Compare commits

...
147 Commits
Author SHA1 Message Date
bdew 5e7c8bda2f attempt to de-derpify unobfuscated jars 2015-01-05 16:03:05 +02:00
bdew 9346d95052 Huge typos and code style cleanup 2014-12-23 17:54:59 +02:00
bdew f0169a15e5 updated copyright header and minor cleanup 2014-12-23 14:41:32 +02:00
bdew 1da90af3f1 Added multiblock stuff for item output and slot selection 2014-12-23 14:34:54 +02:00
bdew b015636514 Added InventoryProxy and MultipleInventoryAdapter 2014-12-23 14:29:13 +02:00
bdew 610be18c74 Added resource system 2014-12-23 14:27:21 +02:00
bdew 9c977904ab Added hack to the gradle script to prevent IDEA14 from derping 2014-12-18 16:43:11 +02:00
bdew cc107d7466 Version bump 2014-12-18 11:26:55 +02:00
bdew 4284f11ec4 Added DataSlotDouble 2014-12-18 11:26:25 +02:00
bdew 300726e660 reworked OutputConfig &co to be easier to extend 2014-12-18 11:26:12 +02:00
bdew 02850b9f85 added DecFormat, some cleanup 2014-12-18 11:20:18 +02:00
bdew 1618931c6d Allow fluid gauge to have no overlay, fixed typo 2014-11-05 16:29:59 +02:00
bdew 5854625700 Added serialization helpers for ItemStack and NBTTagCompound 2014-10-28 10:04:57 +02:00
bdew 8bbab862ab Added RecipesHelper with some shared code for config system loading 2014-10-19 17:16:59 +03:00
bdew 9e83d04487 Build with newer forge 2014-10-19 17:16:15 +03:00
bdew 9202b27340 Added renderer for covers (to allow partially showing the underlying texture) - bdew/gendustry#57 2014-10-15 12:09:08 +03:00
bdew 70ee9fabd6 Added BaseBlockRenderHandler and RenderUtils (some common code moved there) 2014-10-15 12:09:08 +03:00
bdew 78d9bed924 Merge pull request #7 from nalimleinad/mc1710
Create cs_CZ.lang
2014-10-14 13:44:19 +03:00
nalimleinad 92517cdcec Create cs_CZ.lang 2014-10-13 15:30:59 +02:00
bdew bcb8edc8a5 Improved handling of missing icons of fluids and in Texture class 2014-10-08 12:11:53 +03:00
bdew 9a837361e7 /dumpregistry will now show actual items registered in OD 2014-10-06 13:51:40 +03:00
bdew 5ae0461f10 Recipe parser/loader rework, see http://bdew.net/bacon/ for description of new format 2014-10-06 13:51:38 +03:00
bdew b3f8fb3c56 Added PlayerCache - a generic player->whatever map that auto-clears on server restart, logoff, respawn, etc. 2014-09-23 14:12:13 +03:00
bdew 023ae4d77f Added another version of Misc.asInstanceOpt that's easier to use with map, etc. 2014-09-23 14:12:13 +03:00
bdew b1e0e70fc4 Added WidgetSimpleIcon 2014-09-23 14:12:13 +03:00
bdew 5f01716310 Made network message type bound to a specific channel, this should give compile-time errors for sending messages on the wrong channel. Messages should now inherit from YourChannelObject.Message 2014-09-23 14:12:13 +03:00
bdew 0976fb4acc Merge pull request #5 from ViKaleidoscope/patch-1
Create zh_CN.lang
2014-09-19 09:25:35 +03:00
∑( ° △ °|||) 4effeafbb7 Create zh_CN.lang 2014-09-19 12:54:59 +08:00
bdew e0d3609e66 Add ability to customize on what updates DataSlotTank sends it's capacity (default unchanged - only on GUI) 2014-09-18 10:07:56 +03:00
bdew 5a1c150a03 Fixed DrawTarget.drawTextureInterpolate ignoring color parameter 2014-09-16 14:57:37 +03:00
bdew c5a7fc3d51 Fixed WidgetFluidGauge not respecting fluid color 2014-09-16 14:51:33 +03:00
bdew 9787c4836e WidgetOutputs + WidgetPowerOutput moved back to generators as it's mod-specific. WidgetRSConfig refactored from them 2014-09-16 09:44:03 +03:00
bdew cd833163af MsgOutputCfgPower/Fluid (That only had RS configuration) replaced by MsgOutputCfgRSMode 2014-09-16 09:43:13 +03:00
bdew 5a9aedb4d5 Refactoring multiblock outputs, TileOutput (&co) now has a type parameter for config object type 2014-09-04 15:54:35 +03:00
bdew 2a7bbaeb97 prevent outputs connecting back to the same structure 2014-09-03 17:37:00 +03:00
bdew 58125ee291 TileModule.getCoreAs reworked for better type safety 2014-09-03 17:36:19 +03:00
bdew d9cc8ace82 Fixed fluid config save/load 2014-09-02 17:23:36 +03:00
bdew 32617ff592 Added DataSlotInventory 2014-09-02 14:10:50 +03:00
bdew 64683a0208 Refactored output config for multiblocks, added config object for fluid outputs 2014-09-02 14:10:36 +03:00
bdew f593458511 Allow quoted strings as config keys 2014-08-31 10:44:35 +03:00
bdew e6b38472ce Ensure tanks are marked for saving when content changes 2014-08-24 09:58:51 +03:00
bdew e6c0ef2c68 Merge pull request #4 from Adaptivity/patch-1
Create ru_RU.lang
2014-08-21 13:46:48 +03:00
Anton 56110d8ec5 Create ru_RU.lang 2014-08-21 14:09:51 +04:00
bdew f000d11c54 Added ConfigSection.keys 2014-08-20 14:17:13 +03:00
bdew 913d4f48a6 Added localization file 2014-08-20 10:49:06 +03:00
bdew a25553edaf Force block update when connections change for output modules 2014-08-20 10:48:21 +03:00
bdew 82328d10ec Aded multiblock system (moved from DCM) 2014-08-14 15:13:31 +03:00
bdew 12f19fc410 BlockManager.regBlock should looke for NamedBlock trait, not SimpleBlock 2014-08-14 10:04:26 +03:00
bdew 7c275f434a bump version 2014-08-12 13:05:52 +03:00
bdew f960050f9c Added creative tabs helper 2014-08-12 12:41:23 +03:00
bdew 87dd7c34c5 Added DataSlotOption 2014-08-12 12:41:10 +03:00
bdew 9fdc6bd880 Added connected textures renderer 2014-08-11 16:51:18 +03:00
bdew 490433a7f4 Added BlockFace, HasTE can now work with BlockRef, Fixed missing copyrights 2014-08-11 16:45:01 +03:00
bdew 71bef762a6 Added BlockRef (from pressure pipes) 2014-08-07 12:46:21 +03:00
bdew 5eef56811b Fixed InventoryItemAdapter not loading properly 2014-07-29 17:19:39 +03:00
bdew 5a3fa7ef75 Added a statement to check if an API is present in configs 2014-07-29 16:19:05 +03:00
bdew 2d799bb797 Code style 2014-07-29 12:44:05 +03:00
bdew 03d9b0fef0 Rewrote networking system (experimental) 2014-07-29 12:43:53 +03:00
bdew 9b0ed5b0b5 Merge remote-tracking branch 'remotes/origin/mc172' into mc1710 2014-07-15 14:02:45 +03:00
bdew e2c7940539 fixed getConcreteStack in RecipeLoader ignoring size 2014-07-15 14:01:47 +03:00
bdew cd85553fa1 Bump forge to recommended 1180 2014-07-14 10:26:52 +03:00
bdew bbe994c28c Added DataSlotGameProfile 2014-07-14 10:26:34 +03:00
bdew 79e308941d Update to 1.7.10 2014-07-08 11:36:18 +03:00
bdew 7a5982bf37 Cleanup and update changes to 1.7.2 2014-06-18 11:37:56 +03:00
bdew 5166576d30 Merge remote-tracking branch 'remotes/origin/master' into mc172 2014-06-18 11:25:59 +03:00
bdew da3e58b44b Reworked cover system to store full itemstack of the cover (for stuff like filter covers to have a place to store data) 2014-06-01 16:53:51 +03:00
bdew 5bac374211 Added cover upgrades system 2014-06-01 15:07:54 +03:00
bdew e41e203b7e Added Misc.forgeDirection, Misc.asInstanceOpt, Misc.getNeighbourTile and ItemUtils.getAccessibleSlotsFromSide helpers 2014-06-01 15:07:33 +03:00
bdew 0b87dd83e7 Fixed tile entity names not being scoped, should prevent collisions 2014-05-29 11:24:24 +03:00
bdew 49a2f0baec Fix NPE in getBiomeByName (bdew/gendustry#22) 2014-05-13 02:15:57 +03:00
bdew 35be9bff77 Merge remote-tracking branch 'remotes/origin/master' into mc172 2014-05-04 15:48:48 +03:00
bdew 2a995f1c05 Added Misc.hasLocal 2014-05-04 15:40:04 +03:00
bdew 423351bfee Added ItemUtils.copyWithRandomSize (inspired by forestry) 2014-05-04 15:39:47 +03:00
bdew d67bd24eda added IStackBlock for pattern matching with ItemBlocks 2014-04-30 11:18:39 +03:00
bdew a10e90a1e1 Merge remote-tracking branch 'remotes/origin/master' into mc172 2014-04-30 11:16:57 +03:00
bdew 517c3f347f Fixed build script 2014-04-30 09:33:43 +03:00
bdew 0831386798 Added hex numbers support in config parser (0x12345678) 2014-04-29 16:10:41 +03:00
bdew 0b45c61c51 ConfigSection.getColor now accepts numeric values, added Color.fromInt 2014-04-29 16:10:15 +03:00
bdew 65aa8a0f66 Use the right logger in LootListLoader, added a version of resolve to use outside config sections 2014-04-28 13:39:43 +03:00
bdew 446f2b6e60 Added loot list sections to recipe parser 2014-04-24 16:49:57 +03:00
bdew ecdcdfb05f Added /dumpregistry command 2014-04-23 15:11:07 +03:00
bdew d1d3df184f Don't register custom item stacks from Machine.regBlock - not needed anymore 2014-04-23 14:09:01 +03:00
bdew 522ac5b57b Proper exception logging in RecipeLoader statements 2014-04-23 13:37:09 +03:00
bdew 7acca5475f Added NamedItem trait (which SimpleItem extends now) 2014-04-23 13:36:42 +03:00
bdew 1b86f5f7cc Merge remote-tracking branch 'remotes/origin/mc172' into mc172 2014-04-20 13:46:06 +03:00
bdew 819197cf1e Block and Item Manager should not register itemstacks by default in 1.7 since the normal block/item registry is now usable 2014-04-20 13:44:42 +03:00
bdew 1e71bf7dd9 Fixed RecipeLoader logging error 2014-04-20 13:44:10 +03:00
bdew 0549f95088 Fix project name 2014-04-14 09:50:22 +03:00
bdew 06f0007bca oops wrong version 2014-04-14 09:36:21 +03:00
bdew 54499cdb2e Update to Forge 1057 (FG 1.2) 2014-04-13 15:25:20 +03:00
bdew d80d89acf1 Merge remote-tracking branch 'remotes/origin/master' into mc172 2014-04-13 15:24:45 +03:00
bdew 926f006f68 Bumped version number 2014-04-02 17:52:23 +03:00
bdew 4697c96cf2 Added ItemUtils.findItemInInventory 2014-04-02 17:47:57 +03:00
bdew 8891cfff06 Added extractor (for scala pattern matching) for ItemStack 2014-03-19 11:28:34 +02:00
bdew 971fd94532 Cleanup 2014-03-18 12:01:34 +02:00
bdew a9e1e88ff2 Added object for misc clientside functions 2014-03-18 12:01:25 +02:00
bdew c9c014a3a9 Added misc method to find biome by name 2014-03-17 17:23:35 +02:00
bdew 3001309a85 Config parser/loader changes: IfOreDict can now contain only delayed statements and is a delayed statement itself (will be evaluated when loadDealayed is called)
Also 2 new terms added at parser level - delayedStatement(s) - to separate lists that require delayed statements
2014-03-13 12:02:48 +02:00
bdew 07fbbb0267 Workaround for ItemInventory crashing on servers (scala synthetic methods not keeping annotations) 2014-03-09 12:21:53 +02:00
bdew 561f176682 Added workaround for bug in GuiContainer - not resetting color when rendering background icon 2014-03-04 16:32:59 +02:00
bdew 5f9c311f41 Fixed BaseScreen not drawing the background in correct position 2014-02-27 11:13:40 +02:00
bdew 78c5ec1362 Merge branch 'master' of github.com:bdew/bdlib into mc172 2014-02-27 10:06:58 +02:00
bdew c2a1cc09e3 Widget.bindTexture is useless now 2014-02-27 09:43:01 +02:00
bdew 273735a976 Widget(Dyn)Label should use DrawTarget.drawText 2014-02-27 09:35:43 +02:00
bdew 26137a88d7 Added a separate method to Widget that draws the background layer 2014-02-27 09:33:26 +02:00
bdew 81a0d00a8b Why did i make that a double? 0.o (closes #2) 2014-02-27 09:31:19 +02:00
bdew 5d7c0cd5e8 GUI/texture refactoring 2014-02-26 17:48:53 +02:00
bdew 4e2df02b8a added alpha component to Color 2014-02-24 20:52:38 +02:00
bdew 82e88157f2 Fixed drawTextureScaled and made the code more readable 2014-02-24 20:52:00 +02:00
bdew 7b588d896d Added some color constants 2014-02-24 11:43:38 +02:00
bdew 938ea4f3d5 EntryNumList can be converted used as color 2014-02-24 11:34:29 +02:00
bdew 1541b96a5a Added support for number lists in config 2014-02-24 11:28:08 +02:00
bdew 17329115a2 made ItemPreloader easier to use 2014-02-20 18:03:34 +02:00
bdew 3966305a61 Added IconPreloader 2014-02-20 12:35:58 +02:00
bdew 31573cc8fc Allow negative numbers in config (derp!) 2014-02-17 17:54:34 +02:00
bdew 563ae0a328 Use main logger as the parent for RecipeLoader 2014-02-17 17:54:13 +02:00
bdew 13cef01a2d Added helper classes for items that have and inventory and a gui 2014-02-17 12:26:20 +02:00
bdew 1296b32110 Added log object, fixed missing annotation, fixed copyright headers 2014-02-17 12:25:56 +02:00
bdew 005c300d8f Added experimental network stuff 2014-02-12 17:03:34 +02:00
bdew 4754c209ae oops, i an annotation 2014-02-12 14:19:24 +02:00
bdew b89d445b17 Updated Recipe Loader for 1.7.2 changes 2014-02-12 14:18:57 +02:00
bdew 7eefbb1a31 Updated HasTE, BaseInventory and Block/Item Manager for 1.7.2 changes 2014-02-12 12:39:10 +02:00
bdew 4268019935 Initial port to MC 1.7.2 2014-02-10 14:28:05 +02:00
bdew 78a69acc44 Bumping version 2014-02-01 13:06:39 +02:00
bdew e3bf80e1c9 Added WidgetDynLabel 2014-02-01 12:25:00 +02:00
bdew f4f126fed2 Added WidgetContainer.drawTextureScaled 2014-02-01 12:24:36 +02:00
bdew 97b3e0ea1d added WidgetMultipane 2014-01-26 02:17:18 +02:00
bdew 9f6e2d7533 WidgetContainer draw functions now take color 2014-01-26 02:17:04 +02:00
bdew 9819600b15 Fixed wrong mouse offset in handleTooltip 2014-01-23 17:49:36 +02:00
bdew 12a1327e53 Refactoring widget system to allow containers, added button widget 2014-01-23 17:40:03 +02:00
bdew c495fb8b33 Fixed WidgetFluidGauge not respecting it's width 2014-01-21 17:21:50 +02:00
bdew 0b94b006ec Fixed DataSlotTank not changing to empty state 2014-01-18 19:00:07 +02:00
bdew c4dbda8a20 Added ConfigSection.hasValue to check if a value is present 2014-01-17 21:41:20 +02:00
bdew 2698d93444 Split BaseContainer into NoInvContainer for stuff that doesn't need the tile to be an inventory 2014-01-17 21:40:54 +02:00
bdew b4cc77d3cc Removed redundant size field on DataSlotTank, fixed div by 0 crash with the widget 2014-01-17 21:39:25 +02:00
bdew 2c94505c97 Added UpdateKind.RENDER - data slots with this flag will cause the block to be re-rendered on the client after it's synced from the server 2014-01-15 18:08:09 +02:00
bdew 2c3607e113 Fixed config parser not recognizing ifOreDict 2014-01-14 23:49:54 +02:00
bdew b34192d8c2 Updated copyright header 2014-01-13 20:40:45 +02:00
bdew 0212f20f69 Bump version for release 2014-01-13 19:56:54 +02:00
bdew 3b31e285d2 Added a slot trait that intercepts clicks 2013-12-31 12:35:34 +02:00
bdew 041f570109 Fixed crash on dedicated servers 2013-12-24 10:25:13 +02:00
bdew 745cf43928 Split recipe loader to 2 phases, added statement to override recipes 2013-12-23 17:44:38 +02:00
bdew 914815fee7 Added enabled flag to machine class 2013-12-23 15:16:56 +02:00
bdew bed3149880 More refactoring and cleanup 2013-12-23 15:08:19 +02:00
bdew 302429f340 Refactoring, cleanup and moving stuff to bdlib 2013-12-23 13:30:07 +02:00
bdew b6fe2dc14d Switched to use the token replacement in forgegradle 2013-12-13 17:25:23 +02:00
bdew 377fe3c27a Added helper stuff to Point and Rect 2013-12-12 18:16:57 +02:00
181 changed files with 5813 additions and 868 deletions

No files matched your search

+9 -8
View File
@@ -1,9 +1,10 @@
/.gradle
/build
/deps
/eclipse
/bin
/out
*.ipr
*.iml
*.iws
/build
/run
/deps/run
/eclipse
/.gradle
/*.iml
/*.ipr
/.idea
+17 -30
View File
@@ -1,24 +1,27 @@
buildscript {
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
repositories {
mavenCentral()
maven {
name = "bdew"
url = "http://jenkins.bdew.net/maven"
}
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:1.0-SNAPSHOT'
classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
}
}
apply plugin: 'forge'
apply plugin: 'scala'
apply plugin: 'forge'
version = "0.9.1"
version = "1.6.0"
if (project.hasProperty('buildnum')) {
project.version = project.version + '.' + project.buildnum
@@ -28,15 +31,15 @@ if (project.hasProperty('buildnum')) {
group = "net.bdew"
archivesBaseName = "bdlib"
ext.versuffix = "mc164"
ext.versuffix = "mc1710"
minecraft {
version = "1.6.4-9.11.1.964"
version = "1.7.10-10.13.2.1231"
replace("BDLIB_VER", project.version)
}
import org.apache.tools.ant.filters.ReplaceTokens
def myTokens = [BdLibVer: project.version]
sourceSets {
main {
@@ -46,31 +49,15 @@ sourceSets {
resources {
srcDir 'resources'
}
output.resourcesDir = output.classesDir // Hack for IDEA
}
processed {
scala {
srcDir 'build/stage'
}
}
}
task stage(type: Sync) {
inputs.property "tokens", myTokens
from sourceSets.main.scala
into 'build/stage'
filter(ReplaceTokens, tokens: myTokens)
}
compileScala {
source = sourceSets.processed.scala
dependsOn stage
}
processResources {
inputs.property "tokens", myTokens
inputs.property "tokens", minecraft.replacements
from(sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
filter(ReplaceTokens, tokens: myTokens)
filter(ReplaceTokens, tokens: minecraft.replacements)
}
from(sourceSets.main.resources.srcDirs) {
@@ -83,7 +70,7 @@ task sourceJar(type: Jar) {
}
task deobfJar(type: Jar) {
from sourceSets.main.output
from sourceSets.main.output.classesDir
}
jar {
Binary file not shown.
+2 -2
View File
@@ -1,6 +1,6 @@
#Thu Nov 28 11:30:59 IST 2013
#Wed Jul 02 15:54:47 CDT 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip
+19
View File
@@ -0,0 +1,19 @@
bdlib.multiblock.face.north=Sever
bdlib.multiblock.face.south=Jih
bdlib.multiblock.face.east=Západ
bdlib.multiblock.face.west=Východ
bdlib.multiblock.face.up=Vršek
bdlib.multiblock.face.down=Spodek
bdlib.multiblock.disabled=Zakázáno
bdlib.multiblock.incomplete=Tento stroj není kompletní, ještě potřebuje alespoň:
bdlib.multiblock.notconnected=Nepřipojeno ke správnému stroji
bdlib.multiblock.toomanyoutputs=Připojeno příliš mnoho výstupů, nemohu získat nové připojení
bdlib.rsmode.always=Vždy ZAPNUTO
bdlib.rsmode.never=Zakázáno
bdlib.rsmode.rs_on=Povoleno při ruditovém signálu
bdlib.rsmode.rs_off=Zakázáno při ruditovém signálu
bdlib.label.empty=Prázdný
+19
View File
@@ -0,0 +1,19 @@
bdlib.multiblock.face.north=North
bdlib.multiblock.face.south=South
bdlib.multiblock.face.east=East
bdlib.multiblock.face.west=West
bdlib.multiblock.face.up=Top
bdlib.multiblock.face.down=Bottom
bdlib.multiblock.disabled=Disabled
bdlib.multiblock.incomplete=This machine is incomplete, it requires at least:
bdlib.multiblock.notconnected=Not connected to a valid machine
bdlib.multiblock.toomanyoutputs=Too many outputs connected, unable to attach new connection
bdlib.rsmode.always=Always ON
bdlib.rsmode.never=Disabled
bdlib.rsmode.rs_on=Enable on redstone
bdlib.rsmode.rs_off=Disable on redstone
bdlib.label.empty=Empty
+18
View File
@@ -0,0 +1,18 @@
bdlib.multiblock.face.north=Север
bdlib.multiblock.face.south=Юг
bdlib.multiblock.face.east=Восток
bdlib.multiblock.face.west=Запад
bdlib.multiblock.face.up=Верх
bdlib.multiblock.face.down=Низ
bdlib.multiblock.disabled=Отключено
bdlib.multiblock.incomplete=Этот механизм не завершён, ему требуется как минимум:
bdlib.multiblock.notconnected=Не подключено к верному механизму
bdlib.multiblock.toomanyoutputs=Слишком много выходов подсоединено, нельзя установить новое соединение
bdlib.rsmode.always=Всегда ВКЛ.
bdlib.rsmode.never=Отключен
bdlib.rsmode.rs_on=Включение по сигналу красного камня
bdlib.rsmode.rs_off=Отключение по сигналу красного камня
bdlib.label.empty=Пусто
+18
View File
@@ -0,0 +1,18 @@
bdlib.multiblock.face.north=北方
bdlib.multiblock.face.south=南方
bdlib.multiblock.face.east=东方
bdlib.multiblock.face.west=西方
bdlib.multiblock.face.up=顶部
bdlib.multiblock.face.down=底部
bdlib.multiblock.disabled=停用
bdlib.multiblock.incomplete=这台多方块结构机器未搭建完成, 它至少需要安装一个:
bdlib.multiblock.notconnected=未连接有效机器
bdlib.multiblock.toomanyoutputs=连接的输出接口过多, 无法连接新的接口
bdlib.rsmode.always=一直启用
bdlib.rsmode.never=一直停用
bdlib.rsmode.rs_on=接收到红石信号时启用
bdlib.rsmode.rs_off=接收到红石信号时停用
bdlib.label.empty=空
+1 -1
View File
@@ -3,7 +3,7 @@
"modid": "bdlib",
"name": "BD Lib",
"description": "",
"version": "@BdLibVer@",
"version": "@BDLIB_VER@",
"url": "bdew.net/mods/",
"updateUrl": "",
"authorList": [
+1
View File
@@ -0,0 +1 @@
rootProject.name = 'bdlib'
+42 -3
View File
@@ -1,11 +1,50 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib
import cpw.mods.fml.common.Mod
import cpw.mods.fml.common.event.FMLPreInitializationEvent
import cpw.mods.fml.common.Mod.EventHandler
import cpw.mods.fml.common.event.{FMLPreInitializationEvent, FMLServerStartingEvent, FMLServerStoppingEvent}
import net.bdew.lib.multiblock.network.NetHandler
import net.minecraft.command.CommandHandler
import org.apache.logging.log4j.Logger
@Mod(modid = "bdlib", version = "@BdLibVer@", modLanguage = "scala")
@Mod(modid = "bdlib", name = "BD lib", version = "BDLIB_VER", modLanguage = "scala")
object BdLib {
var log: Logger = null
def logInfo(msg: String, args: Any*) = log.info(msg.format(args: _*))
def logWarn(msg: String, args: Any*) = log.warn(msg.format(args: _*))
def logError(msg: String, args: Any*) = log.error(msg.format(args: _*))
def logWarnException(msg: String, t: Throwable, args: Any*) = log.warn(msg.format(args: _*), t)
def logErrorException(msg: String, t: Throwable, args: Any*) = log.error(msg.format(args: _*), t)
val onServerStarting = Event[FMLServerStartingEvent]
val onServerStopping = Event[FMLServerStoppingEvent]
@EventHandler
def preInit(ev: FMLPreInitializationEvent) {
ev.getModLog.info("bdlib @BdLibVer@ loaded")
log = ev.getModLog
log.info("bdlib BDLIB_VER loaded")
NetHandler.init()
}
@EventHandler
def serverStarting(event: FMLServerStartingEvent) {
val commandHandler = event.getServer.getCommandManager.asInstanceOf[CommandHandler]
commandHandler.registerCommand(new CommandDumpRegistry)
onServerStarting.trigger(event)
}
@EventHandler
def serverStopping(event: FMLServerStoppingEvent) {
onServerStopping.trigger(event)
}
}
+34
View File
@@ -0,0 +1,34 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib
import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.texture.TextureMap
import org.lwjgl.input.Keyboard
/**
* Misc functions and shortcuts for client-side code
*/
object Client {
def minecraft = Minecraft.getMinecraft
def fontRenderer = Minecraft.getMinecraft.fontRenderer
def renderEngine = Minecraft.getMinecraft.renderEngine
def world = Minecraft.getMinecraft.theWorld
def player = Minecraft.getMinecraft.thePlayer
def textureManager = Minecraft.getMinecraft.getTextureManager
def blockMissingIcon = textureManager.getTexture(TextureMap.locationBlocksTexture).asInstanceOf[TextureMap].getAtlasSprite("missingno")
def itemMissingIcon = textureManager.getTexture(TextureMap.locationItemsTexture).asInstanceOf[TextureMap].getAtlasSprite("missingno")
def shiftDown: Boolean = {
return Keyboard.isKeyDown(42) || Keyboard.isKeyDown(54)
}
}
@@ -0,0 +1,70 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib
import java.io.{BufferedWriter, File, FileWriter}
import com.google.common.collect.Table
import cpw.mods.fml.common.registry.GameData
import cpw.mods.fml.relauncher.FMLInjectionData
import net.minecraft.command.{CommandBase, ICommandSender}
import net.minecraft.item.ItemStack
import net.minecraftforge.fluids.FluidRegistry
import net.minecraftforge.oredict.OreDictionary
class CommandDumpRegistry extends CommandBase {
def getCommandName = "dumpregistry"
override def getRequiredPermissionLevel = 2
def getCommandUsage(c: ICommandSender) = "dumpregistry"
def processCommand(sender: ICommandSender, params: Array[String]) {
val mcHome = FMLInjectionData.data()(6).asInstanceOf[File] //is there a better way to get this?
val dumpFile = new File(mcHome, "registry.dump")
val dumpWriter = new BufferedWriter(new FileWriter(dumpFile))
import scala.collection.JavaConversions._
try {
dumpWriter.write("==== BLOCKS ====\n")
dumpWriter.write(GameData.getBlockRegistry.map(GameData.getBlockRegistry.getNameForObject).toList.sorted.mkString("\n"))
dumpWriter.write("\n\n")
dumpWriter.write("==== ITEMS ====\n")
dumpWriter.write(GameData.getItemRegistry.map(GameData.getItemRegistry.getNameForObject).toList.sorted.mkString("\n"))
dumpWriter.write("\n\n")
dumpWriter.write("==== CUSTOM STACKS ====\n")
val stacksField = classOf[GameData].getDeclaredField("customItemStacks")
stacksField.setAccessible(true)
val stacksData = stacksField.get(null).asInstanceOf[Table[String, String, ItemStack]]
dumpWriter.write(stacksData.cellSet().map(x => x.getRowKey + ":" + x.getColumnKey).toList.sorted.mkString("\n"))
dumpWriter.write("\n\n")
dumpWriter.write("==== ORE DICT ====\n")
dumpWriter.write((OreDictionary.getOreNames.sorted flatMap { name =>
List(name) ++
(OreDictionary.getOres(name) map { ore =>
" - " + ore.toString
})
}).mkString("\n"))
dumpWriter.write("\n\n")
dumpWriter.write("==== FLUIDS ====\n")
dumpWriter.write(FluidRegistry.getRegisteredFluids.map(_._1).toList.sorted.mkString("\n"))
dumpWriter.write("\n\n")
CommandBase.func_152373_a(sender, this, "Registry dumped to " + dumpFile.getCanonicalPath)
} catch {
case e: Throwable =>
CommandBase.func_152373_a(sender, this, "Failed to save registry dump: " + e)
BdLib.logErrorException("Failed to save registry dump", e)
} finally {
dumpWriter.close()
}
}
}
@@ -0,0 +1,24 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib
import net.minecraft.creativetab.CreativeTabs
import net.minecraft.item.Item
class CreativeTabContainer {
class Tab(name: String, item: => Item) extends CreativeTabs(name) {
override def getTabIconItem = item
}
BdLib.logInfo("Loaded creative tabs for %s", Misc.getActiveModId)
def init() {}
}
+25
View File
@@ -0,0 +1,25 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib
import java.text.DecimalFormat
object DecFormat {
val thousandsFmt = new DecimalFormat("#,##0")
val dec2Fmt = new DecimalFormat("#,##0.00")
def round(x: Double) = thousandsFmt.format(x)
def round(x: Float) = thousandsFmt.format(x)
def round(x: Int) = thousandsFmt.format(x)
def dec2(x: Double) = dec2Fmt.format(x)
def dec2(x: Float) = dec2Fmt.format(x)
def dec2(x: Int) = dec2Fmt.format(x)
}
+3 -3
View File
@@ -1,10 +1,10 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib
@@ -28,7 +28,7 @@ class Event2[T, R] extends EventBase[(T, R) => Unit] {
}
object Event {
def apply(t: Unit) = new Event0
def apply() = new Event0
def apply[T] = new Event1[T]
def apply[T, R] = new Event2[T, R]
}
+73 -16
View File
@@ -1,28 +1,42 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib
import cpw.mods.fml.common.registry.GameRegistry
import net.minecraft.nbt.{NBTTagCompound, NBTTagList}
import net.minecraft.util.StatCollector
import net.minecraft.item.ItemStack
import cpw.mods.fml.common.versioning.{ArtifactVersion, VersionParser}
import cpw.mods.fml.common.Loader
import cpw.mods.fml.common.registry.GameRegistry
import cpw.mods.fml.common.versioning.{ArtifactVersion, VersionParser}
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.tileentity.TileEntity
import net.minecraft.util.{IIcon, StatCollector}
import net.minecraft.world.biome.BiomeGenBase
import net.minecraftforge.common.util.ForgeDirection
import net.minecraftforge.fluids.{Fluid, FluidStack}
import net.minecraftforge.oredict.ShapedOreRecipe
object Misc {
def iterNbtList[X](list: NBTTagList) =
for (i <- 0 until list.tagCount()) yield list.tagAt(i).asInstanceOf[X]
def iterNbtCompoundList(parent: NBTTagCompound, name: String): Iterable[NBTTagCompound] = {
val list = parent.getTagList(name, 10)
for (i <- 0 until list.tagCount()) yield list.getCompoundTagAt(i)
}
def iterNbtIntArray(parent: NBTTagCompound, name: String): Iterable[Array[Int]] = {
val list = parent.getTagList(name, 11)
for (i <- 0 until list.tagCount()) yield list.func_150306_c(i)
}
def getActiveModId = Loader.instance().activeModContainer().getModId
def toLocal(s: String) = StatCollector.translateToLocal(s)
def toLocalF(s: String, params: Any*) = StatCollector.translateToLocal(s).format(params: _*)
def hasLocal(s: String) = StatCollector.canTranslate(s)
def flattenRecipe(pattern: Seq[String], items: Map[Char, AnyRef]) =
pattern ++ items.map {
@@ -32,7 +46,7 @@ object Misc {
def wrapTag(n: String, f: (NBTTagCompound) => Any)(t: NBTTagCompound) {
val p = t.getCompoundTag(n)
f(p)
t.setCompoundTag(n, p)
t.setTag(n, p)
}
def addRecipe(result: ItemStack, pattern: Seq[String], items: Map[Char, AnyRef]) =
@@ -41,26 +55,69 @@ object Misc {
def addRecipeOD(result: ItemStack, pattern: Seq[String], items: Map[Char, AnyRef]) =
GameRegistry.addRecipe(new ShapedOreRecipe(result, flattenRecipe(pattern, items): _*))
def min[T](vals: T*)(implicit o: Ordering[T]): T = vals.min(o)
def max[T](vals: T*)(implicit o: Ordering[T]): T = vals.max(o)
def min[T: Ordering](values: T*) = values.min
def max[T: Ordering](values: T*) = values.max
def clamp[T](value: T, min: T, max: T)(implicit o: Ordering[T]): T = if (o.gt(value,max)) max else if (o.lt(value,min)) min else value
def clamp[T](value: T, min: T, max: T)(implicit o: Ordering[T]): T = if (o.gt(value, max)) max else if (o.lt(value, min)) min else value
def iterSome[T](list: Seq[T], indexes: Iterable[Int]): Iterable[T] = for (i <- indexes) yield list(i)
def iterSomeEnum[T](list: Seq[T], indexes: Iterable[Int]): Iterable[(Int, T)] = for (i <- indexes) yield i -> list(i)
def filterType[T](from: Iterable[_], cls: Class[T]) = from.filter(cls.isInstance).asInstanceOf[Iterable[T]]
def getBiomeByName(name: String) = BiomeGenBase.getBiomeGenArray.find(x => x != null && x.biomeName == name).orNull
def haveModVersion(spec: String): Boolean = {
val req = VersionParser.parseVersionReference(spec)
val modid = req.getLabel
val modId = req.getLabel
if (!Loader.instance.getIndexedModList.containsKey(modid)) return false
if (!Loader.instance.getIndexedModList.containsKey(modId)) return false
val found: ArtifactVersion = Loader.instance.getIndexedModList.get(modid).getProcessedVersion
val found: ArtifactVersion = Loader.instance.getIndexedModList.get(modId).getProcessedVersion
if (found == null || !req.containsVersion(found)) return false
return true
}
// Because writing this every time is awkward
def forgeDirection(i: Int) = ForgeDirection.values()(i)
// Easy replacement for various "if(foo.isInstanceOf[Bar]) foo.asInstanceOf[Bar]" constructs
def asInstanceOpt[T](v: Any, cls: Class[T]) =
if (cls.isInstance(v)) Some(v.asInstanceOf[T]) else None
// Same thing but in a way that's easier to use with map, etc.
def asInstanceOpt[T](cls: Class[T])(v: Any) =
if (cls.isInstance(v)) Some(v.asInstanceOf[T]) else None
def getNeighbourTile[T](origin: TileEntity, dir: ForgeDirection, cls: Class[T]) =
Option(origin.getWorldObj.getTileEntity(origin.xCoord + dir.offsetX,
origin.yCoord + dir.offsetY, origin.zCoord + dir.offsetZ)) flatMap (asInstanceOpt(_, cls))
@inline def applyMutator[T](f: (T) => Unit, init: T): T = {
f(init)
init
}
@inline def applyMutator[T](init: T)(f: (T) => Unit) = {
f(init)
init
}
def getFluidIcon(fs: FluidStack): IIcon =
if (fs != null && fs.getFluid != null && fs.getFluid.getIcon != null)
fs.getFluid.getIcon(fs)
else
Client.blockMissingIcon
def getFluidIcon(f: Fluid): IIcon =
if (f != null) getFluidIcon(new FluidStack(f, 1)) else Client.blockMissingIcon
def getFluidColor(fs: FluidStack): Int =
if (fs != null && fs.getFluid != null) fs.getFluid.getColor(fs) else 0xFFFFFF
def getFluidColor(f: Fluid): Int =
if (f != null) getFluidColor(new FluidStack(f, 1)) else 0xFFFFFF
}
+22
View File
@@ -0,0 +1,22 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.block
import net.minecraftforge.common.util.ForgeDirection
case class BlockFace(x: Int, y: Int, z: Int, face: ForgeDirection) {
def origin = BlockRef(x, y, z)
def target = origin.neighbour(face)
def opposite = face.getOpposite
}
object BlockFace {
def apply(bp: BlockRef, face: ForgeDirection) = new BlockFace(bp.x, bp.y, bp.z, face)
}
+59
View File
@@ -0,0 +1,59 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.block
import net.minecraft.block.Block
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.tileentity.TileEntity
import net.minecraft.world.IBlockAccess
import net.minecraftforge.common.util.ForgeDirection
import scala.reflect.ClassTag
case class BlockRef(x: Int, y: Int, z: Int) {
def block(w: IBlockAccess) = Option(w.getBlock(x, y, z))
def tile(w: IBlockAccess) = Option(w.getTileEntity(x, y, z))
def meta(w: IBlockAccess) = w.getBlockMetadata(x, y, z)
def blockIs(w: IBlockAccess, other: Block) = block(w).contains(other)
def neighbour(side: ForgeDirection) = BlockRef(x + side.offsetX, y + side.offsetY, z + side.offsetZ)
def neighbours = ForgeDirection.VALID_DIRECTIONS.map(x => x -> neighbour(x)).toMap
override def toString = "(x=%d y=%d z=%d)".format(x, y, z)
def getTile[T: ClassTag](w: IBlockAccess) = tile(w) flatMap { tile =>
val cls = implicitly[ClassTag[T]].runtimeClass
if (cls.isInstance(tile))
Some(tile.asInstanceOf[T])
else None
}
def ==(tx: Int, ty: Int, tz: Int) = x == tx && y == ty && z == tz
def getBlock[T: ClassTag](w: IBlockAccess) = block(w) flatMap { block =>
val cls = implicitly[ClassTag[T]].runtimeClass
if (cls.isInstance(block))
Some(block.asInstanceOf[T])
else None
}
def writeToNBT(tag: NBTTagCompound) {
tag.setInteger("x", x)
tag.setInteger("y", y)
tag.setInteger("z", z)
}
}
object BlockRef {
def fromTile(te: TileEntity) = BlockRef(te.xCoord, te.yCoord, te.zCoord)
def fromNBT(tag: NBTTagCompound) =
BlockRef(tag.getInteger("x"), tag.getInteger("y"), tag.getInteger("z"))
}
+14 -10
View File
@@ -1,30 +1,34 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.block
import net.minecraft.block.{ITileEntityProvider, Block}
import net.minecraft.world.{IBlockAccess, World}
import net.bdew.lib.BdLib
import net.minecraft.block.{Block, ITileEntityProvider}
import net.minecraft.tileentity.TileEntity
import cpw.mods.fml.common.FMLCommonHandler
import net.minecraft.world.{IBlockAccess, World}
trait HasTE[T] extends Block with ITileEntityProvider {
val TEClass: Class[_ <: TileEntity]
def createNewTileEntity(world: World): TileEntity = TEClass.newInstance()
def createNewTileEntity(world: World, meta: Int): TileEntity = TEClass.newInstance()
def getTE(w: IBlockAccess, ref: BlockRef): T = getTE(w, ref.x, ref.y, ref.z)
def getTE(w: IBlockAccess, x: Int, y: Int, z: Int): T = {
var t = w.getBlockTileEntity(x, y, z)
var t = w.getTileEntity(x, y, z)
if ((t == null) || !TEClass.isInstance(t)) {
FMLCommonHandler.instance().getFMLLogger.severe("Tile entity for block %s at (%d,%d,%d) is corrupt or missing - recreating".format(this, x, y, z))
BdLib.logError("Tile entity for block %s at (%d,%d,%d) is corrupt or missing - recreating", this, x, y, z)
w match {
case ww: World =>
t = createNewTileEntity(ww)
ww.setBlockTileEntity(x, y, z, t)
t = createNewTileEntity(ww, w.getBlockMetadata(x, y, z))
ww.setTileEntity(x, y, z, t)
case _ =>
sys.error("Unable to recreate TE")
}
+30
View File
@@ -0,0 +1,30 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.block
import cpw.mods.fml.relauncher.{Side, SideOnly}
import net.bdew.lib.Misc
import net.minecraft.block.Block
import net.minecraft.block.material.Material
import net.minecraft.client.renderer.texture.IIconRegister
trait NamedBlock extends Block {
def name: String
}
class SimpleBlock(val name: String, material: Material) extends Block(material) with NamedBlock {
val modId = Misc.getActiveModId
setBlockName(modId + "." + name)
@SideOnly(Side.CLIENT)
override def registerBlockIcons(reg: IIconRegister) {
blockIcon = reg.registerIcon(modId + ":" + name.toLowerCase)
}
}
@@ -0,0 +1,38 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.config
import cpw.mods.fml.common.registry.GameRegistry
import net.bdew.lib.Misc
import net.bdew.lib.block.{HasTE, NamedBlock}
import net.minecraft.block.Block
import net.minecraft.creativetab.CreativeTabs
import net.minecraft.item.ItemStack
class BlockManager(creativeTab: CreativeTabs) {
def regBlock[T <: NamedBlock](block: T): T = regBlock(block, block.name)
def regBlock[T <: Block](block: T, name: String, addStack: Boolean = false): T = {
GameRegistry.registerBlock(block, name)
block.setCreativeTab(creativeTab)
if (addStack)
GameRegistry.registerCustomItemStack(name, new ItemStack(block))
if (block.isInstanceOf[HasTE[_]])
GameRegistry.registerTileEntity(block.asInstanceOf[HasTE[_]].TEClass,
"%s.%s".format(Misc.getActiveModId, name))
return block
}
def load() {}
}
@@ -0,0 +1,20 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.config
import net.minecraftforge.fluids.{Fluid, FluidRegistry}
class FluidManager() {
def regFluid[T <: Fluid](fluid: T): T = {
FluidRegistry.registerFluid(fluid)
return fluid
}
def load() {}
}
+31
View File
@@ -0,0 +1,31 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.config
import cpw.mods.fml.common.registry.GameRegistry
import net.bdew.lib.items.{NamedItem, SimpleItem}
import net.minecraft.creativetab.CreativeTabs
import net.minecraft.item.{Item, ItemStack}
class ItemManager(creativeTab: CreativeTabs) {
def regSimpleItem(name: String): SimpleItem = regItem(new SimpleItem(name), name)
def regItem[T <: NamedItem](item: T): T = regItem[T](item, item.name)
def regItem[T <: Item](item: T, name: String, addStack: Boolean = false): T = {
GameRegistry.registerItem(item, name)
item.setCreativeTab(creativeTab)
if (addStack)
GameRegistry.registerCustomItemStack(name, new ItemStack(item))
return item
}
def load() {}
}
@@ -0,0 +1,29 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.config
import net.bdew.lib.gui.{GuiHandler, GuiProvider}
import net.bdew.lib.machine.Machine
import net.bdew.lib.recipes.gencfg.ConfigSection
import net.minecraft.creativetab.CreativeTabs
class MachineManager(val tuning: ConfigSection, guiHandler: GuiHandler, creativeTab: CreativeTabs) {
def registerMachine[R <: Machine[_]](machine: R): R = {
machine.tuning = tuning.getSection(machine.name)
if (machine.tuning.getBoolean("Enabled")) {
machine.enabled = true
machine.regBlock(creativeTab)
if (machine.isInstanceOf[GuiProvider])
guiHandler.register(machine.asInstanceOf[GuiProvider])
}
return machine
}
def load() {}
}
@@ -0,0 +1,75 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.covers
import cpw.mods.fml.relauncher.{Side, SideOnly}
import net.bdew.lib.Misc
import net.bdew.lib.block.HasTE
import net.bdew.lib.items.ItemUtils
import net.minecraft.block.Block
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.util.IIcon
import net.minecraft.world.{IBlockAccess, World}
import net.minecraftforge.common.util.ForgeDirection
trait BlockCoverable[T <: TileCoverable] extends HasTE[T] {
@SideOnly(Side.CLIENT)
override def getRenderType = CoverRenderer.id
override def onBlockActivated(world: World, x: Int, y: Int, z: Int, player: EntityPlayer, face: Int, xOffs: Float, yOffs: Float, zOffs: Float): Boolean = {
val te = getTE(world, x, y, z)
val side = Misc.forgeDirection(face)
if (player.getCurrentEquippedItem == null && player.isSneaking) {
for (cover <- Option(te.covers(side).value)) {
if (!world.isRemote) {
te.covers(side) := null
te.onCoversChanged()
ItemUtils.dropItemToPlayer(world, player, cover)
}
return true
}
}
for {
activeStack <- Option(player.getCurrentEquippedItem)
activeItem <- Option(activeStack.getItem)
coverItem <- Misc.asInstanceOpt(activeItem, classOf[ItemCover])
if te.isValidCover(side, activeStack) && coverItem.isValidTile(te, activeStack)
} {
if (!world.isRemote) {
for (cover <- Option(te.covers(side).value))
ItemUtils.throwItemAt(world, te.xCoord + side.offsetX, te.yCoord + side.offsetY, te.zCoord + side.offsetZ, cover.copy())
te.covers(side) := activeStack.splitStack(1)
if (activeStack.stackSize <= 0) player.inventory.setInventorySlotContents(player.inventory.currentItem, null)
te.onCoversChanged()
}
return true
}
super.onBlockActivated(world, x, y, z, player, face, xOffs, yOffs, zOffs)
}
def getCoverIcon(w: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection): Option[IIcon] =
for {
coverStack <- Option(getTE(w, x, y, z).covers(side).value)
coverItemMaybe <- Option(coverStack.getItem)
coverItem <- Misc.asInstanceOpt(coverItemMaybe, classOf[ItemCover])
} yield coverItem.getCoverIcon(coverStack)
override def breakBlock(world: World, x: Int, y: Int, z: Int, block: Block, meta: Int) {
if (!world.isRemote)
for ((dir, covOpt) <- getTE(world, x, y, z).covers; cover <- Option(covOpt.value))
ItemUtils.throwItemAt(world, x, y, z, cover)
super.breakBlock(world, x, y, z, block, meta)
}
}
@@ -0,0 +1,34 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.covers
import net.bdew.lib.Misc
import net.bdew.lib.render.connected.ConnectedHelper
import net.bdew.lib.render.{BaseBlockRenderHandler, RenderUtils}
import net.minecraft.block.Block
import net.minecraft.client.renderer.RenderBlocks
import net.minecraft.world.IBlockAccess
import net.minecraftforge.common.util.ForgeDirection
object CoverRenderer extends BaseBlockRenderHandler {
override def renderInventoryBlock(block: Block, metadata: Int, modelId: Int, renderer: RenderBlocks) =
RenderUtils.renderSimpleBlockItem(block, metadata, renderer)
override def renderWorldBlock(world: IBlockAccess, x: Int, y: Int, z: Int, block: Block, modelId: Int, renderer: RenderBlocks) = {
renderer.renderStandardBlock(block, x, y, z)
for {
blockCov <- Misc.asInstanceOpt(block, classOf[BlockCoverable[_]])
face <- ForgeDirection.VALID_DIRECTIONS
icon <- blockCov.getCoverIcon(world, x, y, z, face)
if block.shouldSideBeRendered(world, x + face.offsetX, y + face.offsetY, z + face.offsetZ, face.ordinal())
} ConnectedHelper.draw(face, 8).doDraw(ConnectedHelper.Vec3F(x, y, z), icon)
true
}
}
+31
View File
@@ -0,0 +1,31 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.covers
import net.minecraft.item.{Item, ItemStack}
import net.minecraft.util.IIcon
import net.minecraftforge.common.util.ForgeDirection
trait ItemCover extends Item {
/**
* @return Icon to render, MUST be on terrain sprite sheet (0), not item!
*/
def getCoverIcon(stack: ItemStack): IIcon
/**
* Perform tick, called on server only
*/
def tickCover(te: TileCoverable, side: ForgeDirection, cover: ItemStack)
/**
* Checks if this cover can be installed on a specific TE
*/
def isValidTile(te: TileCoverable, cover: ItemStack): Boolean
}
@@ -0,0 +1,43 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.covers
import net.bdew.lib.Misc
import net.bdew.lib.data.DataSlotItemStack
import net.bdew.lib.data.base.{TileDataSlots, UpdateKind}
import net.minecraft.item.ItemStack
import net.minecraftforge.common.util.ForgeDirection
trait TileCoverable extends TileDataSlots {
val covers = (ForgeDirection.VALID_DIRECTIONS map { x =>
x -> DataSlotItemStack("cover_" + x.toString.toLowerCase, this).setUpdate(UpdateKind.SAVE, UpdateKind.WORLD, UpdateKind.RENDER)
}).toMap
/**
* Checks if a specific cover can be installed here
*/
def isValidCover(side: ForgeDirection, cover: ItemStack): Boolean
/**
* Called when new covers are installed
*/
def onCoversChanged() {}
def tickCovers() =
for {
(dir, coverSlot) <- covers
coverStack <- Option(coverSlot.value)
coverItem <- Option(coverStack.getItem) flatMap (Misc.asInstanceOpt(_, classOf[ItemCover]))
} {
coverItem.tickCover(this, dir, coverStack)
}
serverTick.listen(tickCovers)
}
+6 -6
View File
@@ -1,19 +1,19 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.data.base.{DataSlotVal, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import net.bdew.lib.data.base.{UpdateKind, TileDataSlots, DataSlotVal}
case class DataSlotBoolean(name: String, parent: TileDataSlots, default: Boolean = false) extends DataSlotVal[Boolean] {
var cval = default
def save(t: NBTTagCompound, kind: UpdateKind.Value) = t.setBoolean(name, cval)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = cval = t.getBoolean(name)
var value = default
def save(t: NBTTagCompound, kind: UpdateKind.Value) = t.setBoolean(name, value)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = value = t.getBoolean(name)
}
@@ -1,20 +1,20 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.data.base.{TileDataSlots, UpdateKind, DataSlotVal}
import net.minecraftforge.common.ForgeDirection
import net.bdew.lib.data.base.{DataSlotVal, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.util.ForgeDirection
case class DataSlotDirection(name: String, parent: TileDataSlots) extends DataSlotVal[ForgeDirection] {
var cval = ForgeDirection.UP
def save(t: NBTTagCompound, kind: UpdateKind.Value) = t.setByte(name, cval.ordinal().toByte)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = cval = ForgeDirection.getOrientation(t.getByte(name))
var value = ForgeDirection.UP
def save(t: NBTTagCompound, kind: UpdateKind.Value) = t.setByte(name, value.ordinal().toByte)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = value = ForgeDirection.getOrientation(t.getByte(name))
}
@@ -0,0 +1,18 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.data.base.{DataSlotNumeric, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
case class DataSlotDouble(name: String, parent: TileDataSlots, default: Double = 0) extends DataSlotNumeric[Double](default) {
def save(t: NBTTagCompound, kind: UpdateKind.Value) = t.setDouble(name, value)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = value = t.getDouble(name)
}
+5 -5
View File
@@ -1,18 +1,18 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.data.base.{DataSlotNumeric, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import net.bdew.lib.data.base.{UpdateKind, TileDataSlots, DataSlotNumeric}
case class DataSlotFloat(name: String, parent: TileDataSlots, default: Float = 0) extends DataSlotNumeric[Float](default) {
def save(t: NBTTagCompound, kind: UpdateKind.Value) = t.setFloat(name, cval)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = cval = t.getFloat(name)
def save(t: NBTTagCompound, kind: UpdateKind.Value) = t.setFloat(name, value)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = value = t.getFloat(name)
}
@@ -0,0 +1,36 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import java.util.UUID
import com.mojang.authlib.GameProfile
import net.bdew.lib.data.base.{DataSlotVal, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import org.apache.commons.lang3.StringUtils
case class DataSlotGameProfile(name: String, parent: TileDataSlots) extends DataSlotVal[GameProfile] {
override var value: GameProfile = null
override def load(t: NBTTagCompound, kind: UpdateKind.Value) = {
value = if (t.hasKey(name + "_uid") || t.hasKey(name + "_name")) {
val uId = if (t.hasKey(name + "_uid")) UUID.fromString(t.getString(name + "_uid")) else null
val uName = if (t.hasKey(name + "_name")) t.getString(name + "_name") else null
new GameProfile(uId, uName)
} else null
}
override def save(t: NBTTagCompound, kind: UpdateKind.Value) = {
if (value != null) {
Option(value.getId) map (id => t.setString(name + "_uid", id.toString))
Option(value.getName) filterNot (name => StringUtils.isBlank(name)) map (name => t.setString(name + "_name", name))
}
}
}
+5 -5
View File
@@ -1,18 +1,18 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.data.base.{DataSlotNumeric, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import net.bdew.lib.data.base.{UpdateKind, TileDataSlots, DataSlotNumeric}
case class DataSlotInt(name: String, parent: TileDataSlots, default: Int = 0) extends DataSlotNumeric[Int](default) {
def save(t: NBTTagCompound, kind: UpdateKind.Value) = t.setInteger(name, cval)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = cval = t.getInteger(name)
def save(t: NBTTagCompound, kind: UpdateKind.Value) = t.setInteger(name, value)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = value = t.getInteger(name)
}
@@ -0,0 +1,46 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.Misc
import net.bdew.lib.data.base.{DataSlot, TileDataSlots, UpdateKind}
import net.bdew.lib.tile.inventory.BaseInventory
import net.minecraft.item.ItemStack
import net.minecraft.nbt.{NBTTagCompound, NBTTagList}
case class DataSlotInventory(name: String, parent: TileDataSlots, size: Int) extends DataSlot with BaseInventory {
setUpdate(UpdateKind.SAVE)
override def getSizeInventory = size
override def markDirty() = parent.dataSlotChanged(this)
override def load(t: NBTTagCompound, kind: UpdateKind.Value) {
inv = new Array[ItemStack](getSizeInventory)
for (nbtItem <- Misc.iterNbtCompoundList(t, name)) {
val slot = nbtItem.getByte("Slot")
if (slot >= 0 && slot < inv.size) {
inv(slot) = ItemStack.loadItemStackFromNBT(nbtItem)
}
}
}
override def save(t: NBTTagCompound, kind: UpdateKind.Value) {
val itemList = new NBTTagList
for ((item, i) <- inv.view.zipWithIndex if item != null) {
val itemNbt: NBTTagCompound = new NBTTagCompound
itemNbt.setByte("Slot", i.asInstanceOf[Byte])
item.writeToNBT(itemNbt)
itemList.appendTag(itemNbt)
}
t.setTag(name, itemList)
}
}
+10 -10
View File
@@ -1,32 +1,32 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.data.base.{TileDataSlots, UpdateKind, DataSlotVal}
import net.minecraft.nbt.NBTTagCompound
import net.bdew.lib.data.base.{DataSlotVal, TileDataSlots, UpdateKind}
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
case class DataSlotItemStack(name: String, parent: TileDataSlots) extends DataSlotVal[ItemStack] {
var cval: ItemStack = null
var value: ItemStack = null
override def update(v: ItemStack) = {
if (!ItemStack.areItemStacksEqual(v, cval)) {
cval = if (v == null) null else v.copy()
if (!ItemStack.areItemStacksEqual(v, value)) {
value = if (v == null) null else v.copy()
parent.dataSlotChanged(this)
}
}
def save(t: NBTTagCompound, kind: UpdateKind.Value) = {
val tag = new NBTTagCompound()
if (cval != null) cval.writeToNBT(tag)
t.setCompoundTag(name, tag)
if (value != null) value.writeToNBT(tag)
t.setTag(name, tag)
}
def load(t: NBTTagCompound, kind: UpdateKind.Value) = cval = ItemStack.loadItemStackFromNBT(t.getCompoundTag(name))
def load(t: NBTTagCompound, kind: UpdateKind.Value) = value = ItemStack.loadItemStackFromNBT(t.getCompoundTag(name))
}
@@ -0,0 +1,46 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.data.base.DataSlotVal
abstract class DataSlotOption[T] extends DataSlotVal[Option[T]] {
override var value: Option[T] = None
def set(v: T) {
if (v == null) sys.error("Null should never be used with DataSlotOption")
value = Some(v)
}
def unset() {
value = None
}
override def isSame(v: Option[T]) = {
if (v == null) sys.error("Null should never be used with DataSlotOption")
super.isSame(v)
}
override def :=(that: Option[T]) = {
if (that == null) sys.error("Null should never be used with DataSlotOption")
super.:=(that)
}
override def :!=(that: Option[T]) = {
if (that == null) sys.error("Null should never be used with DataSlotOption")
super.:!=(that)
}
override def :==(that: Option[T]) = {
if (that == null) sys.error("Null should never be used with DataSlotOption")
super.:==(that)
}
override def update(v: Option[T]) = {
if (v == null) sys.error("Null should never be used with DataSlotOption")
super.update(v)
}
}
+6 -6
View File
@@ -1,19 +1,19 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.data.base.{DataSlotVal, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import net.bdew.lib.data.base.{UpdateKind, TileDataSlots, DataSlotVal}
case class DataSlotString(name: String, parent: TileDataSlots, default: String = null) extends DataSlotVal[String] {
var cval: String = default
def save(t: NBTTagCompound, kind: UpdateKind.Value) = if (cval != null) t.setString(name, cval)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = cval = if (t.hasKey(name)) t.getString(name) else null
var value: String = default
def save(t: NBTTagCompound, kind: UpdateKind.Value) = if (value != null) t.setString(name, value)
def load(t: NBTTagCompound, kind: UpdateKind.Value) = value = if (t.hasKey(name)) t.getString(name) else null
}
+26 -11
View File
@@ -1,26 +1,27 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.minecraftforge.fluids.{IFluidTank, FluidTank, FluidStack}
import net.bdew.lib.data.base.{DataSlot, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import net.bdew.lib.data.base.{UpdateKind, TileDataSlots, DataSlot}
import net.minecraftforge.fluids.{FluidStack, FluidTank, IFluidTank}
abstract class DataSlotTankBase(sz: Int) extends FluidTank(sz) with IFluidTank with DataSlot {
var oldStack: FluidStack = null
var size: Int
parent.serverTick.listen(checkUpdate)
updateKind = Set(UpdateKind.GUI, UpdateKind.SAVE)
val sendCapacityOnUpdateKind = Set(UpdateKind.GUI)
def checkUpdate() {
if (!isSame(oldStack, fluid)) {
oldStack = if (fluid == null) null else fluid.copy()
@@ -37,20 +38,34 @@ abstract class DataSlotTankBase(sz: Int) extends FluidTank(sz) with IFluidTank w
def save(t: NBTTagCompound, k: UpdateKind.Value) {
val tag = new NBTTagCompound()
writeToNBT(tag)
if (k == UpdateKind.GUI)
tag.setInteger("size", size)
t.setCompoundTag(name, tag)
if (sendCapacityOnUpdateKind.contains(k))
tag.setInteger("size", getCapacity)
t.setTag(name, tag)
}
def load(t: NBTTagCompound, k: UpdateKind.Value) {
setFluid(null)
val tag = t.getCompoundTag(name)
readFromNBT(tag)
if (k == UpdateKind.GUI)
size = tag.getInteger("size")
if (sendCapacityOnUpdateKind.contains(k))
setCapacity(tag.getInteger("size"))
}
override def setFluid(fluid: FluidStack) = execWithChangeNotify(super.setFluid(fluid))
override def setCapacity(capacity: Int) = execWithChangeNotify(super.setCapacity(capacity))
override def drain(maxDrain: Int, doDrain: Boolean) =
if (doDrain)
execWithChangeNotify(super.drain(maxDrain, true))
else
super.drain(maxDrain, false)
override def fill(resource: FluidStack, doFill: Boolean) =
if (doFill)
execWithChangeNotify(super.fill(resource, true))
else
super.fill(resource, false)
}
case class DataSlotTank(name: String, parent: TileDataSlots, var size: Int) extends DataSlotTankBase(size)
case class DataSlotTank(name: String, parent: TileDataSlots, size: Int) extends DataSlotTankBase(size)
case class DataSlotTankRestricted(name: String, parent: TileDataSlots, var size: Int, fluidID: Int) extends DataSlotTankBase(size) {
def fill(amount: Int, doFill: Boolean) = super.fill(new FluidStack(fluidID, amount), doFill)
@@ -1,19 +1,19 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data.base
import net.bdew.lib.gui.NoInvContainer
import net.minecraft.entity.player.EntityPlayerMP
import net.bdew.lib.gui.BaseContainer
import net.minecraft.inventory.ICrafting
trait ContainerDataSlots extends BaseContainer {
trait ContainerDataSlots extends NoInvContainer {
val dataSource: TileDataSlots
var lastSentChange = dataSource.lastChange
@@ -21,19 +21,19 @@ trait ContainerDataSlots extends BaseContainer {
super.addCraftingToCrafters(crafter)
if (crafter.isInstanceOf[EntityPlayerMP]) {
val pkt = dataSource.getDataSlotPacket
crafter.asInstanceOf[EntityPlayerMP].playerNetServerHandler.sendPacketToPlayer(pkt)
crafter.asInstanceOf[EntityPlayerMP].playerNetServerHandler.sendPacket(pkt)
}
}
override def detectAndSendChanges() {
super.detectAndSendChanges()
// only send updates every 10 ticks
if (dataSource.lastChange >= lastSentChange + 10 || (dataSource.lastChange > lastSentChange && lastSentChange + 10 < dataSource.worldObj.getTotalWorldTime)) {
if (dataSource.lastChange >= lastSentChange + 10 || (dataSource.lastChange > lastSentChange && lastSentChange + 10 < dataSource.getWorldObj.getTotalWorldTime)) {
lastSentChange = dataSource.lastChange
val pkt = dataSource.getDataSlotPacket
for (player <- players)
player.playerNetServerHandler.sendPacketToPlayer(pkt)
player.playerNetServerHandler.sendPacket(pkt)
}
}
}
+8 -2
View File
@@ -1,10 +1,10 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data.base
@@ -35,6 +35,12 @@ trait DataSlot {
def save(t: NBTTagCompound, kind: UpdateKind.Value)
def load(t: NBTTagCompound, kind: UpdateKind.Value)
def execWithChangeNotify[T](f: => T): T = {
val v = f
parent.dataSlotChanged(this)
v
}
def setUpdate(vals: UpdateKind.Value*): this.type = {
updateKind = vals.toSet
return this
@@ -1,22 +1,22 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data.base
/**
* Base class for data slots that hold numeric values
* adds convinience operators to modify the value
* adds convenience operators to modify the value
*/
abstract class DataSlotNumeric[T](default: T)(implicit n: Numeric[T]) extends DataSlotVal[T] {
var cval = default
def +=(that: T) = update(n.plus(cval, that))
def -=(that: T) = update(n.minus(cval, that))
def *=(that: T) = update(n.times(cval, that))
var value = default
def +=(that: T) = update(n.plus(value, that))
def -=(that: T) = update(n.minus(value, that))
def *=(that: T) = update(n.times(value, that))
}
@@ -1,21 +1,21 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data.base
/**
* Base class for data slots that hold values with ordering operators, adds more convinience operators
* Base class for data slots that hold values with ordering operators, adds more convenience operators
* TODO: Do i need this? normal operators can be used with the implicit conversion
*/
abstract class DataSlotOrdered[T](implicit n: Ordering[T]) extends DataSlotVal[T] {
def :>(that: T) = n.compare(cval, that) > 0
def :<(that: T) = n.compare(cval, that) < 0
def :>=(that: T) = n.compare(cval, that) >= 0
def :<=(that: T) = n.compare(cval, that) <= 0
def :>(that: T) = n.compare(value, that) > 0
def :<(that: T) = n.compare(value, that) < 0
def :>=(that: T) = n.compare(value, that) >= 0
def :<=(that: T) = n.compare(value, that) <= 0
}
+10 -10
View File
@@ -1,39 +1,39 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data.base
import language.implicitConversions
import scala.language.implicitConversions
/**
* Base trait for data slots that hold primitive values
* Defines some convinience operators to access the value and an implicit conversion to the value
* Defines some convenience operators to access the value and an implicit conversion to the value
*/
trait DataSlotVal[T] extends DataSlot {
var cval: T
var value: T
def isSame(v: T) = v == cval
def isSame(v: T) = v == value
def :=(that: T) = update(that)
def :!=(that: T) = cval != that
def :==(that: T) = cval == that
def :!=(that: T) = value != that
def :==(that: T) = value == that
def update(v: T) {
if (!isSame(v)) {
cval = v
value = v
parent.dataSlotChanged(this)
}
}
}
object DataSlotVal {
implicit def slot2val[T](slot: DataSlotVal[T]): T = slot.cval
implicit def slot2val[T](slot: DataSlotVal[T]): T = slot.value
}
+15 -11
View File
@@ -1,18 +1,20 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data.base
import net.minecraft.network.packet.Packet132TileEntityData
import scala.collection.mutable
import net.minecraft.nbt.NBTTagCompound
import net.bdew.lib.tile.TileExtended
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.network.Packet
import net.minecraft.network.play.server.S35PacketUpdateTileEntity
import scala.collection.mutable
trait TileDataSlots extends TileExtended {
val dataSlots = mutable.HashMap.empty[String, DataSlot]
@@ -31,6 +33,8 @@ trait TileDataSlots extends TileExtended {
for ((n, s) <- dataSlots if s.updateKind.contains(kind)) {
if (TRACE) printf("%s: %s L<= %s\n".format(kind, n, t.getTag(n)))
s.load(t, kind)
if (kind == UpdateKind.WORLD && s.updateKind.contains(UpdateKind.RENDER))
getWorldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord)
}
}
@@ -40,20 +44,20 @@ trait TileDataSlots extends TileExtended {
handleClientUpdate.listen(doLoad(UpdateKind.WORLD, _))
def dataSlotChanged(slot: DataSlot) {
if (worldObj != null) {
if (getWorldObj != null) {
if (slot.updateKind.contains(UpdateKind.GUI))
lastChange = worldObj.getTotalWorldTime
lastChange = getWorldObj.getTotalWorldTime
if (slot.updateKind.contains(UpdateKind.WORLD))
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord)
getWorldObj.markBlockForUpdate(xCoord, yCoord, zCoord)
if (slot.updateKind.contains(UpdateKind.SAVE))
worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this)
getWorldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this)
}
}
def getDataSlotPacket: Packet132TileEntityData = {
def getDataSlotPacket: Packet = {
val tag = new NBTTagCompound()
doSave(UpdateKind.GUI, tag)
return new Packet132TileEntityData(this.xCoord, this.yCoord, this.zCoord, ACT_GUI, tag)
return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, ACT_GUI, tag)
}
override protected def extDataPacket(id: Int, data: NBTTagCompound) {
+3 -2
View File
@@ -1,10 +1,10 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data.base
@@ -13,4 +13,5 @@ object UpdateKind extends Enumeration {
val WORLD = Value("WORLD")
val GUI = Value("GUI")
val SAVE = Value("SAVE")
val RENDER = Value("RENDER")
}
+8 -20
View File
@@ -1,34 +1,20 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.minecraft.inventory.{IInventory, Slot, Container}
import net.minecraft.entity.player.{EntityPlayerMP, EntityPlayer, InventoryPlayer}
import net.minecraft.item.ItemStack
import net.bdew.lib.items.ItemUtils
import net.bdew.lib.Misc
abstract class BaseContainer(te: IInventory) extends Container {
import scala.collection.JavaConversions._
def players = Misc.filterType(crafters, classOf[EntityPlayerMP])
protected def bindPlayerInventory(inv: InventoryPlayer, xOffs: Int, yOffsInv: Int, yOffsHotbar: Int) {
for (i <- 0 until 3; j <- 0 until 9)
addSlotToContainer(new Slot(inv, j + i * 9 + 9, xOffs + j * 18, yOffsInv + i * 18))
for (i <- 0 until 9)
addSlotToContainer(new Slot(inv, i, xOffs + i * 18, yOffsHotbar))
}
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.inventory.IInventory
import net.minecraft.item.ItemStack
abstract class BaseContainer(te: IInventory) extends NoInvContainer {
override def transferStackInSlot(player: EntityPlayer, slot: Int): ItemStack = {
var stack = getSlot(slot).getStack
if (getSlot(slot).inventory == player.inventory) {
@@ -42,5 +28,7 @@ abstract class BaseContainer(te: IInventory) extends Container {
getSlot(slot).putStack(stack)
return null
}
override def canInteractWith(player: EntityPlayer) = te.isUseableByPlayer(player)
}
+25
View File
@@ -0,0 +1,25 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
case class BasePoint[T: Numeric](x: T, y: T) {
val n = implicitly[Numeric[T]]
import n.mkNumericOps
def this(p: BasePoint[T]) = this(p.x, p.y)
def +(that: BasePoint[T]) = BasePoint(this.x + that.x, this.y + that.y)
def +(xOff: T, yOff: T) = BasePoint(this.x + xOff, this.y + yOff)
def -(that: BasePoint[T]) = BasePoint(this.x - that.x, this.y - that.y)
def -(xOff: T, yOff: T) = BasePoint(this.x - xOff, this.y - yOff)
def map[R: Numeric](f: T => R) = new BasePoint(f(x), f(y))
}
+40
View File
@@ -0,0 +1,40 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
case class BaseRect[T: Numeric](x: T, y: T, w: T, h: T) {
val n = implicitly[Numeric[T]]
import n.mkNumericOps
def this(p: BasePoint[T], w: T, h: T) = this(p.x, p.y, w, h)
def contains(p: BasePoint[T]) = n.gteq(p.x, x) && n.gteq(p.y, y) && n.lteq(p.x, x2) && n.lteq(p.y, y2)
def origin = BasePoint(x, y)
def map[R: Numeric](f: T => R) = new BaseRect(f(x), f(y), f(w), f(h))
def interpolate(xf1: Float, yf1: Float, xf2: Float, yf2: Float) =
new BaseRect[Float](
xf1 * w.toFloat() + x.toFloat(),
yf1 * h.toFloat() + y.toFloat(),
(xf2 - xf1) * w.toFloat(),
(yf2 - yf1) * h.toFloat()
)
def +(p: BasePoint[T]) = new BaseRect(origin + p, w, h)
def -(p: BasePoint[T]) = new BaseRect(origin - p, w, h)
def x1 = x
def x2 = x + w
def y1 = y
def y2 = y + h
}
+28 -45
View File
@@ -1,32 +1,33 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.inventory.GuiContainer
import net.minecraft.inventory.Container
import scala.collection.mutable
import net.minecraft.client.gui.GuiButton
import net.bdew.lib.gui.widgets.Widget
import net.minecraft.util.ResourceLocation
import org.lwjgl.opengl.GL11
import scala.collection.mutable
abstract class BaseScreen(cont: Container, xSz: Int, ySz: Int) extends GuiContainer(cont) {
xSize = xSz
ySize = ySz
val widgets = mutable.MutableList.empty[Widget]
val texture: ResourceLocation
val widgets = new WidgetContainerWindow(this, xSz, ySz)
val background: Texture
def rect = new Rect(guiLeft, guiTop, xSize, ySize)
def getFontRenderer = fontRenderer
def getFontRenderer = Minecraft.getMinecraft.fontRenderer
def getZLevel = zLevel
override def initGui() {
super.initGui()
@@ -34,56 +35,38 @@ abstract class BaseScreen(cont: Container, xSz: Int, ySz: Int) extends GuiContai
buttonList.clear()
}
def addButton[T <: GuiButton](w: T): T = {
buttonList.asInstanceOf[java.util.ArrayList[GuiButton]].add(w)
return w
}
def addWidget[T <: Widget](w: T): T = {
widgets += w
w.parent = this
return w
}
protected override def keyTyped(c: Char, i: Int) {
for (w <- widgets)
if (w.keyTyped(c, i))
return
super.keyTyped(c, i)
}
protected override def mouseClicked(x: Int, y: Int, bt: Int) {
super.mouseClicked(x, y, bt)
val p = new Point(x, y) - rect.origin
for (w <- widgets if w.rect.contains(p))
w.mouseClicked(p - w.rect.origin, bt)
widgets.mouseClicked(Point(x, y) - rect.origin, bt)
}
protected override def drawGuiContainerForegroundLayer(x: Int, y: Int) {
for (w <- widgets)
w.draw()
}
protected override def keyTyped(c: Char, i: Int) =
if (!widgets.keyTyped(c, i))
super.keyTyped(c, i)
protected override def drawGuiContainerForegroundLayer(x: Int, y: Int) =
widgets.draw(Point(x, y) - rect.origin)
protected override def drawScreen(x: Int, y: Int, f: Float) {
super.drawScreen(x, y, f)
val tip = mutable.MutableList.empty[String]
val p = new Point(x, y) - rect.origin
for (w <- widgets if w.rect.contains(p))
w.handleTooltip(p - w.rect.origin, tip)
widgets.handleTooltip(Point(x, y) - rect.origin, tip)
import collection.JavaConversions._
import scala.collection.JavaConversions._
if (tip.size > 0)
drawHoveringText(tip, x, y, fontRenderer)
drawHoveringText(tip, x, y, getFontRenderer)
}
protected def drawGuiContainerBackgroundLayer(f: Float, i: Int, j: Int) {
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F)
mc.renderEngine.bindTexture(texture)
val x = (width - xSize) / 2
val y = (height - ySize) / 2
this.drawTexturedModalRect(x, y, 0, 0, xSize, ySize)
protected def drawGuiContainerBackgroundLayer(f: Float, x: Int, y: Int) {
if (background != null)
widgets.drawTexture(rect, background)
GL11.glPushMatrix()
GL11.glTranslatef(rect.x, rect.y, 0)
widgets.drawBackground(Point(x, y) - rect.origin)
GL11.glPopMatrix()
}
}
+21
View File
@@ -0,0 +1,21 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.minecraft.inventory.{IInventory, Slot}
import org.lwjgl.opengl.GL11
class BaseSlot(inv: IInventory, slot: Int, x: Int, y: Int) extends Slot(inv, slot, x, y) {
override def getBackgroundIconIndex = {
// Workaround for bug in GuiContainer, color isn't reset if previous slot had an item with color.
GL11.glColor4d(1, 1, 1, 1)
super.getBackgroundIconIndex
}
}
+49
View File
@@ -0,0 +1,49 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.bdew.lib.Misc
import org.lwjgl.opengl.GL11
case class Color(r: Float, g: Float, b: Float, a: Float = 1) {
def this(c: (Float, Float, Float)) = this(c._1, c._2, c._3)
def this(c: (Float, Float, Float, Float)) = this(c._1, c._2, c._3, c._4)
def activate() = GL11.glColor4f(r, g, b, a)
def asARGB =
Misc.clamp((a * 255).round, 0, 255) << 24 |
Misc.clamp((r * 255).round, 0, 255) << 16 |
Misc.clamp((g * 255).round, 0, 255) << 8 |
Misc.clamp((b * 255).round, 0, 255)
def asRGB =
Misc.clamp((r * 255).round, 0, 255) << 16 |
Misc.clamp((g * 255).round, 0, 255) << 8 |
Misc.clamp((b * 255).round, 0, 255)
}
object Color {
def fromRGB(r: Int, g: Int, b: Int, a: Int = 255) = Color(r / 255F, g / 255F, b / 255F, a / 255F)
def fromInt(v: Int) = Color(
((v >> 16) & 0xFF) / 255F,
((v >> 8) & 0xFF) / 255F,
(v & 0xFF) / 255F
)
final val white = Color(1, 1, 1)
final val black = Color(0, 0, 0)
final val red = Color(1, 0, 0)
final val green = Color(0, 1, 0)
final val blue = Color(0, 0, 1)
final val yellow = Color(1, 1, 0)
final val cyan = Color(0, 1, 1)
final val magenta = Color(1, 0, 1)
final val gray = Color(0.5F, 0.5F, 0.5F)
final val lightGray = Color(0.75F, 0.75F, 0.75F)
final val darkGray = Color(0.25F, 0.25F, 0.25F)
}
+5 -5
View File
@@ -1,10 +1,10 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
@@ -12,7 +12,7 @@ package net.bdew.lib.gui
object Direction extends Enumeration {
type Direction = Value
val UP = Value("UP")
val DOWN = Value("UP")
val LEFT = Value("UP")
val RIGHT = Value("UP")
val DOWN = Value("DOWN")
val LEFT = Value("LEFT")
val RIGHT = Value("RIGHT")
}
+46
View File
@@ -0,0 +1,46 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.minecraft.client.gui.FontRenderer
import net.minecraft.client.renderer.Tessellator
trait DrawTarget {
def getZLevel: Float
def getFontRenderer: FontRenderer
def drawTexture(r: Rect, t: Texture, color: Color = Color.white)
def drawText(text: String, p: Point, color: Color, shadow: Boolean)
def drawTextMultiline(text: String, r: Rect, color: Color)
def drawTextureInterpolate(r: Rect, t: Texture, x1: Float, y1: Float, x2: Float, y2: Float, color: Color = Color.white) =
drawTexture(r.interpolate(x1, y1, x2, y2), Texture.interpolate(t, x1, y1, x2, y2), color)
}
trait SimpleDrawTarget extends DrawTarget {
private final val T = Tessellator.instance
def drawTexture(r: Rect, t: Texture, color: Color = Color.white) {
val z = getZLevel
t.bind()
color.activate()
T.startDrawingQuads()
T.addVertexWithUV(r.x1, r.y2, z, t.u1, t.v2)
T.addVertexWithUV(r.x2, r.y2, z, t.u2, t.v2)
T.addVertexWithUV(r.x2, r.y1, z, t.u2, t.v1)
T.addVertexWithUV(r.x1, r.y1, z, t.u1, t.v1)
T.draw()
}
def drawText(text: String, p: Point, color: Color, shadow: Boolean) =
getFontRenderer.drawString(text, p.x.round, p.y.round, color.asARGB, shadow)
def drawTextMultiline(text: String, r: Rect, color: Color) =
getFontRenderer.drawSplitString(text, r.x.round, r.y.round, r.w.round, color.asARGB)
}
+32
View File
@@ -0,0 +1,32 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import cpw.mods.fml.common.network.IGuiHandler
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.world.World
import scala.collection.mutable
class GuiHandler extends IGuiHandler {
val GUIs = mutable.Map.empty[Int, GuiProvider]
def register(p: GuiProvider) = {
if (GUIs.isDefinedAt(p.guiId))
sys.error("GUI ID Collision - %d was registered for %s and attempted to register by %s".format(p.guiId, GUIs(p.guiId), p))
GUIs += (p.guiId -> p)
}
def getServerGuiElement(ID: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): AnyRef =
GUIs(ID).getContainer(world.getTileEntity(x, y, z), player)
def getClientGuiElement(ID: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): AnyRef =
GUIs(ID).getGui(world.getTileEntity(x, y, z), player)
}
+28
View File
@@ -0,0 +1,28 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import cpw.mods.fml.relauncher.{Side, SideOnly}
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.tileentity.TileEntity
trait GuiProvider {
def guiId: Int
type TEClass
@SideOnly(Side.CLIENT)
def getGui(te: TEClass, player: EntityPlayer): AnyRef
def getContainer(te: TEClass, player: EntityPlayer): AnyRef
@SideOnly(Side.CLIENT)
def getGui(te: TileEntity, player: EntityPlayer): AnyRef = getGui(te.asInstanceOf[TEClass], player)
def getContainer(te: TileEntity, player: EntityPlayer): AnyRef = getContainer(te.asInstanceOf[TEClass], player)
}
+41
View File
@@ -0,0 +1,41 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.bdew.lib.Misc
import net.minecraft.entity.player.{EntityPlayer, EntityPlayerMP, InventoryPlayer}
import net.minecraft.inventory.{Container, Slot}
import net.minecraft.item.ItemStack
abstract class NoInvContainer extends Container {
import scala.collection.JavaConversions._
def players = Misc.filterType(crafters, classOf[EntityPlayerMP])
protected def bindPlayerInventory(inv: InventoryPlayer, xOffs: Int, yOffsInv: Int, yOffsHotbar: Int) {
for (i <- 0 until 3; j <- 0 until 9)
addSlotToContainer(new Slot(inv, j + i * 9 + 9, xOffs + j * 18, yOffsInv + i * 18))
for (i <- 0 until 9)
addSlotToContainer(new Slot(inv, i, xOffs + i * 18, yOffsHotbar))
}
override def slotClick(slotNum: Int, button: Int, modifiers: Int, player: EntityPlayer): ItemStack = {
if (inventorySlots.isDefinedAt(slotNum)) {
val slot = getSlot(slotNum)
if (slot != null && slot.isInstanceOf[SlotClickable])
return slot.asInstanceOf[SlotClickable].onClick(button, modifiers, player)
}
return super.slotClick(slotNum, button, modifiers, player)
}
override def transferStackInSlot(player: EntityPlayer, slot: Int): ItemStack = null
}
-16
View File
@@ -1,16 +0,0 @@
/*
* Copyright (c) bdew, 2013
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
*/
package net.bdew.lib.gui
class Point(val x: Int, val y: Int) {
def this(p: Point) = this(p.x, p.y)
def +(that: Point) = new Point(this.x + that.x, this.y + that.y)
def -(that: Point) = new Point(this.x - that.x, this.y - that.y)
}
-16
View File
@@ -1,16 +0,0 @@
/*
* Copyright (c) bdew, 2013
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
*/
package net.bdew.lib.gui
class Rect(val x: Int, val y: Int, val w: Int, val h: Int) {
def this(p: Point, w: Int, h: Int) = this(p.x, p.y, w, h)
def contains(p: Point) = p.x >= x && p.y >= y && p.x <= x + w && p.y <= y + h
def origin = new Point(x, y)
}
+18
View File
@@ -0,0 +1,18 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.inventory.Slot
import net.minecraft.item.ItemStack
trait SlotClickable extends Slot {
def onClick(button: Int, mods: Int, player: EntityPlayer): ItemStack
}
+3 -4
View File
@@ -1,18 +1,17 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.minecraft.inventory.IInventory
import net.minecraft.inventory.Slot
import net.minecraft.item.ItemStack
class SlotValidating(inv: IInventory, slot: Int, x: Int, y: Int) extends Slot(inv, slot, x, y) {
class SlotValidating(inv: IInventory, slot: Int, x: Int, y: Int) extends BaseSlot(inv, slot, x, y) {
override def isItemValid(stack: ItemStack) = inventory.isItemValidForSlot(getSlotIndex, stack)
}
+93
View File
@@ -0,0 +1,93 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.bdew.lib.Client
import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.texture.TextureMap
import net.minecraft.util.{IIcon, ResourceLocation}
trait Texture {
def u1: Float
def u2: Float
def v1: Float
def v2: Float
def bind(): Unit
}
class InterpolatedTexture(val texture: Texture, rect: Rect) extends Texture {
def bind() = texture.bind()
def u1 = rect.x1 * (texture.u2 - texture.u1) + texture.u1
def u2 = rect.x2 * (texture.u2 - texture.u1) + texture.u1
def v1 = rect.y1 * (texture.v2 - texture.v1) + texture.v1
def v2 = rect.y2 * (texture.v2 - texture.v1) + texture.v1
}
class IconWrapper(val resource: ResourceLocation, aIcon: IIcon) extends Texture {
val icon = if (aIcon == null) {
if (resource == Texture.ITEMS) Client.itemMissingIcon
else if (resource == Texture.BLOCKS) Client.blockMissingIcon
else sys.error("Attempt to create IconWrapper for null IIcon")
} else aIcon
def u1 = icon.getMinU
def u2 = icon.getMaxU
def v1 = icon.getMinV
def v2 = icon.getMaxV
def bind() = Minecraft.getMinecraft.renderEngine.bindTexture(resource)
}
class Sprite(val resource: ResourceLocation, r: Rect, scale: Int = 256) extends Texture {
val rect = Rect(r.x / scale, r.y / scale, r.w / scale, r.h / scale)
def u1 = rect.x1
def u2 = rect.x2
def v1 = rect.y1
def v2 = rect.y2
def bind() = Minecraft.getMinecraft.renderEngine.bindTexture(resource)
}
class ScaledResourceLocation(path: String, val scale: Int = 256) extends ResourceLocation(path) {
def this(domain: String, path: String, scale: Int) = this(domain + ":" + path, scale)
def this(domain: String, path: String) = this(domain + ":" + path, 256)
}
object Texture {
val ITEMS = TextureMap.locationItemsTexture
val BLOCKS = TextureMap.locationBlocksTexture
// From minecraft Icon
def apply(res: ResourceLocation, i: IIcon) = new IconWrapper(res, i)
// From a ResourceLocation and position, scale optional
def apply(res: ResourceLocation, r: Rect) = new Sprite(res, r)
def apply(res: ResourceLocation, r: Rect, scale: Int) = new Sprite(res, r, scale)
def apply(res: ResourceLocation, u1: Float, v1: Float, w: Float, h: Float) = new Sprite(res, Rect(u1, v1, w, h))
def apply(res: ResourceLocation, u1: Float, v1: Float, w: Float, h: Float, scale: Int) = new Sprite(res, Rect(u1, v1, w, h), scale)
// From a path (with optional domain) and position, no scale
def apply(path: String, r: Rect) = new Sprite(new ResourceLocation(path), r)
def apply(path: String, u1: Float, v1: Float, w: Float, h: Float) = new Sprite(new ResourceLocation(path), Rect(u1, v1, w, h))
def apply(domain: String, path: String, r: Rect) = new Sprite(new ResourceLocation(domain, path), r)
def apply(domain: String, path: String, u1: Float, v1: Float, w: Float, h: Float) = new Sprite(new ResourceLocation(domain, path), Rect(u1, v1, w, h))
// From a path (with optional domain), position and scale
def apply(path: String, r: Rect, scale: Int) = new Sprite(new ResourceLocation(path), r, scale)
def apply(path: String, u1: Float, v1: Float, w: Float, h: Float, scale: Int) = new Sprite(new ResourceLocation(path), Rect(u1, v1, w, h), scale)
def apply(domain: String, path: String, r: Rect, scale: Int) = new Sprite(new ResourceLocation(domain, path), r, scale)
def apply(domain: String, path: String, u1: Float, v1: Float, w: Float, h: Float, scale: Int) = new Sprite(new ResourceLocation(domain, path), Rect(u1, v1, w, h), scale)
// From a ScaledResourceLocation and position
def apply(res: ScaledResourceLocation, r: Rect) = new Sprite(res, r, res.scale)
def apply(res: ScaledResourceLocation, u1: Float, v1: Float, w: Float, h: Float) = new Sprite(res, Rect(u1, v1, w, h), res.scale)
// A fraction of another Texture, parameters should be between 0 and 1
def interpolate(texture: Texture, rect: Rect) = new InterpolatedTexture(texture, rect)
def interpolate(texture: Texture, u1: Float, v1: Float, u2: Float, v2: Float) = new InterpolatedTexture(texture, Rect(u1, v1, u2 - u1, v2 - v1))
}
@@ -1,16 +0,0 @@
/*
* Copyright (c) bdew, 2013
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
*/
package net.bdew.lib.gui
import net.minecraft.util.ResourceLocation
class TextureLocation(val resource: ResourceLocation, val p: Point) extends Point(p.x, p.y) {
def this(resource: ResourceLocation, x: Int, y: Int) = this(resource, new Point(x, y))
}
@@ -0,0 +1,86 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui
import net.bdew.lib.gui.widgets.BaseWidget
import net.minecraft.client.gui.FontRenderer
import org.lwjgl.opengl.GL11
import scala.collection.mutable
trait WidgetContainer extends DrawTarget {
val rect: Rect
val widgets = mutable.MutableList.empty[BaseWidget]
def activeWidgets: Iterable[BaseWidget] = widgets
def getFontRenderer: FontRenderer
def clear() = widgets.clear()
def add[T <: BaseWidget](w: T): T = {
widgets += w
w.init(this)
return w
}
def mouseClicked(p: Point, bt: Int) {
for (w <- activeWidgets)
if (w.rect.contains(p))
w.mouseClicked(p - w.rect.origin, bt)
else
w.looseFocus()
}
def keyTyped(c: Char, i: Int): Boolean = {
for (w <- activeWidgets)
if (w.keyTyped(c, i))
return true
return false
}
def drawBackground(mouse: Point) {
val p = mouse - rect.origin
GL11.glPushMatrix()
GL11.glTranslatef(rect.origin.x, rect.origin.y, 0)
for (w <- activeWidgets) {
w.drawBackground(p)
}
GL11.glPopMatrix()
}
def draw(mouse: Point) {
val p = mouse - rect.origin
GL11.glPushMatrix()
GL11.glTranslatef(rect.origin.x, rect.origin.y, 0)
for (w <- activeWidgets) {
w.draw(p)
}
GL11.glPopMatrix()
}
def handleTooltip(p: Point, tip: mutable.MutableList[String]) {
for (w <- activeWidgets if w.rect.contains(p))
w.handleTooltip(p - w.rect.origin, tip)
}
def looseFocus() =
for (w <- activeWidgets)
w.looseFocus()
def getOffsetFromWindow: Point
}
class WidgetContainerWindow(val parent: BaseScreen, xSz: Int, ySz: Int) extends WidgetContainer with SimpleDrawTarget {
def getZLevel = parent.getZLevel
def getFontRenderer = parent.getFontRenderer
def getOffsetFromWindow = Point(0, 0)
val rect = Rect(0, 0, xSz, ySz)
}
+33
View File
@@ -0,0 +1,33 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib
package object gui {
type Rect = BaseRect[Float]
type Point = BasePoint[Float]
import scala.language.implicitConversions
implicit def awt2point(p: java.awt.Point): BasePoint[Int] = BasePoint(p.x, p.y)
implicit def point2awt(p: BasePoint[Int]): java.awt.Point = new java.awt.Point(p.x, p.y)
implicit def tuple2point[T: Numeric](p: (T, T)): BasePoint[T] = BasePoint(p._1, p._2)
// Converts different kinds of Point/Rect as long as there's an implicit for the underlying type
implicit def pointConvert[T, R](a: BasePoint[R])(implicit f: R => T, n: Numeric[T]): BasePoint[T] =
BasePoint[T](f(a.x), f(a.y))
implicit def rectConvert[T, R](a: BaseRect[R])(implicit f: R => T, n: Numeric[T]): BaseRect[T] =
BaseRect[T](f(a.x), f(a.y), f(a.w), f(a.h))
def Rect(x: Float, y: Float, w: Float, h: Float) = BaseRect(x, y, w, h)
def Point(x: Float, y: Float) = BasePoint(x, y)
}
+21 -11
View File
@@ -1,26 +1,36 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import scala.collection.mutable
import net.bdew.lib.gui.{Point, BaseScreen, Rect}
import net.minecraft.util.ResourceLocation
import net.minecraft.client.Minecraft
import net.bdew.lib.gui.{Point, Rect, WidgetContainer}
trait Widget {
import scala.collection.mutable
trait BaseWidget {
val rect: Rect
var parent: WidgetContainer = null
def init(p: WidgetContainer) = parent = p
def handleTooltip(p: Point, tip: mutable.MutableList[String])
def mouseClicked(p: Point, button: Int)
def keyTyped(c: Char, i: Int): Boolean
def draw(mouse: Point)
def drawBackground(mouse: Point)
def looseFocus()
}
trait Widget extends BaseWidget {
val rect: Rect
var parent: BaseScreen = null
def handleTooltip(p: Point, tip: mutable.MutableList[String]) {}
def mouseClicked(p: Point, button: Int) {}
def keyTyped(c: Char, i: Int): Boolean = false
def draw() {}
def bindTexture(res: ResourceLocation) = Minecraft.getMinecraft.renderEngine.bindTexture(res)
def draw(mouse: Point) {}
def drawBackground(mouse: Point) {}
def looseFocus() {}
}
@@ -0,0 +1,27 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui.{Point, Rect}
import net.minecraft.client.Minecraft
import net.minecraft.client.audio.PositionedSoundRecord
import net.minecraft.client.gui.GuiButton
import net.minecraft.util.ResourceLocation
class WidgetButton(val rect: Rect, text: String, clicked: WidgetButton => Unit)
extends GuiButton(0, rect.x.round, rect.y.round, rect.w.round, rect.h.round, text) with Widget {
override def mouseClicked(p: Point, button: Int) {
Minecraft.getMinecraft.getSoundHandler.playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F))
clicked(this)
}
override def draw(mouse: Point) = drawButton(Minecraft.getMinecraft, mouse.x.round, mouse.y.round)
}
@@ -0,0 +1,45 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui.{Point, Rect, Texture}
import net.minecraft.client.Minecraft
import net.minecraft.client.audio.PositionedSoundRecord
import net.minecraft.util.ResourceLocation
import scala.collection.mutable
class WidgetButtonIcon(p: Point, clicked: WidgetButtonIcon => Unit, baseTex: Texture, hoverTex: Texture) extends Widget {
val rect = new Rect(p, 16, 16)
val iconRect = new Rect(p +(1, 1), 14, 14)
var icon: Texture = null
var hover: String = null
override def draw(mouse: Point) {
if (rect.contains(mouse))
parent.drawTexture(rect, hoverTex)
else
parent.drawTexture(rect, baseTex)
if (icon != null)
parent.drawTexture(iconRect, icon)
}
override def handleTooltip(p: Point, tip: mutable.MutableList[String]) {
if (hover != null && hover > "")
tip += hover
}
override def mouseClicked(p: Point, button: Int) {
Minecraft.getMinecraft.getSoundHandler.playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F))
clicked(this)
}
}
@@ -0,0 +1,19 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui.{Color, Point, Rect}
class WidgetDynLabel(text: => String, x: Int, y: Int, color: Color) extends Widget {
val rect = new Rect(x, y, 0, 0)
override def draw(mouse: Point) {
parent.drawText(text, rect.origin, color, false)
}
}
@@ -1,37 +1,32 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui.{TextureLocation, Rect}
import net.bdew.lib.gui.Direction
import net.bdew.lib.data.base.DataSlotNumeric
import net.bdew.lib.gui._
class WidgetFillDataslot[T](val rect: Rect, val texture: TextureLocation, dir: Direction.Direction, dslot: DataSlotNumeric[T], maxval: T)(implicit num: Numeric[T]) extends Widget {
class WidgetFillDataSlot[T](val rect: Rect, val texture: Texture, dir: Direction.Direction, dSlot: DataSlotNumeric[T], maxVal: T)(implicit num: Numeric[T]) extends Widget {
def getFillArea(max: Int): Int = (num.toFloat(dslot) / num.toFloat(maxval) * max).round
import num.mkNumericOps
override def draw() {
bindTexture(texture.resource)
override def draw(mouse: Point) {
val fill = dSlot.value.toFloat() / maxVal.toFloat()
dir match {
case Direction.UP =>
val fill = getFillArea(rect.h)
parent.drawTexturedModalRect(rect.x, rect.y + rect.h - fill, texture.x, texture.y + rect.h - fill, rect.w, fill)
parent.drawTextureInterpolate(rect, texture, 0, 1 - fill, 1, 1)
case Direction.DOWN =>
val fill = getFillArea(rect.h)
parent.drawTexturedModalRect(rect.x, rect.y, texture.x, texture.y, rect.w, fill)
parent.drawTextureInterpolate(rect, texture, 0, 0, 1, fill)
case Direction.LEFT =>
val fill = getFillArea(rect.w)
parent.drawTexturedModalRect(rect.x + rect.w - fill, rect.y, texture.x + rect.w - fill, texture.y, fill, rect.h)
parent.drawTextureInterpolate(rect, texture, 1 - fill, 0, 1, 1)
case Direction.RIGHT =>
val fill = getFillArea(rect.w)
parent.drawTexturedModalRect(rect.x, rect.y, texture.x, texture.y, fill, rect.h)
parent.drawTextureInterpolate(rect, texture, 0, 0, fill, 1)
}
}
}
@@ -1,60 +1,58 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui.{Point, TextureLocation, Rect}
import net.bdew.lib.data.DataSlotTankBase
import scala.collection.mutable
import net.minecraft.client.renderer.texture.TextureMap
import java.text.DecimalFormat
import net.bdew.lib.Misc
import net.bdew.lib.gui.{Color, Point, Rect, Texture}
import net.bdew.lib.{DecFormat, Misc}
import org.lwjgl.opengl.GL11
class WidgetFluidGauge(val rect: Rect, overlay: TextureLocation, dslot: DataSlotTankBase) extends Widget {
val formater = new DecimalFormat("#,###")
import scala.collection.mutable
class WidgetFluidGauge(val rect: Rect, overlay: Texture, dSlot: DataSlotTankBase) extends Widget {
override def handleTooltip(p: Point, tip: mutable.MutableList[String]) {
if (dslot.getFluid != null) {
tip += dslot.getFluid.getFluid.getLocalizedName
tip += "%s/%s mB".format(formater.format(dslot.getFluidAmount), formater.format(dslot.getCapacity))
if (dSlot.getFluid != null) {
tip += dSlot.getFluid.getFluid.getLocalizedName(dSlot.getFluid)
tip += "%s/%s mB".format(DecFormat.round(dSlot.getFluidAmount), DecFormat.round(dSlot.getCapacity))
} else {
tip += Misc.toLocal("gendustry.label.empty")
tip += Misc.toLocal("bdlib.label.empty")
}
}
override def draw() {
override def draw(mouse: Point) {
GL11.glEnable(GL11.GL_BLEND)
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA)
val fstack = dslot.getFluid
if (fstack != null && fstack.getFluid.getStillIcon != null) {
val icon = fstack.getFluid.getStillIcon
bindTexture(TextureMap.locationBlocksTexture)
var fillHeight: Int = (rect.h * fstack.amount / dslot.getCapacity).round
val fStack = dSlot.getFluid
if (fStack != null) {
val color = Color.fromInt(Misc.getFluidColor(fStack))
val icon = Texture(Texture.BLOCKS, Misc.getFluidIcon(fStack))
var fillHeight = if (dSlot.getCapacity > 0) rect.h * fStack.amount / dSlot.getCapacity else 0
var yStart: Int = 0
while (fillHeight > 0) {
if (fillHeight > 16) {
parent.drawTexturedModelRectFromIcon(rect.x, rect.y + rect.h - 16 - yStart, icon, 16, 16)
parent.drawTexture(new Rect(rect.x, rect.y2 - 16 - yStart, rect.w, 16), icon, color)
fillHeight -= 16
} else {
parent.drawTexturedModelRectFromIcon(rect.x, rect.y + rect.h - fillHeight - yStart, icon, 16, fillHeight)
parent.drawTextureInterpolate(new Rect(rect.x, rect.y2 - 16 - yStart, rect.w, 16), icon, 0, 1 - fillHeight / 16, 1, 1, color)
fillHeight = 0
}
yStart = yStart + 16
}
}
GL11.glColor3d(1, 1, 1)
GL11.glDisable(GL11.GL_BLEND)
bindTexture(overlay.resource)
parent.drawTexturedModalRect(rect.x, rect.y, overlay.x, overlay.y, rect.w, rect.h)
if (overlay != null)
parent.drawTexture(rect, overlay)
}
}
@@ -1,19 +1,19 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui.Rect
import net.bdew.lib.gui.{Color, Point, Rect}
class WidgetLabel(text: String, x: Int, y: Int, color: Int) extends Widget {
val rect: Rect = new Rect(x, y, 0, 0)
override def draw() {
parent.getFontRenderer.drawString(text, x, y, color)
class WidgetLabel(text: String, x: Int, y: Int, color: Color) extends Widget {
val rect = new Rect(x, y, 0, 0)
override def draw(mouse: Point) {
parent.drawText(text, rect.origin, color, false)
}
}
@@ -0,0 +1,22 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui.Rect
abstract class WidgetMultiPane(rect: Rect) extends WidgetSubContainer(rect) {
def getActivePane: BaseWidget
def addPane[T <: BaseWidget](w: T): T = {
w.init(this)
return w
}
override def activeWidgets = super.activeWidgets ++: List(getActivePane)
}
@@ -1,18 +1,19 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui.{Point, Direction, TextureLocation, Rect}
import net.bdew.lib.data.DataSlotFloat
import net.bdew.lib.gui._
import scala.collection.mutable
class WidgetProgressBar(rect: Rect, texture: TextureLocation, dslot: DataSlotFloat) extends WidgetFillDataslot[Float](rect, texture, Direction.RIGHT, dslot, 1) {
override def handleTooltip(p: Point, tip: mutable.MutableList[String]) = tip += "%.0f".format(dslot.cval * 100) + "%"
class WidgetProgressBar(rect: Rect, texture: Texture, dSlot: DataSlotFloat) extends WidgetFillDataSlot[Float](rect, texture, Direction.RIGHT, dSlot, 1) {
override def handleTooltip(p: Point, tip: mutable.MutableList[String]) = tip += "%.0f".format(dSlot.value * 100) + "%"
}
@@ -0,0 +1,16 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui._
case class WidgetSimpleIcon(rect: Rect, icon: Texture) extends Widget {
override def draw(mouse: Point) = parent.drawTexture(rect, icon)
}
@@ -0,0 +1,18 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.bdew.lib.gui._
class WidgetSubContainer(val rect: Rect) extends BaseWidget with WidgetContainer with SimpleDrawTarget {
def getZLevel = parent.getZLevel
def getFontRenderer = parent.getFontRenderer
def getOffsetFromWindow = parent.getOffsetFromWindow + rect.origin
}
@@ -1,19 +1,25 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.gui.widgets
import net.minecraft.client.gui.{FontRenderer, GuiTextField}
import net.bdew.lib.gui.{Point, Rect}
import net.minecraft.client.gui.{FontRenderer, GuiTextField}
class WidgetTextEdit(val rect: Rect, fr: FontRenderer) extends GuiTextField(fr, rect.x, rect.y, rect.w, rect.h) with Widget {
override def mouseClicked(p: Point, button: Int) = super.mouseClicked(p.x + rect.x, p.y + rect.y, button)
class WidgetTextEdit(val rect: Rect, fr: FontRenderer) extends GuiTextField(fr, rect.x.round, rect.y.round, rect.w.round, rect.h.round) with Widget {
override def mouseClicked(p: Point, button: Int) = {
val pp = p + rect.origin
super.mouseClicked(pp.x.round, pp.y.round, button)
}
override def looseFocus() = setFocused(false)
override def keyTyped(c: Char, i: Int): Boolean = super.textboxKeyTyped(c, i)
override def draw() = super.drawTextBox()
override def draw(mouse: Point) = super.drawTextBox()
}
+35
View File
@@ -0,0 +1,35 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.items
import net.minecraft.block.Block
import net.minecraft.item.{Item, ItemBlock, ItemStack}
/**
* Allows matching Items in ItemStacks in scala pattern matches
*/
object IStack {
def unapply(x: ItemStack): Option[Item] =
if (x == null || x.getItem == null)
None
else
Some(x.getItem)
}
/**
* Allows matching Blocks in ItemStacks in scala pattern matches
*/
object IStackBlock {
def unapply(x: ItemStack): Option[Block] =
if (x == null || x.getItem == null || !x.getItem.isInstanceOf[ItemBlock])
None
else
Some(x.getItem.asInstanceOf[ItemBlock].field_150939_a)
}
+44 -18
View File
@@ -1,20 +1,23 @@
/*
* Copyright (c) bdew, 2013
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.items
import net.minecraft.entity.item.EntityItem
import net.minecraft.item.ItemStack
import net.minecraft.world.World
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.inventory.IInventory
import java.util.Random
import net.bdew.lib.Misc
import net.minecraft.entity.item.EntityItem
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.inventory.{IInventory, ISidedInventory}
import net.minecraft.item.{Item, ItemStack}
import net.minecraft.world.World
import net.minecraftforge.common.util.ForgeDirection
object ItemUtils {
def throwItemAt(world: World, x: Int, y: Int, z: Int, stack: ItemStack) {
@@ -22,11 +25,11 @@ object ItemUtils {
val dx = world.rand.nextFloat * 0.8
val dy = world.rand.nextFloat * 0.8
val dz = world.rand.nextFloat * 0.8
val entityitem: EntityItem = new EntityItem(world, x + dx, y + dy, z + dz, stack)
entityitem.motionX = world.rand.nextGaussian * 0.05
entityitem.motionY = world.rand.nextGaussian * 0.05 + 0.2
entityitem.motionZ = world.rand.nextGaussian * 0.05
world.spawnEntityInWorld(entityitem)
val entity = new EntityItem(world, x + dx, y + dy, z + dz, stack)
entity.motionX = world.rand.nextGaussian * 0.05
entity.motionY = world.rand.nextGaussian * 0.05 + 0.2
entity.motionZ = world.rand.nextGaussian * 0.05
world.spawnEntityInWorld(entity)
}
def dropItemToPlayer(world: World, player: EntityPlayer, stack: ItemStack) {
@@ -37,34 +40,34 @@ object ItemUtils {
def isSameItem(stack1: ItemStack, stack2: ItemStack): Boolean = {
if (stack1 == null || stack2 == null)
return stack1 == stack2
if (stack1.itemID != stack2.itemID)
if (stack1.getItem != stack2.getItem)
return false
if (stack1.getHasSubtypes && stack2.getItemDamage != stack1.getItemDamage)
return false
return ItemStack.areItemStackTagsEqual(stack2, stack1)
}
def addStackToSlots(stack: ItemStack, inv: IInventory, slots: Iterable[Int], checkvalid: Boolean): ItemStack = {
def addStackToSlots(stack: ItemStack, inv: IInventory, slots: Iterable[Int], checkValid: Boolean): ItemStack = {
if (stack == null) return null
// Try merging into existing slots
for (slot <- slots if (!checkvalid || inv.isItemValidForSlot(slot, stack)) && isSameItem(stack, inv.getStackInSlot(slot))) {
for (slot <- slots if (!checkValid || inv.isItemValidForSlot(slot, stack)) && isSameItem(stack, inv.getStackInSlot(slot))) {
val target = inv.getStackInSlot(slot)
val toAdd = Misc.min(target.getMaxStackSize - target.stackSize, inv.getInventoryStackLimit - target.stackSize, stack.stackSize)
if (toAdd >= stack.stackSize) {
target.stackSize += stack.stackSize
stack.stackSize = 0
inv.onInventoryChanged()
inv.markDirty()
return null
} else if (toAdd > 0) {
target.stackSize += toAdd
stack.stackSize -= toAdd
inv.onInventoryChanged()
inv.markDirty()
}
}
// Now find empty slots and stick any leftovers there
for (slot <- slots if (!checkvalid || inv.isItemValidForSlot(slot, stack)) && inv.getStackInSlot(slot) == null) {
for (slot <- slots if (!checkValid || inv.isItemValidForSlot(slot, stack)) && inv.getStackInSlot(slot) == null) {
if (inv.getInventoryStackLimit < stack.stackSize) {
inv.setInventorySlotContents(slot, stack.splitStack(inv.getInventoryStackLimit))
} else {
@@ -76,4 +79,27 @@ object ItemUtils {
return stack
}
def getAccessibleSlotsFromSide(inv: IInventory, side: ForgeDirection) =
(Misc.asInstanceOpt(inv, classOf[ISidedInventory])
map (_.getAccessibleSlotsFromSide(side.ordinal()).toList)
getOrElse (0 until inv.getSizeInventory))
def findItemInInventory(inv: IInventory, item: Item) =
Range(0, inv.getSizeInventory).map(x => x -> inv.getStackInSlot(x))
.find({ case (slot, stack) => stack != null && stack.getItem == item })
.map({ case (slot, stack) => slot })
def copyWithRandomSize(template: ItemStack, max: Int, rand: Random) = {
val newSize = rand.nextInt(max)
val newStack = template.copy()
newStack.stackSize =
if (newSize > newStack.getMaxStackSize)
newStack.getMaxStackSize
else if (newSize <= 0)
1
else
newSize
newStack
}
}
+29
View File
@@ -0,0 +1,29 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.items
import cpw.mods.fml.relauncher.{Side, SideOnly}
import net.bdew.lib.Misc
import net.minecraft.client.renderer.texture.IIconRegister
import net.minecraft.item.Item
trait NamedItem extends Item {
def name: String
}
class SimpleItem(val name: String) extends Item with NamedItem {
val modId = Misc.getActiveModId
setUnlocalizedName(modId + "." + name)
@SideOnly(Side.CLIENT)
override def registerIcons(reg: IIconRegister) {
itemIcon = reg.registerIcon(modId + ":" + name.toLowerCase)
}
}
@@ -0,0 +1,27 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.items.inventory
import net.bdew.lib.gui.BaseContainer
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.inventory.Slot
import net.minecraft.item.ItemStack
class ContainerItemInventory(inv: InventoryItemAdapter, player: EntityPlayer) extends BaseContainer(inv) {
override def slotClick(slotNum: Int, button: Int, modifiers: Int, player: EntityPlayer): ItemStack = {
if (slotNum > 0 && slotNum < inventorySlots.size()) {
val slot = inventorySlots.asInstanceOf[java.util.List[Slot]].get(slotNum)
if (slot.isSlotInInventory(inv.player.inventory, inv.slot))
return null
}
if (modifiers == 2 && button == inv.slot) return null
return super.slotClick(slotNum, button, modifiers, player)
}
}
@@ -0,0 +1,47 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.items.inventory
import net.bdew.lib.Misc
import net.bdew.lib.tile.inventory.BaseInventory
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.nbt.{NBTTagCompound, NBTTagList}
class InventoryItemAdapter(val player: EntityPlayer, val slot: Int, val size: Int, val tagName: String) extends BaseInventory {
def getSizeInventory = size
def getStack = player.inventory.getStackInSlot(slot)
if (getStack.hasTagCompound)
load()
def load() {
val tag = getStack.getTagCompound
for (nbtItem <- Misc.iterNbtCompoundList(tag, tagName)) {
val slot = nbtItem.getByte("Slot")
if (slot >= 0 && slot < inv.size) {
inv(slot) = ItemStack.loadItemStackFromNBT(nbtItem)
}
}
}
def markDirty() {
if (!getStack.hasTagCompound) getStack.setTagCompound(new NBTTagCompound)
val tag = getStack.getTagCompound
val itemList = new NBTTagList
for ((item, i) <- inv.view.zipWithIndex if item != null) {
val itemNbt: NBTTagCompound = new NBTTagCompound
itemNbt.setByte("Slot", i.asInstanceOf[Byte])
item.writeToNBT(itemNbt)
itemList.appendTag(itemNbt)
}
tag.setTag(tagName, itemList)
}
}
@@ -0,0 +1,61 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.items.inventory
import cpw.mods.fml.common.Loader
import cpw.mods.fml.relauncher.{Side, SideOnly}
import net.bdew.lib.BdLib
import net.bdew.lib.gui.GuiProvider
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.Item
import net.minecraft.world.World
/**
* Mixin for items that have an internal inventory
* Subclasses are responsible for registering themselves with the GuiHandler of their mod
*/
trait ItemInventory extends Item with GuiProvider {
type TEClass = Any
def guiId: Int
val invSize: Int
val invTagName: String
val modObj = Loader.instance().activeModContainer().getMod
@SideOnly(Side.CLIENT)
def makeGui(inv: InventoryItemAdapter, player: EntityPlayer): AnyRef
def makeContainer(inv: InventoryItemAdapter, player: EntityPlayer): ContainerItemInventory
def makeAdaptor(player: EntityPlayer) = new InventoryItemAdapter(player, player.inventory.currentItem, invSize, invTagName)
@SideOnly(Side.CLIENT)
def getGui(te: TEClass, player: EntityPlayer) = {
val stack = player.inventory.getCurrentItem
if (stack.getItem == this) {
makeGui(makeAdaptor(player), player)
} else {
BdLib.logWarn("Attempt to open item container GUI without active item (%s)", this)
null
}
}
def getContainer(te: TEClass, player: EntityPlayer) = {
val stack = player.inventory.getCurrentItem
if (stack.getItem == this) {
makeContainer(makeAdaptor(player), player)
} else {
BdLib.logWarn("Attempt to open item container GUI without active item by '%s' (%s)", player.getCommandSenderName, this)
null
}
}
def doOpenGui(player: EntityPlayer, world: World) {
player.openGui(modObj, guiId, world, player.posX.toInt, player.posY.toInt, player.posZ.toInt)
}
}
+34
View File
@@ -0,0 +1,34 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.machine
import cpw.mods.fml.common.registry.GameRegistry
import net.bdew.lib.Misc
import net.bdew.lib.block.HasTE
import net.bdew.lib.recipes.gencfg.ConfigSection
import net.minecraft.block.Block
import net.minecraft.creativetab.CreativeTabs
abstract class Machine[T <: Block](val name: String, blockConstruct: => T) {
var block: T = null.asInstanceOf[T]
var tuning: ConfigSection = null
var enabled = false
val modId = Misc.getActiveModId
def regBlock(creativeTab: CreativeTabs) {
block = blockConstruct
GameRegistry.registerBlock(block, name)
block.setCreativeTab(creativeTab)
if (block.isInstanceOf[HasTE[_]]) {
GameRegistry.registerTileEntity(block.asInstanceOf[HasTE[_]].TEClass, "%s.%s".format(modId, name))
}
}
}
@@ -0,0 +1,19 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.machine
import net.bdew.lib.recipes.gencfg.ConfigSection
trait PoweredMachine {
def tuning: ConfigSection
lazy val maxReceivedEnergy = tuning.getFloat("MaxReceivedEnergy")
lazy val activationEnergy = tuning.getFloat("ActivationEnergy")
lazy val maxStoredEnergy = tuning.getFloat("MaxStoredEnergy")
}
@@ -0,0 +1,15 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.machine
trait ProcessorMachine extends PoweredMachine {
lazy val mjPerItem = tuning.getFloat("MjPerItem")
lazy val powerUseRate = tuning.getFloat("PowerUseRate")
}
@@ -0,0 +1,24 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock
import net.bdew.lib.recipes.gencfg.{ConfigSection, EntryDouble}
trait MachineCore {
var tuning: ConfigSection
def cfgSectionToMap(name: String) = tuning.getSection(name).map({
case (n, EntryDouble(v)) => n -> v.toInt
case (n, x) => sys.error("Invalid config value in section %s%s.%s = %s".format(tuning.pfx, name, n, x))
}).toMap
lazy val modules = cfgSectionToMap("Modules")
lazy val required = cfgSectionToMap("Required")
}
@@ -0,0 +1,36 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock
import net.bdew.lib.gui.{Color, Texture}
import net.minecraft.util.IIcon
trait ResourceProvider {
// Icons for rendering, *must* be on block sprite sheet
def edge: IIcon
def disabled: IIcon
def output: IIcon
def arrowTop: IIcon
def arrowRight: IIcon
def arrowBottom: IIcon
def arrowLeft: IIcon
// Textures for GUI stuff
def btBase: Texture
def btHover: Texture
def btRsOn: Texture
def btRsOff: Texture
def btEnabled: Texture
def btDisabled: Texture
val outputColors: Map[Int, Color]
val unlocalizedOutputName: Map[Int, String]
def getModuleName(s: String): String
}
+51
View File
@@ -0,0 +1,51 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock
import net.bdew.lib.block.BlockRef
import net.bdew.lib.multiblock.tile.{TileController, TileModule}
import net.minecraft.world.World
import scala.collection.mutable
object Tools {
def canConnect(world: World, core: BlockRef, kind: String): Boolean = {
val t = core.getTile[TileController](world).getOrElse(return false)
t.getNumOfModules(kind) < t.cfg.modules.getOrElse(kind, return false)
}
def findConnections(world: World, start: BlockRef, kind: String) =
(start.neighbours.values flatMap { case pos =>
(pos.tile(world) flatMap {
case t: TileModule => t.connected.value
case t: TileController => Some(pos)
case _ => None
}) filter (x => canConnect(world, x, kind))
}).toList.distinct
def getConnectedNeighbours(w: World, core: BlockRef, pos: BlockRef, seen: mutable.Set[BlockRef]) =
pos.neighbours.values
.filterNot(seen.contains)
.flatMap(_.getTile[TileModule](w))
.filter(x => x.connected.contains(core))
.map(_.myPos)
def findReachableModules(world: World, core: BlockRef): Set[BlockRef] = {
val seen = mutable.Set.empty[BlockRef]
val queue = mutable.Queue.empty[BlockRef]
queue ++= getConnectedNeighbours(world, core, core, seen)
while (queue.size > 0) {
val current = queue.dequeue()
seen.add(current)
queue ++= getConnectedNeighbours(world, core, current, seen)
}
return seen.toSet
}
}
@@ -0,0 +1,44 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.block
import net.bdew.lib.block.{BlockRef, HasTE}
import net.bdew.lib.multiblock.ResourceProvider
import net.bdew.lib.multiblock.tile.TileController
import net.bdew.lib.render.connected.ConnectedTextureBlock
import net.minecraft.block.Block
import net.minecraft.block.material.Material
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.world.{IBlockAccess, World}
abstract class BlockController[T <: TileController](val name: String, material: Material, val TEClass: Class[T])
extends Block(material) with HasTE[T] with ConnectedTextureBlock {
def resources: ResourceProvider
override def edgeIcon = resources.edge
override def breakBlock(world: World, x: Int, y: Int, z: Int, block: Block, meta: Int) {
getTE(world, x, y, z).onBreak()
super.breakBlock(world, x, y, z, block, meta)
}
override def canConnect(world: IBlockAccess, origin: BlockRef, target: BlockRef) =
getTE(world, origin).modules.contains(target)
override def onBlockActivated(world: World, x: Int, y: Int, z: Int, player: EntityPlayer, meta: Int, xOffs: Float, yOffs: Float, zOffs: Float): Boolean = {
if (player.isSneaking) return false
if (world.isRemote) return true
getTE(world, x, y, z).onClick(player)
return true
}
}
@@ -0,0 +1,69 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.block
import net.bdew.lib.block.{BlockRef, HasTE}
import net.bdew.lib.multiblock.tile.TileModule
import net.bdew.lib.multiblock.{ResourceProvider, Tools}
import net.bdew.lib.render.connected.ConnectedTextureBlock
import net.minecraft.block.Block
import net.minecraft.block.material.Material
import net.minecraft.entity.EntityLivingBase
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.util.ChatComponentTranslation
import net.minecraft.world.{IBlockAccess, World}
abstract class BlockModule[T <: TileModule](val name: String, val kind: String, material: Material, val TEClass: Class[T])
extends Block(material) with HasTE[T] with ConnectedTextureBlock {
def resources: ResourceProvider
override def edgeIcon = resources.edge
override def canPlaceBlockAt(world: World, x: Int, y: Int, z: Int): Boolean =
Tools.findConnections(world, BlockRef(x, y, z), kind).size <= 1
override def onBlockPlacedBy(world: World, x: Int, y: Int, z: Int, player: EntityLivingBase, stack: ItemStack) {
getTE(world, x, y, z).tryConnect()
}
override def onNeighborBlockChange(world: World, x: Int, y: Int, z: Int, block: Block) {
getTE(world, x, y, z).tryConnect()
}
override def breakBlock(world: World, x: Int, y: Int, z: Int, block: Block, meta: Int) {
getTE(world, x, y, z).onBreak()
super.breakBlock(world, x, y, z, block, meta)
}
override def canConnect(world: IBlockAccess, origin: BlockRef, target: BlockRef) = {
val me = getTE(world, origin)
me.connected.contains(target) ||
(target.getTile[TileModule](world) exists { other =>
me.getCore.isDefined && other.getCore == me.getCore
})
}
override def onBlockActivated(world: World, x: Int, y: Int, z: Int, player: EntityPlayer, meta: Int, xOffs: Float, yOffs: Float, zOffs: Float): Boolean = {
if (player.isSneaking) return false
if (world.isRemote) return true
val te = getTE(world, x, y, z)
(for {
p <- te.connected.value
bl <- p.block(world)
} yield {
bl.onBlockActivated(world, p.x, p.y, p.z, player, meta, 0, 0, 0)
}) getOrElse {
player.addChatMessage(new ChatComponentTranslation("bdlib.multiblock.notconnected"))
}
true
}
}
@@ -0,0 +1,43 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.block
import net.bdew.lib.block.{BlockFace, BlockRef}
import net.bdew.lib.multiblock.tile.TileOutput
import net.bdew.lib.render.connected.{BlockAdditionalRender, ConnectedHelper, FaceOverlay}
import net.minecraft.world.IBlockAccess
import net.minecraftforge.common.util.ForgeDirection
trait BlockOutput[T <: TileOutput[_]] extends BlockModule[T] with BlockAdditionalRender {
def getNeighbourFaces(face: ForgeDirection, bp: BlockRef) = {
val sides = ConnectedHelper.neighbourFaces(face)
Seq(
(BlockFace(bp, sides.top), resources.arrowTop),
(BlockFace(bp, sides.right), resources.arrowRight),
(BlockFace(bp, sides.bottom), resources.arrowBottom),
(BlockFace(bp, sides.left), resources.arrowLeft)
)
}
def getFaceOverlays(world: IBlockAccess, x: Int, y: Int, z: Int, face: ForgeDirection): List[FaceOverlay] = {
var result = List.empty[FaceOverlay]
Option(getTE(world, x, y, z)) flatMap (_.getCore) map { core =>
val bf = BlockFace(x, y, z, face)
if (core.outputFaces.contains(bf))
result :+= FaceOverlay(resources.output, resources.outputColors(core.outputFaces(bf)))
for ((bf, icon) <- getNeighbourFaces(face, bf.origin)) {
if (core.outputFaces.contains(bf))
result :+= FaceOverlay(icon, resources.outputColors(core.outputFaces(bf)))
}
}
return result
}
}
@@ -0,0 +1,49 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.data
import net.bdew.lib.Misc
import net.bdew.lib.block.BlockFace
import net.bdew.lib.data.base.{DataSlot, TileDataSlots, UpdateKind}
import net.minecraft.nbt.{NBTTagCompound, NBTTagIntArray, NBTTagList}
import net.minecraftforge.common.util.ForgeDirection
import scala.collection.mutable
case class DataSlotBlockFaceMap(name: String, parent: TileDataSlots) extends DataSlot {
val map = collection.mutable.Map.empty[BlockFace, Int]
setUpdate(UpdateKind.SAVE, UpdateKind.WORLD)
def inverted = map.map(_.swap)
def ent2arr(x: (BlockFace, Int)) = Array(x._2, x._1.x, x._1.y, x._1.z, x._1.face.ordinal())
def arr2ent(x: Array[Int]) = BlockFace(x(1), x(2), x(3), ForgeDirection.values()(x(4))) -> x(0)
def save(t: NBTTagCompound, kind: UpdateKind.Value) {
val lst = new NBTTagList()
for (x <- map) lst.appendTag(new NBTTagIntArray(ent2arr(x)))
t.setTag(name, lst)
}
def load(t: NBTTagCompound, kind: UpdateKind.Value) {
map.clear()
map ++= Misc.iterNbtIntArray(t, name) map arr2ent
}
def updated() = parent.dataSlotChanged(this)
}
object DataSlotBlockFaceMap {
import scala.language.implicitConversions
implicit def dataSlotBlockFaceMap2map(v: DataSlotBlockFaceMap): mutable.Map[BlockFace, Int] = v.map
}
@@ -0,0 +1,53 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.data
import net.bdew.lib.data.base.{DataSlot, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import scala.collection.mutable
case class DataSlotOutputConfig(name: String, parent: TileDataSlots, slots: Int) extends DataSlot {
val map = collection.mutable.Map.empty[Int, OutputConfig]
setUpdate(UpdateKind.SAVE, UpdateKind.GUI)
def inverted = map.map(_.swap)
def save(t: NBTTagCompound, kind: UpdateKind.Value) {
for ((n, x) <- map) {
val tmp = new NBTTagCompound()
x.write(tmp)
tmp.setString("kind", x.id)
t.setTag(name + "_" + n, tmp)
}
}
def load(t: NBTTagCompound, kind: UpdateKind.Value) {
map.clear()
for (i <- 0 until slots) {
if (t.hasKey(name + "_" + i)) {
val cfg = t.getCompoundTag(name + "_" + i)
val cfgObj = OutputConfigManager.create(cfg.getString("kind"))
cfgObj.read(cfg)
map += i -> cfgObj
}
}
}
def updated() = parent.dataSlotChanged(this)
}
object DataSlotOutputConfig {
import scala.language.implicitConversions
implicit def dataSlotOutputConfig2map(v: DataSlotOutputConfig): mutable.Map[Int, OutputConfig] = v.map
}
@@ -0,0 +1,31 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.data
import net.bdew.lib.Misc
import net.bdew.lib.block.BlockRef
import net.bdew.lib.data.DataSlotOption
import net.bdew.lib.data.base.{TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
case class DataSlotPos(name: String, parent: TileDataSlots) extends DataSlotOption[BlockRef] {
setUpdate(UpdateKind.SAVE, UpdateKind.WORLD)
def save(t: NBTTagCompound, kind: UpdateKind.Value) {
value map (x => t.setTag(name, Misc.applyMutator(x.writeToNBT, new NBTTagCompound)))
}
def load(t: NBTTagCompound, kind: UpdateKind.Value) {
value = if (t.hasKey(name))
Some(BlockRef.fromNBT(t.getCompoundTag(name)))
else
None
}
}
@@ -0,0 +1,44 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.data
import net.bdew.lib.Misc
import net.bdew.lib.block.BlockRef
import net.bdew.lib.data.base.{DataSlot, TileDataSlots, UpdateKind}
import net.minecraft.nbt.{NBTTagCompound, NBTTagList}
import scala.collection.mutable
case class DataSlotPosSet(name: String, parent: TileDataSlots) extends DataSlot {
val set = collection.mutable.Set.empty[BlockRef]
setUpdate(UpdateKind.SAVE, UpdateKind.WORLD)
def save(t: NBTTagCompound, kind: UpdateKind.Value) {
val lst = new NBTTagList()
for (x <- set) lst.appendTag(Misc.applyMutator(x.writeToNBT, new NBTTagCompound))
t.setTag(name, lst)
}
def load(t: NBTTagCompound, kind: UpdateKind.Value) {
set.clear()
set ++= Misc.iterNbtCompoundList(t, name) map BlockRef.fromNBT
}
def updated() = parent.dataSlotChanged(this)
}
object DataSlotPosSet {
import scala.language.implicitConversions
implicit def dataSlotPosSet2set(v: DataSlotPosSet): mutable.Set[BlockRef] = v.set
}
@@ -0,0 +1,37 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.data
import net.bdew.lib.multiblock.network.MsgOutputCfg
import net.minecraft.nbt.NBTTagCompound
import sun.reflect.generics.reflectiveObjects.NotImplementedException
abstract class OutputConfig {
def id: String
def read(t: NBTTagCompound)
def write(t: NBTTagCompound)
def handleConfigPacket(m: MsgOutputCfg)
}
class OutputConfigInvalid extends OutputConfig {
override val id: String = "invalid"
def read(t: NBTTagCompound) {}
def write(t: NBTTagCompound) = throw new NotImplementedException
def handleConfigPacket(m: MsgOutputCfg) = throw new NotImplementedException
}
object OutputConfigManager {
var loaders = Map.empty[String, () => OutputConfig]
def register(id: String, loader: () => OutputConfig) = loaders += id -> loader
def create(id: String) = loaders.get(id).map(_.apply()).getOrElse(new OutputConfigInvalid)
register("fluid", () => new OutputConfigFluid)
register("power", () => new OutputConfigPower)
}
@@ -0,0 +1,40 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.data
import net.bdew.lib.multiblock.network.MsgOutputCfg
import net.minecraft.nbt.NBTTagCompound
class OutputConfigFluid extends OutputConfig with OutputConfigRSControllable {
override def id = "fluid"
var avg = 0.0
var rsMode = RSMode.ALWAYS
final val decay = 0.5
def updateAvg(v: Double) {
avg = avg * decay + (1 - decay) * v
}
def read(t: NBTTagCompound) {
avg = t.getDouble("avg")
rsMode = RSMode(t.getInteger("rsMode"))
}
def write(t: NBTTagCompound) {
t.setDouble("avg", avg)
t.setInteger("rsMode", rsMode.id)
}
def handleConfigPacket(m: MsgOutputCfg) = m match {
case MsgOutputCfgRSMode(_, r) => rsMode = r
case _ => sys.error("Invalid output config packet %s to config %s".format(m, this))
}
}
@@ -0,0 +1,34 @@
/*
* Copyright (c) bdew, 2013 - 2014
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.data
import net.bdew.lib.multiblock.network.{MsgOutputCfg, MsgOutputCfgSlot}
import net.minecraft.nbt.NBTTagCompound
trait OutputConfigSlots {
val slotsDef: SlotSet
var slot = slotsDef.default
}
class OutputConfigFluidSlots(val slotsDef: SlotSet) extends OutputConfigFluid with OutputConfigSlots {
override def id = slotsDef.outputConfigId
override def read(t: NBTTagCompound) {
super.read(t)
slot = slotsDef.get(t.getString("slot"))
}
override def write(t: NBTTagCompound) {
super.write(t)
t.setString("slot", slot.id)
}
override def handleConfigPacket(m: MsgOutputCfg) = m match {
case MsgOutputCfgSlot(n, id) => slot = slotsDef.get(id)
case _ => super.handleConfigPacket(m)
}
}
Loaded 100 of 181 files, more files were not shown because too many files have changed in this diff. Show more