From d7f32a985dce78fa87bd634bd69ebd3d48fc7cc6 Mon Sep 17 00:00:00 2001 From: elix-x Date: Fri, 19 Aug 2016 22:45:27 +0200 Subject: [PATCH] Cables & parts and Baking pipeline - Added cables & parts rendering. - Facades got a completely new way of rendering. Anvil facades are totally a thing. - Added baking pipeline for simplified, highly configurable quad baking. NOTE: Yes, there are a lot of improvements to do, bugs to fix, stuff to add. I'm just pushing it prior to code structure change, so it does not get lost in stashes. But it actually works! --- .../appeng/api/client/BakingPipeline.java | 55 +++++++ .../api/client/BakingPipelineElement.java | 39 +++++ .../api/implementations/parts/IPartCable.java | 1 + .../java/appeng/api/parts/IFacadePart.java | 11 ++ src/api/java/appeng/api/parts/IPart.java | 15 +- .../java/appeng/api/parts/IPartHelper.java | 3 +- src/api/java/appeng/api/parts/IPartItem.java | 21 +-- src/api/java/appeng/api/util/AECableType.java | 50 ++++++- .../block/networking/BlockCableBus.java | 95 ++++-------- .../CableBusContainerUnlistedProperty.java | 34 +++++ src/main/java/appeng/client/ClientHelper.java | 96 +++++++++--- .../client/render/model/ModelsCache.java | 119 +++++++++++++++ .../pipeline/BakingPipelineBakedModel.java | 72 +++++++++ .../pipeline/DoubleFacingQuadRotator.java | 107 +++++++++++++ .../model/pipeline/FacingQuadRotator.java | 39 +++++ .../model/pipeline/MatVecApplicator.java | 141 ++++++++++++++++++ .../client/render/model/pipeline/Merge.java | 37 +++++ .../render/model/pipeline/ParentQuads.java | 21 +++ .../render/model/pipeline/QuadVertexData.java | 121 +++++++++++++++ .../model/pipeline/StatePosRecolorator.java | 71 +++++++++ .../model/pipeline/TintIndexModifier.java | 45 ++++++ .../model/pipeline/TypeTransformer.java | 63 ++++++++ .../pipeline/cable/CableAndConnections.java | 53 +++++++ .../render/model/pipeline/cable/Facades.java | 55 +++++++ .../render/model/pipeline/cable/Parts.java | 55 +++++++ src/main/java/appeng/core/FacadeConfig.java | 2 +- src/main/java/appeng/core/api/ApiPart.java | 3 +- .../features/AECableBusFeatureHandler.java | 53 +++++++ src/main/java/appeng/facade/FacadePart.java | 45 +++++- .../java/appeng/items/parts/ItemFacade.java | 10 +- .../appeng/items/parts/ItemMultiPart.java | 10 +- .../java/appeng/items/parts/PartType.java | 95 +++++++----- src/main/java/appeng/parts/AEBasePart.java | 64 +++++++- .../java/appeng/parts/CableBusContainer.java | 1 + src/main/java/appeng/parts/PartPlacement.java | 43 +++--- .../automation/PartAnnihilationPlane.java | 2 +- .../parts/automation/PartExportBus.java | 2 +- .../parts/automation/PartFormationPlane.java | 2 +- .../parts/automation/PartImportBus.java | 2 +- .../parts/automation/PartLevelEmitter.java | 2 +- .../appeng/parts/misc/PartCableAnchor.java | 16 +- .../java/appeng/parts/misc/PartInterface.java | 2 +- .../appeng/parts/misc/PartStorageBus.java | 2 +- .../java/appeng/parts/misc/PartToggleBus.java | 2 +- .../appeng/parts/networking/PartCable.java | 92 +++++++++--- .../parts/networking/PartCableSmart.java | 10 ++ .../parts/networking/PartDenseCable.java | 10 ++ .../parts/networking/PartQuartzFiber.java | 2 +- .../java/appeng/parts/p2p/PartP2PTunnel.java | 2 +- .../appeng/tile/networking/TileCableBus.java | 36 +---- .../tile/networking/TileCableBusTESR.java | 45 ------ .../models/item/part/crafting_terminal.json | 3 + .../models/part/cable/covered/center.json | 20 +++ .../models/part/cable/covered/connection.json | 20 +++ .../models/part/cable/covered/straight.json | 20 +++ .../models/part/cable/dense/center.json | 20 +++ .../models/part/cable/dense/connection.json | 34 +++++ .../models/part/cable/dense/straight.json | 34 +++++ .../models/part/cable/glass/center.json | 20 +++ .../models/part/cable/glass/connection.json | 20 +++ .../models/part/cable/glass/straight.json | 46 ++++++ .../models/part/cable/smart/center.json | 20 +++ .../models/part/cable/smart/connection.json | 34 +++++ .../models/part/cable/smart/straight.json | 34 +++++ .../models/part/cable_anchor.json | 20 +++ .../models/part/cable_facade.json | 3 + .../models/part/crafting_terminal.json | 75 ++++++++++ .../textures/parts/CableAnchor.png | Bin 0 -> 457 bytes .../textures/parts/cable/covered/Black.png | Bin 0 -> 366 bytes .../textures/parts/cable/covered/Blue.png | Bin 0 -> 360 bytes .../textures/parts/cable/covered/Brown.png | Bin 0 -> 384 bytes .../textures/parts/cable/covered/Cyan.png | Bin 0 -> 367 bytes .../textures/parts/cable/covered/Gray.png | Bin 0 -> 366 bytes .../textures/parts/cable/covered/Green.png | Bin 0 -> 377 bytes .../parts/cable/covered/LightBlue.png | Bin 0 -> 363 bytes .../parts/cable/covered/LightGrey.png | Bin 0 -> 361 bytes .../textures/parts/cable/covered/Lime.png | Bin 0 -> 367 bytes .../textures/parts/cable/covered/Magenta.png | Bin 0 -> 370 bytes .../textures/parts/cable/covered/Orange.png | Bin 0 -> 367 bytes .../textures/parts/cable/covered/Pink.png | Bin 0 -> 353 bytes .../textures/parts/cable/covered/Purple.png | Bin 0 -> 365 bytes .../textures/parts/cable/covered/Red.png | Bin 0 -> 378 bytes .../parts/cable/covered/Transparent.png | Bin 0 -> 304 bytes .../textures/parts/cable/covered/White.png | Bin 0 -> 361 bytes .../textures/parts/cable/covered/Yellow.png | Bin 0 -> 368 bytes .../textures/parts/cable/dense/0.png | Bin 0 -> 2933 bytes .../textures/parts/cable/dense/1.png | Bin 0 -> 2933 bytes .../textures/parts/cable/dense/10.png | Bin 0 -> 2946 bytes .../textures/parts/cable/dense/11.png | Bin 0 -> 2946 bytes .../textures/parts/cable/dense/12.png | Bin 0 -> 2947 bytes .../textures/parts/cable/dense/13.png | Bin 0 -> 2947 bytes .../textures/parts/cable/dense/14.png | Bin 0 -> 2947 bytes .../textures/parts/cable/dense/15.png | Bin 0 -> 2947 bytes .../textures/parts/cable/dense/16.png | Bin 0 -> 2942 bytes .../textures/parts/cable/dense/17.png | Bin 0 -> 2942 bytes .../textures/parts/cable/dense/18.png | Bin 0 -> 2942 bytes .../textures/parts/cable/dense/19.png | Bin 0 -> 2942 bytes .../textures/parts/cable/dense/2.png | Bin 0 -> 2933 bytes .../textures/parts/cable/dense/20.png | Bin 0 -> 2944 bytes .../textures/parts/cable/dense/21.png | Bin 0 -> 2944 bytes .../textures/parts/cable/dense/22.png | Bin 0 -> 2944 bytes .../textures/parts/cable/dense/23.png | Bin 0 -> 2944 bytes .../textures/parts/cable/dense/24.png | Bin 0 -> 2940 bytes .../textures/parts/cable/dense/25.png | Bin 0 -> 2940 bytes .../textures/parts/cable/dense/26.png | Bin 0 -> 2940 bytes .../textures/parts/cable/dense/27.png | Bin 0 -> 2940 bytes .../textures/parts/cable/dense/28.png | Bin 0 -> 2939 bytes .../textures/parts/cable/dense/29.png | Bin 0 -> 2939 bytes .../textures/parts/cable/dense/3.png | Bin 0 -> 2933 bytes .../textures/parts/cable/dense/30.png | Bin 0 -> 2939 bytes .../textures/parts/cable/dense/31.png | Bin 0 -> 2939 bytes .../textures/parts/cable/dense/32.png | Bin 0 -> 2926 bytes .../textures/parts/cable/dense/4.png | Bin 0 -> 2942 bytes .../textures/parts/cable/dense/5.png | Bin 0 -> 2942 bytes .../textures/parts/cable/dense/6.png | Bin 0 -> 2942 bytes .../textures/parts/cable/dense/7.png | Bin 0 -> 2942 bytes .../textures/parts/cable/dense/8.png | Bin 0 -> 2946 bytes .../textures/parts/cable/dense/9.png | Bin 0 -> 2946 bytes .../textures/parts/cable/dense/Black.png | Bin 0 -> 210 bytes .../textures/parts/cable/dense/Blue.png | Bin 0 -> 199 bytes .../textures/parts/cable/dense/Brown.png | Bin 0 -> 221 bytes .../textures/parts/cable/dense/Cyan.png | Bin 0 -> 213 bytes .../textures/parts/cable/dense/Gray.png | Bin 0 -> 210 bytes .../textures/parts/cable/dense/Green.png | Bin 0 -> 215 bytes .../textures/parts/cable/dense/LightBlue.png | Bin 0 -> 213 bytes .../textures/parts/cable/dense/LightGrey.png | Bin 0 -> 228 bytes .../textures/parts/cable/dense/Lime.png | Bin 0 -> 205 bytes .../textures/parts/cable/dense/Magenta.png | Bin 0 -> 213 bytes .../textures/parts/cable/dense/Orange.png | Bin 0 -> 218 bytes .../textures/parts/cable/dense/Pink.png | Bin 0 -> 210 bytes .../textures/parts/cable/dense/Purple.png | Bin 0 -> 213 bytes .../textures/parts/cable/dense/Red.png | Bin 0 -> 211 bytes .../parts/cable/dense/Transparent.png | Bin 0 -> 214 bytes .../textures/parts/cable/dense/White.png | Bin 0 -> 217 bytes .../textures/parts/cable/dense/Yellow.png | Bin 0 -> 214 bytes .../textures/parts/cable/glass/Black.png | Bin 0 -> 441 bytes .../textures/parts/cable/glass/Blue.png | Bin 0 -> 441 bytes .../textures/parts/cable/glass/Brown.png | Bin 0 -> 441 bytes .../textures/parts/cable/glass/Cyan.png | Bin 0 -> 377 bytes .../textures/parts/cable/glass/Green.png | Bin 0 -> 391 bytes .../textures/parts/cable/glass/Grey.png | Bin 0 -> 369 bytes .../textures/parts/cable/glass/LightBlue.png | Bin 0 -> 377 bytes .../textures/parts/cable/glass/LightGrey.png | Bin 0 -> 370 bytes .../textures/parts/cable/glass/Lime.png | Bin 0 -> 441 bytes .../textures/parts/cable/glass/Magenta.png | Bin 0 -> 376 bytes .../textures/parts/cable/glass/Orange.png | Bin 0 -> 378 bytes .../textures/parts/cable/glass/Pink.png | Bin 0 -> 373 bytes .../textures/parts/cable/glass/Purple.png | Bin 0 -> 380 bytes .../textures/parts/cable/glass/Red.png | Bin 0 -> 441 bytes .../parts/cable/glass/Transparent.png | Bin 0 -> 394 bytes .../textures/parts/cable/glass/White.png | Bin 0 -> 441 bytes .../textures/parts/cable/glass/Yellow.png | Bin 0 -> 441 bytes .../textures/parts/cable/smart/0.png | Bin 0 -> 2933 bytes .../textures/parts/cable/smart/1.png | Bin 0 -> 2942 bytes .../textures/parts/cable/smart/2.png | Bin 0 -> 2946 bytes .../textures/parts/cable/smart/3.png | Bin 0 -> 2947 bytes .../textures/parts/cable/smart/4.png | Bin 0 -> 2942 bytes .../textures/parts/cable/smart/5.png | Bin 0 -> 2944 bytes .../textures/parts/cable/smart/6.png | Bin 0 -> 2940 bytes .../textures/parts/cable/smart/7.png | Bin 0 -> 2939 bytes .../textures/parts/cable/smart/8.png | Bin 0 -> 2926 bytes .../textures/parts/cable/smart/Black.png | Bin 0 -> 289 bytes .../textures/parts/cable/smart/Blue.png | Bin 0 -> 291 bytes .../textures/parts/cable/smart/Brown.png | Bin 0 -> 297 bytes .../textures/parts/cable/smart/Cyan.png | Bin 0 -> 292 bytes .../textures/parts/cable/smart/Gray.png | Bin 0 -> 288 bytes .../textures/parts/cable/smart/Green.png | Bin 0 -> 291 bytes .../textures/parts/cable/smart/LightBlue.png | Bin 0 -> 292 bytes .../textures/parts/cable/smart/LightGrey.png | Bin 0 -> 302 bytes .../textures/parts/cable/smart/Lime.png | Bin 0 -> 291 bytes .../textures/parts/cable/smart/Magenta.png | Bin 0 -> 293 bytes .../textures/parts/cable/smart/Orange.png | Bin 0 -> 294 bytes .../textures/parts/cable/smart/Pink.png | Bin 0 -> 291 bytes .../textures/parts/cable/smart/Purple.png | Bin 0 -> 292 bytes .../textures/parts/cable/smart/Red.png | Bin 0 -> 296 bytes .../parts/cable/smart/Transparent.png | Bin 0 -> 287 bytes .../textures/parts/cable/smart/White.png | Bin 0 -> 287 bytes .../textures/parts/cable/smart/Yellow.png | Bin 0 -> 289 bytes .../textures/parts/crafting_terminal/back.png | Bin 0 -> 268 bytes .../parts/crafting_terminal/backlights.png | Bin 0 -> 272 bytes .../parts/crafting_terminal/frame.png | Bin 0 -> 259 bytes .../textures/parts/crafting_terminal/l0.png | Bin 0 -> 281 bytes .../textures/parts/crafting_terminal/l1.png | Bin 0 -> 257 bytes .../textures/parts/crafting_terminal/l2.png | Bin 0 -> 256 bytes .../parts/crafting_terminal/sides.png | Bin 0 -> 229 bytes .../parts/crafting_terminal/sidesstatus.png | Bin 0 -> 261 bytes 186 files changed, 2102 insertions(+), 295 deletions(-) create mode 100644 src/api/java/appeng/api/client/BakingPipeline.java create mode 100644 src/api/java/appeng/api/client/BakingPipelineElement.java create mode 100644 src/main/java/appeng/block/networking/CableBusContainerUnlistedProperty.java create mode 100644 src/main/java/appeng/client/render/model/ModelsCache.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/BakingPipelineBakedModel.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/DoubleFacingQuadRotator.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/FacingQuadRotator.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/MatVecApplicator.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/Merge.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/ParentQuads.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/QuadVertexData.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/StatePosRecolorator.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/TintIndexModifier.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/TypeTransformer.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/cable/CableAndConnections.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/cable/Facades.java create mode 100644 src/main/java/appeng/client/render/model/pipeline/cable/Parts.java delete mode 100644 src/main/java/appeng/tile/networking/TileCableBusTESR.java create mode 100644 src/main/resources/assets/appliedenergistics2/models/item/part/crafting_terminal.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/covered/center.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/covered/connection.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/covered/straight.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/dense/center.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/dense/connection.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/dense/straight.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/glass/center.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/glass/connection.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/glass/straight.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/smart/center.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/smart/connection.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable/smart/straight.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable_anchor.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable_facade.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/crafting_terminal.json create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/CableAnchor.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Black.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Blue.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Brown.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Cyan.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Gray.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Green.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/LightBlue.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/LightGrey.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Lime.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Magenta.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Orange.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Pink.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Purple.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Red.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Transparent.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/White.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Yellow.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/0.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/1.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/10.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/11.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/12.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/13.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/14.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/15.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/16.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/17.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/18.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/19.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/2.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/20.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/21.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/22.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/23.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/24.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/25.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/26.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/27.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/28.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/29.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/3.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/30.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/31.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/32.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/4.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/5.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/6.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/7.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/8.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/9.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Black.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Blue.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Brown.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Cyan.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Gray.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Green.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/LightBlue.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/LightGrey.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Lime.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Magenta.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Orange.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Pink.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Purple.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Red.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Transparent.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/White.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Yellow.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Black.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Blue.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Brown.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Cyan.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Green.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Grey.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/LightBlue.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/LightGrey.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Lime.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Magenta.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Orange.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Pink.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Purple.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Red.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Transparent.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/White.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Yellow.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/0.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/1.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/2.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/3.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/4.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/5.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/6.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/7.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/8.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Black.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Blue.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Brown.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Cyan.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Gray.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Green.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/LightBlue.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/LightGrey.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Lime.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Magenta.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Orange.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Pink.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Purple.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Red.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Transparent.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/White.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Yellow.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/back.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/backlights.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/frame.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/l0.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/l1.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/l2.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/sides.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/sidesstatus.png diff --git a/src/api/java/appeng/api/client/BakingPipeline.java b/src/api/java/appeng/api/client/BakingPipeline.java new file mode 100644 index 000000000..1bd5fa8f5 --- /dev/null +++ b/src/api/java/appeng/api/client/BakingPipeline.java @@ -0,0 +1,55 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2013 AlgorithmX2 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package appeng.api.client; + + +import java.util.List; + +import com.google.common.collect.ImmutableList; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; + + +public class BakingPipeline implements BakingPipelineElement +{ + + private final ImmutableList> pipeline; + + public BakingPipeline( BakingPipelineElement... pipeline ) + { + this.pipeline = ImmutableList.copyOf( pipeline ); + } + + public List pipe( List things, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + for( BakingPipelineElement pipe : pipeline ) + { + things = pipe.pipe( things, parent, state, side, rand ); + } + return things; + } + +} diff --git a/src/api/java/appeng/api/client/BakingPipelineElement.java b/src/api/java/appeng/api/client/BakingPipelineElement.java new file mode 100644 index 000000000..b3ef084e4 --- /dev/null +++ b/src/api/java/appeng/api/client/BakingPipelineElement.java @@ -0,0 +1,39 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2013 AlgorithmX2 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package appeng.api.client; + + +import java.util.List; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; + + +public interface BakingPipelineElement +{ + + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ); + +} diff --git a/src/api/java/appeng/api/implementations/parts/IPartCable.java b/src/api/java/appeng/api/implementations/parts/IPartCable.java index 52a1ae695..d730b9a79 100644 --- a/src/api/java/appeng/api/implementations/parts/IPartCable.java +++ b/src/api/java/appeng/api/implementations/parts/IPartCable.java @@ -86,4 +86,5 @@ public interface IPartCable extends IPart, IGridHost * @return true if this side is currently connects to an external block. */ boolean isConnected( EnumFacing side ); + } diff --git a/src/api/java/appeng/api/parts/IFacadePart.java b/src/api/java/appeng/api/parts/IFacadePart.java index 7984d1c8a..bcc27f8c4 100644 --- a/src/api/java/appeng/api/parts/IFacadePart.java +++ b/src/api/java/appeng/api/parts/IFacadePart.java @@ -24,11 +24,19 @@ package appeng.api.parts; +import java.util.List; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import appeng.api.client.BakingPipeline; import appeng.api.util.AEPartLocation; @@ -72,4 +80,7 @@ public interface IFacadePart void setThinFacades( boolean useThinFacades ); boolean isTransparent(); + + @SideOnly( Side.CLIENT ) + public List getOrBakeQuads( IPartHost host, BakingPipeline rotatingPipeline, IBlockState state, EnumFacing side, long rand ); } \ No newline at end of file diff --git a/src/api/java/appeng/api/parts/IPart.java b/src/api/java/appeng/api/parts/IPart.java index 2e59adce7..b692f9d10 100644 --- a/src/api/java/appeng/api/parts/IPart.java +++ b/src/api/java/appeng/api/parts/IPart.java @@ -30,17 +30,23 @@ import java.util.Random; import io.netty.buffer.ByteBuf; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import appeng.api.client.BakingPipeline; import appeng.api.networking.IGridNode; import appeng.api.util.AEPartLocation; @@ -216,9 +222,10 @@ public interface IPart extends IBoxProvider void getDrops( List drops, boolean wrenched ); /** - * @return 0 - 8, reasonable default 3-4, this controls the cable connection to the node. + * @return 0 - 8, reasonable default 3-4, this controls the cable connection to the node. -1 to render connection + * yourself. */ - int cableConnectionRenderTo(); + int getCableConnectionLength(); /** * same as Block.randomDisplayTick, for but parts. @@ -246,4 +253,8 @@ public interface IPart extends IBoxProvider * @return true if the part can be placed on this support. */ boolean canBePlacedOn( BusSupport what ); + + @SideOnly( Side.CLIENT ) + public List getOrBakeQuads( BakingPipeline rotatingPipeline, IBlockState state, EnumFacing side, long rand ); + } \ No newline at end of file diff --git a/src/api/java/appeng/api/parts/IPartHelper.java b/src/api/java/appeng/api/parts/IPartHelper.java index 319e984c3..d8ed38ff6 100644 --- a/src/api/java/appeng/api/parts/IPartHelper.java +++ b/src/api/java/appeng/api/parts/IPartHelper.java @@ -26,6 +26,7 @@ package appeng.api.parts; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; @@ -72,7 +73,7 @@ public interface IPartHelper * * @return true if placing was successful */ - boolean placeBus( ItemStack is, BlockPos pos, EnumFacing side, EntityPlayer player, EnumHand hand, World world ); + EnumActionResult placeBus( ItemStack is, BlockPos pos, EnumFacing side, EntityPlayer player, EnumHand hand, World world ); /** * @return the render mode diff --git a/src/api/java/appeng/api/parts/IPartItem.java b/src/api/java/appeng/api/parts/IPartItem.java index 41688c846..82146958c 100644 --- a/src/api/java/appeng/api/parts/IPartItem.java +++ b/src/api/java/appeng/api/parts/IPartItem.java @@ -36,26 +36,20 @@ import net.minecraft.item.ItemStack; * * you must register your bus with the Bus renderer, using AEApi.INSTANCE().partHelper().setItemBusRenderer( this ); * - * then simply add these two methods, which tell MC to use the Block Textures, and call AE's Bus Placement Code. + * then simply add this, and call AE's Bus Placement Code. * *
  * 
- * {@literal @}Override
- * {@literal @}SideOnly(Side.CLIENT)
- * public int getSpriteNumber()
- * {
- *     return 0;
- * }
  *
  * {@literal @}Override
- * public boolean onItemUse(ItemStack is, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
- * {
- *     return AEApi.INSTANCE().partHelper().placeBus( is, x, y, z, side, player, world );
- * }
+ * public default EnumActionResult onItemUse(ItemStack is, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ)
+ *	{
+ *		return AEApi.instance().partHelper().placeBus( is, pos, side, player, hand, world );
+ *	}
  * 
  * 
*/ -public interface IPartItem +public interface IPartItem

{ /** @@ -66,5 +60,6 @@ public interface IPartItem * @return part from item */ @Nullable - IPart createPartFromItemStack( ItemStack is ); + P createPartFromItemStack( ItemStack is ); + } \ No newline at end of file diff --git a/src/api/java/appeng/api/util/AECableType.java b/src/api/java/appeng/api/util/AECableType.java index 5d6f3464a..39369247c 100644 --- a/src/api/java/appeng/api/util/AECableType.java +++ b/src/api/java/appeng/api/util/AECableType.java @@ -24,31 +24,71 @@ package appeng.api.util; +import net.minecraft.util.ResourceLocation; + + public enum AECableType { /** * No Cable present. */ - NONE, + NONE( null, 0 ), /** * Connections to this block should render as glass. */ - GLASS, + GLASS( "glass", 0 ), /** * Connections to this block should render as covered. */ - COVERED, + COVERED( "covered", 0 ), /** * Connections to this block should render as smart. */ - SMART, + SMART( "smart", 8 ), /** * Dense Cable, represents a tier 2 block that can carry 32 channels. */ - DENSE, + DENSE( "dense", 32 ); + + public static final AECableType[] VALIDCABLES = { GLASS, COVERED, SMART, DENSE }; + + private final String type; + private final int displayedChannels; + private final ResourceLocation model; + private final ResourceLocation connectionModel; + private final ResourceLocation straightModel; + + private AECableType( String type, int displayedChannels ) + { + this.type = type; + this.displayedChannels = displayedChannels; + this.model = new ResourceLocation( "appliedenergistics2", "part/cable/" + type + "/center" ); + this.connectionModel = new ResourceLocation( "appliedenergistics2", "part/cable/" + type + "/connection" ); + this.straightModel = new ResourceLocation( "appliedenergistics2", "part/cable/" + type + "/straight" ); + } + + public int displayedChannels() + { + return displayedChannels; + } + + public ResourceLocation getModel() + { + return model; + } + + public ResourceLocation getConnectionModel() + { + return connectionModel; + } + + public ResourceLocation getStraightModel() + { + return straightModel; + } } diff --git a/src/main/java/appeng/block/networking/BlockCableBus.java b/src/main/java/appeng/block/networking/BlockCableBus.java index 8b482cca4..e3232f342 100644 --- a/src/main/java/appeng/block/networking/BlockCableBus.java +++ b/src/main/java/appeng/block/networking/BlockCableBus.java @@ -26,6 +26,8 @@ import java.util.Random; import javax.annotation.Nullable; import net.minecraft.block.Block; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.client.particle.ParticleManager; import net.minecraft.creativetab.CreativeTabs; @@ -44,6 +46,9 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.property.ExtendedBlockState; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -55,11 +60,9 @@ import appeng.api.util.AEColor; import appeng.block.AEBaseTileBlock; import appeng.core.AEConfig; import appeng.core.Api; -import appeng.core.CommonHelper; import appeng.core.features.AECableBusFeatureHandler; import appeng.core.features.AEFeature; import appeng.helpers.AEGlassMaterial; -import appeng.helpers.Reflected; import appeng.integration.IntegrationRegistry; import appeng.integration.IntegrationType; import appeng.integration.abstraction.IFMP; @@ -67,30 +70,14 @@ import appeng.parts.ICableBusContainer; import appeng.parts.NullCableBusContainer; import appeng.tile.AEBaseTile; import appeng.tile.networking.TileCableBus; -import appeng.tile.networking.TileCableBusTESR; import appeng.util.Platform; -// TODO: MFR INTEGRATION -//@Interface( iface = "powercrystals.minefactoryreloaded.api.rednet.connectivity.IRedNetConnection", iname = IntegrationType.MFR ) -public class BlockCableBus extends AEBaseTileBlock // implements -// IRedNetConnection +public class BlockCableBus extends AEBaseTileBlock { private static final ICableBusContainer NULL_CABLE_BUS = new NullCableBusContainer(); private static Class noTesrTile; - private static Class tesrTile; - - /** - * Immibis MB Support. - * - * It will look for a field named - * ImmibisMicroblocks_TransformableBlockMarker or - * ImmibisMicroblocks_TransformableTileEntityMarker, modifiers, type, etc - * can be ignored. - */ - @Reflected - private static final boolean ImmibisMicroblocks_TransformableBlockMarker = true; public BlockCableBus() { @@ -104,6 +91,26 @@ public class BlockCableBus extends AEBaseTileBlock // implements this.setFeature( EnumSet.of( AEFeature.Core ) ); } + public static final CableBusContainerUnlistedProperty cableBus = new CableBusContainerUnlistedProperty(); + + @Override + protected BlockStateContainer createBlockState() + { + return new ExtendedBlockState( this, new IProperty[0], new IUnlistedProperty[] { cableBus } ); + } + + @Override + public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos ) + { + return state; + } + + @Override + public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos ) + { + return ( (IExtendedBlockState) state ).withProperty( cableBus, ( (TileCableBus) world.getTileEntity( pos ) ).getCableBus() ); + } + @Override public void randomDisplayTick( final IBlockState state, final World worldIn, final BlockPos pos, final Random rand ) { @@ -146,8 +153,8 @@ public class BlockCableBus extends AEBaseTileBlock // implements public int getStrongPower( final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side ) { return this.cb( w, pos ).isProvidingStrongPower( side.getOpposite() ); // TODO: - // IS - // OPPOSITE!? + // IS + // OPPOSITE!? } @Override @@ -236,7 +243,7 @@ public class BlockCableBus extends AEBaseTileBlock // implements return null; } - + @Override @SideOnly( Side.CLIENT ) public boolean addHitEffects( final IBlockState state, final World world, final RayTraceResult target, final ParticleManager effectRenderer ) @@ -352,24 +359,6 @@ public class BlockCableBus extends AEBaseTileBlock // implements // do nothing } - @Override - public T getTileEntity( final IBlockAccess w, final BlockPos pos ) - { - final TileEntity te = w.getTileEntity( pos ); - - if( noTesrTile.isInstance( te ) ) - { - return (T) te; - } - - if( tesrTile != null && tesrTile.isInstance( te ) ) - { - return (T) te; - } - - return null; - } - @Override protected void setFeature( final EnumSet f ) { @@ -382,17 +371,6 @@ public class BlockCableBus extends AEBaseTileBlock // implements noTesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBus.class.getName() ); this.setTileEntity( noTesrTile ); GameRegistry.registerTileEntity( noTesrTile, "BlockCableBus" ); - if( Platform.isClient() ) - { - tesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBusTESR.class.getName() ); - GameRegistry.registerTileEntity( tesrTile, "ClientOnly_TESR_CableBus" ); - CommonHelper.proxy.bindTileEntitySpecialRenderer( tesrTile, this ); - } - } - - public static Class getTesrTile() - { - return tesrTile; } public static Class getNoTesrTile() @@ -400,19 +378,4 @@ public class BlockCableBus extends AEBaseTileBlock // implements return noTesrTile; } - // TODO MFR Integration - // @Override - // @Method( iname = IntegrationType.MFR ) - // public RedNetConnectionType getConnectionType( World world, int x, int y, - // int z, ForgeDirection side ) - // { - // return this.cb( world, x, y, z ).canConnectRedstone( EnumSet.allOf( - // ForgeDirection.class ) ) ? - // RedNetConnectionType.CableSingle : RedNetConnectionType.None; - // } - // - // public void setRenderColor( int color ) - // { - // this.myColorMultiplier = color; - // } } diff --git a/src/main/java/appeng/block/networking/CableBusContainerUnlistedProperty.java b/src/main/java/appeng/block/networking/CableBusContainerUnlistedProperty.java new file mode 100644 index 000000000..e9b454a48 --- /dev/null +++ b/src/main/java/appeng/block/networking/CableBusContainerUnlistedProperty.java @@ -0,0 +1,34 @@ +package appeng.block.networking; + +import net.minecraftforge.common.property.IUnlistedProperty; + +import appeng.parts.CableBusContainer; + +public class CableBusContainerUnlistedProperty implements IUnlistedProperty +{ + + @Override + public String getName() + { + return "bus"; + } + + @Override + public boolean isValid( CableBusContainer value ) + { + return true; + } + + @Override + public Class getType() + { + return CableBusContainer.class; + } + + @Override + public String valueToString( CableBusContainer value ) + { + return null; + } + +} diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index 78cefb34a..b94fc1ac2 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -24,15 +24,16 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import com.google.common.collect.ImmutableMap; + import org.lwjgl.opengl.GL11; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.client.renderer.color.ItemColors; import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.resources.IReloadableResourceManager; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -40,20 +41,21 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.MouseEvent; import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.client.model.IModel; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import appeng.api.parts.CableRenderMode; +import appeng.api.util.AECableType; import appeng.api.util.AEColor; import appeng.block.AEBaseBlock; import appeng.client.render.effects.AssemblerFX; @@ -63,11 +65,13 @@ import appeng.client.render.effects.LightningArcFX; import appeng.client.render.effects.LightningFX; import appeng.client.render.effects.VibrantFX; import appeng.client.render.model.GlassModelLoader; +import appeng.client.render.model.ModelsCache; import appeng.client.render.model.UVLModelLoader; import appeng.client.render.textures.ParticleTextures; import appeng.core.AEConfig; import appeng.core.AELog; import appeng.core.Api; +import appeng.core.AppEng; import appeng.core.CommonHelper; import appeng.core.features.IAEFeature; import appeng.core.sync.network.NetworkHandler; @@ -81,6 +85,8 @@ import appeng.helpers.IMouseWheelItem; import appeng.hooks.TickHandler; import appeng.hooks.TickHandler.PlayerColor; import appeng.items.misc.ItemPaintBall; +import appeng.items.parts.PartType; +import appeng.parts.AEBasePart; import appeng.server.ServerHelper; import appeng.transformer.MissingCoreMod; import appeng.util.Platform; @@ -95,6 +101,7 @@ public class ClientHelper extends ServerHelper MinecraftForge.EVENT_BUS.register( this ); ModelLoaderRegistry.registerLoader( UVLModelLoader.INSTANCE ); ModelLoaderRegistry.registerLoader( new GlassModelLoader() ); + ( (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager() ).registerReloadListener( ModelsCache.INSTANCE ); for( IAEFeature feature : Api.INSTANCE.definitions().getFeatureRegistry().getRegisteredFeatures() ) { feature.handler().registerStateMapper(); @@ -125,10 +132,6 @@ public class ClientHelper extends ServerHelper for( IAEFeature feature : Api.INSTANCE.definitions().getFeatureRegistry().getRegisteredFeatures() ) { feature.handler().registerModel(); - if( feature instanceof AEBaseBlock ) - { - Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler( new AEBaseBlockColor(), (Block) feature ); - } } // Register color handling for paintball items @@ -296,12 +299,6 @@ public class ClientHelper extends ServerHelper throw new MissingCoreMod(); } - @SubscribeEvent - public void modelsBake( ModelBakeEvent event ) - { - UVLModelLoader.INSTANCE.setLoader( event.getModelLoader() ); - } - @SubscribeEvent public void postPlayerRender( final RenderLivingEvent.Pre p ) { @@ -383,9 +380,10 @@ public class ClientHelper extends ServerHelper @SubscribeEvent public void onModelBakeEvent( final ModelBakeEvent event ) { + UVLModelLoader.INSTANCE.setLoader( event.getModelLoader() ); for( IAEFeature feature : Api.INSTANCE.definitions().getFeatureRegistry().getRegisteredFeatures() ) { - feature.handler().registerCustomModelOverride(event.getModelRegistry()); + feature.handler().registerCustomModelOverride( event.getModelRegistry() ); } } @@ -432,6 +430,48 @@ public class ClientHelper extends ServerHelper public void onTextureStitch( final TextureStitchEvent.Pre event ) { ParticleTextures.registerSprite( event ); + for( AECableType type : AECableType.VALIDCABLES ) + { + for( IModel model : new IModel[] { ModelsCache.INSTANCE.getOrLoadModel( type.getModel() ), ModelsCache.INSTANCE.getOrLoadModel( type.getConnectionModel() ), ModelsCache.INSTANCE.getOrLoadModel( type.getStraightModel() ) } ) + { + for( ResourceLocation location : model.getTextures() ) + { + for( AEColor color : AEColor.values() ) + { + if( type.displayedChannels() > 0 ) + { + for( int i = 0; i <= type.displayedChannels(); i++ ) + { + event.getMap().registerSprite( AEBasePart.replaceProperties( location, ImmutableMap.of( "color", color.name(), "channels", String.valueOf( i ) ) ) ); + } + } + else + { + event.getMap().registerSprite( AEBasePart.replaceProperties( location, ImmutableMap.of( "color", color.name() ) ) ); + } + } + } + } + } + for( PartType part : PartType.values() ) + { + if( !part.isCable() ) + { + IModel model = ModelsCache.INSTANCE.getOrLoadModel( part.getModel() ); + for( ResourceLocation location : model.getTextures() ) + { + for( AEColor color : AEColor.values() ) + { + event.getMap().registerSprite( AEBasePart.replaceProperties( location, ImmutableMap.of( "color", color.name() ) ) ); + } + } + } + } + + for( ResourceLocation location : ModelsCache.INSTANCE.getOrLoadModel( new ResourceLocation( AppEng.MOD_ID, "part/cable_facade" ) ).getTextures() ) + { + event.getMap().registerSprite( location ); + } } private static class IconReg @@ -458,15 +498,29 @@ public class ClientHelper extends ServerHelper } } - - public static class AEBaseBlockColor implements IBlockColor + public class ItemPaintBallColor implements IItemColor { @Override - public int colorMultiplier( IBlockState state, IBlockAccess worldIn, BlockPos pos, int tintIndex ) + public int getColorFromItemstack( ItemStack stack, int tintIndex ) { - return tintIndex; + final AEColor col = ( (ItemPaintBall) stack.getItem() ).getColor( stack ); + + final int colorValue = stack.getItemDamage() >= 20 ? col.mediumVariant : col.mediumVariant; + final int r = ( colorValue >> 16 ) & 0xff; + final int g = ( colorValue >> 8 ) & 0xff; + final int b = ( colorValue ) & 0xff; + + if( stack.getItemDamage() >= 20 ) + { + final float fail = 0.7f; + final int full = (int) ( 255 * 0.3 ); + return (int) ( full + r * fail ) << 16 | (int) ( full + g * fail ) << 8 | (int) ( full + b * fail ) | 0xff << 24; + } + else + { + return r << 16 | g << 8 | b | 0xff << 24; + } } } - } \ No newline at end of file diff --git a/src/main/java/appeng/client/render/model/ModelsCache.java b/src/main/java/appeng/client/render/model/ModelsCache.java new file mode 100644 index 000000000..7c4518d7a --- /dev/null +++ b/src/main/java/appeng/client/render/model/ModelsCache.java @@ -0,0 +1,119 @@ + +package appeng.client.render.model; + + +import java.util.HashMap; +import java.util.Map; + +import com.google.common.base.Function; +import com.google.common.base.Optional; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.IResourceManagerReloadListener; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IModel; +import net.minecraftforge.client.model.ModelLoaderRegistry; +import net.minecraftforge.common.model.IModelState; + + +public enum ModelsCache implements IResourceManagerReloadListener +{ + + INSTANCE; + + public static final IModelState DEFAULTMODELSTATE = opt -> Optional.absent(); + public static final VertexFormat DEFAULTVERTEXFORMAT = DefaultVertexFormats.BLOCK; + public static final Function DEFAULTTEXTUREGETTER = texture -> Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite( texture.toString() ); + + private final Map cache = new HashMap<>(); + private final Map bakedCache = new HashMap<>(); + + public IModel getOrLoadModel( ResourceLocation location ) + { + IModel model = cache.get( location ); + if( model == null ) + { + try + { + model = ModelLoaderRegistry.getModel( location ); + } + catch( Exception e ) + { + // TODO 1.10.2-R - log this in pretty way + e.printStackTrace(); + model = ModelLoaderRegistry.getMissingModel(); + } + cache.put( location, model ); + } + return model; + } + + public IBakedModel getModel( ResourceLocation key ) + { + return bakedCache.get( key ); + } + + public IBakedModel getOrLoadModel( ResourceLocation key, ResourceLocation location, IModelState state, VertexFormat format, Function textureGetter ) + { + IBakedModel model = getModel( key ); + if( model == null ) + { + model = getOrLoadModel( location ).bake( state, format, textureGetter ); + bakedCache.put( key, model ); + } + return model; + } + + public IBakedModel getOrLoadModel( ResourceLocation key, ResourceLocation location, IModelState state, VertexFormat format ) + { + return getOrLoadModel( key, location, state, format, DEFAULTTEXTUREGETTER ); + } + + public IBakedModel getOrLoadModel( ResourceLocation key, ResourceLocation location, IModelState state, Function textureGetter ) + { + return getOrLoadModel( key, location, state, DEFAULTVERTEXFORMAT, textureGetter ); + } + + public IBakedModel getOrLoadModel( ResourceLocation key, ResourceLocation location, VertexFormat format, Function textureGetter ) + { + return getOrLoadModel( key, location, DEFAULTMODELSTATE, format, textureGetter ); + } + + public IBakedModel getOrLoadModel( ResourceLocation key, ResourceLocation location, IModelState state ) + { + return getOrLoadModel( key, location, state, DEFAULTVERTEXFORMAT, DEFAULTTEXTUREGETTER ); + } + + public IBakedModel getOrLoadModel( ResourceLocation key, ResourceLocation location, VertexFormat format ) + { + return getOrLoadModel( key, location, DEFAULTMODELSTATE, format, DEFAULTTEXTUREGETTER ); + } + + public IBakedModel getOrLoadModel( ResourceLocation key, ResourceLocation location, Function textureGetter ) + { + return getOrLoadModel( key, location, DEFAULTMODELSTATE, DEFAULTVERTEXFORMAT, textureGetter ); + } + + public IBakedModel getOrLoadModel( ResourceLocation key, ResourceLocation location ) + { + return getOrLoadModel( key, location, DEFAULTMODELSTATE, DEFAULTVERTEXFORMAT, DEFAULTTEXTUREGETTER ); + } + + public IBakedModel getOrLoadBakedModel( ResourceLocation location ) + { + return getOrLoadModel( location, location, DEFAULTMODELSTATE, DEFAULTVERTEXFORMAT, DEFAULTTEXTUREGETTER ); + } + + @Override + public void onResourceManagerReload( IResourceManager resourceManager ) + { + cache.clear(); + bakedCache.clear(); + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/BakingPipelineBakedModel.java b/src/main/java/appeng/client/render/model/pipeline/BakingPipelineBakedModel.java new file mode 100644 index 000000000..577573578 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/BakingPipelineBakedModel.java @@ -0,0 +1,72 @@ + +package appeng.client.render.model.pipeline; + + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ItemCameraTransforms; +import net.minecraft.client.renderer.block.model.ItemOverrideList; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.EnumFacing; + +import appeng.api.client.BakingPipeline; +import appeng.api.client.BakingPipelineElement; + + +public class BakingPipelineBakedModel extends BakingPipeline implements IBakedModel +{ + + private final IBakedModel parent; + public BakingPipelineBakedModel( IBakedModel parent, BakingPipelineElement... pipeline ) + { + super( pipeline ); + this.parent = parent; + } + + @Override + public List getQuads( IBlockState state, EnumFacing side, long rand ) + { + return pipe( new ArrayList(), parent, state, side, rand ); + } + + @Override + public boolean isAmbientOcclusion() + { + return parent.isAmbientOcclusion(); + } + + @Override + public boolean isGui3d() + { + return parent.isGui3d(); + } + + @Override + public boolean isBuiltInRenderer() + { + return parent.isBuiltInRenderer(); + } + + @Override + public TextureAtlasSprite getParticleTexture() + { + return parent.getParticleTexture(); + } + + @Override + public ItemCameraTransforms getItemCameraTransforms() + { + return parent.getItemCameraTransforms(); + } + + @Override + public ItemOverrideList getOverrides() + { + return parent.getOverrides(); + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/DoubleFacingQuadRotator.java b/src/main/java/appeng/client/render/model/pipeline/DoubleFacingQuadRotator.java new file mode 100644 index 000000000..7a3a79fe0 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/DoubleFacingQuadRotator.java @@ -0,0 +1,107 @@ + +package appeng.client.render.model.pipeline; + + +import java.util.ArrayList; +import java.util.List; + +import javax.vecmath.Vector3f; +import javax.vecmath.Vector4f; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import net.minecraft.util.EnumFacing; + +import appeng.api.client.BakingPipelineElement; +import appeng.block.AEBaseTileBlock; +import appeng.client.render.FacingToRotation; + + +public class DoubleFacingQuadRotator implements BakingPipelineElement +{ + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + if( state != null ) + { + final EnumFacing forward = state.getValue( AEBaseTileBlock.AE_BLOCK_FORWARD ); + final EnumFacing up = state.getValue( AEBaseTileBlock.AE_BLOCK_UP ); + final FacingToRotation f2r = FacingToRotation.get( forward, up ); + List rotated = new ArrayList(); + for( QuadVertexData data : elements ) + { + data.setFace( f2r.rotate( data.getFace() ) ); + float[][][] qd = data.getData(); + for( int v = 0; v < 4; v++ ) + { + for( int e = 0; e < data.getFormat().getElementCount(); e++ ) + { + VertexFormatElement element = data.getFormat().getElement( e ); + if( element.getUsage() == VertexFormatElement.EnumUsage.POSITION ) + { + qd[v][e] = transform( f2r, qd[v][e] ); + } + else if( element.getUsage() == VertexFormatElement.EnumUsage.NORMAL ) + { + qd[v][e] = transformNormal( f2r, qd[v][e] ); + } + } + } + rotated.add( new QuadVertexData( data.getFormat(), qd, data.getTintIndex(), data.getFace(), data.getSprite(), data.shouldApplyDiffuseLighting() ) ); + } + return rotated; + } + return elements; + } + + private float[] transform( FacingToRotation f2r, float[] fs ) + { + switch( fs.length ) + { + case 3: + Vector3f vec = new Vector3f( fs[0], fs[1], fs[2] ); + vec.x -= 0.5f; + vec.y -= 0.5f; + vec.z -= 0.5f; + f2r.getMat().transform( vec ); + vec.x += 0.5f; + vec.y += 0.5f; + vec.z += 0.5f; + return new float[] { vec.x, vec.y, vec.z }; + case 4: + Vector4f vecc = new Vector4f( fs[0], fs[1], fs[2], fs[3] ); + vecc.x -= 0.5f; + vecc.y -= 0.5f; + vecc.z -= 0.5f; + f2r.getMat().transform( vecc ); + vecc.x += 0.5f; + vecc.y += 0.5f; + vecc.z += 0.5f; + return new float[] { vecc.x, vecc.y, vecc.z, vecc.w }; + + default: + return fs; + } + } + + private float[] transformNormal( FacingToRotation f2r, float[] fs ) + { + switch( fs.length ) + { + case 3: + Vector3f vec = new Vector3f( fs[0], fs[1], fs[2] ); + f2r.getMat().transform( vec ); + return new float[] { vec.x, vec.y, vec.z }; + case 4: + Vector4f vecc = new Vector4f( fs[0], fs[1], fs[2], fs[3] ); + f2r.getMat().transform( vecc ); + return new float[] { vecc.x, vecc.y, vecc.z, vecc.w }; + + default: + return fs; + } + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/FacingQuadRotator.java b/src/main/java/appeng/client/render/model/pipeline/FacingQuadRotator.java new file mode 100644 index 000000000..4f2664a7f --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/FacingQuadRotator.java @@ -0,0 +1,39 @@ + +package appeng.client.render.model.pipeline; + + +import java.util.List; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.model.TRSRTransformation; + + +public class FacingQuadRotator extends MatVecApplicator +{ + + private EnumFacing override; + + public FacingQuadRotator( EnumFacing override ) + { + super( TRSRTransformation.getMatrix( override ) ); + this.override = override; + } + + public FacingQuadRotator() + { + this.override = null; + } + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + if( override == null ) + { + setMatrix( TRSRTransformation.getMatrix( side ) ); + } + return super.pipe( elements, parent, state, side, rand ); + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/MatVecApplicator.java b/src/main/java/appeng/client/render/model/pipeline/MatVecApplicator.java new file mode 100644 index 000000000..cffcbd6b5 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/MatVecApplicator.java @@ -0,0 +1,141 @@ + +package appeng.client.render.model.pipeline; + + +import java.util.ArrayList; +import java.util.List; + +import javax.vecmath.Matrix4f; +import javax.vecmath.Vector3f; +import javax.vecmath.Vector4f; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.model.TRSRTransformation; + +import appeng.api.client.BakingPipelineElement; + + +public class MatVecApplicator implements BakingPipelineElement +{ + + private Matrix4f matrix; + private boolean forceTranslate; + + public MatVecApplicator( Matrix4f matrix, boolean forceTranslate ) + { + this.matrix = matrix; + this.forceTranslate = forceTranslate; + } + + public MatVecApplicator( Matrix4f matrix ) + { + this( matrix, false ); + } + + public MatVecApplicator() + { + this( new Matrix4f() ); + } + + public Matrix4f getMatrix() + { + return matrix; + } + + public void setMatrix( Matrix4f matrix ) + { + this.matrix = matrix; + } + + public boolean forceTranslate() + { + return forceTranslate; + } + + public void setForceTranslate( boolean forceTranslate ) + { + this.forceTranslate = forceTranslate; + } + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + List rotated = new ArrayList(); + for( QuadVertexData data : elements ) + { + float[][][] qd = data.getData(); + data.setFace( side != null ? TRSRTransformation.rotate( matrix, side ) : side ); + for( int v = 0; v < 4; v++ ) + { + for( int e = 0; e < data.getFormat().getElementCount(); e++ ) + { + VertexFormatElement element = data.getFormat().getElement( e ); + if( element.getUsage() == VertexFormatElement.EnumUsage.POSITION ) + { + qd[v][e] = transform( qd[v][e] ); + } + else if( element.getUsage() == VertexFormatElement.EnumUsage.NORMAL ) + { + qd[v][e] = transformNormal( qd[v][e] ); + } + } + } + rotated.add( new QuadVertexData( data.getFormat(), qd, data.getTintIndex(), data.getFace(), data.getSprite(), data.shouldApplyDiffuseLighting() ) ); + } + return rotated; + } + + private float[] transform( float[] fs ) + { + switch( fs.length ) + { + case 3: + Vector4f vec = new Vector4f( fs[0], fs[1], fs[2], forceTranslate ? 1 : 0 ); + vec.x -= 0.5f; + vec.y -= 0.5f; + vec.z -= 0.5f; + this.matrix.transform( vec ); + vec.x += 0.5f; + vec.y += 0.5f; + vec.z += 0.5f; + return new float[] { vec.x, vec.y, vec.z }; + case 4: + Vector4f vecc = new Vector4f( fs[0], fs[1], fs[2], forceTranslate ? 1 : fs[3] ); + vecc.x -= 0.5f; + vecc.y -= 0.5f; + vecc.z -= 0.5f; + this.matrix.transform( vecc ); + vecc.x += 0.5f; + vecc.y += 0.5f; + vecc.z += 0.5f; + return new float[] { vecc.x, vecc.y, vecc.z, vecc.w }; + + default: + return fs; + } + } + + private float[] transformNormal( float[] fs ) + { + switch( fs.length ) + { + case 3: + Vector3f vec = new Vector3f( fs[0], fs[1], fs[2] ); + this.matrix.transform( vec ); + vec.normalize(); + return new float[] { vec.x, vec.y, vec.z }; + case 4: + Vector4f vecc = new Vector4f( fs[0], fs[1], fs[2], fs[3] ); + this.matrix.transform( vecc ); + vecc.normalize(); + return new float[] { vecc.x, vecc.y, vecc.z, vecc.w }; + + default: + return fs; + } + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/Merge.java b/src/main/java/appeng/client/render/model/pipeline/Merge.java new file mode 100644 index 000000000..a6b60ffd6 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/Merge.java @@ -0,0 +1,37 @@ + +package appeng.client.render.model.pipeline; + + +import java.util.ArrayList; +import java.util.List; + +import com.google.common.collect.ImmutableList; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; + +import appeng.api.client.BakingPipelineElement; + + +public class Merge implements BakingPipelineElement +{ + + private final ImmutableList> pipeline; + + public Merge( BakingPipelineElement... pipeline ) + { + this.pipeline = ImmutableList.copyOf( pipeline ); + } + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + for( BakingPipelineElement element : pipeline ) + { + elements.addAll( element.pipe( new ArrayList<>(), parent, state, side, rand ) ); + } + return elements; + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/ParentQuads.java b/src/main/java/appeng/client/render/model/pipeline/ParentQuads.java new file mode 100644 index 000000000..bd45579f5 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/ParentQuads.java @@ -0,0 +1,21 @@ +package appeng.client.render.model.pipeline; + +import java.util.List; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; + +import appeng.api.client.BakingPipelineElement; + +public class ParentQuads implements BakingPipelineElement +{ + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + return parent.getQuads( state, side, rand ); + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/QuadVertexData.java b/src/main/java/appeng/client/render/model/pipeline/QuadVertexData.java new file mode 100644 index 000000000..993b281ca --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/QuadVertexData.java @@ -0,0 +1,121 @@ + +package appeng.client.render.model.pipeline; + + +import java.lang.reflect.Field; + +import com.google.common.base.Throwables; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad; +import net.minecraftforge.fml.relauncher.ReflectionHelper; + + +public final class QuadVertexData +{ + + private static final Field unpackedData = ReflectionHelper.findField( UnpackedBakedQuad.class, "unpackedData" ); + + private static float[][][] unpackedData( UnpackedBakedQuad quad ) + { + try + { + return (float[][][]) unpackedData.get( quad ); + } + catch( Exception e ) + { + throw Throwables.propagate( e ); + } + } + + private VertexFormat format; + private float[][][] data; + + private int tintIndex; + private EnumFacing face; + private TextureAtlasSprite sprite; + protected boolean applyDiffuseLighting; + + public QuadVertexData( VertexFormat format, float[][][] data, int tintIndex, EnumFacing face, TextureAtlasSprite sprite, boolean applyDiffuseLighting ) + { + this.format = format; + this.data = data; + this.tintIndex = tintIndex; + this.face = face; + this.sprite = sprite; + this.applyDiffuseLighting = applyDiffuseLighting; + } + + public QuadVertexData( UnpackedBakedQuad quad ) + { + this( quad.getFormat(), unpackedData( quad ), quad.getTintIndex(), quad.getFace(), quad.getSprite(), quad.shouldApplyDiffuseLighting() ); + } + + public UnpackedBakedQuad toQuad() + { + return new UnpackedBakedQuad( data, tintIndex, face, sprite, applyDiffuseLighting, format ); + } + + public VertexFormat getFormat() + { + return format; + } + + public void setFormat( VertexFormat format ) + { + this.format = format; + } + + public float[][][] getData() + { + return data; + } + + public void setData( float[][][] data ) + { + this.data = data; + } + + public int getTintIndex() + { + return tintIndex; + } + + public void setTintIndex( int tintIndex ) + { + this.tintIndex = tintIndex; + } + + public EnumFacing getFace() + { + return face; + } + + public void setFace( EnumFacing face ) + { + this.face = face; + } + + public TextureAtlasSprite getSprite() + { + return sprite; + } + + public void setSprite( TextureAtlasSprite sprite ) + { + this.sprite = sprite; + } + + public boolean shouldApplyDiffuseLighting() + { + return applyDiffuseLighting; + } + + public void setApplyDiffuseLighting( boolean applyDiffuseLighting ) + { + this.applyDiffuseLighting = applyDiffuseLighting; + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/StatePosRecolorator.java b/src/main/java/appeng/client/render/model/pipeline/StatePosRecolorator.java new file mode 100644 index 000000000..ce9186ce6 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/StatePosRecolorator.java @@ -0,0 +1,71 @@ + +package appeng.client.render.model.pipeline; + + +import java.util.List; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; + +import appeng.api.client.BakingPipelineElement; + + +public class StatePosRecolorator implements BakingPipelineElement +{ + + private IBlockAccess blockAccess; + private BlockPos pos; + private IBlockState state; + + public StatePosRecolorator( IBlockAccess blockAccess, BlockPos pos, IBlockState state ) + { + this.blockAccess = blockAccess; + this.pos = pos; + this.state = state; + } + + public IBlockAccess getBlockAccess() + { + return blockAccess; + } + + public void setBlockAccess( IBlockAccess blockAccess ) + { + this.blockAccess = blockAccess; + } + + public BlockPos getPos() + { + return pos; + } + + public void setPos( BlockPos pos ) + { + this.pos = pos; + } + + public IBlockState getState() + { + return state; + } + + public void setState( IBlockState state ) + { + this.state = state; + } + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + for( QuadVertexData data : elements ) + { + data.setTintIndex( Minecraft.getMinecraft().getBlockColors().colorMultiplier( this.state, blockAccess, this.pos, data.getTintIndex() ) ); + } + return elements; + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/TintIndexModifier.java b/src/main/java/appeng/client/render/model/pipeline/TintIndexModifier.java new file mode 100644 index 000000000..575dbea0f --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/TintIndexModifier.java @@ -0,0 +1,45 @@ + +package appeng.client.render.model.pipeline; + + +import java.util.List; +import java.util.function.Function; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; + +import appeng.api.client.BakingPipelineElement; + + +public class TintIndexModifier implements BakingPipelineElement +{ + + private Function tintTransformer; + + public TintIndexModifier( Function tintTransformer ) + { + this.tintTransformer = tintTransformer; + } + + public Function getTintTransformer() + { + return tintTransformer; + } + + public void setTintTransformer( Function tintTransformer ) + { + this.tintTransformer = tintTransformer; + } + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + for( QuadVertexData quad : elements ) + { + quad.setTintIndex( tintTransformer.apply( quad.getTintIndex() ) ); + } + return elements; + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/TypeTransformer.java b/src/main/java/appeng/client/render/model/pipeline/TypeTransformer.java new file mode 100644 index 000000000..34f595326 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/TypeTransformer.java @@ -0,0 +1,63 @@ + +package appeng.client.render.model.pipeline; + + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.client.model.pipeline.LightUtil; +import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad; + +import appeng.api.client.BakingPipelineElement; + + +public class TypeTransformer +{ + + public static final BakingPipelineElement quads2vecs = new BakingPipelineElement(){ + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + return Lists.transform( elements, ( quad ) -> { + if( quad instanceof UnpackedBakedQuad ) + { + return new QuadVertexData( (UnpackedBakedQuad) quad ); + } + else + { + int[] qdata = quad.getVertexData(); + float[][][] data = new float[4][quad.getFormat().getElementCount()][4]; + for( int v = 0; v < data.length; v++ ) + { + float[][] vd = data[v]; + for( int e = 0; e < vd.length; e++ ) + { + LightUtil.unpack( qdata, vd[e], quad.getFormat(), v, e ); + } + } + return new QuadVertexData( quad.getFormat(), data, quad.getTintIndex(), quad.getFace(), quad.getSprite(), quad.shouldApplyDiffuseLighting() ); + } + } ); + } + + }; + + public static final BakingPipelineElement vecs2quads = new BakingPipelineElement(){ + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + return Lists.transform( elements, ( data ) -> { + return data.toQuad(); + } ); + } + + }; + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/cable/CableAndConnections.java b/src/main/java/appeng/client/render/model/pipeline/cable/CableAndConnections.java new file mode 100644 index 000000000..26921c918 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/cable/CableAndConnections.java @@ -0,0 +1,53 @@ + +package appeng.client.render.model.pipeline.cable; + + +import java.util.List; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.property.IExtendedBlockState; + +import appeng.api.client.BakingPipeline; +import appeng.api.client.BakingPipelineElement; +import appeng.api.implementations.parts.IPartCable; +import appeng.api.parts.IPart; +import appeng.api.util.AEPartLocation; +import appeng.block.networking.BlockCableBus; +import appeng.client.render.model.pipeline.TintIndexModifier; +import appeng.parts.CableBusContainer; + + +public class CableAndConnections implements BakingPipelineElement +{ + + private final BakingPipeline rotatingPipeline; + private final TintIndexModifier tintIndexModifier; + private final BakingPipeline tintIndexFixPipeline; + + public CableAndConnections( BakingPipeline rotatingPipeline, TintIndexModifier tintIndexModifier, BakingPipeline tintIndexFixPipeline ) + { + this.rotatingPipeline = rotatingPipeline; + this.tintIndexModifier = tintIndexModifier; + this.tintIndexFixPipeline = tintIndexFixPipeline; + } + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + if( state != null ) + { + CableBusContainer cableBus = ( (IExtendedBlockState) state ).getValue( BlockCableBus.cableBus ); + IPart part = cableBus.getPart( AEPartLocation.INTERNAL ); + if( part instanceof IPartCable ) + { + tintIndexModifier.setTintTransformer( tint -> ( AEPartLocation.INTERNAL.ordinal() << 2 ) | tint ); + elements.addAll( tintIndexFixPipeline.pipe( ( (IPartCable) part ).getOrBakeQuads( rotatingPipeline, state, side, rand ), parent, state, side, rand ) ); + } + } + return elements; + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/cable/Facades.java b/src/main/java/appeng/client/render/model/pipeline/cable/Facades.java new file mode 100644 index 000000000..6b5fcdec4 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/cable/Facades.java @@ -0,0 +1,55 @@ + +package appeng.client.render.model.pipeline.cable; + + +import java.util.List; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.property.IExtendedBlockState; + +import appeng.api.client.BakingPipeline; +import appeng.api.client.BakingPipelineElement; +import appeng.api.parts.IFacadePart; +import appeng.api.util.AEPartLocation; +import appeng.block.networking.BlockCableBus; +import appeng.client.render.model.pipeline.TintIndexModifier; +import appeng.parts.CableBusContainer; + + +public class Facades implements BakingPipelineElement +{ + + private final BakingPipeline rotatingPipeline; + private final TintIndexModifier tintIndexModifier; + private final BakingPipeline tintIndexFixPipeline; + + public Facades( BakingPipeline rotatingPipeline, TintIndexModifier tintIndexModifier, BakingPipeline tintIndexFixPipeline ) + { + this.rotatingPipeline = rotatingPipeline; + this.tintIndexModifier = tintIndexModifier; + this.tintIndexFixPipeline = tintIndexFixPipeline; + } + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + if( state != null ) + { + CableBusContainer cableBus = ( (IExtendedBlockState) state ).getValue( BlockCableBus.cableBus ); + for( AEPartLocation facing : AEPartLocation.SIDE_LOCATIONS ) + { + IFacadePart facade = cableBus.getFacadeContainer().getFacade( facing ); + if( facade != null ) + { + tintIndexModifier.setTintTransformer( tint -> ( facing.ordinal() << 2 ) | tint ); + elements.addAll( tintIndexFixPipeline.pipe( facade.getOrBakeQuads( cableBus, rotatingPipeline, state, side, rand ), parent, state, side, rand ) ); + } + } + } + return elements; + } + +} diff --git a/src/main/java/appeng/client/render/model/pipeline/cable/Parts.java b/src/main/java/appeng/client/render/model/pipeline/cable/Parts.java new file mode 100644 index 000000000..bcd041255 --- /dev/null +++ b/src/main/java/appeng/client/render/model/pipeline/cable/Parts.java @@ -0,0 +1,55 @@ + +package appeng.client.render.model.pipeline.cable; + + +import java.util.List; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.property.IExtendedBlockState; + +import appeng.api.client.BakingPipeline; +import appeng.api.client.BakingPipelineElement; +import appeng.api.parts.IPart; +import appeng.api.util.AEPartLocation; +import appeng.block.networking.BlockCableBus; +import appeng.client.render.model.pipeline.TintIndexModifier; +import appeng.parts.CableBusContainer; + + +public class Parts implements BakingPipelineElement +{ + + private final BakingPipeline rotatingPipeline; + private final TintIndexModifier tintIndexModifier; + private final BakingPipeline tintIndexFixPipeline; + + public Parts( BakingPipeline rotatingPipeline, TintIndexModifier tintIndexModifier, BakingPipeline tintIndexFixPipeline ) + { + this.rotatingPipeline = rotatingPipeline; + this.tintIndexModifier = tintIndexModifier; + this.tintIndexFixPipeline = tintIndexFixPipeline; + } + + @Override + public List pipe( List elements, IBakedModel parent, IBlockState state, EnumFacing side, long rand ) + { + if( state != null ) + { + CableBusContainer cableBus = ( (IExtendedBlockState) state ).getValue( BlockCableBus.cableBus ); + for( AEPartLocation facing : AEPartLocation.SIDE_LOCATIONS ) + { + IPart part = cableBus.getPart( facing ); + if( part != null ) + { + tintIndexModifier.setTintTransformer( tint -> ( facing.ordinal() << 2 ) | tint ); + elements.addAll( tintIndexFixPipeline.pipe( part.getOrBakeQuads( rotatingPipeline, state, side, rand ), parent, state, side, rand ) ); + } + } + } + return elements; + } + +} diff --git a/src/main/java/appeng/core/FacadeConfig.java b/src/main/java/appeng/core/FacadeConfig.java index dda88f33e..98d0f7450 100644 --- a/src/main/java/appeng/core/FacadeConfig.java +++ b/src/main/java/appeng/core/FacadeConfig.java @@ -58,7 +58,7 @@ public class FacadeConfig extends Configuration { if( f.get( Block.class ) == id ) { - return this.get( "minecraft", f.getName() + ( metadata == 0 ? "" : "." + metadata ), automatic ).getBoolean( automatic ); + return this.get( "minecraft", f.getName() + ( metadata == 0 ? "" : "/" + metadata ), automatic ).getBoolean( automatic ); } } catch( final Throwable e ) diff --git a/src/main/java/appeng/core/api/ApiPart.java b/src/main/java/appeng/core/api/ApiPart.java index fbe7bd59b..728032056 100644 --- a/src/main/java/appeng/core/api/ApiPart.java +++ b/src/main/java/appeng/core/api/ApiPart.java @@ -42,6 +42,7 @@ import org.objectweb.asm.tree.MethodNode; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; @@ -326,7 +327,7 @@ public class ApiPart implements IPartHelper } @Override - public boolean placeBus( final ItemStack is, final BlockPos pos, final EnumFacing side, final EntityPlayer player, final EnumHand hand, final World w ) + public EnumActionResult placeBus( final ItemStack is, final BlockPos pos, final EnumFacing side, final EntityPlayer player, final EnumHand hand, final World w ) { return PartPlacement.place( is, pos, side, player, hand, w, PartPlacement.PlaceType.PLACE_ITEM, 0 ); } diff --git a/src/main/java/appeng/core/features/AECableBusFeatureHandler.java b/src/main/java/appeng/core/features/AECableBusFeatureHandler.java index d7e0bde1c..f89247969 100644 --- a/src/main/java/appeng/core/features/AECableBusFeatureHandler.java +++ b/src/main/java/appeng/core/features/AECableBusFeatureHandler.java @@ -20,25 +20,43 @@ package appeng.core.features; import java.util.EnumSet; +import java.util.Set; import com.google.common.base.Optional; +import com.google.common.collect.Sets; +import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ModelBakery; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.color.IBlockColor; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.IRegistry; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; +import appeng.api.client.BakingPipeline; import appeng.api.definitions.ITileDefinition; +import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; import appeng.block.networking.BlockCableBus; +import appeng.client.render.model.pipeline.BakingPipelineBakedModel; +import appeng.client.render.model.pipeline.FacingQuadRotator; +import appeng.client.render.model.pipeline.Merge; +import appeng.client.render.model.pipeline.TintIndexModifier; +import appeng.client.render.model.pipeline.TypeTransformer; +import appeng.client.render.model.pipeline.cable.CableAndConnections; +import appeng.client.render.model.pipeline.cable.Facades; +import appeng.client.render.model.pipeline.cable.Parts; import appeng.core.AppEng; import appeng.core.CommonHelper; import appeng.core.CreativeTab; +import appeng.parts.CableBusContainer; import appeng.util.Platform; @@ -106,6 +124,7 @@ public final class AECableBusFeatureHandler implements IFeatureHandler @Override public void registerModel() { + Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler( new CableBusColor(), this.featured ); Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( this.definition.maybeItem().get(), 0, new ModelResourceLocation( registryName, "normal" ) ); } @@ -118,6 +137,40 @@ public final class AECableBusFeatureHandler implements IFeatureHandler @Override public void registerCustomModelOverride( IRegistry modelRegistry ) { + final BakingPipeline rotatingPipeline = new BakingPipeline( TypeTransformer.quads2vecs, new FacingQuadRotator(), TypeTransformer.vecs2quads ); + final TintIndexModifier tintIndexModifier = new TintIndexModifier( tint -> tint ); + final BakingPipeline tintIndexFixPipeline = new BakingPipeline( TypeTransformer.quads2vecs, tintIndexModifier, TypeTransformer.vecs2quads ); + Set keys = Sets.newHashSet( modelRegistry.getKeys() ); + for( ModelResourceLocation model : keys ) + { + if( model.getResourceDomain().equals( registryName.getResourceDomain() ) && model.getResourcePath().equals( registryName.getResourcePath() ) ) + { + modelRegistry.putObject( model, new BakingPipelineBakedModel( modelRegistry.getObject( model ), new Merge( new CableAndConnections( rotatingPipeline, tintIndexModifier, tintIndexFixPipeline ), new Facades( rotatingPipeline, tintIndexModifier, tintIndexFixPipeline ), new Parts( rotatingPipeline, tintIndexModifier, tintIndexFixPipeline ) ) ) ); + } + } + } + public static class CableBusColor implements IBlockColor + { + + @Override + public int colorMultiplier( IBlockState state, IBlockAccess worldIn, BlockPos pos, int color ) + { + AEPartLocation side = AEPartLocation.fromOrdinal( ( color >> 2 ) & 7 ); + CableBusContainer bus = ( (IExtendedBlockState) state ).getValue( BlockCableBus.cableBus ); + switch( color & 3 ) + { + case 0: + return bus.getGridNode( side ) != null && bus.getGridNode( side ).isActive() ? 0xffffff : 0; + case 1: + return bus.getColor().blackVariant; + case 2: + return bus.getColor().mediumVariant; + case 3: + return bus.getColor().whiteVariant; + default: + return color; + } + } } } diff --git a/src/main/java/appeng/facade/FacadePart.java b/src/main/java/appeng/facade/FacadePart.java index 786c1d587..85d2a3af2 100644 --- a/src/main/java/appeng/facade/FacadePart.java +++ b/src/main/java/appeng/facade/FacadePart.java @@ -19,27 +19,48 @@ package appeng.facade; +import java.util.ArrayList; import java.util.EnumSet; +import java.util.List; import javax.annotation.Nullable; +import org.lwjgl.util.vector.Matrix4f; +import org.lwjgl.util.vector.Vector3f; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3i; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.model.TRSRTransformation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.AEApi; +import appeng.api.client.BakingPipeline; import appeng.api.parts.IBoxProvider; import appeng.api.parts.IFacadeContainer; import appeng.api.parts.IFacadePart; import appeng.api.parts.IPartCollisionHelper; import appeng.api.parts.IPartHost; import appeng.api.util.AEPartLocation; +import appeng.client.render.model.ModelsCache; +import appeng.client.render.model.pipeline.MatVecApplicator; +import appeng.client.render.model.pipeline.ParentQuads; +import appeng.client.render.model.pipeline.StatePosRecolorator; +import appeng.client.render.model.pipeline.TypeTransformer; +import appeng.core.AppEng; import appeng.integration.IntegrationRegistry; import appeng.integration.IntegrationType; import appeng.integration.abstraction.IBuildCraftTransport; @@ -147,7 +168,7 @@ public class FacadePart implements IFacadePart, IBoxProvider final ItemStack is = this.getTexture(); final Block blk = Block.getBlockFromItem( is.getItem() ); - return !blk.isOpaqueCube(blk.getDefaultState()); + return !blk.isOpaqueCube( blk.getDefaultState() ); } @Nullable @@ -237,7 +258,7 @@ public class FacadePart implements IFacadePart, IBoxProvider * if ( out.contains( AEPartLocation.EAST ) && (side.offsetY != 0) ) { IFacadePart fp = fc.getFacade( * AEPartLocation.EAST ); if ( fp != null && (fp.isTransparent() == facade.isTransparent()) ) out.remove( * AEPartLocation.EAST ); } - * if ( out.contains( AEPartLocation.WEST ) && (side.offsetY != 0) ) { IFacadePart fp = fc.getFacade( + * if ( out.contains( AEPartLocation.WEST ) && (side.offsetY != 0) ) { IFacadePart fp = fc.getFacade(s * AEPartLocation.WEST ); if ( fp != null && (fp.isTransparent() == facade.isTransparent()) ) out.remove( * AEPartLocation.WEST ); } */ @@ -262,4 +283,24 @@ public class FacadePart implements IFacadePart, IBoxProvider { this.getBoxes( bch, null ); } + + @Override + @SideOnly( Side.CLIENT ) + public List getOrBakeQuads( IPartHost host, BakingPipeline rotatingPipeline, IBlockState state, EnumFacing side, long rand ) + { + List elements = new ArrayList(); + elements.addAll( rotatingPipeline.pipe( ModelsCache.INSTANCE.getOrLoadBakedModel( new ResourceLocation( AppEng.MOD_ID, "part/cable_facade" ) ).getQuads( state, side, rand ), null, state, getSide().getFacing(), rand ) ); + + ItemStack titem = getTexture(); + if( titem != null && titem.getItem() != null && Block.getBlockFromItem( titem.getItem() ) != null ) + { + Block tblock = Block.getBlockFromItem( titem.getItem() ); + IBlockState tstate = tblock.getStateFromMeta( titem.getItem().getMetadata( titem.getItemDamage() ) ); + Vec3i s = getSide().getFacing().getDirectionVec(); + Vector3f scale = new Vector3f( s.getX() == 0 ? 0.9999f : 0.125f, s.getY() == 0 ? 0.9999f : 0.125f, s.getZ() == 0 ? 0.9999f : 0.125f ); + Vector3f trans = new Vector3f( s.getX() * 3.5f, s.getY() * 3.5f, s.getZ() * 3.5f ); + elements.addAll( new BakingPipeline( new ParentQuads(), TypeTransformer.quads2vecs, new MatVecApplicator( TRSRTransformation.toVecmath( new Matrix4f().scale( scale ).translate( trans ) ), true ), new StatePosRecolorator( host.getTile().getWorld(), host.getLocation().getPos(), tstate ), TypeTransformer.vecs2quads ).pipe( new ArrayList<>(), Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState( tstate ), tstate, side, rand ) ); + } + return elements; + } } diff --git a/src/main/java/appeng/items/parts/ItemFacade.java b/src/main/java/appeng/items/parts/ItemFacade.java index b102ffac5..9ca044895 100644 --- a/src/main/java/appeng/items/parts/ItemFacade.java +++ b/src/main/java/appeng/items/parts/ItemFacade.java @@ -48,7 +48,6 @@ import appeng.api.parts.IAlphaPassItem; import appeng.api.util.AEPartLocation; import appeng.core.FacadeConfig; import appeng.core.features.AEFeature; -import appeng.decorative.solid.BlockQuartzOre; import appeng.facade.FacadePart; import appeng.facade.IFacadeItem; import appeng.items.AEBaseItem; @@ -68,7 +67,7 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte @Override public EnumActionResult onItemUseFirst( final ItemStack is, final EntityPlayer player, final World world, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ, final EnumHand hand ) { - return AEApi.instance().partHelper().placeBus( is, pos, side, player, hand, world ) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; + return AEApi.instance().partHelper().placeBus( is, pos, side, player, hand, world ); } @Override @@ -148,11 +147,8 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte final int metadata = l.getItem().getMetadata( l.getItemDamage() ); - final boolean hasTile = b.hasTileEntity( b.getStateFromMeta( metadata ) ); - final boolean enableGlass = b instanceof BlockGlass || b instanceof BlockStainedGlass; - final boolean disableOre = b instanceof BlockQuartzOre; - - final boolean defaultValue = ( b.isOpaqueCube(b.getDefaultState()) && !b.getTickRandomly() && !hasTile && !disableOre ) || enableGlass; + // TODO 1.10.2-R - XD + final boolean defaultValue = true || b instanceof BlockGlass || b instanceof BlockStainedGlass; if( FacadeConfig.instance.checkEnabled( b, metadata, defaultValue ) ) { if( returnItem ) diff --git a/src/main/java/appeng/items/parts/ItemMultiPart.java b/src/main/java/appeng/items/parts/ItemMultiPart.java index a3fce691a..c210af3ac 100644 --- a/src/main/java/appeng/items/parts/ItemMultiPart.java +++ b/src/main/java/appeng/items/parts/ItemMultiPart.java @@ -35,6 +35,8 @@ import javax.annotation.Nullable; import com.google.common.base.Preconditions; +import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -81,6 +83,12 @@ public final class ItemMultiPart extends AEBaseItem implements IPartItem, IItemG instance = this; } + @Override + public ItemMeshDefinition getItemMeshDefinition() + { + return itemstack -> new ModelResourceLocation( getTypeByStack( itemstack ).getModel(), null ); + } + @Nonnull public final ItemStackSrc createPart( final PartType mat ) { @@ -177,7 +185,7 @@ public final class ItemMultiPart extends AEBaseItem implements IPartItem, IItemG return EnumActionResult.PASS; } - return AEApi.instance().partHelper().placeBus( is, pos, side, player, hand, w ) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; + return AEApi.instance().partHelper().placeBus( is, pos, side, player, hand, w ); } @Override diff --git a/src/main/java/appeng/items/parts/PartType.java b/src/main/java/appeng/items/parts/PartType.java index c7564b39e..f09dacde8 100644 --- a/src/main/java/appeng/items/parts/PartType.java +++ b/src/main/java/appeng/items/parts/PartType.java @@ -24,7 +24,10 @@ import java.util.Collections; import java.util.EnumSet; import java.util.Set; +import net.minecraft.util.ResourceLocation; + import appeng.api.parts.IPart; +import appeng.core.AppEng; import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.integration.IntegrationType; @@ -62,9 +65,9 @@ import appeng.parts.reporting.PartTerminal; public enum PartType { - InvalidType( -1, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), null ), + InvalidType( -1, new ResourceLocation( AppEng.MOD_ID, "invalid" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), null ), - CableGlass( 0, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartCableGlass.class ) + CableGlass( 0, new ResourceLocation( AppEng.MOD_ID, "cable_glass" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartCableGlass.class ) { @Override public boolean isCable() @@ -73,7 +76,7 @@ public enum PartType } }, - CableCovered( 20, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartCableCovered.class ) + CableCovered( 20, new ResourceLocation( AppEng.MOD_ID, "cable_covered" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartCableCovered.class ) { @Override public boolean isCable() @@ -82,7 +85,7 @@ public enum PartType } }, - CableSmart( 40, EnumSet.of( AEFeature.Channels ), EnumSet.noneOf( IntegrationType.class ), PartCableSmart.class ) + CableSmart( 40, new ResourceLocation( AppEng.MOD_ID, "cable_smart" ), EnumSet.of( AEFeature.Channels ), EnumSet.noneOf( IntegrationType.class ), PartCableSmart.class ) { @Override public boolean isCable() @@ -91,7 +94,7 @@ public enum PartType } }, - CableDense( 60, EnumSet.of( AEFeature.Channels ), EnumSet.noneOf( IntegrationType.class ), PartDenseCable.class ) + CableDense( 60, new ResourceLocation( AppEng.MOD_ID, "cable_dense" ), EnumSet.of( AEFeature.Channels ), EnumSet.noneOf( IntegrationType.class ), PartDenseCable.class ) { @Override public boolean isCable() @@ -100,53 +103,53 @@ public enum PartType } }, - ToggleBus( 80, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartToggleBus.class ), + ToggleBus( 80, new ResourceLocation( AppEng.MOD_ID, "toggle_bus" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartToggleBus.class ), - InvertedToggleBus( 100, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartInvertedToggleBus.class ), + InvertedToggleBus( 100, new ResourceLocation( AppEng.MOD_ID, "inverted_toggle_bus" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartInvertedToggleBus.class ), - CableAnchor( 120, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartCableAnchor.class ), + CableAnchor( 120, new ResourceLocation( AppEng.MOD_ID, "cable_anchor" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartCableAnchor.class ), - QuartzFiber( 140, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartQuartzFiber.class ), + QuartzFiber( 140, new ResourceLocation( AppEng.MOD_ID, "quartz_fiber" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartQuartzFiber.class ), - Monitor( 160, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartPanel.class ), + Monitor( 160, new ResourceLocation( AppEng.MOD_ID, "monitor" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartPanel.class ), - SemiDarkMonitor( 180, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartSemiDarkPanel.class ), + SemiDarkMonitor( 180, new ResourceLocation( AppEng.MOD_ID, "semi_dark_monitor" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartSemiDarkPanel.class ), - DarkMonitor( 200, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartDarkPanel.class ), + DarkMonitor( 200, new ResourceLocation( AppEng.MOD_ID, "dark_monitor" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartDarkPanel.class ), - StorageBus( 220, EnumSet.of( AEFeature.StorageBus ), EnumSet.noneOf( IntegrationType.class ), PartStorageBus.class ), + StorageBus( 220, new ResourceLocation( AppEng.MOD_ID, "storage_bus" ), EnumSet.of( AEFeature.StorageBus ), EnumSet.noneOf( IntegrationType.class ), PartStorageBus.class ), - ImportBus( 240, EnumSet.of( AEFeature.ImportBus ), EnumSet.noneOf( IntegrationType.class ), PartImportBus.class ), + ImportBus( 240, new ResourceLocation( AppEng.MOD_ID, "import_bus" ), EnumSet.of( AEFeature.ImportBus ), EnumSet.noneOf( IntegrationType.class ), PartImportBus.class ), - ExportBus( 260, EnumSet.of( AEFeature.ExportBus ), EnumSet.noneOf( IntegrationType.class ), PartExportBus.class ), + ExportBus( 260, new ResourceLocation( AppEng.MOD_ID, "export_bus" ), EnumSet.of( AEFeature.ExportBus ), EnumSet.noneOf( IntegrationType.class ), PartExportBus.class ), - LevelEmitter( 280, EnumSet.of( AEFeature.LevelEmitter ), EnumSet.noneOf( IntegrationType.class ), PartLevelEmitter.class ), + LevelEmitter( 280, new ResourceLocation( AppEng.MOD_ID, "level_emitter" ), EnumSet.of( AEFeature.LevelEmitter ), EnumSet.noneOf( IntegrationType.class ), PartLevelEmitter.class ), - AnnihilationPlane( 300, EnumSet.of( AEFeature.AnnihilationPlane ), EnumSet.noneOf( IntegrationType.class ), PartAnnihilationPlane.class ), + AnnihilationPlane( 300, new ResourceLocation( AppEng.MOD_ID, "annihilation_plane" ), EnumSet.of( AEFeature.AnnihilationPlane ), EnumSet.noneOf( IntegrationType.class ), PartAnnihilationPlane.class ), - IdentityAnnihilationPlane( 301, EnumSet.of( AEFeature.AnnihilationPlane, AEFeature.IdentityAnnihilationPlane ), EnumSet.noneOf( IntegrationType.class ), PartIdentityAnnihilationPlane.class ), + IdentityAnnihilationPlane( 301, new ResourceLocation( AppEng.MOD_ID, "identity_annihilation_plane" ), EnumSet.of( AEFeature.AnnihilationPlane, AEFeature.IdentityAnnihilationPlane ), EnumSet.noneOf( IntegrationType.class ), PartIdentityAnnihilationPlane.class ), - FormationPlane( 320, EnumSet.of( AEFeature.FormationPlane ), EnumSet.noneOf( IntegrationType.class ), PartFormationPlane.class ), + FormationPlane( 320, new ResourceLocation( AppEng.MOD_ID, "formation_plane" ), EnumSet.of( AEFeature.FormationPlane ), EnumSet.noneOf( IntegrationType.class ), PartFormationPlane.class ), - PatternTerminal( 340, EnumSet.of( AEFeature.Patterns ), EnumSet.noneOf( IntegrationType.class ), PartPatternTerminal.class ), + PatternTerminal( 340, new ResourceLocation( AppEng.MOD_ID, "pattern_terminal" ), EnumSet.of( AEFeature.Patterns ), EnumSet.noneOf( IntegrationType.class ), PartPatternTerminal.class ), - CraftingTerminal( 360, EnumSet.of( AEFeature.CraftingTerminal ), EnumSet.noneOf( IntegrationType.class ), PartCraftingTerminal.class ), + CraftingTerminal( 360, new ResourceLocation( AppEng.MOD_ID, "crafting_terminal" ), EnumSet.of( AEFeature.CraftingTerminal ), EnumSet.noneOf( IntegrationType.class ), PartCraftingTerminal.class ), - Terminal( 380, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartTerminal.class ), + Terminal( 380, new ResourceLocation( AppEng.MOD_ID, "terminal" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartTerminal.class ), - StorageMonitor( 400, EnumSet.of( AEFeature.StorageMonitor ), EnumSet.noneOf( IntegrationType.class ), PartStorageMonitor.class ), + StorageMonitor( 400, new ResourceLocation( AppEng.MOD_ID, "storage_monitor" ), EnumSet.of( AEFeature.StorageMonitor ), EnumSet.noneOf( IntegrationType.class ), PartStorageMonitor.class ), - ConversionMonitor( 420, EnumSet.of( AEFeature.PartConversionMonitor ), EnumSet.noneOf( IntegrationType.class ), PartConversionMonitor.class ), + ConversionMonitor( 420, new ResourceLocation( AppEng.MOD_ID, "conversion_monitor" ), EnumSet.of( AEFeature.PartConversionMonitor ), EnumSet.noneOf( IntegrationType.class ), PartConversionMonitor.class ), - Interface( 440, EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartInterface.class ), + Interface( 440, new ResourceLocation( AppEng.MOD_ID, "interface" ), EnumSet.of( AEFeature.Core ), EnumSet.noneOf( IntegrationType.class ), PartInterface.class ), - P2PTunnelME( 460, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelME ), EnumSet.noneOf( IntegrationType.class ), PartP2PTunnelME.class, GuiText.METunnel ), + P2PTunnelME( 460, new ResourceLocation( AppEng.MOD_ID, "p2p_tunnel_me" ), EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelME ), EnumSet.noneOf( IntegrationType.class ), PartP2PTunnelME.class, GuiText.METunnel ), - P2PTunnelRedstone( 461, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelRedstone ), EnumSet.noneOf( IntegrationType.class ), PartP2PRedstone.class, GuiText.RedstoneTunnel ), + P2PTunnelRedstone( 461, new ResourceLocation( AppEng.MOD_ID, "p2p_tunnel_redstone" ), EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelRedstone ), EnumSet.noneOf( IntegrationType.class ), PartP2PRedstone.class, GuiText.RedstoneTunnel ), - P2PTunnelItems( 462, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelItems ), EnumSet.noneOf( IntegrationType.class ), PartP2PItems.class, GuiText.ItemTunnel ), + P2PTunnelItems( 462, new ResourceLocation( AppEng.MOD_ID, "p2p_tunnel_items" ), EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelItems ), EnumSet.noneOf( IntegrationType.class ), PartP2PItems.class, GuiText.ItemTunnel ), - P2PTunnelLiquids( 463, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelLiquids ), EnumSet.noneOf( IntegrationType.class ), PartP2PLiquids.class, GuiText.FluidTunnel ), + P2PTunnelLiquids( 463, new ResourceLocation( AppEng.MOD_ID, "p2p_tunnel_liquids" ), EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelLiquids ), EnumSet.noneOf( IntegrationType.class ), PartP2PLiquids.class, GuiText.FluidTunnel ), // P2PTunnelEU( 465, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelEU ), EnumSet.of( IntegrationType.IC2 ), // PartP2PIC2Power.class, GuiText.EUTunnel ), @@ -154,7 +157,7 @@ public enum PartType // P2PTunnelRF( 466, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelRF ), EnumSet.of( IntegrationType.RF ), // PartP2PRFPower.class, GuiText.RFTunnel ), - P2PTunnelLight( 467, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelLight ), EnumSet.noneOf( IntegrationType.class ), PartP2PLight.class, GuiText.LightTunnel ), + P2PTunnelLight( 467, new ResourceLocation( AppEng.MOD_ID, "p2p_tunnel_light" ), EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelLight ), EnumSet.noneOf( IntegrationType.class ), PartP2PLight.class, GuiText.LightTunnel ), // P2PTunnelOpenComputers( 468, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelOpenComputers ), EnumSet.of( // IntegrationType.OpenComputers ), PartP2POpenComputers.class, GuiText.OCTunnel ), @@ -162,27 +165,44 @@ public enum PartType // P2PTunnelPressure( 469, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelPressure ), EnumSet.of( // IntegrationType.PneumaticCraft ), PartP2PPressure.class, GuiText.PressureTunnel ), - InterfaceTerminal( 480, EnumSet.of( AEFeature.InterfaceTerminal ), EnumSet.noneOf( IntegrationType.class ), PartInterfaceTerminal.class ); + InterfaceTerminal( 480, new ResourceLocation( AppEng.MOD_ID, "interface_terminal" ), EnumSet.of( AEFeature.InterfaceTerminal ), EnumSet.noneOf( IntegrationType.class ), PartInterfaceTerminal.class ); private final int baseDamage; + private final ResourceLocation name; private final Set features; private final Set integrations; private final Class myPart; private final GuiText extraName; private Constructor constructor; - PartType( final int baseMetaValue, final Set features, final Set integrations, final Class c ) + PartType( final int baseMetaValue, final ResourceLocation name, final Set features, final Set integrations, final Class c ) { - this( baseMetaValue, features, integrations, c, null ); + this( baseMetaValue, name, features, integrations, c, null ); } - PartType( final int baseMetaValue, final Set features, final Set integrations, final Class c, final GuiText en ) + PartType( final int baseMetaValue, final ResourceLocation name, final Set features, final Set integrations, final Class c, final GuiText en ) { + this.baseDamage = baseMetaValue; + this.name = name; this.features = Collections.unmodifiableSet( features ); this.integrations = Collections.unmodifiableSet( integrations ); this.myPart = c; this.extraName = en; - this.baseDamage = baseMetaValue; + } + + int getBaseDamage() + { + return this.baseDamage; + } + + public ResourceLocation getName() + { + return name; + } + + public ResourceLocation getModel() + { + return new ResourceLocation( name.getResourceDomain(), "part/" + name.getResourcePath() ); } public boolean isCable() @@ -220,9 +240,4 @@ public enum PartType this.constructor = constructor; } - int getBaseDamage() - { - return this.baseDamage; - } - } diff --git a/src/main/java/appeng/parts/AEBasePart.java b/src/main/java/appeng/parts/AEBasePart.java index 1eadaf42f..454fd76ec 100644 --- a/src/main/java/appeng/parts/AEBasePart.java +++ b/src/main/java/appeng/parts/AEBasePart.java @@ -24,11 +24,17 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import com.google.common.base.Function; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; import io.netty.buffer.ByteBuf; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; @@ -40,6 +46,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -47,6 +54,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.AEApi; +import appeng.api.client.BakingPipeline; import appeng.api.config.Upgrades; import appeng.api.definitions.IDefinitions; import appeng.api.implementations.IUpgradeableHost; @@ -64,8 +72,11 @@ import appeng.api.util.AEColor; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; +import appeng.client.render.model.ModelsCache; import appeng.helpers.ICustomNameObject; import appeng.helpers.IPriorityHost; +import appeng.items.parts.ItemMultiPart; +import appeng.items.parts.PartType; import appeng.me.helpers.AENetworkProxy; import appeng.me.helpers.IGridProxyable; import appeng.parts.networking.PartCable; @@ -77,6 +88,35 @@ import appeng.util.SettingsFrom; public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost, IUpgradeableHost, ICustomNameObject { + private static final Pattern PROPERTY_PATTERN = Pattern.compile( "\\$\\{([\\p{Alnum}_\\-\\.]+)\\}" ); + + public static final ResourceLocation replaceProperties( ResourceLocation location, ImmutableMap properties ) + { + Matcher m = PROPERTY_PATTERN.matcher( location.getResourcePath() ); + StringBuffer buffer = new StringBuffer(); + while( m.find() ) + { + m.appendReplacement( buffer, properties.get( m.group( 1 ) ) ); + } + m.appendTail( buffer ); + return new ResourceLocation( location.getResourceDomain(), buffer.toString() ); + } + + protected static final Function propertyTextureGetter( ImmutableMap properties ) + { + return location -> ModelsCache.DEFAULTTEXTUREGETTER.apply( replaceProperties( location, properties ) ); + } + + protected static final Function propertyTextureGetter( ImmutableMap.Builder properties ) + { + return propertyTextureGetter( properties.build() ); + } + + protected static final ResourceLocation withProperties( ResourceLocation location, ImmutableMap.Builder properties ) + { + return new ResourceLocation( location.getResourceDomain(), location.getResourcePath() + properties.build().toString() ); + } + private final AENetworkProxy proxy; private final ItemStack is; private TileEntity tile = null; @@ -97,6 +137,16 @@ public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost, return this.host; } + public PartType getType() + { + return ItemMultiPart.instance.getTypeByStack( is ); + } + + public ResourceLocation getDefaultModelLocation() + { + return getType().getModel(); + } + @Override public IGridNode getGridNode( final AEPartLocation dir ) { @@ -319,7 +369,7 @@ public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost, } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 3; } @@ -515,6 +565,18 @@ public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost, return false; } + @Override + @SideOnly( Side.CLIENT ) + public List getOrBakeQuads( BakingPipeline rotatingPipeline, IBlockState state, EnumFacing side, long rand ) + { + return rotatingPipeline.pipe( ModelsCache.INSTANCE.getOrLoadModel( withProperties( getDefaultModelLocation(), propertiesForModel( getSide().getFacing() ) ), getDefaultModelLocation(), propertyTextureGetter( propertiesForModel( getSide().getFacing() ) ) ).getQuads( state, side, rand ), null, state, getSide().getFacing(), rand ); + } + + protected ImmutableMap.Builder propertiesForModel( EnumFacing facing ) + { + return ImmutableMap.builder().put( "color", getColor().name() ); + } + public AEPartLocation getSide() { return this.side; diff --git a/src/main/java/appeng/parts/CableBusContainer.java b/src/main/java/appeng/parts/CableBusContainer.java index 1a9eda6e4..1b0acfff4 100644 --- a/src/main/java/appeng/parts/CableBusContainer.java +++ b/src/main/java/appeng/parts/CableBusContainer.java @@ -80,6 +80,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I private final EnumSet myLayerFlags = EnumSet.noneOf( LayerFlags.class ); private YesNo hasRedstone = YesNo.UNDECIDED; private IPartHost tcb; + //TODO 1.10.2-R - does somebody seriously want to make parts TESR??? Hope not. private boolean requiresDynamicRender = false; private boolean inWorld = false; diff --git a/src/main/java/appeng/parts/PartPlacement.java b/src/main/java/appeng/parts/PartPlacement.java index dec45c848..200b48f91 100644 --- a/src/main/java/appeng/parts/PartPlacement.java +++ b/src/main/java/appeng/parts/PartPlacement.java @@ -32,6 +32,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.SoundCategory; @@ -75,18 +76,18 @@ public class PartPlacement private final ThreadLocal placing = new ThreadLocal(); private boolean wasCanceled = false; - public static boolean place( final ItemStack held, final BlockPos pos, EnumFacing side, final EntityPlayer player, final EnumHand hand, final World world, PlaceType pass, final int depth ) + public static EnumActionResult place( final ItemStack held, final BlockPos pos, EnumFacing side, final EntityPlayer player, final EnumHand hand, final World world, PlaceType pass, final int depth ) { if( depth > 3 ) { - return false; + return EnumActionResult.FAIL; } if( held != null && Platform.isWrench( player, held, pos ) && player.isSneaking() ) { if( !Platform.hasPermissions( new DimensionalCoord( world, pos ), player ) ) { - return false; + return EnumActionResult.FAIL; } final Block block = world.getBlockState( pos ).getBlock(); @@ -140,10 +141,10 @@ public class PartPlacement player.swingArm( hand ); NetworkHandler.instance.sendToServer( new PacketPartPlacement( pos, side, getEyeOffset( player ), hand ) ); } - return true; + return EnumActionResult.SUCCESS; } - return false; + return EnumActionResult.PASS; } TileEntity tile = world.getTileEntity( pos ); @@ -165,7 +166,7 @@ public class PartPlacement { if( host.getPart( AEPartLocation.INTERNAL ) == null ) { - return false; + return EnumActionResult.FAIL; } if( host.canAddPart( held, AEPartLocation.fromFacing( side ) ) ) @@ -182,7 +183,7 @@ public class PartPlacement MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held, hand ) ); } } - return true; + return EnumActionResult.SUCCESS; } } } @@ -190,10 +191,10 @@ public class PartPlacement { player.swingArm( hand ); NetworkHandler.instance.sendToServer( new PacketPartPlacement( pos, side, getEyeOffset( player ), hand ) ); - return true; + return EnumActionResult.SUCCESS; } } - return false; + return EnumActionResult.FAIL; } } @@ -233,7 +234,7 @@ public class PartPlacement { NetworkHandler.instance.sendToServer( new PacketPartPlacement( pos, side, getEyeOffset( player ), hand ) ); } - return true; + return EnumActionResult.SUCCESS; } } } @@ -242,7 +243,7 @@ public class PartPlacement if( held == null || !( held.getItem() instanceof IPartItem ) ) { - return false; + return EnumActionResult.PASS; } BlockPos te_pos = pos; @@ -312,18 +313,18 @@ public class PartPlacement { player.swingArm( hand ); NetworkHandler.instance.sendToServer( new PacketPartPlacement( pos, side, getEyeOffset( player ), hand ) ); - return true; + return EnumActionResult.SUCCESS; } } else if( host != null && !host.canAddPart( held, AEPartLocation.fromFacing( side ) ) ) { - return false; + return EnumActionResult.FAIL; } } if( host == null ) { - return false; + return EnumActionResult.PASS; } if( !host.canAddPart( held, AEPartLocation.fromFacing( side ) ) ) @@ -341,13 +342,13 @@ public class PartPlacement } if( ( blkID == null || blkID.isReplaceable( world, te_pos ) || host != null ) ) // /&& side != - // AEPartLocation.INTERNAL - // ) + // AEPartLocation.INTERNAL + // ) { return place( held, te_pos, side.getOpposite(), player, hand, world, pass == PlaceType.INTERACT_FIRST_PASS ? PlaceType.INTERACT_SECOND_PASS : PlaceType.PLACE_ITEM, depth + 1 ); } } - return false; + return EnumActionResult.PASS; } if( !world.isRemote ) @@ -364,7 +365,7 @@ public class PartPlacement { if( !player.isSneaking() && sp.part.onActivate( player, hand, mop.hitVec ) ) { - return false; + return EnumActionResult.FAIL; } } } @@ -372,7 +373,7 @@ public class PartPlacement final DimensionalCoord dc = host.getLocation(); if( !Platform.hasPermissions( dc, player ) ) { - return false; + return EnumActionResult.FAIL; } final AEPartLocation mySide = host.addPart( held, AEPartLocation.fromFacing( side ), player, hand ); @@ -401,7 +402,7 @@ public class PartPlacement player.swingArm( hand ); NetworkHandler.instance.sendToServer( new PacketPartPlacement( pos, side, getEyeOffset( player ), hand ) ); } - return true; + return EnumActionResult.SUCCESS; } private static float getEyeOffset( final EntityPlayer p ) @@ -494,7 +495,7 @@ public class PartPlacement this.placing.set( event ); final ItemStack held = event.getEntityPlayer().getHeldItem( event.getHand() ); - if( place( held, event.getPos(), event.getFace(), event.getEntityPlayer(), event.getHand(), event.getEntityPlayer().worldObj, PlaceType.INTERACT_FIRST_PASS, 0 ) ) + if( place( held, event.getPos(), event.getFace(), event.getEntityPlayer(), event.getHand(), event.getEntityPlayer().worldObj, PlaceType.INTERACT_FIRST_PASS, 0 ) == EnumActionResult.SUCCESS ) { event.setCanceled( true ); this.wasCanceled = true; diff --git a/src/main/java/appeng/parts/automation/PartAnnihilationPlane.java b/src/main/java/appeng/parts/automation/PartAnnihilationPlane.java index 4b0cc7d36..053cf4183 100644 --- a/src/main/java/appeng/parts/automation/PartAnnihilationPlane.java +++ b/src/main/java/appeng/parts/automation/PartAnnihilationPlane.java @@ -208,7 +208,7 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 1; } diff --git a/src/main/java/appeng/parts/automation/PartExportBus.java b/src/main/java/appeng/parts/automation/PartExportBus.java index 4db177b1e..d51134128 100644 --- a/src/main/java/appeng/parts/automation/PartExportBus.java +++ b/src/main/java/appeng/parts/automation/PartExportBus.java @@ -184,7 +184,7 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 5; } diff --git a/src/main/java/appeng/parts/automation/PartFormationPlane.java b/src/main/java/appeng/parts/automation/PartFormationPlane.java index 06744d7f7..34de96cfe 100644 --- a/src/main/java/appeng/parts/automation/PartFormationPlane.java +++ b/src/main/java/appeng/parts/automation/PartFormationPlane.java @@ -274,7 +274,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 1; } diff --git a/src/main/java/appeng/parts/automation/PartImportBus.java b/src/main/java/appeng/parts/automation/PartImportBus.java index bdbdb84ac..e25e8b8ad 100644 --- a/src/main/java/appeng/parts/automation/PartImportBus.java +++ b/src/main/java/appeng/parts/automation/PartImportBus.java @@ -95,7 +95,7 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 5; } diff --git a/src/main/java/appeng/parts/automation/PartLevelEmitter.java b/src/main/java/appeng/parts/automation/PartLevelEmitter.java index 4c36dbd0d..222ca5470 100644 --- a/src/main/java/appeng/parts/automation/PartLevelEmitter.java +++ b/src/main/java/appeng/parts/automation/PartLevelEmitter.java @@ -425,7 +425,7 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 16; } diff --git a/src/main/java/appeng/parts/misc/PartCableAnchor.java b/src/main/java/appeng/parts/misc/PartCableAnchor.java index ebc85433b..4209f855e 100644 --- a/src/main/java/appeng/parts/misc/PartCableAnchor.java +++ b/src/main/java/appeng/parts/misc/PartCableAnchor.java @@ -25,17 +25,23 @@ import java.util.Random; import io.netty.buffer.ByteBuf; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import appeng.api.client.BakingPipeline; import appeng.api.networking.IGridNode; import appeng.api.parts.BusSupport; import appeng.api.parts.IPart; @@ -204,7 +210,7 @@ public class PartCableAnchor implements IPart } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 0; } @@ -226,4 +232,12 @@ public class PartCableAnchor implements IPart { return what == BusSupport.CABLE || what == BusSupport.DENSE_CABLE; } + + @Override + @SideOnly( Side.CLIENT ) + public List getOrBakeQuads( BakingPipeline rotatingPipeline, IBlockState state, EnumFacing side, long rand ) + { + return null; + } + } diff --git a/src/main/java/appeng/parts/misc/PartInterface.java b/src/main/java/appeng/parts/misc/PartInterface.java index 88ed77100..dd9b86654 100644 --- a/src/main/java/appeng/parts/misc/PartInterface.java +++ b/src/main/java/appeng/parts/misc/PartInterface.java @@ -138,7 +138,7 @@ public class PartInterface extends PartBasicState implements IGridTickable, ISto } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 4; } diff --git a/src/main/java/appeng/parts/misc/PartStorageBus.java b/src/main/java/appeng/parts/misc/PartStorageBus.java index 00ed2c7ca..5994a5142 100644 --- a/src/main/java/appeng/parts/misc/PartStorageBus.java +++ b/src/main/java/appeng/parts/misc/PartStorageBus.java @@ -265,7 +265,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 4; } diff --git a/src/main/java/appeng/parts/misc/PartToggleBus.java b/src/main/java/appeng/parts/misc/PartToggleBus.java index 7463d9abd..9bc83afc2 100644 --- a/src/main/java/appeng/parts/misc/PartToggleBus.java +++ b/src/main/java/appeng/parts/misc/PartToggleBus.java @@ -159,7 +159,7 @@ public class PartToggleBus extends PartBasicState } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 5; } diff --git a/src/main/java/appeng/parts/networking/PartCable.java b/src/main/java/appeng/parts/networking/PartCable.java index 5e8e8e8c3..917544afc 100644 --- a/src/main/java/appeng/parts/networking/PartCable.java +++ b/src/main/java/appeng/parts/networking/PartCable.java @@ -20,16 +20,29 @@ package appeng.parts.networking; import java.io.IOException; +import java.util.ArrayList; import java.util.EnumSet; +import java.util.List; + +import com.google.common.collect.ImmutableSet; + +import org.lwjgl.util.vector.Matrix4f; +import org.lwjgl.util.vector.Vector3f; import io.netty.buffer.ByteBuf; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.model.TRSRTransformation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.AEApi; +import appeng.api.client.BakingPipeline; import appeng.api.config.SecurityPermissions; import appeng.api.definitions.IParts; import appeng.api.implementations.parts.IPartCable; @@ -45,6 +58,10 @@ import appeng.api.util.AECableType; import appeng.api.util.AEColor; import appeng.api.util.AEPartLocation; import appeng.api.util.IReadOnlyCollection; +import appeng.client.render.model.ModelsCache; +import appeng.client.render.model.pipeline.FacingQuadRotator; +import appeng.client.render.model.pipeline.MatVecApplicator; +import appeng.client.render.model.pipeline.TypeTransformer; import appeng.items.parts.ItemMultiPart; import appeng.me.GridAccessException; import appeng.parts.AEBasePart; @@ -54,6 +71,8 @@ import appeng.util.Platform; public class PartCable extends AEBasePart implements IPartCable { + private static final ImmutableSet STRAIGHT_PART_LOCATIONS = ImmutableSet.of( AEPartLocation.DOWN, AEPartLocation.NORTH, AEPartLocation.EAST ); + private final int[] channelsOnSide = { 0, 0, 0, 0, 0, 0 }; private EnumSet connections = EnumSet.noneOf( AEPartLocation.class ); @@ -180,7 +199,7 @@ public class PartCable extends AEBasePart implements IPartCable final IPart p = ph.getPart( dir ); if( p instanceof IGridHost ) { - final double dist = p.cableConnectionRenderTo(); + final double dist = p.getCableConnectionLength(); if( dist > 8 ) { @@ -281,14 +300,7 @@ public class PartCable extends AEBasePart implements IPartCable final IReadOnlyCollection set = part.getGridNode().getConnections(); for( final IGridConnection gc : set ) { - if( this.getProxy().getNode().hasFlag( GridFlags.DENSE_CAPACITY ) && gc.getOtherSide( this.getProxy().getNode() ).hasFlag( GridFlags.DENSE_CAPACITY ) ) - { - sideOut |= ( gc.getUsedChannels() / 4 ) << ( 4 * thisSide.ordinal() ); - } - else - { - sideOut |= ( gc.getUsedChannels() ) << ( 4 * thisSide.ordinal() ); - } + sideOut |= ( gc.getUsedChannels() ) << ( 5 * thisSide.ordinal() ); } } } @@ -299,17 +311,7 @@ public class PartCable extends AEBasePart implements IPartCable final AEPartLocation side = gc.getDirection( n ); if( side != AEPartLocation.INTERNAL ) { - final boolean isTier2a = this.getProxy().getNode().hasFlag( GridFlags.DENSE_CAPACITY ); - final boolean isTier2b = gc.getOtherSide( this.getProxy().getNode() ).hasFlag( GridFlags.DENSE_CAPACITY ); - - if( isTier2a && isTier2b ) - { - sideOut |= ( gc.getUsedChannels() / 4 ) << ( 4 * side.ordinal() ); - } - else - { - sideOut |= gc.getUsedChannels() << ( 4 * side.ordinal() ); - } + sideOut |= gc.getUsedChannels() << ( 5 * side.ordinal() ); cs |= ( 1 << side.ordinal() ); } } @@ -346,7 +348,7 @@ public class PartCable extends AEBasePart implements IPartCable { if( d != AEPartLocation.INTERNAL ) { - final int ch = ( sideOut >> ( d.ordinal() * 4 ) ) & 0xF; + final int ch = ( sideOut >> ( d.ordinal() * 5 ) ) & 0x1F; if( ch != this.getChannelsOnSide( d.ordinal() ) ) { channelsChanged = true; @@ -379,9 +381,53 @@ public class PartCable extends AEBasePart implements IPartCable return !myC.equals( this.getConnections() ) || wasPowered != this.powered || channelsChanged; } - protected boolean nonLinear( final EnumSet sides ) + @Override + @SideOnly( Side.CLIENT ) + public List getOrBakeQuads( BakingPipeline rotatingPipeline, IBlockState state, EnumFacing side, long rand ) { - return ( sides.contains( AEPartLocation.EAST ) && sides.contains( AEPartLocation.WEST ) ) || ( sides.contains( AEPartLocation.NORTH ) && sides.contains( AEPartLocation.SOUTH ) ) || ( sides.contains( AEPartLocation.UP ) && sides.contains( AEPartLocation.DOWN ) ); + List elements = new ArrayList<>(); + if( isStraight( getHost(), connections ) ) + { + EnumFacing facing = getConnections().contains( AEPartLocation.DOWN ) ? EnumFacing.DOWN : getConnections().contains( AEPartLocation.NORTH ) ? EnumFacing.NORTH : getConnections().contains( AEPartLocation.EAST ) ? EnumFacing.EAST : EnumFacing.NORTH; + elements.addAll( rotatingPipeline.pipe( ModelsCache.INSTANCE.getOrLoadModel( withProperties( getCableConnectionType().getStraightModel(), propertiesForModel( facing ) ), getCableConnectionType().getStraightModel(), propertyTextureGetter( propertiesForModel( facing ) ) ).getQuads( state, side, rand ), null, state, connections.contains( AEPartLocation.DOWN ) ? EnumFacing.DOWN : connections.contains( AEPartLocation.NORTH ) ? EnumFacing.NORTH : connections.contains( AEPartLocation.EAST ) ? EnumFacing.EAST : EnumFacing.NORTH, rand ) ); + } + else + { + elements.addAll( ModelsCache.INSTANCE.getOrLoadModel( withProperties( getCableConnectionType().getModel(), propertiesForModel( null ) ), getCableConnectionType().getModel(), propertyTextureGetter( propertiesForModel( null ) ) ).getQuads( state, side, rand ) ); + for( EnumFacing facing : EnumFacing.values() ) + { + if( isConnected( facing ) ) + { + elements.addAll( rotatingPipeline.pipe( ModelsCache.INSTANCE.getOrLoadModel( withProperties( getCableConnectionType().getConnectionModel(), propertiesForModel( facing ) ), getCableConnectionType().getConnectionModel(), propertyTextureGetter( propertiesForModel( facing ) ) ).getQuads( state, side, rand ), null, state, facing, rand ) ); + } + else if( getHost().getPart( facing ) != null ) + { + IPart part = getHost().getPart( facing ); + if( part.getCableConnectionLength() != -1 ) + { + elements.addAll( new BakingPipeline( TypeTransformer.quads2vecs, new MatVecApplicator( TRSRTransformation.toVecmath( new Matrix4f().scale( new Vector3f( 1, 1, part.getCableConnectionLength() / 4f ) ) ) ), new FacingQuadRotator( facing ), TypeTransformer.vecs2quads ).pipe( ModelsCache.INSTANCE.getOrLoadModel( withProperties( getCableConnectionType().getConnectionModel(), propertiesForModel( facing ) ), getCableConnectionType().getConnectionModel(), propertyTextureGetter( propertiesForModel( facing ) ) ).getQuads( state, side, rand ), null, state, facing, rand ) ); + } + } + } + } + return elements; + } + + protected boolean isStraight( IPartHost host, final EnumSet sides ) + { + boolean b = false; + for( EnumFacing facing : EnumFacing.values() ) + { + b |= host.getPart( facing ) != null; + } + if( !b && sides.size() == 2 ) + { + return ( sides.contains( AEPartLocation.EAST ) && sides.contains( AEPartLocation.WEST ) ) || ( sides.contains( AEPartLocation.NORTH ) && sides.contains( AEPartLocation.SOUTH ) ) || ( sides.contains( AEPartLocation.UP ) && sides.contains( AEPartLocation.DOWN ) ); + } + else + { + return false; + } } int getChannelsOnSide( final int i ) diff --git a/src/main/java/appeng/parts/networking/PartCableSmart.java b/src/main/java/appeng/parts/networking/PartCableSmart.java index 5997cc59f..310af0299 100644 --- a/src/main/java/appeng/parts/networking/PartCableSmart.java +++ b/src/main/java/appeng/parts/networking/PartCableSmart.java @@ -19,7 +19,10 @@ package appeng.parts.networking; +import com.google.common.collect.ImmutableMap; + import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; import appeng.api.networking.IGridNode; import appeng.api.networking.events.MENetworkChannelsChanged; @@ -102,4 +105,11 @@ public class PartCableSmart extends PartCable } } } + + @Override + protected ImmutableMap.Builder propertiesForModel( EnumFacing facing ) + { + return facing != null ? super.propertiesForModel( facing ).put( "channels", String.valueOf( getChannelsOnSide( facing.ordinal() ) ) ) : super.propertiesForModel( facing ); + } + } diff --git a/src/main/java/appeng/parts/networking/PartDenseCable.java b/src/main/java/appeng/parts/networking/PartDenseCable.java index 4b5d0839b..acab24c2a 100644 --- a/src/main/java/appeng/parts/networking/PartDenseCable.java +++ b/src/main/java/appeng/parts/networking/PartDenseCable.java @@ -19,8 +19,11 @@ package appeng.parts.networking; +import com.google.common.collect.ImmutableMap.Builder; + import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; import appeng.api.networking.GridFlags; import appeng.api.networking.IGridHost; @@ -168,4 +171,11 @@ public class PartDenseCable extends PartCable { this.getHost().markForUpdate(); } + + @Override + protected Builder propertiesForModel( EnumFacing facing ) + { + return facing != null ? super.propertiesForModel( facing ).put( "channels", String.valueOf( getChannelsOnSide( facing.ordinal() ) ) ) : super.propertiesForModel( facing ); + } + } diff --git a/src/main/java/appeng/parts/networking/PartQuartzFiber.java b/src/main/java/appeng/parts/networking/PartQuartzFiber.java index be471a204..d19001c05 100644 --- a/src/main/java/appeng/parts/networking/PartQuartzFiber.java +++ b/src/main/java/appeng/parts/networking/PartQuartzFiber.java @@ -110,7 +110,7 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 16; } diff --git a/src/main/java/appeng/parts/p2p/PartP2PTunnel.java b/src/main/java/appeng/parts/p2p/PartP2PTunnel.java index 8fb07d56f..0e04dbc63 100644 --- a/src/main/java/appeng/parts/p2p/PartP2PTunnel.java +++ b/src/main/java/appeng/parts/p2p/PartP2PTunnel.java @@ -149,7 +149,7 @@ public abstract class PartP2PTunnel extends PartBasicSt } @Override - public int cableConnectionRenderTo() + public int getCableConnectionLength() { return 1; } diff --git a/src/main/java/appeng/tile/networking/TileCableBus.java b/src/main/java/appeng/tile/networking/TileCableBus.java index 19cc1cde1..62de70b2b 100644 --- a/src/main/java/appeng/tile/networking/TileCableBus.java +++ b/src/main/java/appeng/tile/networking/TileCableBus.java @@ -45,7 +45,6 @@ import appeng.api.util.AECableType; import appeng.api.util.AEColor; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; -import appeng.block.networking.BlockCableBus; import appeng.helpers.AEMultiTile; import appeng.helpers.ICustomCollision; import appeng.hooks.TickHandler; @@ -64,10 +63,6 @@ public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomColl private CableBusContainer cb = new CableBusContainer( this ); - /** - * Immibis MB Support - */ - private final boolean ImmibisMicroblocks_TransformableTileEntityMarker = true; private int oldLV = -1; // on re-calculate light when it changes @TileEvent( TileEventType.WORLD_NBT_READ ) @@ -94,27 +89,9 @@ public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomColl this.worldObj.checkLight( this.pos ); } - this.updateTileSetting(); return ret; } - protected void updateTileSetting() - { - if( this.getCableBus().isRequiresDynamicRender() ) - { - try - { - final TileCableBus tcb = (TileCableBus) BlockCableBus.getTesrTile().newInstance(); - tcb.copyFrom( this ); - this.getWorld().setTileEntity( this.pos, tcb ); - } - catch( final Throwable ignored ) - { - - } - } - } - protected void copyFrom( final TileCableBus oldTile ) { final CableBusContainer tmpCB = this.getCableBus(); @@ -285,7 +262,8 @@ public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomColl @Override public boolean isBlocked( final EnumFacing side ) { - return !this.ImmibisMicroblocks_isSideOpen( side ); + //TODO 1.10.2-R - Stuff. + return false; } @Override @@ -369,16 +347,6 @@ public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomColl return this.getCableBus().isInWorld(); } - private boolean ImmibisMicroblocks_isSideOpen( final EnumFacing side ) - { - return true; - } - - public void ImmibisMicroblocks_onMicroblocksChanged() - { - this.getCableBus().updateConnections(); - } - @Override public boolean recolourBlock( final EnumFacing side, final AEColor colour, final EntityPlayer who ) { diff --git a/src/main/java/appeng/tile/networking/TileCableBusTESR.java b/src/main/java/appeng/tile/networking/TileCableBusTESR.java deleted file mode 100644 index 1de4bee91..000000000 --- a/src/main/java/appeng/tile/networking/TileCableBusTESR.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.tile.networking; - - -import appeng.block.networking.BlockCableBus; - - -public class TileCableBusTESR extends TileCableBus -{ - - @Override - protected void updateTileSetting() - { - if( !this.getCableBus().isRequiresDynamicRender() ) - { - try - { - final TileCableBus tcb = (TileCableBus) BlockCableBus.getNoTesrTile().newInstance(); - tcb.copyFrom( this ); - this.getWorld().setTileEntity( this.pos, tcb ); - } - catch( final Throwable ignored ) - { - - } - } - } -} diff --git a/src/main/resources/assets/appliedenergistics2/models/item/part/crafting_terminal.json b/src/main/resources/assets/appliedenergistics2/models/item/part/crafting_terminal.json new file mode 100644 index 000000000..a39647c65 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/item/part/crafting_terminal.json @@ -0,0 +1,3 @@ +{ + "parent": "appliedenergistics2:part/crafting_terminal" +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/covered/center.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/covered/center.json new file mode 100644 index 000000000..e9de8342f --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/covered/center.json @@ -0,0 +1,20 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/covered/${color}" + }, + "elements": [ + { + "name": "Element", + "from": [ 5.0, 5.0, 5.0 ], + "to": [ 11.0, 11.0, 11.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "east": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "south": { "texture": "#base", "uv": [ 11.0, 5.0, 5.0, 11.0 ] }, + "west": { "texture": "#base", "uv": [ 11.0, 5.0, 5.0, 11.0 ] }, + "up": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "down": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/covered/connection.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/covered/connection.json new file mode 100644 index 000000000..2e1f0efa1 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/covered/connection.json @@ -0,0 +1,20 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/covered/${color}" + }, + "elements": [ + { + "name": "Element", + "from": [ 6.0, 6.0, 0.0 ], + "to": [ 10.0, 10.0, 5.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "east": { "texture": "#base", "uv": [ 11.0, 6.0, 16.0, 10.0 ] }, + "south": { "texture": "#base", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "west": { "texture": "#base", "uv": [ 16.0, 6.0, 11.0, 10.0 ] }, + "up": { "texture": "#base", "uv": [ 6.0, 0.0, 10.0, 5.0 ] }, + "down": { "texture": "#base", "uv": [ 6.0, 11.0, 10.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/covered/straight.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/covered/straight.json new file mode 100644 index 000000000..1cc416cb0 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/covered/straight.json @@ -0,0 +1,20 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/covered/${color}" + }, + "elements": [ + { + "name": "Element", + "from": [ 5.0, 5.0, 0.0 ], + "to": [ 11.0, 11.0, 16.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "east": { "texture": "#base", "uv": [ 0.0, 5.0, 5.0, 11.0 ] }, + "south": { "texture": "#base", "uv": [ 11.0, 5.0, 5.0, 11.0 ] }, + "west": { "texture": "#base", "uv": [ 5.0, 5.0, 0.0, 11.0 ] }, + "up": { "texture": "#base", "uv": [ 5.0, 0.0, 11.0, 5.0 ] }, + "down": { "texture": "#base", "uv": [ 5.0, 11.0, 11.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/dense/center.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/dense/center.json new file mode 100644 index 000000000..cdaff367e --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/dense/center.json @@ -0,0 +1,20 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/dense/${color}" + }, + "elements": [ + { + "name": "Base", + "from": [ 3.0, 3.0, 3.0 ], + "to": [ 13.0, 13.0, 13.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 5.5, 5.5, 10.5, 10.5 ] }, + "east": { "texture": "#base", "uv": [ 5.5, 5.5, 10.5, 10.5 ] }, + "south": { "texture": "#base", "uv": [ 10.5, 5.5, 5.5, 10.5 ] }, + "west": { "texture": "#base", "uv": [ 10.5, 5.5, 5.5, 10.5 ] }, + "up": { "texture": "#base", "uv": [ 5.5, 5.5, 10.5, 10.5 ] }, + "down": { "texture": "#base", "uv": [ 5.5, 5.5, 10.5, 10.5 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/dense/connection.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/dense/connection.json new file mode 100644 index 000000000..3f7175248 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/dense/connection.json @@ -0,0 +1,34 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/dense/${color}", + "channels": "appliedenergistics2:parts/cable/dense/${channels}" + }, + "elements": [ + { + "name": "Base", + "from": [ 4.0, 4.0, 0.0 ], + "to": [ 12.0, 12.0, 3.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 5.5, 5.5, 10.5, 10.5 ] }, + "east": { "texture": "#base", "uv": [ 11.0, 5.5, 16.0, 10.5 ] }, + "south": { "texture": "#base", "uv": [ 10.5, 10.5, 5.5, 5.5 ] }, + "west": { "texture": "#base", "uv": [ 16.0, 5.5, 11.0, 10.5 ] }, + "up": { "texture": "#base", "uv": [ 5.5, 0.0, 10.5, 5.0 ] }, + "down": { "texture": "#base", "uv": [ 5.5, 11.0, 10.5, 16.0 ] } + } + }, + { + "name": "Channels", + "from": [ 4.0, 4.0, 0.0 ], + "to": [ 12.0, 12.0, 3.0 ], + "faces": { + "north": { "texture": "#channels", "uv": [ 5.5, 5.5, 10.5, 10.5 ] }, + "east": { "texture": "#channels", "uv": [ 11.0, 5.5, 16.0, 10.5 ] }, + "south": { "texture": "#channels", "uv": [ 10.5, 10.5, 5.5, 5.5 ] }, + "west": { "texture": "#channels", "uv": [ 16.0, 5.5, 11.0, 10.5 ] }, + "up": { "texture": "#channels", "uv": [ 5.5, 0.0, 10.5, 5.0 ] }, + "down": { "texture": "#channels", "uv": [ 5.5, 11.0, 10.5, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/dense/straight.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/dense/straight.json new file mode 100644 index 000000000..269109c20 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/dense/straight.json @@ -0,0 +1,34 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/dense/${color}", + "channels": "appliedenergistics2:parts/cable/dense/${channels}" + }, + "elements": [ + { + "name": "Base", + "from": [ 3.0, 3.0, 0.0 ], + "to": [ 13.0, 13.0, 16.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "east": { "texture": "#base", "uv": [ 0.0, 5.0, 5.0, 11.0 ] }, + "south": { "texture": "#base", "uv": [ 11.0, 5.0, 5.0, 11.0 ] }, + "west": { "texture": "#base", "uv": [ 5.0, 5.0, 0.0, 11.0 ] }, + "up": { "texture": "#base", "uv": [ 5.0, 0.0, 11.0, 5.0 ] }, + "down": { "texture": "#base", "uv": [ 5.0, 11.0, 11.0, 16.0 ] } + } + }, + { + "name": "Channels", + "from": [ 3.0, 3.0, 0.0 ], + "to": [ 13.0, 13.0, 16.0 ], + "faces": { + "north": { "texture": "#channels", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "east": { "texture": "#channels", "uv": [ 0.0, 5.0, 5.0, 11.0 ] }, + "south": { "texture": "#channels", "uv": [ 11.0, 5.0, 5.0, 11.0 ] }, + "west": { "texture": "#channels", "uv": [ 5.0, 5.0, 0.0, 11.0 ] }, + "up": { "texture": "#channels", "uv": [ 5.0, 0.0, 11.0, 5.0 ] }, + "down": { "texture": "#channels", "uv": [ 5.0, 11.0, 11.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/glass/center.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/glass/center.json new file mode 100644 index 000000000..774c00f34 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/glass/center.json @@ -0,0 +1,20 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/glass/${color}" + }, + "elements": [ + { + "name": "Element", + "from": [ 6.0, 6.0, 6.0 ], + "to": [ 10.0, 10.0, 10.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "east": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "south": { "texture": "#base", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "west": { "texture": "#base", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "up": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "down": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/glass/connection.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/glass/connection.json new file mode 100644 index 000000000..deb410344 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/glass/connection.json @@ -0,0 +1,20 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/glass/${color}" + }, + "elements": [ + { + "name": "Element", + "from": [ 6.0, 6.0, 0.0 ], + "to": [ 10.0, 10.0, 6.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "east": { "texture": "#base", "uv": [ 10.0, 6.0, 16.0, 10.0 ] }, + "south": { "texture": "#base", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "west": { "texture": "#base", "uv": [ 16.0, 6.0, 10.0, 10.0 ] }, + "up": { "texture": "#base", "uv": [ 6.0, 0.0, 10.0, 6.0 ] }, + "down": { "texture": "#base", "uv": [ 6.0, 10.0, 10.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/glass/straight.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/glass/straight.json new file mode 100644 index 000000000..23ccfab64 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/glass/straight.json @@ -0,0 +1,46 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/glass/${color}" + }, + "elements": [ + { + "name": "Element", + "from": [ 6.0, 6.0, 6.0 ], + "to": [ 10.0, 10.0, 10.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "east": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "south": { "texture": "#base", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "west": { "texture": "#base", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "up": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "down": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] } + } + }, + { + "name": "Element", + "from": [ 6.0, 6.0, 0.0 ], + "to": [ 10.0, 10.0, 6.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "east": { "texture": "#base", "uv": [ 10.0, 6.0, 16.0, 10.0 ] }, + "south": { "texture": "#base", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "west": { "texture": "#base", "uv": [ 16.0, 6.0, 10.0, 10.0 ] }, + "up": { "texture": "#base", "uv": [ 6.0, 0.0, 10.0, 6.0 ] }, + "down": { "texture": "#base", "uv": [ 6.0, 10.0, 10.0, 16.0 ] } + } + }, + { + "name": "Element", + "from": [ 6.0, 6.0, 10.0 ], + "to": [ 10.0, 10.0, 16.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "east": { "texture": "#base", "uv": [ 0.0, 6.0, 6.0, 10.0 ] }, + "south": { "texture": "#base", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "west": { "texture": "#base", "uv": [ 6.0, 6.0, 0.0, 10.0 ] }, + "up": { "texture": "#base", "uv": [ 6.0, 10.0, 10.0, 16.0 ] }, + "down": { "texture": "#base", "uv": [ 6.0, 0.0, 10.0, 6.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/smart/center.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/smart/center.json new file mode 100644 index 000000000..145a8170a --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/smart/center.json @@ -0,0 +1,20 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/smart/${color}" + }, + "elements": [ + { + "name": "Element", + "from": [ 5.0, 5.0, 5.0 ], + "to": [ 11.0, 11.0, 11.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "east": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "south": { "texture": "#base", "uv": [ 11.0, 5.0, 5.0, 11.0 ] }, + "west": { "texture": "#base", "uv": [ 11.0, 5.0, 5.0, 11.0 ] }, + "up": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "down": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/smart/connection.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/smart/connection.json new file mode 100644 index 000000000..f6e598548 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/smart/connection.json @@ -0,0 +1,34 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/smart/${color}", + "channels": "appliedenergistics2:parts/cable/smart/${channels}" + }, + "elements": [ + { + "name": "Element", + "from": [ 6.0, 6.0, 0.0 ], + "to": [ 10.0, 10.0, 5.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "east": { "texture": "#base", "uv": [ 11.0, 6.0, 16.0, 10.0 ] }, + "south": { "texture": "#base", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "west": { "texture": "#base", "uv": [ 16.0, 6.0, 11.0, 10.0 ] }, + "up": { "texture": "#base", "uv": [ 6.0, 0.0, 10.0, 5.0 ] }, + "down": { "texture": "#base", "uv": [ 6.0, 11.0, 10.0, 16.0 ] } + } + }, + { + "name": "Channels", + "from": [ 6.0, 6.0, 0.0 ], + "to": [ 10.0, 10.0, 5.0 ], + "faces": { + "north": { "texture": "#channels", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, + "east": { "texture": "#channels", "uv": [ 11.0, 6.0, 16.0, 10.0 ] }, + "south": { "texture": "#channels", "uv": [ 10.0, 6.0, 6.0, 10.0 ] }, + "west": { "texture": "#channels", "uv": [ 16.0, 6.0, 11.0, 10.0 ] }, + "up": { "texture": "#channels", "uv": [ 6.0, 0.0, 10.0, 5.0 ] }, + "down": { "texture": "#channels", "uv": [ 6.0, 11.0, 10.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable/smart/straight.json b/src/main/resources/assets/appliedenergistics2/models/part/cable/smart/straight.json new file mode 100644 index 000000000..c30d62065 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable/smart/straight.json @@ -0,0 +1,34 @@ +{ + "textures": { + "base": "appliedenergistics2:parts/cable/smart/${color}", + "channels": "appliedenergistics2:parts/cable/smart/${channels}" + }, + "elements": [ + { + "name": "Element", + "from": [ 5.0, 5.0, 0.0 ], + "to": [ 11.0, 11.0, 16.0 ], + "faces": { + "north": { "texture": "#base", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "east": { "texture": "#base", "uv": [ 0.0, 5.0, 5.0, 11.0 ] }, + "south": { "texture": "#base", "uv": [ 11.0, 5.0, 5.0, 11.0 ] }, + "west": { "texture": "#base", "uv": [ 5.0, 5.0, 0.0, 11.0 ] }, + "up": { "texture": "#base", "uv": [ 5.0, 0.0, 11.0, 5.0 ] }, + "down": { "texture": "#base", "uv": [ 5.0, 11.0, 11.0, 16.0 ] } + } + }, + { + "name": "Channels", + "from": [ 5.0, 5.0, 0.0 ], + "to": [ 11.0, 11.0, 16.0 ], + "faces": { + "north": { "texture": "#channels", "uv": [ 5.0, 5.0, 11.0, 11.0 ] }, + "east": { "texture": "#channels", "uv": [ 0.0, 5.0, 5.0, 11.0 ] }, + "south": { "texture": "#channels", "uv": [ 11.0, 5.0, 5.0, 11.0 ] }, + "west": { "texture": "#channels", "uv": [ 5.0, 5.0, 0.0, 11.0 ] }, + "up": { "texture": "#channels", "uv": [ 5.0, 0.0, 11.0, 5.0 ] }, + "down": { "texture": "#channels", "uv": [ 5.0, 11.0, 11.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable_anchor.json b/src/main/resources/assets/appliedenergistics2/models/part/cable_anchor.json new file mode 100644 index 000000000..52c6fe627 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable_anchor.json @@ -0,0 +1,20 @@ +{ + "textures": { + "0": "appliedenergistics2:parts/CableAnchor" + }, + "elements": [ + { + "name": "Element", + "from": [ 7.0, 7.0, 0.0 ], + "to": [ 9.0, 9.0, 6.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 6.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 6.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable_facade.json b/src/main/resources/assets/appliedenergistics2/models/part/cable_facade.json new file mode 100644 index 000000000..272e1350d --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/cable_facade.json @@ -0,0 +1,3 @@ +{ + "parent": "appliedenergistics2:parts/cableanchor" +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/part/crafting_terminal.json b/src/main/resources/assets/appliedenergistics2/models/part/crafting_terminal.json new file mode 100644 index 000000000..3f0425f6e --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/crafting_terminal.json @@ -0,0 +1,75 @@ +{ + "textures": { + "frame": "appliedenergistics2:parts/crafting_terminal/frame", + "sides": "appliedenergistics2:parts/crafting_terminal/sides", + "back": "appliedenergistics2:parts/crafting_terminal/back", + "l0": "appliedenergistics2:parts/crafting_terminal/l0", + "l1": "appliedenergistics2:parts/crafting_terminal/l1", + "l2": "appliedenergistics2:parts/crafting_terminal/l2", + "SidesStatus": "appliedenergistics2:parts/crafting_terminal/sidesstatus", + "Backlights": "appliedenergistics2:parts/crafting_terminal/backlights" + }, + "elements": [ + { + "name": "Base", + "from": [ 2.0, 2.0, 0.0 ], + "to": [ 14.0, 14.0, 1.0 ], + "faces": { + "north": { "texture": "frame", "uv": [ 2.0, 2.0, 14.0, 14.0 ] }, + "east": { "texture": "sides", "uv": [ 0.0, 2.0, 1.0, 14.0 ] }, + "south": { "texture": "back", "uv": [ 2.0, 2.0, 14.0, 14.0 ] }, + "west": { "texture": "sides", "uv": [ 15.0, 2.0, 16.0, 14.0 ] }, + "up": { "texture": "sides", "uv": [ 2.0, 0.0, 14.0, 1.0 ] }, + "down": { "texture": "sides", "uv": [ 2.0, 15.0, 14.0, 16.0 ] } + } + }, + { + "name": "l0", + "from": [ 2.0, 2.0, 0.0 ], + "to": [ 14.0, 14.0, 1.0 ], + "faces": { + "north": { "texture": "l0", "tintindex": 1, "uv": [ 2.0, 2.0, 14.0, 14.0 ] } + } + }, + { + "name": "l1", + "from": [ 2.0, 2.0, 0.0 ], + "to": [ 14.0, 14.0, 1.0 ], + "faces": { + "north": { "texture": "l1", "tintindex": 2, "uv": [ 2.0, 2.0, 14.0, 14.0 ] } + } + }, + { + "name": "l2", + "from": [ 2.0, 2.0, 0.0 ], + "to": [ 14.0, 14.0, 1.0 ], + "faces": { + "north": { "texture": "l2", "tintindex": 3, "uv": [ 2.0, 2.0, 14.0, 14.0 ] } + } + }, + { + "name": "Back", + "from": [ 4.0, 4.0, 1.0 ], + "to": [ 12.0, 12.0, 2.0 ], + "faces": { + "north": { "texture": "back", "uv": [ 4.0, 4.0, 12.0, 12.0 ] }, + "east": { "texture": "SidesStatus", "uv": [ 0.0, 4.0, 1.0, 12.0 ] }, + "south": { "texture": "back", "uv": [ 4.0, 4.0, 12.0, 12.0 ] }, + "west": { "texture": "SidesStatus", "uv": [ 15.0, 4.0, 16.0, 12.0 ] }, + "up": { "texture": "SidesStatus", "uv": [ 4.0, 0.0, 12.0, 1.0 ] }, + "down": { "texture": "SidesStatus", "uv": [ 4.0, 15.0, 12.0, 16.0 ] } + } + }, + { + "name": "Backlights", + "from": [ 4.0, 4.0, 1.0 ], + "to": [ 12.0, 12.0, 2.0 ], + "faces": { + "east": { "texture": "Backlights", "tintindex": 0, "uv": [ 0.0, 4.0, 1.0, 12.0 ] }, + "west": { "texture": "Backlights", "tintindex": 0, "uv": [ 15.0, 4.0, 16.0, 12.0 ] }, + "up": { "texture": "Backlights", "tintindex": 0, "uv": [ 4.0, 0.0, 12.0, 1.0 ] }, + "down": { "texture": "Backlights", "tintindex": 0, "uv": [ 4.0, 15.0, 12.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/CableAnchor.png b/src/main/resources/assets/appliedenergistics2/textures/parts/CableAnchor.png new file mode 100644 index 0000000000000000000000000000000000000000..2615c94f006c3a2bb337786fdc71761e20c14f55 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z`&C3 z=)hob9)j&V9a9>``>&%ns2L zss$D@vlv7i%$D>wsJ@yb{V`GI_^k|uVAg{CIUWC*>=vXpJFcnjVc4Miy7&>_Gj9dw z#10mL*@voG&V2h_JJ)Q(lOB!@dhHqWthk@t&HJuCAwH3pLvi8rGwl59xGQ?P?}# zx;Tbd_%EGo$ah46hvla@tEuSz2dW_}E7T3$l*xa3je6L*Lc?QmUN7gI z+WX!1`JL!&=OUSHj|!8?I%MQ2yuKFtwa}f#eCX4N~3=+F9D~zfaHjFVxBX zLTd7yTc@gZCvEGlVOOwN@A|0yLfKwMfhLRH)82d&cIf?7|7T9}f5r(#p7on+x_B8F P7#KWV{an^LB{Ts5ve$tq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Blue.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e59e547ecdb37b8d1c6ef3b2f8e4bcde282ba6ef GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#MbV zx;Tbd_%EFt$kk%N<5Il$*YoM(w+>ISZIhqp`a!@@xJ+f*g;P=z(vQBFW=#p|s^bq` zbLRQUEvv3Y#hwUUtp7{4p~JkI;n=s&-a1P1j4zHqyZdRsT;p=*dycCE*#jRv3+sM) znPck_ZNL1Zyn!oJ;}T~FvQ%`7v83G7W0=kOl4;X6jvbs^kNp0pdd%PHr|;s;zV>Ic zW`37a@e}_f$I$pyN+m{M&N_7l7Db`sLYr-w3Y7oq*FRsRp1A6jt&v=~CIbTlgQu&X J%Q~loCIF<>ezyPs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Brown.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Brown.png new file mode 100644 index 0000000000000000000000000000000000000000..70c8c57a763f44045d6f40e6776796439207bfb2 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#J>i zx;Tbd_%EHjk(bGk$91y^t8zHx6#^YjvNcY>Y(Mjam!FmQ z{D^bktzUm=l}N6O(VrRoGjH#S=Z_VaPw6_b@?`p7R)-s>#T-8Fy3f|2JLx;ar^|mT z?b|suiu`6W^v~-%#j>?ZID%C#>#h0enp^Asxt#sX_G0Um1lO~l*?Kco9V9=BGgaJE zYe-Y@Z7`q45O&4p{h#R>|AjiaUr0@!GwZpmxaV!xdrSgz9xHux&e*+-fy1#W*1K#s id%)s9#`e!=>}OV48)Vy1JfDGqfx*+&&t;ucLK6V+--`YK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Cyan.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1ac7e76cc4beef87bee6aa9b7d848df909281b GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#Q|@ zx;Tbd_%981Pfjpd}=#ZxD*Wf$&d6F9si`@!L!usdPr3;wDe z+uw44f$7+i9Y<}&I&ZgDpJ! zx;Tbd_%EI8$aO@4$93<#av__>@`9J5y9ys4oKrb1K1eV+<3YdTzddb!ul9WZYteUZ zrA^C);&Xea7`gcQ+P#)%I28Aep)2Y&=LXkL>J5KPwqHBPsZq3VCPV+czGEz#=c#Qd ziaFC|_-)E1-z#Bp?6uRR)~r~&$1gdG)4=UdJA?LnF$d!bx(TM!7{acE-FvTp@t>-Y z_yton%dJztN2%nB|KxKhi0eMWzwm7pvjR(DneNTE>J3s)|NpT3{f~L^wSDUYzkM}g QU|?YIboFyt=akR{0N;IwcK`qY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Green.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Green.png new file mode 100644 index 0000000000000000000000000000000000000000..990574ee745e31e176d357987c6450c7a7a74d4e GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#L1^ zx;Tbd_%EGo$alzq$F*2g?*OZn@e{E-Tq}jSgVr556>1fl)YNyIlv=ze0$_)&76-TR}A zuIF_59=v#~V6Abn_<>-?l!OOn{Phz&Ivp0buvM7~q+E7>lJimg$(5`-%NP!Kn6PF{ zTXA#k)dT8zJ*o}`>$;CLUnt8JR8SH66Se8KEhBH&{?AtK bznLue&Xv0vzO0ggfq}u()z4*}Q$iB}(C3U3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/LightBlue.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/LightBlue.png new file mode 100644 index 0000000000000000000000000000000000000000..a65687f89ba38d256d86a090daf9c32f03d8d180 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#MbY zx;Tbd_%EGo$alzq$F+EGO!MLm#r-^M<}^)gm2Nn4E=+RX#q~|1mQ%A{nqT|=efn*y zrPs2)ZF~>}x3PO@@6W$s%`2x zqp&ETW5L6s=zj{6JDe1qc#Zi)dT%->$$yl7QlOlhmdKI;Vst0FD%dg#Z8m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/LightGrey.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/LightGrey.png new file mode 100644 index 0000000000000000000000000000000000000000..ba16a837cd67cd758acc43c8988be7b6bb6c0c49 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#MbX zx;Tbd_%EI8$aPeK$7S!lc9ED}AGr3ma+}XP`hR|^-A|>cjD)NiKFb#No~yp^tvNUN zXKAc$%Y|Ss<|hT0BL5mFNe}n6CVf81lJTX?Ky60htOJJv zX9y<0v3zcSBBgDyfitfkuphV(;AJHA>P{2ufJZ)x;v%V ztonY>nqSH3yKkJ_mb-dE+vIbvXEQ#WWz2l^y4=|Vlefl6me?NFul~l%<#}&2qm-@e z7G9=l(iSRGg4dg>8+??6dO3L4SWMWmto=yoQK2gZ%5SeUB>F64Gf{SX-DhD?(`h2{ zp+P#czurx@e_eM~mcx`k_DifnoUU&@-S9%~}C*RKCrT!Pbaa$aX(ksl#o?R??>Ff zAMf`%%IjqQ^xef;^Z6#9KYp|L9P5*UOILp-Ib1n9uhFTh`^gE1s#)>*|9u%w?o4f3 zp)c&xqqZVZL@8s(Jh}P_o-KhL0f#%7ml{;b+o8+% zroQvzW(F>k3?I|&TV5+=?mkh?#`1iZhfP*dH=|%>1##uFjinfA6~d z_vGOz*goS+!OSvykFs4as@X(d*Gyl22WQ%mvv4FO#u8Hjh6rb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Pink.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Pink.png new file mode 100644 index 0000000000000000000000000000000000000000..6343b8c4362eb3710d4adf1f136d83278567b19d GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#KEs zx;Tbd_%EG&k@K(tkIUY9?XTtH6gE$BdRgww?(sjy{vfNX#O{QHN4rYOH9991o%>o* ztF`>o^W4?<-^O`svK3`Ls@x|ju+P#cpksbgVVZ*7qjK--@{O}QZnDUAy0J7p-Wabi zxx+=-sVS0IrT3-crrsNeK83w5Y-j5*l$5&A^P>0m>c+3rU)Xm#FgG5Xvg5d|xaVzG zJ0k^)^RAB`b^n(TcywF&MDN{sk}m%q?Vs?P|3bUz1I-<|N(>AP44$rjF6*2UngCtK Bfhzz2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Purple.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Purple.png new file mode 100644 index 0000000000000000000000000000000000000000..8727b9cd91955297b79cebd7a14c5e455aa7de03 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#Q|? zx;Tbd_%EG&koS-QkE^Xv_LDPQK8LglP6%#f5kE3haDv344^4HcYcy7dc<aI6KaNc>UI%UBvRb#fd-9 z6q27Q9Lh*BD6q8ouP~8k@x+CVk-Rf<+&b>))HTnE>bDk2keIlT;cU;myK%fZ|2sZT z=P;3&;LH1c$7!X^-6!0cSe|e4ut_THWl*fEW?i}QwsGT``xW9{^$f|TN17M5T&ZPX PU|{fc^>bP0l+XkK+2w|a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Red.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Red.png new file mode 100644 index 0000000000000000000000000000000000000000..b2470e730bcabadcb0854d6c2b217e99699023f2 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#L1@ zx;Tbd_^+LOk=MzP!}Vtg7rSBI&+Aj?99G=b(ENg-PHOvsIIfoK6TYc>6$Lx#FMrY* z;+441R$}?nnmtCBXJ)TedJ+^I|D~KkDdrr5-1l_$oURk$3|~(tuix%>q08dCkAhsS z>?`4(C|?1WBEuKX>dy|RDz8+H6Z)l*+aVP2NLAYSRQ!<+U7iV*%Nb0VjaXBXB^9`~ zp84J0FHt8Xt|xu>*p%x5-h1|W?2A2-&fsEQJ8=o;!rNQ98v;0vZatEx&v+~2pZx!G bt@~e=tvT_}{jM+r0|SGntDnm{r-UW|KBtDv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Transparent.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..d72371017f8d44e695f6c8f80403f1f30590530c GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkG>W_r3f zhFJJ-op6!!fC7)pW)J({*IhSFeY|7oTTb?sF-sQMRxI$WVL5wu_M$15vewGZxyti` zNzKfN@$hfCMkV2%Kk7fa4%#&xE0xm^2;O|mR9QsfTMLt^wdeywmEgvx?k0|`tg^qt zp@Ij_nHGi_FW{bW;{*%O`)ZahAA?OAAIg~bEwp0}IUD1}z`(%Z>FVdQ&MBb@0P1RE Aa{vGU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/White.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/White.png new file mode 100644 index 0000000000000000000000000000000000000000..23d24bb2b79ff2db59b642dac3c347b68d9d442e GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#MbX zx;Tbd_%EI8$aPeK$7Sz4^RFUJ)%h2kcN9Fl^nZS;-A|>cjD)NiKFb#No~yp^tvNUN zXKAeMu^Y}D%ufm~MgBEV$SF);uwv^ywrMK%k{C4DO!|D1CF4t(f!d71SqBaU z&X^eV%JRAWiIld*2F|?dd=|Z#iXSCDN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Yellow.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/covered/Yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3923fbc8bcc40a1a7b56e90c850737b200acf6 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#I$C zx;Tbd_%981BHw?FA$o^E{WWM}NK<+8ZvEP-9I?K}cmPKCM~Z+kQ6n*2R^f9D6bl_HEOwJrt? Q3=9kmp00i_>zopr0HW=HJOBUy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/0.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/0.png new file mode 100644 index 0000000000000000000000000000000000000000..d63a978ca4ee492048b24723a4d50a80b80e771a GIT binary patch literal 2933 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 Q+JcmMy85}Sb4q9e0N|%wB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/1.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d63a978ca4ee492048b24723a4d50a80b80e771a GIT binary patch literal 2933 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 Q+JcmMy85}Sb4q9e0N|%wB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/10.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/10.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c2d6d70476ca99e1db9162e843c64d18b74ca5 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/13.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/13.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b95105f4330f34944706dda6a1c0e6ffe26417 GIT binary patch literal 2947 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/14.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/14.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b95105f4330f34944706dda6a1c0e6ffe26417 GIT binary patch literal 2947 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/15.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/15.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b95105f4330f34944706dda6a1c0e6ffe26417 GIT binary patch literal 2947 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEJ4}r;Fna-R}9C&vQ4QXFtHfGtI*|(6oVPrIVcCgXZH$jy-&$=g`Qd zQotaExux3<0_f3F`IFE;BUD{V}teks*4DqA25n zi3|$DsU0p18P*JI&WClmGDH|Kh@^QRv1GWR%V6Lcp60=@VLQWta{}C(7&v$s3<5h^ zH5pi{84^w?D_1bI%w!O8`xI{TQG1=hb1epjikX{icB)vqHb!&k7P5zj>&a=H^Ay(> zF-v4hoaLZ*sB)&HQKJd}gU@Fe7#2(v6@1YA`ESKJzIEr$ne}bsi`RX%pY6X=Qqtpp zPtUI|aA06~SW!-AK$!ao;)!p3#s zgq=5UK7I1!hSw3N=)_auwg1u&#UBX&oAa~I=Fj)95B5D$X*7y$bZ7bT;Lw>bK1*fJ zPvUGzy7R2x{m*vp|9@mJD;@Dn+8LoG@;Feau+L>y&u62hN}W!VG>@uY`k(UXzRquE zyZfdL8?x*et0(HNh)rhx=B+LeQF7qXcLs(}yYmlT(coZi$Y_3ezWo1t`@ilBR2dr5 zJSP=0FvPj2=!KlxY=4}Cfx%@#qt*sT=`RN*bPlk|9Av$7ko!-9S&Ng(kwZ=bPFyJs zGDQiRYnq%i+Rko})k@I6;vj2sATXnCasi*-q0k+CwgvpZ5;^7_)Y#L=$>Ml|LpV|K zRtIBJSA=pOhxp9aABqP(ScJM&6i#-C1S)w?H1#kH>IzW^^^pB!Tf}799^kJ-ZK7glHR-|Dw> zK5lT}g#^3tksJfPV~3qKTIg_2PCmU+X${ZnV^SN!)-dnx{F;1zV>ydZqw4`qGnR5E zg+w_=j|iU#zZ)Ja6l7FP1aEPgb27IC9#U7Dyuy2n+AhJLME}D8-DnmTud*=EVCA$RgPL=bUej)tQ>6h*=roUkR zQqIHMCfaNQnusv-zs_doG3wOJe@6TKQZpOTQaSii)@|WMM-242OOs)RkkiWUVmVb5UiD28z zqr!HZ=bVJiQPaYF8(ID1w?76t#~yZYUYa;Har(oSi90XaEWYa2>&D-cc`W9!%H!N) zxyKf(v8gGldHcTdeK#w}cjq$AW!65{KF80VIlJiWwV9@~Z4Iv*J)ix2_VwBKwv291H=cXr7%Oc-x+mqKCWf{3NA~Y&?v)kIaYgMo9Ub}m_;PRb*ll@lDyOw@< z!^dqWx2@bRx#8&zw%hBrnRA0@Uv^IyPv2SG{JEpM)4S=k z-gG;?+0w`Ep4j`utK@58?8B-{U+2!=Jp0hw6}Q*FGkcf$uKmvZGbZyj=S3P9UpRci z`9a{*i}u{}ry6A6UsLDr?BAHa^|`Wsvi`*IwbwUnUs}HEd*XX>yKiziwlTkF zbT2agjQN4>C$^vVKb$`=zV*Iyz4HH*|5g7lGAwUUWlU%8Y;S?Vr%gfn!|Igdc?T_X@;(lB$K12URY(eG1bBDgPE*D#=C!}LF z&B3R`&tl34M**!BVm+##gv(X?xGE3H9!gizzi4)`CP7Ql@s>(@cP`HZ8cA9R+&Psk*(EU!{$j7ClorZQuLj?E&Wycv$V3)Yf@V` z{X3f1yPFp=s`|R5@n@`=I zU_R&l{Qqx-4hcP+v~6jdcet)>#IwC?vMe{*6jt8mdMwJS-4@2S#%4#?Hm%&N{;S`H zPhVHJSFOr7yD{$IsiuQl8M9w=hjKk_t$lsx`rBCl2>rmX)iI>`XbIb}8-UvwOPpqWPw+n*MA$UmowxTU&VVhi!TL z^_%N${pn{lZtrg1=Dc(9ew!V8QkS1Rch=fIWJ$=EkY6EY?=Iclnt1(3-oR2DUt<2tuFSXX z`pzp?WiQ!=1odCje(lb8Tz=obx$nz$dCho3d*>W`q+H-q`Q+ty&imixc&%=g^;EBU z$bMPAOg3FsKg(&>r&(^ZgJ=DYPKw^;f5z_OwO9A5{1XyJxN28I!&9UDe*L)oI^fO3yPtclXQQ%8z3IuU(yI zX?u6?=c@egN56l)FLt-CNd51*)4Ok$tG`>j$A3@!7l*fwH=XacU$u|^cjw0YJM~!y z$`^dTc*p%aTWj03=E|P3=FRl7#OT(FffScPl`Y4#=yX^&eO#)q~g|_TZVki1_CS&`A7cm z-?OsmMaH3%LYsM6Tl+uWbegdx_HgE;t7Wn4pPx0Ge6;4;X=VoO;NQg8%iql{-t+aK ze}g*rKiQfa%w_Ky?xw$Zx#TlbdG@-?M|=1x%74sUV&%a8fRWUe lv6~1H{rr=Of#LsuW(J*yb_HD%I$wi?Jzf1=);T3K0RTy>X`%oC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/16.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/16.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf5601ad46822f75e4b51d0d411e24f4af9abed GIT binary patch literal 2942 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 b|Nk>Hd=T`@lxgnm1_^t*`njxgN@xNAC}Lrf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/17.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/17.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf5601ad46822f75e4b51d0d411e24f4af9abed GIT binary patch literal 2942 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 b|Nk>Hd=T`@lxgnm1_^t*`njxgN@xNAC}Lrf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/18.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/18.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf5601ad46822f75e4b51d0d411e24f4af9abed GIT binary patch literal 2942 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 b|Nk>Hd=T`@lxgnm1_^t*`njxgN@xNAC}Lrf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/19.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/19.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf5601ad46822f75e4b51d0d411e24f4af9abed GIT binary patch literal 2942 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 b|Nk>Hd=T`@lxgnm1_^t*`njxgN@xNAC}Lrf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/2.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/2.png new file mode 100644 index 0000000000000000000000000000000000000000..d63a978ca4ee492048b24723a4d50a80b80e771a GIT binary patch literal 2933 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 Q+JcmMy85}Sb4q9e0N|%wB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/20.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/20.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb6c342b02d00084be149eb2d645c51b0d90201 GIT binary patch literal 2944 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/21.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/21.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb6c342b02d00084be149eb2d645c51b0d90201 GIT binary patch literal 2944 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/22.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/22.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb6c342b02d00084be149eb2d645c51b0d90201 GIT binary patch literal 2944 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/23.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/23.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb6c342b02d00084be149eb2d645c51b0d90201 GIT binary patch literal 2944 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/24.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/24.png new file mode 100644 index 0000000000000000000000000000000000000000..ac6a20a1a54998df40963ac3f79d6e8e85743cd2 GIT binary patch literal 2940 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/25.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/25.png new file mode 100644 index 0000000000000000000000000000000000000000..ac6a20a1a54998df40963ac3f79d6e8e85743cd2 GIT binary patch literal 2940 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/26.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/26.png new file mode 100644 index 0000000000000000000000000000000000000000..ac6a20a1a54998df40963ac3f79d6e8e85743cd2 GIT binary patch literal 2940 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEJ4}r;Fna-R}9C&vQ4QXFtHfGtI*|(6oVPrIVcCgXZH$jy-&$=g`Qd zQotaExux3<0_f3F`IFE;BUD{V}teks*4DqA25n zi3|$DsU0p18P*JI&WClmGDH|Kh@^QRv1GWR%V6Lcp60=@VLQWta{}C(7&v$s3<5h^ zH5pi{84^w?D_1bI%w!O8`xI{TQG1=hb1epjikX{icB)vqHb!&k7P5zj>&a=H^Ay(> zF-v4hoaLZ*sB)&HQKJd}gU@Fe7#2(v6@1YA`ESKJzIEr$ne}bsi`RX%pY6X=Qqtpp zPtUI|aA06~SW!-AK$!ao;)!p3#s zgq=5UK7I1!hSw3N=)_auwg1u&#UBX&oAa~I=Fj)95B5D$X*7y$bZ7bT;Lw>bK1*fJ zPvUGzy7R2x{m*vp|9@mJD;@Dn+8LoG@;Feau+L>y&u62hN}W!VG>@uY`k(UXzRquE zyZfdL8?x*et0(HNh)rhx=B+LeQF7qXcLs(}yYmlT(coZi$Y_3ezWo1t`@ilBR2dr5 zJSP=0FvPj2=!KlxY=4}Cfx%@#qt*sT=`RN*bPlk|9Av$7ko!-9S&Ng(kwZ=bPFyJs zGDQiRYnq%i+Rko})k@I6;vj2sATXnCasi*-q0k+CwgvpZ5;^7_)Y#L=$>Ml|LpV|K zRtIBJSA=pOhxp9aABqP(ScJM&6i#-C1S)w?H1#kH>IzW^^^pB!Tf}799^kJ-ZK7glHR-|Dw> zK5lT}g#^3tksJfPV~3qKTIg_2PCmU+X${ZnV^SN!)-dnx{F;1zV>ydZqw4`qGnR5E zg+w_=j|iU#zZ)Ja6l7FP1aEPgb27IC9#U7Dyuy2n+AhJLME}D8-DnmTud*=EVCA$RgPL=bUej)tQ>6h*=roUkR zQqIHMCfaNQnusv-zs_doG3wOJe@6TKQZpOTQaSii)@|WMM-242OOs)RkkiWUVmVb5UiD28z zqr!HZ=bVJiQPaYF8(ID1w?76t#~yZYUYa;Har(oSi90XaEWYa2>&D-cc`W9!%H!N) zxyKf(v8gGldHcTdeK#w}cjq$AW!65{KF80VIlJiWwV9@~Z4Iv*J)ix2_VwBKwv291H=cXr7%Oc-x+mqKCWf{3NA~Y&?v)kIaYgMo9Ub}m_;PRb*ll@lDyOw@< z!^dqWx2@bRx#8&zw%hBrnRA0@Uv^IyPv2SG{JEpM)4S=k z-gG;?+0w`Ep4j`utK@58?8B-{U+2!=Jp0hw6}Q*FGkcf$uKmvZGbZyj=S3P9UpRci z`9a{*i}u{}ry6A6UsLDr?BAHa^|`Wsvi`*IwbwUnUs}HEd*XX>yKiziwlTkF zbT2agjQN4>C$^vVKb$`=zV*Iyz4HH*|5g7lGAwUUWlU%8Y;S?Vr%gfn!|Igdc?T_X@;(lB$K12URY(eG1bBDgPE*D#=C!}LF z&B3R`&tl34M**!BVm+##gv(X?xGE3H9!gizzi4)`CP7Ql@s>(@cP`HZ8cA9R+&Psk*(EU!{$j7ClorZQuLj?E&Wycv$V3)Yf@V` z{X3f1yPFp=s`|R5@n@`=I zU_R&l{Qqx-4hcP+v~6jdcet)>#IwC?vMe{*6jt8mdMwJS-4@2S#%4#?Hm%&N{;S`H zPhVHJSFOr7yD{$IsiuQl8M9w=hjKk_t$lsx`rBCl2>rmX)iI>`XbIb}8-UvwOPpqWPw+n*MA$UmowxTU&VVhi!TL z^_%N${pn{lZtrg1=Dc(9ew!V8QkS1Rch=fIWJ$=EkY6EY?=Iclnt1(3-oR2DUt<2tuFSXX z`pzp?WiQ!=1odCje(lb8Tz=obx$nz$dCho3d*>W`q+H-q`Q+ty&imixc&%=g^;EBU z$bMPAOg3FsKg(&>r&(^ZgJ=DYPKw^;f5z_OwO9A5{1XyJxN28I!&9UDe*L)oI^fO3yPtclXQQ%8z3IuU(yI zX?u6?=c@egN56l)FLt-CNd51*)4Ok$tG`>j$A3@!7l*fwH=XacU$u|^cjw0YJM~!y z$`^dTc*p%aTWj03=E|P3=FRl7#OT(FffScPl`Y4#=yX^+|$J|q~g|_TZTdn3OpxW&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/27.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/27.png new file mode 100644 index 0000000000000000000000000000000000000000..ac6a20a1a54998df40963ac3f79d6e8e85743cd2 GIT binary patch literal 2940 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEJ4}r;Fna-R}9C&vQ4QXFtHfGtI*|(6oVPrIVcCgXZH$jy-&$=g`Qd zQotaExux3<0_f3F`IFE;BUD{V}teks*4DqA25n zi3|$DsU0p18P*JI&WClmGDH|Kh@^QRv1GWR%V6Lcp60=@VLQWta{}C(7&v$s3<5h^ zH5pi{84^w?D_1bI%w!O8`xI{TQG1=hb1epjikX{icB)vqHb!&k7P5zj>&a=H^Ay(> zF-v4hoaLZ*sB)&HQKJd}gU@Fe7#2(v6@1YA`ESKJzIEr$ne}bsi`RX%pY6X=Qqtpp zPtUI|aA06~SW!-AK$!ao;)!p3#s zgq=5UK7I1!hSw3N=)_auwg1u&#UBX&oAa~I=Fj)95B5D$X*7y$bZ7bT;Lw>bK1*fJ zPvUGzy7R2x{m*vp|9@mJD;@Dn+8LoG@;Feau+L>y&u62hN}W!VG>@uY`k(UXzRquE zyZfdL8?x*et0(HNh)rhx=B+LeQF7qXcLs(}yYmlT(coZi$Y_3ezWo1t`@ilBR2dr5 zJSP=0FvPj2=!KlxY=4}Cfx%@#qt*sT=`RN*bPlk|9Av$7ko!-9S&Ng(kwZ=bPFyJs zGDQiRYnq%i+Rko})k@I6;vj2sATXnCasi*-q0k+CwgvpZ5;^7_)Y#L=$>Ml|LpV|K zRtIBJSA=pOhxp9aABqP(ScJM&6i#-C1S)w?H1#kH>IzW^^^pB!Tf}799^kJ-ZK7glHR-|Dw> zK5lT}g#^3tksJfPV~3qKTIg_2PCmU+X${ZnV^SN!)-dnx{F;1zV>ydZqw4`qGnR5E zg+w_=j|iU#zZ)Ja6l7FP1aEPgb27IC9#U7Dyuy2n+AhJLME}D8-DnmTud*=EVCA$RgPL=bUej)tQ>6h*=roUkR zQqIHMCfaNQnusv-zs_doG3wOJe@6TKQZpOTQaSii)@|WMM-242OOs)RkkiWUVmVb5UiD28z zqr!HZ=bVJiQPaYF8(ID1w?76t#~yZYUYa;Har(oSi90XaEWYa2>&D-cc`W9!%H!N) zxyKf(v8gGldHcTdeK#w}cjq$AW!65{KF80VIlJiWwV9@~Z4Iv*J)ix2_VwBKwv291H=cXr7%Oc-x+mqKCWf{3NA~Y&?v)kIaYgMo9Ub}m_;PRb*ll@lDyOw@< z!^dqWx2@bRx#8&zw%hBrnRA0@Uv^IyPv2SG{JEpM)4S=k z-gG;?+0w`Ep4j`utK@58?8B-{U+2!=Jp0hw6}Q*FGkcf$uKmvZGbZyj=S3P9UpRci z`9a{*i}u{}ry6A6UsLDr?BAHa^|`Wsvi`*IwbwUnUs}HEd*XX>yKiziwlTkF zbT2agjQN4>C$^vVKb$`=zV*Iyz4HH*|5g7lGAwUUWlU%8Y;S?Vr%gfn!|Igdc?T_X@;(lB$K12URY(eG1bBDgPE*D#=C!}LF z&B3R`&tl34M**!BVm+##gv(X?xGE3H9!gizzi4)`CP7Ql@s>(@cP`HZ8cA9R+&Psk*(EU!{$j7ClorZQuLj?E&Wycv$V3)Yf@V` z{X3f1yPFp=s`|R5@n@`=I zU_R&l{Qqx-4hcP+v~6jdcet)>#IwC?vMe{*6jt8mdMwJS-4@2S#%4#?Hm%&N{;S`H zPhVHJSFOr7yD{$IsiuQl8M9w=hjKk_t$lsx`rBCl2>rmX)iI>`XbIb}8-UvwOPpqWPw+n*MA$UmowxTU&VVhi!TL z^_%N${pn{lZtrg1=Dc(9ew!V8QkS1Rch=fIWJ$=EkY6EY?=Iclnt1(3-oR2DUt<2tuFSXX z`pzp?WiQ!=1odCje(lb8Tz=obx$nz$dCho3d*>W`q+H-q`Q+ty&imixc&%=g^;EBU z$bMPAOg3FsKg(&>r&(^ZgJ=DYPKw^;f5z_OwO9A5{1XyJxN28I!&9UDe*L)oI^fO3yPtclXQQ%8z3IuU(yI zX?u6?=c@egN56l)FLt-CNd51*)4Ok$tG`>j$A3@!7l*fwH=XacU$u|^cjw0YJM~!y z$`^dTc*p%aTWj03=E|P3=FRl7#OT(FffScPl`Y4#=yX^+|$J|q~g|_TZTdn3OpxW&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/28.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/28.png new file mode 100644 index 0000000000000000000000000000000000000000..a73015de9d685d0b730dd84d7b4f200f19b43dbd GIT binary patch literal 2939 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 Q+JcmMy85}Sb4q9e0N|%wB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/30.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/30.png new file mode 100644 index 0000000000000000000000000000000000000000..a73015de9d685d0b730dd84d7b4f200f19b43dbd GIT binary patch literal 2939 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEJ4}r;Fna-R}9C&vQ4QXFtHfGtI*|(6oVPrIVcCgXZH$jy-&$=g`Qd zQotaExux3<0_f3F`IFE;BUD{V}teks*4DqA25n zi3|$DsU0p18P*JI&WClmGDH|Kh@^QRv1GWR%V6Lcp60=@VLQWta{}C(7&v$s3<5h^ zH5pi{84^w?D_1bI%w!O8`xI{TQG1=hb1epjikX{icB)vqHb!&k7P5zj>&a=H^Ay(> zF-v4hoaLZ*sB)&HQKJd}gU@Fe7#2(v6@1YA`ESKJzIEr$ne}bsi`RX%pY6X=Qqtpp zPtUI|aA06~SW!-AK$!ao;)!p3#s zgq=5UK7I1!hSw3N=)_auwg1u&#UBX&oAa~I=Fj)95B5D$X*7y$bZ7bT;Lw>bK1*fJ zPvUGzy7R2x{m*vp|9@mJD;@Dn+8LoG@;Feau+L>y&u62hN}W!VG>@uY`k(UXzRquE zyZfdL8?x*et0(HNh)rhx=B+LeQF7qXcLs(}yYmlT(coZi$Y_3ezWo1t`@ilBR2dr5 zJSP=0FvPj2=!KlxY=4}Cfx%@#qt*sT=`RN*bPlk|9Av$7ko!-9S&Ng(kwZ=bPFyJs zGDQiRYnq%i+Rko})k@I6;vj2sATXnCasi*-q0k+CwgvpZ5;^7_)Y#L=$>Ml|LpV|K zRtIBJSA=pOhxp9aABqP(ScJM&6i#-C1S)w?H1#kH>IzW^^^pB!Tf}799^kJ-ZK7glHR-|Dw> zK5lT}g#^3tksJfPV~3qKTIg_2PCmU+X${ZnV^SN!)-dnx{F;1zV>ydZqw4`qGnR5E zg+w_=j|iU#zZ)Ja6l7FP1aEPgb27IC9#U7Dyuy2n+AhJLME}D8-DnmTud*=EVCA$RgPL=bUej)tQ>6h*=roUkR zQqIHMCfaNQnusv-zs_doG3wOJe@6TKQZpOTQaSii)@|WMM-242OOs)RkkiWUVmVb5UiD28z zqr!HZ=bVJiQPaYF8(ID1w?76t#~yZYUYa;Har(oSi90XaEWYa2>&D-cc`W9!%H!N) zxyKf(v8gGldHcTdeK#w}cjq$AW!65{KF80VIlJiWwV9@~Z4Iv*J)ix2_VwBKwv291H=cXr7%Oc-x+mqKCWf{3NA~Y&?v)kIaYgMo9Ub}m_;PRb*ll@lDyOw@< z!^dqWx2@bRx#8&zw%hBrnRA0@Uv^IyPv2SG{JEpM)4S=k z-gG;?+0w`Ep4j`utK@58?8B-{U+2!=Jp0hw6}Q*FGkcf$uKmvZGbZyj=S3P9UpRci z`9a{*i}u{}ry6A6UsLDr?BAHa^|`Wsvi`*IwbwUnUs}HEd*XX>yKiziwlTkF zbT2agjQN4>C$^vVKb$`=zV*Iyz4HH*|5g7lGAwUUWlU%8Y;S?Vr%gfn!|Igdc?T_X@;(lB$K12URY(eG1bBDgPE*D#=C!}LF z&B3R`&tl34M**!BVm+##gv(X?xGE3H9!gizzi4)`CP7Ql@s>(@cP`HZ8cA9R+&Psk*(EU!{$j7ClorZQuLj?E&Wycv$V3)Yf@V` z{X3f1yPFp=s`|R5@n@`=I zU_R&l{Qqx-4hcP+v~6jdcet)>#IwC?vMe{*6jt8mdMwJS-4@2S#%4#?Hm%&N{;S`H zPhVHJSFOr7yD{$IsiuQl8M9w=hjKk_t$lsx`rBCl2>rmX)iI>`XbIb}8-UvwOPpqWPw+n*MA$UmowxTU&VVhi!TL z^_%N${pn{lZtrg1=Dc(9ew!V8QkS1Rch=fIWJ$=EkY6EY?=Iclnt1(3-oR2DUt<2tuFSXX z`pzp?WiQ!=1odCje(lb8Tz=obx$nz$dCho3d*>W`q+H-q`Q+ty&imixc&%=g^;EBU z$bMPAOg3FsKg(&>r&(^ZgJ=DYPKw^;f5z_OwO9A5{1XyJxN28I!&9UDe*L)oI^fO3yPtclXQQ%8z3IuU(yI zX?u6?=c@egN56l)FLt-CNd51*)4Ok$tG`>j$A3@!7l*fwH=XacU$u|^cjw0YJM~!y z$`^dTc*p%aTWj03=E|P3=FRl7#OT(FffScPl`Y4#=yX^%+tj&q~g|_TZViM3OuX<`#$~) zU)NoztamG;VlTr}(Nhk=p^Gh-ajQv&PCb{hZDR!kcF>@%bW)$;Tc~**=04xWP}nQ0|UeV|I7^A Ww#qe5TBD!J4}r;Fna-R}9C&vQ4QXFtHfGtI*|(6oVPrIVcCgXZH$jy-&$=g`Qd zQotaExux3<0_f3F`IFE;BUD{V}teks*4DqA25n zi3|$DsU0p18P*JI&WClmGDH|Kh@^QRv1GWR%V6Lcp60=@VLQWta{}C(7&v$s3<5h^ zH5pi{84^w?D_1bI%w!O8`xI{TQG1=hb1epjikX{icB)vqHb!&k7P5zj>&a=H^Ay(> zF-v4hoaLZ*sB)&HQKJd}gU@Fe7#2(v6@1YA`ESKJzIEr$ne}bsi`RX%pY6X=Qqtpp zPtUI|aA06~SW!-AK$!ao;)!p3#s zgq=5UK7I1!hSw3N=)_auwg1u&#UBX&oAa~I=Fj)95B5D$X*7y$bZ7bT;Lw>bK1*fJ zPvUGzy7R2x{m*vp|9@mJD;@Dn+8LoG@;Feau+L>y&u62hN}W!VG>@uY`k(UXzRquE zyZfdL8?x*et0(HNh)rhx=B+LeQF7qXcLs(}yYmlT(coZi$Y_3ezWo1t`@ilBR2dr5 zJSP=0FvPj2=!KlxY=4}Cfx%@#qt*sT=`RN*bPlk|9Av$7ko!-9S&Ng(kwZ=bPFyJs zGDQiRYnq%i+Rko})k@I6;vj2sATXnCasi*-q0k+CwgvpZ5;^7_)Y#L=$>Ml|LpV|K zRtIBJSA=pOhxp9aABqP(ScJM&6i#-C1S)w?H1#kH>IzW^^^pB!Tf}799^kJ-ZK7glHR-|Dw> zK5lT}g#^3tksJfPV~3qKTIg_2PCmU+X${ZnV^SN!)-dnx{F;1zV>ydZqw4`qGnR5E zg+w_=j|iU#zZ)Ja6l7FP1aEPgb27IC9#U7Dyuy2n+AhJLME}D8-DnmTud*=EVCA$RgPL=bUej)tQ>6h*=roUkR zQqIHMCfaNQnusv-zs_doG3wOJe@6TKQZpOTQaSii)@|WMM-242OOs)RkkiWUVmVb5UiD28z zqr!HZ=bVJiQPaYF8(ID1w?76t#~yZYUYa;Har(oSi90XaEWYa2>&D-cc`W9!%H!N) zxyKf(v8gGldHcTdeK#w}cjq$AW!65{KF80VIlJiWwV9@~Z4Iv*J)ix2_VwBKwv291H=cXr7%Oc-x+mqKCWf{3NA~Y&?v)kIaYgMo9Ub}m_;PRb*ll@lDyOw@< z!^dqWx2@bRx#8&zw%hBrnRA0@Uv^IyPv2SG{JEpM)4S=k z-gG;?+0w`Ep4j`utK@58?8B-{U+2!=Jp0hw6}Q*FGkcf$uKmvZGbZyj=S3P9UpRci z`9a{*i}u{}ry6A6UsLDr?BAHa^|`Wsvi`*IwbwUnUs}HEd*XX>yKiziwlTkF zbT2agjQN4>C$^vVKb$`=zV*Iyz4HH*|5g7lGAwUUWlU%8Y;S?Vr%gfn!|Igdc?T_X@;(lB$K12URY(eG1bBDgPE*D#=C!}LF z&B3R`&tl34M**!BVm+##gv(X?xGE3H9!gizzi4)`CP7Ql@s>(@cP`HZ8cA9R+&Psk*(EU!{$j7ClorZQuLj?E&Wycv$V3)Yf@V` z{X3f1yPFp=s`|R5@n@`=I zU_R&l{Qqx-4hcP+v~6jdcet)>#IwC?vMe{*6jt8mdMwJS-4@2S#%4#?Hm%&N{;S`H zPhVHJSFOr7yD{$IsiuQl8M9w=hjKk_t$lsx`rBCl2>rmX)iI>`XbIb}8-UvwOPpqWPw+n*MA$UmowxTU&VVhi!TL z^_%N${pn{lZtrg1=Dc(9ew!V8QkS1Rch=fIWJ$=EkY6EY?=Iclnt1(3-oR2DUt<2tuFSXX z`pzp?WiQ!=1odCje(lb8Tz=obx$nz$dCho3d*>W`q+H-q`Q+ty&imixc&%=g^;EBU z$bMPAOg3FsKg(&>r&(^ZgJ=DYPKw^;f5z_OwO9A5{1XyJxN28I!&9UDe*L)oI^fO3yPtclXQQ%8z3IuU(yI zX?u6?=c@egN56l)FLt-CNd51*)4Ok$tG`>j$A3@!7l*fwH=XacU$u|^cjw0YJM~!y z$`^dTc*p%aTWj03=E|P3=FRl7#OT(FffScPl`Y4#=yX^%+tj&q~g|_TZViM3OuX<`#$~) zU)NoztamG;VlTr}(Nhk=p^Gh-ajQv&PCb{hZDR!kcF>@%bW)$;Tc~**=04xWP}nQ0|UeV|I7^A Ww#qe5TBD!J4}r;Fna-R}9C&vQ4QXFtHfGtI*|(6oVPrIVcCgXZH$jy-&$=g`Qd zQotaExux3<0_f3F`IFE;BUD{V}teks*4DqA25n zi3|$DsU0p18P*JI&WClmGDH|Kh@^QRv1GWR%V6Lcp60=@VLQWta{}C(7&v$s3<5h^ zH5pi{84^w?D_1bI%w!O8`xI{TQG1=hb1epjikX{icB)vqHb!&k7P5zj>&a=H^Ay(> zF-v4hoaLZ*sB)&HQKJd}gU@Fe7#2(v6@1YA`ESKJzIEr$ne}bsi`RX%pY6X=Qqtpp zPtUI|aA06~SW!-AK$!ao;)!p3#s zgq=5UK7I1!hSw3N=)_auwg1u&#UBX&oAa~I=Fj)95B5D$X*7y$bZ7bT;Lw>bK1*fJ zPvUGzy7R2x{m*vp|9@mJD;@Dn+8LoG@;Feau+L>y&u62hN}W!VG>@uY`k(UXzRquE zyZfdL8?x*et0(HNh)rhx=B+LeQF7qXcLs(}yYmlT(coZi$Y_3ezWo1t`@ilBR2dr5 zJSP=0FvPj2=!KlxY=4}Cfx%@#qt*sT=`RN*bPlk|9Av$7ko!-9S&Ng(kwZ=bPFyJs zGDQiRYnq%i+Rko})k@I6;vj2sATXnCasi*-q0k+CwgvpZ5;^7_)Y#L=$>Ml|LpV|K zRtIBJSA=pOhxp9aABqP(ScJM&6i#-C1S)w?H1#kH>IzW^^^pB!Tf}799^kJ-ZK7glHR-|Dw> zK5lT}g#^3tksJfPV~3qKTIg_2PCmU+X${ZnV^SN!)-dnx{F;1zV>ydZqw4`qGnR5E zg+w_=j|iU#zZ)Ja6l7FP1aEPgb27IC9#U7Dyuy2n+AhJLME}D8-DnmTud*=EVCA$RgPL=bUej)tQ>6h*=roUkR zQqIHMCfaNQnusv-zs_doG3wOJe@6TKQZpOTQaSii)@|WMM-242OOs)RkkiWUVmVb5UiD28z zqr!HZ=bVJiQPaYF8(ID1w?76t#~yZYUYa;Har(oSi90XaEWYa2>&D-cc`W9!%H!N) zxyKf(v8gGldHcTdeK#w}cjq$AW!65{KF80VIlJiWwV9@~Z4Iv*J)ix2_VwBKwv291H=cXr7%Oc-x+mqKCWf{3NA~Y&?v)kIaYgMo9Ub}m_;PRb*ll@lDyOw@< z!^dqWx2@bRx#8&zw%hBrnRA0@Uv^IyPv2SG{JEpM)4S=k z-gG;?+0w`Ep4j`utK@58?8B-{U+2!=Jp0hw6}Q*FGkcf$uKmvZGbZyj=S3P9UpRci z`9a{*i}u{}ry6A6UsLDr?BAHa^|`Wsvi`*IwbwUnUs}HEd*XX>yKiziwlTkF zbT2agjQN4>C$^vVKb$`=zV*Iyz4HH*|5g7lGAwUUWlU%8Y;S?Vr%gfn!|Igdc?T_X@;(lB$K12URY(eG1bBDgPE*D#=C!}LF z&B3R`&tl34M**!BVm+##gv(X?xGE3H9!gizzi4)`CP7Ql@s>(@cP`HZ8cA9R+&Psk*(EU!{$j7ClorZQuLj?E&Wycv$V3)Yf@V` z{X3f1yPFp=s`|R5@n@`=I zU_R&l{Qqx-4hcP+v~6jdcet)>#IwC?vMe{*6jt8mdMwJS-4@2S#%4#?Hm%&N{;S`H zPhVHJSFOr7yD{$IsiuQl8M9w=hjKk_t$lsx`rBCl2>rmX)iI>`XbIb}8-UvwOPpqWPw+n*MA$UmowxTU&VVhi!TL z^_%N${pn{lZtrg1=Dc(9ew!V8QkS1Rch=fIWJ$=EkY6EY?=Iclnt1(3-oR2DUt<2tuFSXX z`pzp?WiQ!=1odCje(lb8Tz=obx$nz$dCho3d*>W`q+H-q`Q+ty&imixc&%=g^;EBU z$bMPAOg3FsKg(&>r&(^ZgJ=DYPKw^;f5z_OwO9A5{1XyJxN28I!&9UDe*L)oI^fO3yPtclXQQ%8z3IuU(yI zX?u6?=c@egN56l)FLt-CNd51*)4Ok$tG`>j$A3@!7l*fwH=XacU$u|^cjw0YJM~!y z$`^dTc*p%aTWj03=E|P3=FRl7#OT(FffScPl`Y4#=yWZ)6>N>X0HBKt|!F#tSplSqN`z(?SiVx?Of7~5I%PD>rMs+hX4PW8NQ$5YuR47GYh25)78&q Iol`;+09hDSod5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/4.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/4.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc8ce4340a56109702fa25f3a59539c2a83471e GIT binary patch literal 2942 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 ZXJ!yOB-fa$k-HD1%+uA+Wt~$(6967vT$%s? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/5.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/5.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc8ce4340a56109702fa25f3a59539c2a83471e GIT binary patch literal 2942 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 ZXJ!yOB-fa$k-HD1%+uA+Wt~$(6967vT$%s? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/6.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/6.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc8ce4340a56109702fa25f3a59539c2a83471e GIT binary patch literal 2942 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 ZXJ!yOB-fa$k-HD1%+uA+Wt~$(6967vT$%s? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/7.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/7.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc8ce4340a56109702fa25f3a59539c2a83471e GIT binary patch literal 2942 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 ZXJ!yOB-fa$k-HD1%+uA+Wt~$(6967vT$%s? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/8.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/8.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c2d6d70476ca99e1db9162e843c64d18b74ca5 GIT binary patch literal 2946 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 O1B0ilpUXO@geCx^!BY+Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Blue.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Blue.png new file mode 100644 index 0000000000000000000000000000000000000000..0698a8b79e381edefde8eb946ee83767fcf61e6a GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}eV#6kAr-fhBfkFnU!PR4 zKwLz=DS^#|LAZUT^0k<@K=vN1ge#1T`6LS15AdqB9A3DCwaHM1L9~6f@}-zdG7ijJ zI~FLnL{Bi;HbJqUdGb4k6%QpcS-Pbb$vAK|s5(t(J$}L9j$oXMlvgKn!aj+ed<(op zcq)`+e&kp@V7=%desuBHhbx%fWDQ<52)<`vcoZ<}H=pySUIqpR22WQ%mvv4FO#pnF BM7aO} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Brown.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Brown.png new file mode 100644 index 0000000000000000000000000000000000000000..2c34472f0575e95df1826de11a8ce824e07165f4 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}OFUg1Ln>}1R}{QFQlC^X zalWQR{`@fhV>}rQYJ9=&Yj*N1=94Hru!7l5*5CnOL#9H@YG<8;6=~DNB^Fylm8e)Y zh-E!=bmwTUY0qIibNqx|`^n}XM`n3%VosQLe}9DxtFm>I3i|}6gtlg#n!4v&Ty2(2 zGHbRlz2LL3*vr=AzK(f?5G(UM4t5)9z6wW^2d*D8axGpp1hV&7B^}1N0fg*U7xh! z-IRRr3V_U8J0B)v_%S3ys(!@wqVfedne#D zLxufA%(nwrT~l+a6|yv%A#qS3dc9mVtqR N!PC{xWt~$(695_ePO|_2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Gray.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Gray.png new file mode 100644 index 0000000000000000000000000000000000000000..bb86b7b1fde507c95994f80617e4956fdac9ec0b GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Gd*1#Ln>~)oqCY-fC7)J zY)k=D`G*%=aV+ZDh9A1C3>&@p)IR7=*tr4B6jtWqndLukQgCp9fWq;y>@LsA+oVsl~v+ Oz~JfX=d#Wzp$PyQD^S@0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Green.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Green.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e7c48e5f76abf5b8b7327beae059949bb2151e GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}^E_P~Ln>}1&-j;itv+eP zYbI9%zlt^N$9OUr)cAtk*X-n3%qLNLUGFTek?P zon+h+z|C*vB=N*Lg*(B{?VF{KoTUm!;v`vy@@12u+4vJO)}1@A&xke|=Ix z(ECh-yr|DIJ(3p~d}NmOMHEZA$r`+B2xRZEN;n|PaM^+5u+ELDpZXGutr^t%-U&F( zP+`B|q-*nnBXPp}3AznGC2l@9sC+U(p~bU|p{MrE<$95xHyo2>9Jm@J`8EmI8XlBk zpEMY&;RR6@PK`YSUL1)2%%?}&IU6|uU`mePu=94Hru!7lb4>QBO?fQMCuY{g4 QFfcH9y85}Sb4q9e0Em80B>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/LightGrey.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/LightGrey.png new file mode 100644 index 0000000000000000000000000000000000000000..85918fc599d84de2b3dbdcc8db49213fae42fafd GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}t36#DLn>~)oodZ>K!L|$ z?|)eq{s*Elb7f>%($8O<c!e1vIB<=WB( z(*-y^n8cQ!jm~CPX-u^hjbZTP*`vMTsc6jpmh1M1h0i|qP=BMnajWR-`vI&Ki>5T~ h(Oyvgz_L+(X2$JTYufU!FfcGMc)I$ztaD0e0su(CS9t&c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Lime.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Lime.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7164b9a4cbbb8f5fae8fe619d10707c7d09029 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Q#@T9Ln>~)oqCY-fC7)J zaeV&W<;Eow);&mitI3+FP{U=opyC7jJ=e9BF21hsy`w8i*30Y)WjS;#H}>^DCq}M- z2ByobZ<;$kFRoe8(7V{f#cM%nuGfJcWiAzsbyBR8etEepVGUrLyo}W-arXaMBYXA5 zOss4EyyhygYTow!r3=E#GelF{r G5}E+DlualA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Magenta.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2097dab227c05e33cb9c84fe6077be71f48c65 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}b39!fLn>}1TUb3lQlC^X zIYwCG{e@eM$9OUr)cAtk*X-n3%qLNLUB%l}oo85kHC NJYD@<);T3K0RS*_Nj?Ao literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Orange.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Orange.png new file mode 100644 index 0000000000000000000000000000000000000000..a4fe8a118ba32a704a9d5308a022804fc3aacc5e GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}3q4&NLn>}1|EMc_S)cUb z{L5(xf3oLtOBgR;oMGW3yYZP(k5$4I#>IRRr3V_U8J0B){IkC++>=;S!hS&3;xubd zr|EPRc7fH?RM-zR^$ECbXK?17we-j=?@i1J(-t3B-KE@7#-PcNW^m$={&&9x2{V*8 zEahLtSi*jw#;{1%VXB722N#P6Hz$a-a{GEYeNmd0<@zxr*Wy(}AbXEh!Vzl*2B8V@ WJ_}_yyBHW47(8A5T-G@yGywokcTV{L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Pink.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Pink.png new file mode 100644 index 0000000000000000000000000000000000000000..84eeab90d5c609f5b112a4f2c024b0baaa234be5 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Gd*1#Ln>~)oqCX~L4l{O zw*Ez7%`}ch)fF!VZmcc%aQfC!wv&8$A7YQ(**;V1)3kT`Yl2nQSqM9_95a0Xde=eL zm;UKIdD9|tV24QNLZKIi+qbQAUD>DZaCFb7TXoku#j+Y_#k^CW9Ke~u z)IGf=-73zZ>DDdnB@C-1!XHf6HTchYwtwMI*OWTZ-`Ovi^d2xB=C-*dw?FO^t6UZX P0|SGntDnm{r-UW|iY!+W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Purple.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Purple.png new file mode 100644 index 0000000000000000000000000000000000000000..44b6c5d4b169ef138e6c9f206717c3a2c2fefaaa GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}b39!fLn>}1TkQLBraq}) z@QAkiw)vO7jJ#If*EY1;Clv!IMF3C?>>qCU|?Wi N@O1TaS?83{1OVFGOa1@= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Red.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Red.png new file mode 100644 index 0000000000000000000000000000000000000000..a0a341b094cfa5e897001a68077b00d630a4016c GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}vpiiKLn>}1|FD1hsD9Cg z7*Q7E8x4lcQVpGluL@@B9bUogCTsAjA&{MC4|9SP#{+Smu!KMJ4|Dby$}otwuU5Vk zGf9TwyDFp4EanaqkvGmy5{`+v-nb%kV2L$D+D|o;o;MspG7ek}*-erAz6xozSvG|@ zYZf^iOyrQ;$+y5wgr`DD=0}dj1J;WT;zt*6eF(L0;yVTg_43sh{;-4wGB7YOc)I$z JtaD0e0suR3N!I`X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Transparent.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/Transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..dc47ab47ca2e977b8b2f3412850ad51e4b7ed105 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}b3I)gLn>~)of^;8pup2! zK2fgvwbHz!-W5#wiWT0;hm?+HxNU5&Ywl0@eEztW>hqY35B9Ea5zxBQ`XqHuS!@#n zivj~1Z;y}5 T+vGAZFfe$!`njxgN@xNAn%P*R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/White.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/dense/White.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca58b2d40be4f67d26914a71174370e41778e00 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}3p`yMLn>~)oqC#+L6L{` z?S7%v0()*Zx<(w*W0Px%@p1V0fcuQ=A0MIXzR5l3o!`f5Eaf=Ka?J4j?)*gztQroD zubCn?EV`z(}1|Ja{@wSG}S zyn@94AMaU@@nkTl@ddlD*~zn*Pong|3T8K1gAaTSnF=lSP9G&X+{zhzWDYB`7*4 z_6YK2V5m}KU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUF7#J9&1AIbU85kH^ zT3XW5(yXnmySln2OqgJAZ}0E#|NsAgZ-coP85kHCOM?7@862M7NCR<_yxmKLIwr~ N22WQ%mvv4FO#pirkkbGF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Blue.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e7913f6f7401958f1f3d120a8c89cd8ad8c99f70 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdp969eo`c7&i8E|4C$JU|>*4 z_6YK2V5m}KU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUF7#J9&1AIbU85kH= zz5X9~=zpNs|6{NJzj*yWF#LaD%m4rX|1Woo>0)4DU@Qsp3ubV5b|VeMN%D4g;b^-z zwTgj(fwRCPvY3H^Zy5+Pw%=Kq&%nTt=IP=X!g1ZT*O05#K)@xwBWZW1xkuvMKY}^M zEC;(e?#cVqam`MA`1Z_U!Oi-78+QD5IvR5(eB;bUHI9YyiW4rC>F=L1f$!zS85X?T)PQgeyB2Km4^=T+*5EO3Icl4F(1V)e_f;l9a@fRIB8o z)Wnih1|tJQV_gGdT|=V~0}Cr-V=F@oT?11q1A}X>C- zwlXl$H88U>F!*|vdp!dKgA~Yy;QX|b^2DN4hJeJ(yb?V>*ARs=V?9$nLj!{^MGF}i P7#KWV{an^LB{Ts58aS7e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Brown.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Brown.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4247c5817e579efd2750c6b7adebab409fe56d GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdp969eo`c7&i8E|4C$JU|>*4 z_6YK2V5m}KU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUF7#J9&1AIbU85kHI zTspCRT78k9>GL~RKfHKc9b!2%%j^ID|1y{VY-eC#U@Qsp3ubV5b|VeMN%D4g;b^-z zwTgj(fwRCPvY3H^Zy5+Pw%=Kq&%nTt=IP=X!g1ZT*O05#K)@xwBWZW1xkuvMKY}^M zEC;(e?#cVqam`MA`1Z_U!Oi-78+QD5IvR5(eB;bUHI9YyiW4rC>F=L1f$!zS85X?T)PQgeyB2Km4^=T+*5EO3Icl4F(1V)e_f;l9a@fRIB8o z)Wnih1|tJQV_gGdT|=V~0}Cr-V=F@oT?11q1A}X>C- zwlXl$H88U>F!*|vdp!dKgA~Yy;QX|b^2DN4hJeJ(yb?V>*ARs=V?9$nLj!{^MGF}i P7#KWV{an^LB{Ts59Kx0e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Cyan.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..84907c97afa690894904c303e8fb67f677400238 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#L1^ zx;Tbd_)iTo_uv`A)v_0#K#o6R8F5I86{>Ul0N6L1V?h6i05bqE46c^Gl`peP)#1)DWk~;FKwOZ<@Fcw9~PGcB(IRtHaKnd$kloWr=l)Hn@*ejpXXf0pKmLl zd*OcO$m?Glnjc19V^)+}5a|%lJ>#I2Lwi-zAML};POCc$^cc1%Jda(mlJ(2h2FW#P bY5HXg1oi%0yH~)#z`)??>gTe~DWM4f)kKM5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Green.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Green.png new file mode 100644 index 0000000000000000000000000000000000000000..a9fd11bd9da437267c5b45c23fd81adf0018432c GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#Oa5 zx;Tbd_)nc|$alzq$F*2g@4%5`XHH4(5ET;UZclisQR0-;)T{a>a_iUEZd2+`zB>M| z(vw-Fq-Nf#nQ=eP*2eSSwW_M9ns>Rzqn&TZzPxLv8J=uD`HpMB_1b&SWEWJXr5U*} zYRp$CbN9RYi}ggP#FJZd!@qvI!N%afeyVAep4gwui*wj()vd$y+g?>Fo$Y(4lvgrA zpJ@@plLX<^RW*}Olmxv|S4F!1W+H8F1=2YN(bka%oR%yqxo zK5Om8!@=_|*Lbw^-S~dDO0uEm+l^SpFVE&YlU-1mmS&Vv+HynIGW4~yLb&3b)mzJQ zZi_M4G;Ghgu(jskD)*awRcgPZmP@R9-f2?3yL-n)?|mE{OcR=Yd5Zs*v}{*9+LYbD z<1LgVVJCtzQMbelo}iJSn}C TbH|8*fq}u()z4*}Q$iB}9>2tDK+A_ c#ADuh8yo{o9gt?8)-JJCLk&A1n|E8j?{qBmnj>$cT&uG@X z|GQ$V8^3?0-)BWxtAzXIuTvR5-ApcLy)e6YR(Zp-nKMsLxGI=b{v>2=enU)a!Mba= zHs(e%d|*4 z_6YK2V5m}KU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUF7#J9&1AIbU85kJ; z|5)|&e_+jjufP9~efs~R?|_!@hljQC0!qIkb zY83+m180FpWHAE+-!c$pY`?QIpMilP&C|s(gyXtvuOU~ffq+YVN7C+2bC1Nie*|-i zSq^q{+>`gIlL@a>tyf}8dEHthKAbTsBn_{N!yY8(sY6(?LO)89X30^iGtGd4V0 z`SzvC`n8`FJ-=Uiw0ir&+8tTp30HP5e)wy#xTG`Rm6R=A8Vn2!swJ)wB`Jv|saDBF zsfi`23`Pcq#<~W^x`sv}1{PMv##V+Fx(23J1_sw$Pwq$2kei>9nN|tcU|an&Ha)b5TFLtNzwkLyW?^`%nPe{5;=i?j3(sO0sjUdVReWxf3EJ(szGEoHx;sOf`h?zMXv ZFGW78N(=6s%fP_E;OXk;vd$@?2>^fYf}{Wd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Orange.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Orange.png new file mode 100644 index 0000000000000000000000000000000000000000..17f56381096e0403b07f1cd3d60aefe3e5069739 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#L1@ zx;Tbd_)iTo_aC-ZV-5(Bly;<|8rF_FC#a%78dYiLdJEAr{x@UP#HH$Isd-l=@ z#=rCYOLzM2W!oFGOl$sc>pd$Ot{O4Cu;ZqPOV^!trmR7!(gNES0wHW!`0%Z d_4}vr?^F zdg`8O*%cWtEYGr+T;jfSnpL61Y~j2G-}7#9o9xe9tY=xuYG+h0nqqcH^!MAJwpZ7! z=IJR@<^K2aK{|V%(ZgAuS9=zmlB#&C$-A#(f>?v|w3BCo!&msowX+uYR~*sGc0cpw zLyY|FkVx*98;#$XzHdEX+{6B2$vlPsrz#Y-%=&YCCqstgx!D21+;^@soj2Ha?UwYy Y@{BF#k7fHYFfcH9y85}Sb4q9e0NxLb{{R30 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Purple.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Purple.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd0bd115312c9890fe362f01c3bcfad2c2ab9eb GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#PlY zx;Tbd_)nd5m-mo?K(n#X?hQijs~yscR_^^oc0Rg#WVO+VZUmZ}j{)Mc2hGkNCjbpbPN__&|R zee4Lm);Htj!<}|!D>sR8Y-D=N`YyXMUBdi=r>*0^sUICOOn+`KX1vfe$9&;3u^sDK f=OyN>-KyW+^>gK48@8Pc3=9mOu6{1-oD!M<=Dm&O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Red.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Red.png new file mode 100644 index 0000000000000000000000000000000000000000..b37bd466f65ae14142ca8a46fe2edd2b2cf0c834 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdp969eo`c7&i8E|4C$JU|>*4 z_6YK2V5m}KU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUF7#J9&1AIbU85kJ; zPr3MCuIfL7&Ht^J{@;7{pUL(=htvQ6|IgJ;1nFli3GxeOaCmkjje&uIG0EHAg`@4> z)G7uB2F?PH$YKTtzGWcH*nVeaJ_7?onx~6n2*-8TUPG={0|A%#j-=h4<{pW2{|M$3 zvmET^xF_#Z$2B|g;oCEZ1vl&SZP@YK>1fQE@QpJY)i@T)D^9pnroVs61iqIOXKZ-1 z^6g8N^=m&VdVat3X!Z7kwL7xH6RzxB{P5ReaY<*sD=AyLG#D5dR7+eVN>UO_QmvAU zQWHy38H@}Jjdcx-bq$R|3@ogSjjaqVbPY_c3=FQhp4^Y3AvZrIGp!P?!N4TM$k@uj z*vh~}*TBrmz~Jju?)3}|3{oH)g7ec#$`gxH83GbB^GfvmTtgJfjP*?Q3=Isv6fI<6 PU|{fc^>bP0l+XkKiaM5H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Transparent.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/glass/Transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..78ebee7c409fa5cde0594e1d7281b1cc99ad5ae6 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWHrDUy2qoFfiQm zba4!^@LxJ%Bd?PokBc!Q?^FHEh=aCI^#w(PH?RsxZ(xY7tC*&@Yeqog$@|kkKTY~C zCYbx1CA7kF&bHrQuUdY{t6ws8j@C?h^_4~f;k+^SI~qCXH*A&`SSNp{#c;>m`E!~7 z$0*(ul8CwHF5Xzn)Zey4O*uG~;n)GwQ-2)2+@6|Bg`6`!_x{V?ud@uCj&IeUlW^^V z>hXKx|LR%m>x25Prazcjn_O7qX2Ql;<72?w7zL5o!~`7CK*EeWk>P`R5YM3;sS} tQ@hhp!hGm!^Xv^gN3L^*C@*4 z_6YK2V5m}KU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUF7#J9&1AIbU85kJe zzkh%G_U(Q9_I>{R`TO_p2M-=RbLPzd|Nra%2J$m7Fff(``2{mLJiCzw;v{*yyKuDK zn_9)dz`$AH5n0T@z_$#98Qbry%x7R=Nb_`Y4B@!$+H1(wY9Qbe-;uPt)7&F*?jOON zVwQv59QWjX>bPbnK74!Tu;6BWz70EmI~|QV6TWd~qZ-FTdBq8r%Jlb7nZWmQ;*1TC zR=$0yvVQF+MbGb-9b=o*+=85n%M%DtX}fk6snLvVgtNqJ&XDnmeGW?qS&pKFLhnX#U!o}q!km!gFX P3=9mOu6{1-oD!M*4 z_6YK2V5m}KU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUF7#J9&1AIbU85kJ; z?_2f1FYw2Ium87>{r~gg|IfhxX9EBK|NkuS%X|g~2F8*gzhDN3XE)M7oFs2|7ml`j zQ>z#l7&r?&B8wRq_?Ce%WBZ+z`3wvUX`U{QAsp9Tdkwi-4Fp``JCb&HntLS9{UexD z%yO`s#U-8juB2?~(qLdQHnuXf&^0i%GBCL2dU8LChTQy=%(P0l1_P52BV#KA zV=Ds_T>~>K1B0(uxz{r=Fi3%H2+mI{DNig)We7;j%q!9Ja}7}_GuAWJGc+*xQnZkP Pfq}u()z4*}Q$iB}?cSN! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/0.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/0.png new file mode 100644 index 0000000000000000000000000000000000000000..d63a978ca4ee492048b24723a4d50a80b80e771a GIT binary patch literal 2933 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 Q+JcmMy85}Sb4q9e0N|%wB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/1.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/1.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc8ce4340a56109702fa25f3a59539c2a83471e GIT binary patch literal 2942 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 ZXJ!yOB-fa$k-HD1%+uA+Wt~$(6967vT$%s? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/2.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c2d6d70476ca99e1db9162e843c64d18b74ca5 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/4.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/4.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf5601ad46822f75e4b51d0d411e24f4af9abed GIT binary patch literal 2942 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 b|Nk>Hd=T`@lxgnm1_^t*`njxgN@xNAC}Lrf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/5.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/5.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb6c342b02d00084be149eb2d645c51b0d90201 GIT binary patch literal 2944 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/6.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/6.png new file mode 100644 index 0000000000000000000000000000000000000000..ac6a20a1a54998df40963ac3f79d6e8e85743cd2 GIT binary patch literal 2940 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/7.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/7.png new file mode 100644 index 0000000000000000000000000000000000000000..a73015de9d685d0b730dd84d7b4f200f19b43dbd GIT binary patch literal 2939 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 Iol`;+09hDSod5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Black.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Black.png new file mode 100644 index 0000000000000000000000000000000000000000..e1affe79b731e3b0fd1c9aed3d88b247b448dd5e GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#IpY zT^vI!{NDy1L0iG7{V<*eDaTd@tL2 zMlR7aImPGBGg$8Md;L!I<_4yi<-L;s9VV}r*g08!qOZYCsgi72+lAIXW=DGd3SQUu mT=3wX;E98!x3U*}V^DKAxvS?>b{hi&1B0ilpUXO@geCy;`d#G! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Blue.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Blue.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd44883701bc84794968958f4b19aba4c74fc8c GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#NB@ zT^vI!{NDyTay1z6-2T0%@{{wvW9dI+r={EXS6??*Zxt5F)Ud4p8no+vyfeCdki1*=RfKS44&g?R(Zm}VXbK?>sN!D0>;Ps oBlfGDboS>jn3Z{IH&cVS5Bmhm5YFfvbL$!fUOXfH5vF-x1H oP{QSf49g^E-wI^j_lKRq>T(6QAk*hG1_lNOPgg&ebxsLQ003}Sw*UYD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Gray.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Gray.png new file mode 100644 index 0000000000000000000000000000000000000000..580dc9dc7bfbeea19a82ec706f0e42e306365728 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#IpX zT^vI!{NDy1SPBxP<+Bfz^AZDiMFKzu_DnJr{2+TovZ%qNZe~G@<$Rmg^5p z9Tqmt%suy0Qi1(?=H0zY(qRp+w-`Q_&-f&&T>eRA6Q^2qbKcs;>Lu+b+h%OEfAmY0 lQ{;{fd1ykWS;U zVw>I9mng;2*=TTu&xc_Wi?!e>HttDG39}s91h#O>PJY6g!^k{|A+zCDqrJey#Vl=( pLJ5}_GAxsveJhap-+y)nHsu}Xv$WXz85kHCJYD@<);T3K0RRXLStbAg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/LightGrey.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/LightGrey.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff3331d97780eebff059fd1f273b7aef5d5da74 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#Qk2 zT^vI!{NGNz&3V9p!*%n2zDAx0TsIH(=OkCVI&WB*x!}TlF7YGBFU~k}Mkq9U>YU9g z#y>jFX4N0ybWmC~Maks~;|E!xrC&7iBaSM}E;Lmsb^UC*Bl#Z7iK3t@*M!sB9hrE| z9{=ljJblN6fL$}q&u86d-g2$#!)#tRTlNhyYk$t_E1S&zhJk^B!PC{xWt~$(695!z BXoCO% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Lime.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Lime.png new file mode 100644 index 0000000000000000000000000000000000000000..1ed3faedc6409fab653daef7d616b2e9ce944862 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#NB@ zT^vI!{NGNz$a%nk!)5OJ`n$`GOD3$jaP-#t)#_Xay`29k+X$SU+bMX5cP6_vUycC( zvo)dV(;KBWOthTpUAWhPe{#>xbSHyVg7ZJ}n!W9s7hS04wuyBqr`r62ObpQYW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Pink.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Pink.png new file mode 100644 index 0000000000000000000000000000000000000000..5921c7599a7e4d724fd2fe3dc0ec9ce6e00c42ff GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#NB@ zT^vI!{NDyTavf0M`TT#w^B>a;C3bi77i`bdd@B(-v%*|Jqt|omva*oGciz*C*H7YE zak2Z{xdv+nCgHYiQ`H%^wi}qvec2YrzeO_M;fi+D+OvW?I2G@Do>{2w(%s0=eD+8D pqu<_h1WfKec=qBA&x#^OJCD1XN{bkM7#J8BJYD@<);T3K0RYy3U;+RD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Purple.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Purple.png new file mode 100644 index 0000000000000000000000000000000000000000..2a83155307b92bc5e2f433fe17396973a2148787 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#K=C zT^vI!{F5#A{Ww!!awlcO%m0%e6#ti8z;J}EGcnjYi{S#p1Qsi{%o`JmnDZDqc#T

FVdQ&MBb@0FHlI!TS!Yv)F+v*Zcc*UCzL lE*)Q3Ol_aqGCtEUzqb6#lZkgc85kHCJYD@<);T3K0RR=~UdaFe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/White.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/White.png new file mode 100644 index 0000000000000000000000000000000000000000..c347720e540424972a2737f6962c15f275000e20 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#Q+B zT^vI!{NDyTavd<>c>P~q^~*c{nil_p?iUh%VO9AG3d=gz%C5?qs+8oCqTC?0_uU)L z9n1{KXyQbb# ksA)O-r8{$N8MDM$tsgdcdw#gez`(%Z>FVdQ&MBb@06l|Vq5uE@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Yellow.png b/src/main/resources/assets/appliedenergistics2/textures/parts/cable/smart/Yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..fe058e243ae4f39f9aa53294766dfaac2b6e59f7 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#IpY zT^vI!{NDyTavf0M`CPmE=SJHj?r&JDCs?O0yJD0zv%*|Jqt|n*S_~`m`JOIj&x5n} zzIelzz`%Nb`Nwl&2W~mZsNUTyon{-9-m^d>{7Td;?H6ioKI)Zvwu(_atWqV%{tNAo mPs(XpqJ2hY&Rs@U{oM9B+Cfu3#4|83FnGH9xvX&o*?e4W)B(~85x4FYS~FHYbs@6 PU|{fc^>bP0l+XkKnC47R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/backlights.png b/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/backlights.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ac516475da2c9d48542b31c16f9ebf46e89111 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#I>f zT^vI!{MYsvaxob49RBs+|9MpNf#w&Ngf*I3BaMrN*SN}hZxAchIT&?iBTIJRaUq0& n&GXK9xjSfr$f~x@{mOXL&f-(cg^*4L1_lOCS3j3^P6%BGDw7g~jx@no+!@$a|+g9>A^@Szh~8@YrI zHD6%}NH}<-<--c`j8ukoOL};luOvx0=pEDYu!%d!z_8x5yXeaweO?9z1_n=8KbLh* G2~7a^a8DQj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/l0.png b/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/l0.png new file mode 100644 index 0000000000000000000000000000000000000000..aea3238540b479b7b51efe1b4ab11b6a404e7b02 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#K1= zT^vI!{I~W5ay1z6IF|?LKk+R)T&E?ObHq&aw8003V|%xKei40QW0Q>biH}~3?zJTz za#CwP?yi<9yN2n*aCE>*how%O+U&BEN?-P~ zp6PkrD83?OK~SR?tCr}B5RHX@djgLwaNhLqwfv6U2_mapn5>?kV_;xl@O1TaS?83{ F1OPM=Pdoqs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/l2.png b/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/l2.png new file mode 100644 index 0000000000000000000000000000000000000000..bf283814e1274d6e6f1e81e0ec10f72bcd4692f9 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#IRP zT^vI!{Fn9}iZNQt(i~Ov_>4$XJBAp@O1TaS?83{1ONjw BOG^L% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/sides.png b/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/sides.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1f6f9f359d80e876a2f8d33e9d2fca3d980139 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#K`F zT^vI!{O_JIWMnYlVcOt%m_e`NW59DC7XR(a`RC3oxyZila)f|~*W>nv6e(^dhD;lI Z1@TWwLi?L%?gv@J;OXk;vd$@?2>_~zKdt}( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/sidesstatus.png b/src/main/resources/assets/appliedenergistics2/textures/parts/crafting_terminal/sidesstatus.png new file mode 100644 index 0000000000000000000000000000000000000000..142f38511c2f61f1c9ec3acfbebd6bf52ec420f1 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7&r?&B8wRq z_?Ce%WBZ+z`3wvUQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWMGXpPkGZ7#Ko5 zT^vI!{I8zbD0skt!#U6`nQ_~KRCcrQH%@akgv|Ti$0Zlu-z7cyYfiBAT=rF5!faRE z#954lLG*J*xms2G`x`nAw76$2=4N`=$H|