Finished implementation of Incense Altar and associated blocks.

Also added the recipe for the Ritual Tinkerer, as well as the finalized book entry for the Incense Altar.
This commit is contained in:
WayofTime 2020-11-13 19:44:57 -05:00
parent 7634404dac
commit cb2db9bc50
108 changed files with 2197 additions and 81 deletions

View file

@ -16,6 +16,8 @@ e780d6d9e891082dc6ce83fde1697ce36281a02a assets/bloodmagic/blockstates/fireritua
f78ce2be09ab794bf5f5679414eee0dc85cf4fb1 assets/bloodmagic/blockstates/largebloodstonebrick.json
002795212cc7bf2cad2a91f873d85e2204c6367d assets/bloodmagic/blockstates/lightritualstone.json
e1a98bd53fca155e4bbb03c1e548341af0f84bd7 assets/bloodmagic/blockstates/masterritualstone.json
95a0c9a84139cf92c2689e53408b51619db126a1 assets/bloodmagic/blockstates/obsidianbrickpath.json
8b0ea137c63cf3a658a03eee58ca4b2c3d996f87 assets/bloodmagic/blockstates/obsidiantilepath.json
372ecd737f7082a4c2c70e46745f893b1179f885 assets/bloodmagic/blockstates/orbcapacityrune.json
a2eaa9166258d7179d9e5099200f777bb9edf613 assets/bloodmagic/blockstates/rawdemoncrystal.json
90daa355e528ab8a6582f796951201882f3c56da assets/bloodmagic/blockstates/ritualstone.json
@ -23,9 +25,15 @@ a2eaa9166258d7179d9e5099200f777bb9edf613 assets/bloodmagic/blockstates/rawdemonc
b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json
487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json
f1ca47098385a955155cab9c2a97219e02d390a0 assets/bloodmagic/blockstates/steadfastdemoncrystal.json
297bc2425f7b07b1a9dd3f7f6649c44f88dbac29 assets/bloodmagic/blockstates/stonebrickpath.json
e3256db10fc8a8ab540f6ac8d27e0f47861e817a assets/bloodmagic/blockstates/stonetilepath.json
48ed6b25a5d8d8074c38d772fdc27c1753d42c36 assets/bloodmagic/blockstates/vengefuldemoncrystal.json
e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritualstone.json
69f7dee8ac7105339c604bc9b211386200165a2a assets/bloodmagic/lang/en_us.json
74c889434f46e060e8f185e8ef674312eb2f1192 assets/bloodmagic/blockstates/woodbrickpath.json
42f26f715bddd16c069f9b51e3767b36477c8908 assets/bloodmagic/blockstates/woodtilepath.json
3c6ce233dae6c1307d9016406c324bbe844b4e1e assets/bloodmagic/blockstates/wornstonebrickpath.json
d59655f12d1724b73b77c373fb6864fcff69db12 assets/bloodmagic/blockstates/wornstonetilepath.json
59b1ed6c18916f66576dd584ca3d1a203aa6fd87 assets/bloodmagic/lang/en_us.json
34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json
bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.json
adf6c0b1e25451609486dc8c8cfbd9cf0f8c67f4 assets/bloodmagic/models/block/alchemicalreactionchamber.json
@ -77,12 +85,20 @@ c30064f4aa09c42d23e94d118ae5b148eadb3a6c assets/bloodmagic/models/block/earthrit
d6bf1482345199e7d056a60865024ea5d480b986 assets/bloodmagic/models/block/largebloodstonebrick.json
2e1a81c758bfeec2aee807b48239f23241302268 assets/bloodmagic/models/block/lightritualstone.json
eab1713a8879decb2ae05258a6bcfa9da78ec67b assets/bloodmagic/models/block/masterritualstone.json
1e354903812e9cf8e2fea26b908430d7e1cf20a9 assets/bloodmagic/models/block/obsidianbrickpath.json
71893b8b185c2b0f64f21b7dc6c4f2850f936206 assets/bloodmagic/models/block/obsidiantilepath.json
c3a813b735cd229f8597e41d04465926b2e65fe1 assets/bloodmagic/models/block/orbcapacityrune.json
9b2bf2a44b788cbaecbe63a3e085e8de76672e1b assets/bloodmagic/models/block/ritualstone.json
a8a1d06fcc2f8395530c72d2846133fff37d5537 assets/bloodmagic/models/block/sacrificerune.json
791c9f2e27215ff0a45eed7efe385276bfc09aed assets/bloodmagic/models/block/selfsacrificerune.json
65fe5e01ed2660e45a5c329ff2389a87e4d791ec assets/bloodmagic/models/block/speedrune.json
c5d2b0e33500a5c51046cd606e0d1272ec0dddd6 assets/bloodmagic/models/block/stonebrickpath.json
359e28e79778961f57c6369b5d1b68218972fccb assets/bloodmagic/models/block/stonetilepath.json
6041f2e47f5437d90a58586e42d18dadc42df439 assets/bloodmagic/models/block/waterritualstone.json
d77cdb168a084aeb962be6ad7b4f41b181837be6 assets/bloodmagic/models/block/woodbrickpath.json
e54a4f2b3cd405c69782662b1b0d57e24f7c2524 assets/bloodmagic/models/block/woodtilepath.json
ee59117289640eaebf7a9d7f629dd584ac3ed50f assets/bloodmagic/models/block/wornstonebrickpath.json
bee51abed529a89ad088b2cb89a4c1d0de541bf1 assets/bloodmagic/models/block/wornstonetilepath.json
9462d62d9bc9408359d30728de8651dc104aacf1 assets/bloodmagic/models/item/accelerationrune.json
1aad9b00930b996e3680223cfcb631db2d9cb5ce assets/bloodmagic/models/item/activationcrystalawakened.json
5b8a9b260de9e5eccac525b3fa665ae973f5d23f assets/bloodmagic/models/item/activationcrystalcreative.json
@ -144,6 +160,8 @@ ccbcba6e4a6450bb67f91ba17754d668ba64c0ac assets/bloodmagic/models/item/ironfragm
0a3566d3c86403f24c22977dd32ffaec727a9ad3 assets/bloodmagic/models/item/masterbloodorb.json
9e377ab2c131993f96ab6fb544bda4dbba0ab87e assets/bloodmagic/models/item/masterritualstone.json
7596826c5b40c2809eb0a42eb5f5f2089290e3e5 assets/bloodmagic/models/item/miningsigil.json
eaa0548775c3d5839b46d333af33f815dc6dd0fe assets/bloodmagic/models/item/obsidianbrickpath.json
cf066d15baae650a383240a91240abd335bbb0e3 assets/bloodmagic/models/item/obsidiantilepath.json
ff9b802098659824626dc90dbb5a0d8960234228 assets/bloodmagic/models/item/orbcapacityrune.json
aa3947434e24f4a4c4ae43428de3f2dd2ceb31a6 assets/bloodmagic/models/item/plantoil.json
f267edf1b08e69d377290a549bd5ec4a12661d9e assets/bloodmagic/models/item/primitive_crystalline_resonator.json
@ -156,6 +174,7 @@ c0a7633527bdd25fc85e78fc4838733063726d88 assets/bloodmagic/models/item/reagentfa
4ff6b8f6943d96a0f292ff4e0b0973edff550229 assets/bloodmagic/models/item/reagentgrowth.json
c82717c2706ec2ef1518f95c6aefdff9bdae09b8 assets/bloodmagic/models/item/reagentlava.json
baafdb5915c5fbc99b84a54670ed64a6f26cb0fe assets/bloodmagic/models/item/reagentmagnetism.json
2023ecdc208cfca92053b5cc3bbb98e21f5e3e19 assets/bloodmagic/models/item/reagentsight.json
95b2925e96a7df71d72568e0ed7b03290293cbe7 assets/bloodmagic/models/item/reagentvoid.json
fd1447d943ddc4540a51a72dcbb245d77d45da71 assets/bloodmagic/models/item/reagentwater.json
50bf796adbed412488df48ed9250fc9b0ecd851f assets/bloodmagic/models/item/reinforcedslate.json
@ -164,9 +183,10 @@ fd1447d943ddc4540a51a72dcbb245d77d45da71 assets/bloodmagic/models/item/reagentwa
2722891c9c40b124d85bf9ff8eb885e175f5e6ff assets/bloodmagic/models/item/ritualstone.json
094b2d159deb0996c655498cf89a20e1c06a4ab7 assets/bloodmagic/models/item/ritualtinkerer.json
db73abb3bcb1731b6fc389e3577910b6aab87b10 assets/bloodmagic/models/item/sacrificerune.json
9403d6195d4d38d5876c2a42f4edfb9bdcd05210 assets/bloodmagic/models/item/sacrificialdagger.json
616afe16c430ce4732498f0b2d19509d3a545bcc assets/bloodmagic/models/item/sacrificialdagger.json
b23b701e93011247714ebdaffd6d52e918ba3d8a assets/bloodmagic/models/item/saltpeter.json
b8582a5cd6ca35279e9b35931f1c5ca089b094b8 assets/bloodmagic/models/item/sanguinereverter.json
b9fd6c60eba0186ba7ac156c4d126fcf74c21b84 assets/bloodmagic/models/item/seersigil.json
cc71421e98ee7ee047a4cfbb6cb69529c2b02d4e assets/bloodmagic/models/item/selfsacrificerune.json
ea5747638d0b5dcc03f008b202cc60a11e0827bb assets/bloodmagic/models/item/sigilofmagnetism.json
db0f63198089161b8d4ecfb1ec8a45f7dc5ba83d assets/bloodmagic/models/item/soulaxe.json
@ -181,6 +201,8 @@ fe2b201007c974229509f6900c6eb8b03d158b0a assets/bloodmagic/models/item/soulsword
52d21027ac6fed000e77b5e8ad9102319b25cb33 assets/bloodmagic/models/item/speedrune.json
6e2b7581e06ee42915cc98ac10a6cb8e45512c70 assets/bloodmagic/models/item/steadfastcrystal.json
6968a3d0c3bbeac8ea4cb2c050e28506e8938851 assets/bloodmagic/models/item/steadfastdemoncrystal.json
29009ca92dc30e1ec4ae1d454cd3f8726d8edc3c assets/bloodmagic/models/item/stonebrickpath.json
2dc28b0e2b7ae7bb0bcf8c8e74b9ba7c800446ff assets/bloodmagic/models/item/stonetilepath.json
26cb0aae63ea4f27efd5337c90c580ddd7481b99 assets/bloodmagic/models/item/sulfur.json
e8fe01c5cddc268538681889f3161472a8f1c8ad assets/bloodmagic/models/item/variants/growthsigil_activated.json
20c802279de4df496057795c2e891fa54a21376f assets/bloodmagic/models/item/variants/growthsigil_deactivated.json
@ -188,6 +210,8 @@ e8fe01c5cddc268538681889f3161472a8f1c8ad assets/bloodmagic/models/item/variants/
11f5516cea8ac65bbb0f5958d6492170482ae8d8 assets/bloodmagic/models/item/variants/icesigil_deactivated.json
be3772fd711ccf4a2adfad122a8b39e8a36e874a assets/bloodmagic/models/item/variants/miningsigil_activated.json
7dec45f3167426d975564692a80196cdb3f4bdb4 assets/bloodmagic/models/item/variants/miningsigil_deactivated.json
9403d6195d4d38d5876c2a42f4edfb9bdcd05210 assets/bloodmagic/models/item/variants/sacrificialdagger.json
89ea1f760bac680b1baa98536d6bc407e347676e assets/bloodmagic/models/item/variants/sacrificialdagger_ceremonial.json
79c61e61656a934397c92626809c1869b0617fc3 assets/bloodmagic/models/item/variants/sigilofmagnetism_activated.json
129ace1f4a25f22bd09215603248a25adcf234e0 assets/bloodmagic/models/item/variants/sigilofmagnetism_deactivated.json
81e1cb0664f53f30ad195fc4330786b71db9e20c assets/bloodmagic/models/item/variants/soulaxe.json
@ -243,6 +267,10 @@ a31019db55828cb937a071ac2f74b125a2d0c955 assets/bloodmagic/models/item/waterritu
7426fed5f833ce3d08602f727f1467dd3e107991 assets/bloodmagic/models/item/watersigil.json
f72efc172699d43405019add97f455bd6b7f452b assets/bloodmagic/models/item/weakbloodorb.json
1efacee8dc0c3114567509ad247800cff59cb455 assets/bloodmagic/models/item/weakbloodshard.json
c0907e611e09ccc924452070519006add21f3d12 assets/bloodmagic/models/item/woodbrickpath.json
1de444baa270a146dcd33c784b08f75a3d745421 assets/bloodmagic/models/item/woodtilepath.json
c8ea88c439c91d0eeee3e6204a3c50f8cfd36758 assets/bloodmagic/models/item/wornstonebrickpath.json
2d9dab8ebc036473d82eb044eb7a7bba0d0937a4 assets/bloodmagic/models/item/wornstonetilepath.json
04faf23bcb783a306c3b7a8a375ac2bf87c1072b data/bloodmagic/advancements/recipes/bloodmagictab/alchemy_table.json
e6a3ac3998653b10ee09780be9099a9d0c5b3917 data/bloodmagic/advancements/recipes/bloodmagictab/arc.json
828c0f89e747d48d37c6a86030a8ec59ca5c29cb data/bloodmagic/advancements/recipes/bloodmagictab/blood_altar.json
@ -257,8 +285,15 @@ e897d6f91e2a0bd12b0da0a50e5c897294989e7c data/bloodmagic/advancements/recipes/bl
263f7c251d2f163db5bd229f2ab8a222f23ae03a data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_self_sacrifice.json
7ca400d1141ff4be1b529cd060950b42cf3b9bfb data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_speed.json
764e54fdaa24f87cceb815990bbbd2e2cd87f205 data/bloodmagic/advancements/recipes/bloodmagictab/bloodstonebrick.json
a6f012d0584d36d9b7dd0ec4f9e4cbd2a3ff1146 data/bloodmagic/advancements/recipes/bloodmagictab/incense_altar.json
4c24af93a64071aadc0308b27bcbc44572e5ccfc data/bloodmagic/advancements/recipes/bloodmagictab/largebloodstonebrick.json
344567e6f5671131addcfebbd92d18e5cbd66ef5 data/bloodmagic/advancements/recipes/bloodmagictab/lava_crystal.json
d8ca7255f72a2ab6915552cdeb682ecc6efde03a data/bloodmagic/advancements/recipes/bloodmagictab/path/path_stone.json
1b85f9d2b823aef941158276b6f46bd8279cd693 data/bloodmagic/advancements/recipes/bloodmagictab/path/path_stonetile.json
f17f721149daf9246788be3235e5a6472155215a data/bloodmagic/advancements/recipes/bloodmagictab/path/path_wood.json
147ba38e68ca50e503ecf1ea96e85ce62c2dd86d data/bloodmagic/advancements/recipes/bloodmagictab/path/path_woodtile.json
ea0b32b5595661f0d09f68a8a596577cc62ba0b1 data/bloodmagic/advancements/recipes/bloodmagictab/path/path_wornstone.json
0dc717f46c2c6f36b58114df2bf5c82aadb104d2 data/bloodmagic/advancements/recipes/bloodmagictab/path/path_wornstonetile.json
091fbd276c5ad173716e9e7474fa278e742a662f data/bloodmagic/advancements/recipes/bloodmagictab/primitive_furnace_cell.json
7cf09fef1a5bfc1401ecc34857bdf78c7282c12a data/bloodmagic/advancements/recipes/bloodmagictab/primitive_hydration_cell.json
01e90bb9c59d44a52777ecc0cf28754295fda675 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json
@ -290,9 +325,12 @@ a9fcfc656fab957328c10ee1d9d33807e697b7f7 data/bloodmagic/loot_tables/blocks/disl
26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/duskritualstone.json
26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/earthritualstone.json
26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/fireritualstone.json
59dd54a876b7ccd0b6c90f409753c2af2d687f03 data/bloodmagic/loot_tables/blocks/incensealtar.json
462a82b07e7fe3e479a2c072c73507686c339346 data/bloodmagic/loot_tables/blocks/largebloodstonebrick.json
26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/lightritualstone.json
72610188b4538d98ffcd015c2813d63d19889d5f data/bloodmagic/loot_tables/blocks/masterritualstone.json
3892d33bbef90db50034b1358d4a9ee8b731bc8d data/bloodmagic/loot_tables/blocks/obsidianbrickpath.json
3576b2f9d92ab5bdc456cb904905fb5c969e55f3 data/bloodmagic/loot_tables/blocks/obsidiantilepath.json
95442c1bb740fab2eb8ee051f7184813f6023afa data/bloodmagic/loot_tables/blocks/orbcapacityrune.json
6c59e846922061c0f2249b0c73c3be89ec73ea31 data/bloodmagic/loot_tables/blocks/rawdemoncrystal.json
26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/ritualstone.json
@ -301,8 +339,14 @@ e0239eff7762a414a4e4faa0158d844dffb8c1f6 data/bloodmagic/loot_tables/blocks/sacr
f748a5ba8838b50de0502f132fe2a65f4726dae6 data/bloodmagic/loot_tables/blocks/soulforge.json
015e07226fd90935f7ec663f4bcf3873a57a82d1 data/bloodmagic/loot_tables/blocks/speedrune.json
128ec3ee93e927d457beeb8161e80706e9239760 data/bloodmagic/loot_tables/blocks/steadfastdemoncrystal.json
8849e41b699c2eb7c3712a8e862bd9dd309a5c31 data/bloodmagic/loot_tables/blocks/stonebrickpath.json
6149fd464bafaabf35ca431202680c84cf5441b1 data/bloodmagic/loot_tables/blocks/stonetilepath.json
33a22d9b198c93ed07ac69b7a594bb08db64b239 data/bloodmagic/loot_tables/blocks/vengefuldemoncrystal.json
26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/waterritualstone.json
04c5bc02383ddff04588af3a048ee3973e69666f data/bloodmagic/loot_tables/blocks/woodbrickpath.json
2c471cedf5e3e39610821766609646698d2b47e3 data/bloodmagic/loot_tables/blocks/woodtilepath.json
9ab0aac56f75e7811f9641a6a20ff8d9dd78876a data/bloodmagic/loot_tables/blocks/wornstonebrickpath.json
4a7395079f874ae08af94f64a8a00211a56e906a data/bloodmagic/loot_tables/blocks/wornstonetilepath.json
2df19ff659705a5408ce0819a947764673404388 data/bloodmagic/recipes/alchemy_table.json
a343604b5a75e1b3810df97d024813fb041cffb6 data/bloodmagic/recipes/alchemytable/basic_cutting_fluid.json
f86432e8fef0d6e140e27f575063704b7e843d75 data/bloodmagic/recipes/alchemytable/bread.json
@ -334,7 +378,7 @@ d79a96eb3eed597f1c18a8983764a6362a24748c data/bloodmagic/recipes/altar/dusk_tool
30d84c946ad9235f6e59f1046edbe8d44acc799e data/bloodmagic/recipes/altar/reinforcedslate.json
584d01dff4d64bb88bd3783751a29723700f1728 data/bloodmagic/recipes/altar/slate.json
926d4a0e165c87a15a609744d832d2f5f04a40d0 data/bloodmagic/recipes/altar/water_tool.json
7551501cf361667ec7454c307b9d2368536fbed6 data/bloodmagic/recipes/altar/weakbloodorb.json
dd59da50b674ec8f680e01a91261bf34091075cf data/bloodmagic/recipes/altar/weakbloodorb.json
5807b2515f4a2dc9855327940e6055f6947f0749 data/bloodmagic/recipes/arc.json
f35bb47d609201f6568b598307ae9d157792fe3e data/bloodmagic/recipes/arc/clay_from_sand.json
6b8ba1822bac8a1af426a14f87d613dc89e3fca0 data/bloodmagic/recipes/arc/clay_from_terracotta.json
@ -363,6 +407,7 @@ d1ac23080f72f21adb5908befefe965ffb4efd4f data/bloodmagic/recipes/array/bloodligh
f191a3c9982b827b0b2ba93164a81fc4f8cb0959 data/bloodmagic/recipes/array/growthsigil.json
78c880321f0bfad14239d4b9d2edae170a7fa86e data/bloodmagic/recipes/array/lavasigil.json
8b1007de1b7fca5d27b54d7c9839cde9e47ab1c0 data/bloodmagic/recipes/array/magnetismsigil.json
6fd91801759c6a7a018b9d18601fc3db4d3ee3b4 data/bloodmagic/recipes/array/seersigil.json
cabe693e7c714203ad708a1068f302b3ee3120b0 data/bloodmagic/recipes/array/voidsigil.json
5e68d933fff631142a8dd819aee235d343d43cff data/bloodmagic/recipes/array/watersigil.json
de8dbcf4d69bd3b47693c4631578a9b5c0e3f50c data/bloodmagic/recipes/blood_altar.json
@ -377,8 +422,15 @@ b63d77c3762f86d4a91f62e192c3e9b26e3b52ca data/bloodmagic/recipes/blood_rune_sacr
7c4e247c1df6ef594bbb2fc2196afb102f45982b data/bloodmagic/recipes/blood_rune_self_sacrifice.json
e2bcf2a6f951fbcef45554ec90ba28d14e261d18 data/bloodmagic/recipes/blood_rune_speed.json
eeb5e64b8bc90adc2554dde88b8792b92ad7c8cc data/bloodmagic/recipes/bloodstonebrick.json
9a5749465020b32b0147b3367784ce31a0d3b54b data/bloodmagic/recipes/incense_altar.json
63bca28ba5eebb9c488c819bcb117595eadb877d data/bloodmagic/recipes/largebloodstonebrick.json
9dedad36e9d2ab6688e069c2e6df3851c395b583 data/bloodmagic/recipes/lava_crystal.json
50d84717ac673875e4b52522b583f564a8a75e8e data/bloodmagic/recipes/path/path_stone.json
2756ff3f29e1231795671c94fdaf9e5abc65bbee data/bloodmagic/recipes/path/path_stonetile.json
dcb702aeb768bc0ff5d1f05c5ac95066c4082193 data/bloodmagic/recipes/path/path_wood.json
7491b9f62c29d2fde6ff1dbff09f16f458b9afe8 data/bloodmagic/recipes/path/path_woodtile.json
d85f637e3c87ba050c24581b8f4bef4176e1ba14 data/bloodmagic/recipes/path/path_wornstone.json
2ee3e7f073df764289939b8df814cc8f056eced0 data/bloodmagic/recipes/path/path_wornstonetile.json
0b1a11f0e1b6bc317e2dbf04560a81581623f41e data/bloodmagic/recipes/primitive_furnace_cell.json
7e1a70935e9b5ba6b345af6a7077287896ec6cfe data/bloodmagic/recipes/primitive_hydration_cell.json
bfd7925ad30534463d7daf0f7dce03cf1502cbcf data/bloodmagic/recipes/ritual_diviner_0.json
@ -407,6 +459,7 @@ cba99433d18bd61a0a7c2f5ef9f97cad91028f16 data/bloodmagic/recipes/soulforge/reage
ae3a6a760e9f793d5a62e2f0f6c45219b0017816 data/bloodmagic/recipes/soulforge/reagent_growth.json
1c391181ea77f5ed01f7226e0782b3b45162ab3c data/bloodmagic/recipes/soulforge/reagent_lava.json
e517023dc3e32929344ff5415397fc833bfbc29a data/bloodmagic/recipes/soulforge/reagent_magnetism.json
c65a8b31432ec36e9de9de1447e357387de2195c data/bloodmagic/recipes/soulforge/reagent_sight.json
c0e75e0e12290d191245c5b0b5b13bc739d2ff44 data/bloodmagic/recipes/soulforge/reagent_void.json
a222d09abf1ea61feb684f2ac23d011c2034f526 data/bloodmagic/recipes/soulforge/reagent_water.json
4a4340f334c51beaacb77fd201298ad94b71e79c data/bloodmagic/recipes/soulforge/sanguine_reverter.json

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "bloodmagic:block/obsidianbrickpath"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "bloodmagic:block/obsidiantilepath"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "bloodmagic:block/stonebrickpath"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "bloodmagic:block/stonetilepath"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "bloodmagic:block/woodbrickpath"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "bloodmagic:block/woodtilepath"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "bloodmagic:block/wornstonebrickpath"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "bloodmagic:block/wornstonetilepath"
}
}
}

View file

@ -17,9 +17,12 @@
"block.bloodmagic.duskritualstone": "Dusk Ritual Stone",
"block.bloodmagic.earthritualstone": "Earth Ritual Stone",
"block.bloodmagic.fireritualstone": "Fire Ritual Stone",
"block.bloodmagic.incensealtar": "Incense Altar",
"block.bloodmagic.largebloodstonebrick": "Large Bloodstone Brick",
"block.bloodmagic.lightritualstone": "Dawn Ritual Stone",
"block.bloodmagic.masterritualstone": "Master Ritual Stone",
"block.bloodmagic.obsidianbrickpath": "Obsidian Path",
"block.bloodmagic.obsidiantilepath": "Tiled Obsidian Path",
"block.bloodmagic.orbcapacityrune": "Rune of the Orb",
"block.bloodmagic.rawdemoncrystal": "Raw Crystal Cluster",
"block.bloodmagic.ritualstone": "Ritual Stone",
@ -28,8 +31,14 @@
"block.bloodmagic.soulforge": "Hellfire Forge",
"block.bloodmagic.speedrune": "Speed Rune",
"block.bloodmagic.steadfastdemoncrystal": "Steadfast Crystal Cluster",
"block.bloodmagic.stonebrickpath": "Stone Path",
"block.bloodmagic.stonetilepath": "Tiled Stone Path",
"block.bloodmagic.vengefuldemoncrystal": "Vengeful Crystal Cluster",
"block.bloodmagic.waterritualstone": "Water Ritual Stone",
"block.bloodmagic.woodbrickpath": "Wooden Path",
"block.bloodmagic.woodtilepath": "Tiled Wooden Path",
"block.bloodmagic.wornstonebrickpath": "Worn Stone Path",
"block.bloodmagic.wornstonetilepath": "Tiled Worn Stone Path",
"chat.bloodmagic.damageSource": "%s's soul became too weak",
"chat.bloodmagic.ritual.activate": "A rush of energy flows through the ritual!",
"chat.bloodmagic.ritual.notValid": "You feel that these runes are not configured correctly...",
@ -38,6 +47,7 @@
"gui.bloodmagic.empty": "Empty",
"guide.bloodmagic.landing_text": "\"It is my dear hope that by holding this tome in your hands, I may impart the knowledge of the lost art that is Blood Magic\"$(br)$(o)- Magus Arcana$()",
"guide.bloodmagic.name": "Sanguine Scientiem",
"hud.bloodmagic.inactive": "Inactive",
"item.bloodmagic.activationcrystalawakened": "Awakened Activation Crystal",
"item.bloodmagic.activationcrystalcreative": "Creative Activation Crystal",
"item.bloodmagic.activationcrystalweak": "Weak Activation Crystal",
@ -92,6 +102,7 @@
"item.bloodmagic.reagentgrowth": "Growth Reagent",
"item.bloodmagic.reagentlava": "Lava Reagent",
"item.bloodmagic.reagentmagnetism": "Magnetism Reagent",
"item.bloodmagic.reagentsight": "Sight Reagent",
"item.bloodmagic.reagentvoid": "Void Reagent",
"item.bloodmagic.reagentwater": "Water Reagent",
"item.bloodmagic.reinforcedslate": "Reinforced Slate",
@ -101,6 +112,7 @@
"item.bloodmagic.sacrificialdagger": "Sacrificial Knife",
"item.bloodmagic.saltpeter": "Saltpeter",
"item.bloodmagic.sanguinereverter": "Sanguine Reverter",
"item.bloodmagic.seersigil": "Seer's Sigil",
"item.bloodmagic.sigilofmagnetism": "Sigil of Magnetism",
"item.bloodmagic.soulaxe": "Sentient Axe",
"item.bloodmagic.soulgemcommon": "Common Tartaric Gem",
@ -347,6 +359,16 @@
"tooltip.bloodmagic.sigil.greengrove.desc": "Environmentally friendly",
"tooltip.bloodmagic.sigil.lava.desc": "HOT! DO NOT EAT",
"tooltip.bloodmagic.sigil.magnetism.desc": "I have a very magnetic personality",
"tooltip.bloodmagic.sigil.seer.currentAltarCapacity": "Current Capacity: %d LP",
"tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate": "Consumption Rate: %d LP",
"tooltip.bloodmagic.sigil.seer.currentAltarProgress": "Current Progress: %d LP/ %s LP",
"tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent": "Current Progress: %s",
"tooltip.bloodmagic.sigil.seer.currentAltarTier": "Current Tier: %d",
"tooltip.bloodmagic.sigil.seer.currentBonus": "Current Bonus: +%d%%",
"tooltip.bloodmagic.sigil.seer.currentCharge": "Current Charge: %d",
"tooltip.bloodmagic.sigil.seer.currentEssence": "Current Essence: %d LP",
"tooltip.bloodmagic.sigil.seer.currentTranquility": "Current Tranquility: %d",
"tooltip.bloodmagic.sigil.seer.desc": "When seeing all is not enough",
"tooltip.bloodmagic.sigil.void.desc": "Better than a Swiffer\u00AE!",
"tooltip.bloodmagic.sigil.water.desc": "Infinite water, anyone?",
"tooltip.bloodmagic.slate.desc": "Infused stone inside of a Blood Altar",

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "bloodmagic:block/obsidianbrickpath"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "bloodmagic:block/obsidiantilepath"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "bloodmagic:block/stonebrickpath"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "bloodmagic:block/stonetilepath"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "bloodmagic:block/woodbrickpath"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "bloodmagic:block/woodtilepath"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "bloodmagic:block/wornstonebrickpath"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "bloodmagic:block/wornstonetilepath"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "bloodmagic:block/obsidianbrickpath"
}

View file

@ -0,0 +1,3 @@
{
"parent": "bloodmagic:block/obsidiantilepath"
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "bloodmagic:item/reagentsight"
}
}

View file

@ -2,5 +2,19 @@
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "bloodmagic:item/sacrificialdagger"
}
},
"overrides": [
{
"predicate": {
"bloodmagic:incense": 0.0
},
"model": "bloodmagic:item/variants/sacrificialdagger"
},
{
"predicate": {
"bloodmagic:incense": 1.0
},
"model": "bloodmagic:item/variants/sacrificialdagger_ceremonial"
}
]
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "bloodmagic:item/seersigil"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "bloodmagic:block/stonebrickpath"
}

View file

@ -0,0 +1,3 @@
{
"parent": "bloodmagic:block/stonetilepath"
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "bloodmagic:item/sacrificialdagger"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "bloodmagic:item/sacrificialdagger_ceremonial"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "bloodmagic:block/woodbrickpath"
}

View file

@ -0,0 +1,3 @@
{
"parent": "bloodmagic:block/woodtilepath"
}

View file

@ -0,0 +1,3 @@
{
"parent": "bloodmagic:block/wornstonebrickpath"
}

View file

@ -0,0 +1,3 @@
{
"parent": "bloodmagic:block/wornstonetilepath"
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"bloodmagic:incense_altar"
]
},
"criteria": {
"has_weak_orb": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "bloodmagic:weakbloodorb"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "bloodmagic:incense_altar"
}
}
},
"requirements": [
[
"has_weak_orb",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"bloodmagic:path/path_stone"
]
},
"criteria": {
"has_magician_orb": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "bloodmagic:magicianbloodorb"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "bloodmagic:path/path_stone"
}
}
},
"requirements": [
[
"has_magician_orb",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"bloodmagic:path/path_stonetile"
]
},
"criteria": {
"has_magician_orb": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "bloodmagic:magicianbloodorb"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "bloodmagic:path/path_stonetile"
}
}
},
"requirements": [
[
"has_magician_orb",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"bloodmagic:path/path_wood"
]
},
"criteria": {
"has_apprentice_orb": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "bloodmagic:apprenticebloodorb"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "bloodmagic:path/path_wood"
}
}
},
"requirements": [
[
"has_apprentice_orb",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"bloodmagic:path/path_woodtile"
]
},
"criteria": {
"has_apprentice_orb": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "bloodmagic:apprenticebloodorb"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "bloodmagic:path/path_woodtile"
}
}
},
"requirements": [
[
"has_apprentice_orb",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"bloodmagic:path/path_wornstone"
]
},
"criteria": {
"has_master_orb": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "bloodmagic:masterbloodorb"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "bloodmagic:path/path_wornstone"
}
}
},
"requirements": [
[
"has_master_orb",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"bloodmagic:path/path_wornstonetile"
]
},
"criteria": {
"has_master_orb": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "bloodmagic:masterbloodorb"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "bloodmagic:path/path_wornstonetile"
}
}
},
"requirements": [
[
"has_master_orb",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "bloodmagic:incensealtar"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "bloodmagic:obsidianbrickpath"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "bloodmagic:obsidiantilepath"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "bloodmagic:stonebrickpath"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "bloodmagic:stonetilepath"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "bloodmagic:woodbrickpath"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "bloodmagic:woodtilepath"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "bloodmagic:wornstonebrickpath"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "bloodmagic:wornstonetilepath"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -8,6 +8,6 @@
},
"upgradeLevel": 0,
"altarSyphon": 2000,
"consumptionRate": 2,
"consumptionRate": 5,
"drainRate": 1
}

View file

@ -0,0 +1,13 @@
{
"type": "bloodmagic:array",
"texture": "bloodmagic:textures/models/alchemyarrays/sightsigil.png",
"baseinput": {
"item": "bloodmagic:reagentsight"
},
"addedinput": {
"item": "bloodmagic:reinforcedslate"
},
"output": {
"item": "bloodmagic:seersigil"
}
}

View file

@ -0,0 +1,26 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"s s",
"shs",
"coc"
],
"key": {
"s": {
"tag": "forge:stone"
},
"c": {
"tag": "forge:cobblestone"
},
"h": {
"item": "minecraft:charcoal"
},
"o": {
"type": "bloodmagic:bloodorb",
"orb_tier": 1
}
},
"result": {
"item": "bloodmagic:incensealtar"
}
}

View file

@ -0,0 +1,25 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"tag": "forge:stone"
},
{
"tag": "forge:stone"
},
{
"tag": "forge:stone"
},
{
"tag": "forge:stone"
},
{
"type": "bloodmagic:bloodorb",
"orb_tier": 3
}
],
"result": {
"item": "bloodmagic:stonebrickpath",
"count": 4
}
}

View file

@ -0,0 +1,21 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "bloodmagic:stonebrickpath"
},
{
"item": "bloodmagic:stonebrickpath"
},
{
"item": "bloodmagic:stonebrickpath"
},
{
"item": "bloodmagic:stonebrickpath"
}
],
"result": {
"item": "bloodmagic:stonetilepath",
"count": 4
}
}

View file

@ -0,0 +1,25 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"tag": "minecraft:planks"
},
{
"tag": "minecraft:planks"
},
{
"tag": "minecraft:planks"
},
{
"tag": "minecraft:planks"
},
{
"type": "bloodmagic:bloodorb",
"orb_tier": 2
}
],
"result": {
"item": "bloodmagic:woodbrickpath",
"count": 4
}
}

View file

@ -0,0 +1,21 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "bloodmagic:woodbrickpath"
},
{
"item": "bloodmagic:woodbrickpath"
},
{
"item": "bloodmagic:woodbrickpath"
},
{
"item": "bloodmagic:woodbrickpath"
}
],
"result": {
"item": "bloodmagic:woodtilepath",
"count": 4
}
}

View file

@ -0,0 +1,25 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "bloodmagic:stonebrickpath"
},
{
"item": "bloodmagic:stonebrickpath"
},
{
"item": "bloodmagic:stonebrickpath"
},
{
"item": "bloodmagic:stonebrickpath"
},
{
"type": "bloodmagic:bloodorb",
"orb_tier": 4
}
],
"result": {
"item": "bloodmagic:wornstonebrickpath",
"count": 4
}
}

View file

@ -0,0 +1,21 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "bloodmagic:wornstonebrickpath"
},
{
"item": "bloodmagic:wornstonebrickpath"
},
{
"item": "bloodmagic:wornstonebrickpath"
},
{
"item": "bloodmagic:wornstonebrickpath"
}
],
"result": {
"item": "bloodmagic:wornstonetilepath",
"count": 4
}
}

View file

@ -0,0 +1,20 @@
{
"type": "bloodmagic:soulforge",
"input0": {
"tag": "forge:dusts/glowstone"
},
"input1": {
"tag": "forge:glass"
},
"input2": {
"tag": "forge:glass"
},
"input3": {
"item": "bloodmagic:divinationsigil"
},
"output": {
"item": "bloodmagic:reagentsight"
},
"minimumDrain": 64.0,
"drain": 0.0
}

View file

@ -51,6 +51,7 @@ import wayoftime.bloodmagic.core.recipe.IngredientBloodOrb;
import wayoftime.bloodmagic.core.registry.OrbRegistry;
import wayoftime.bloodmagic.network.BloodMagicPacketHandler;
import wayoftime.bloodmagic.potion.BloodMagicPotions;
import wayoftime.bloodmagic.registry.ModTranquilityHandlers;
import wayoftime.bloodmagic.ritual.RitualManager;
import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber;
import wayoftime.bloodmagic.tile.TileAlchemyArray;
@ -59,6 +60,7 @@ import wayoftime.bloodmagic.tile.TileAltar;
import wayoftime.bloodmagic.tile.TileDemonCrucible;
import wayoftime.bloodmagic.tile.TileDemonCrystal;
import wayoftime.bloodmagic.tile.TileDemonCrystallizer;
import wayoftime.bloodmagic.tile.TileIncenseAltar;
import wayoftime.bloodmagic.tile.TileMasterRitualStone;
import wayoftime.bloodmagic.tile.TileSoulForge;
import wayoftime.bloodmagic.util.handler.event.GenericHandler;
@ -122,6 +124,8 @@ public class BloodMagic
ModLoadingContext context = ModLoadingContext.get();
context.registerConfig(ModConfig.Type.CLIENT, ConfigManager.CLIENT_SPEC);
ModTranquilityHandlers.init();
}
private void registerRecipes(RegistryEvent.Register<IRecipeSerializer<?>> event)
@ -166,6 +170,7 @@ public class BloodMagic
event.getRegistry().register(TileEntityType.Builder.create(TileDemonCrystal::new, BloodMagicBlocks.RAW_CRYSTAL_BLOCK.get(), BloodMagicBlocks.CORROSIVE_CRYSTAL_BLOCK.get(), BloodMagicBlocks.DESTRUCTIVE_CRYSTAL_BLOCK.get(), BloodMagicBlocks.VENGEFUL_CRYSTAL_BLOCK.get(), BloodMagicBlocks.STEADFAST_CRYSTAL_BLOCK.get()).build(null).setRegistryName("demoncrystal"));
event.getRegistry().register(TileEntityType.Builder.create(TileDemonCrucible::new, BloodMagicBlocks.DEMON_CRUCIBLE.get()).build(null).setRegistryName("demoncrucible"));
event.getRegistry().register(TileEntityType.Builder.create(TileDemonCrystallizer::new, BloodMagicBlocks.DEMON_CRYSTALLIZER.get()).build(null).setRegistryName("demoncrystallizer"));
event.getRegistry().register(TileEntityType.Builder.create(TileIncenseAltar::new, BloodMagicBlocks.INCENSE_ALTAR.get()).build(null).setRegistryName("incensealtar"));
}
@SubscribeEvent

View file

@ -276,11 +276,11 @@ public class BloodAltar// implements IFluidHandler
if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive)
{
// int chargeInputted = Math.min(chargingRate, this.fluid.getAmount());
// chargeInputted = Math.min(chargeInputted, maxCharge - totalCharge);
// totalCharge += chargeInputted;
// this.fluid.setAmount(this.fluid.getAmount() - chargeInputted);
// tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3);
int chargeInputted = Math.min(chargingRate, this.fluid.getAmount());
chargeInputted = Math.min(chargeInputted, maxCharge - totalCharge);
totalCharge += chargeInputted;
this.fluid.setAmount(this.fluid.getAmount() - chargeInputted);
tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3);
}
if (internalCounter % 100 == 0 && (this.isActive || this.cooldownAfterCrafting <= 0))

View file

@ -32,14 +32,14 @@ public interface IBloodMagicAPI
*/
@Nonnull
IBloodMagicRecipeRegistrar getRecipeRegistrar();
//
// /**
// * Retrieves the instance of the value manager.
// *
// * @return the active {@link IBloodMagicValueManager} instance
// */
// @Nonnull
// IBloodMagicValueManager getValueManager();
/**
* Retrieves the instance of the value manager.
*
* @return the active {@link IBloodMagicValueManager} instance
*/
@Nonnull
IBloodMagicValueManager getValueManager();
/**
* Registers an {@link IBlockState} as a given component for the Blood Altar.

View file

@ -0,0 +1,45 @@
package wayoftime.bloodmagic.api;
import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import net.minecraft.block.BlockState;
import net.minecraft.util.ResourceLocation;
/**
* Allows value modification for various features of Blood Magic such as
* Sacrificial values.
*/
public interface IBloodMagicValueManager
{
/**
* Sets the amount of LP received per health point from sacrificing the given
* entity. By default, this is 25. Setting the value to 0 effectively disables
* sacrificing.
*
* @param entityId The registry name of the entity.
* @param value The amount of LP per health point to receive upon sacrifice.
*/
void setSacrificialValue(@Nonnull ResourceLocation entityId, @Nonnegative int value);
/**
* Sets the Tranquility value of a given {@link IBlockState}.
* <p>
* Valid tranquility types:
* <ul>
* <li>PLANT</li>
* <li>CROP</li>
* <li>TREE</li>
* <li>EARTHEN</li>
* <li>WATER</li>
* <li>FIRE</li>
* <li>LAVA</li>
* </ul>
*
* @param state The {@link IBlockState} to set the value of.
* @param tranquilityType The type of Tranquility this block should provide.
* @param value The amount of tranquility this block should provide.
*/
void setTranquility(@Nonnull BlockState state, @Nonnull String tranquilityType, double value);
}

View file

@ -19,14 +19,14 @@ public class BloodMagicAPI implements IBloodMagicAPI
// private final BloodMagicBlacklist blacklist;
private final BloodMagicRecipeRegistrar recipeRegistrar;
// private final BloodMagicValueManager valueManager;
private final BloodMagicValueManager valueManager;
private final Multimap<ComponentType, BlockState> altarComponents;
public BloodMagicAPI()
{
// this.blacklist = new BloodMagicBlacklist();
this.recipeRegistrar = new BloodMagicRecipeRegistrar();
// this.valueManager = new BloodMagicValueManager();
this.valueManager = new BloodMagicValueManager();
this.altarComponents = ArrayListMultimap.create();
}
@ -43,13 +43,14 @@ public class BloodMagicAPI implements IBloodMagicAPI
{
return recipeRegistrar;
}
//
// @Nonnull
// @Override
// public BloodMagicValueManager getValueManager()
// {
// return valueManager;
// }
@Nonnull
@Override
public BloodMagicValueManager getValueManager()
{
return valueManager;
}
@Override
public void registerAltarComponent(@Nonnull BlockState state, @Nonnull String componentType)

View file

@ -4,6 +4,8 @@ import net.minecraft.block.Blocks;
import wayoftime.bloodmagic.altar.ComponentType;
import wayoftime.bloodmagic.api.IBloodMagicAPI;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.incense.EnumTranquilityType;
import wayoftime.bloodmagic.incense.TranquilityStack;
public class BloodMagicCorePlugin
{
@ -11,6 +13,21 @@ public class BloodMagicCorePlugin
public void register(IBloodMagicAPI apiInterface)
{
BloodMagicAPI api = (BloodMagicAPI) apiInterface;
api.getValueManager().setTranquility(Blocks.LAVA, new TranquilityStack(EnumTranquilityType.LAVA, 1.2D));
// api.getValueManager().setTranquility(Blocks.FLOWING_LAVA, new TranquilityStack(EnumTranquilityType.LAVA, 1.2D));
api.getValueManager().setTranquility(Blocks.WATER, new TranquilityStack(EnumTranquilityType.WATER, 1.0D));
// api.getValueManager().setTranquility(Blocks.water, new TranquilityStack(EnumTranquilityType.WATER, 1.0D));
api.getValueManager().setTranquility(BloodMagicBlocks.LIFE_ESSENCE_BLOCK.get(), new TranquilityStack(EnumTranquilityType.WATER, 1.5D));
api.getValueManager().setTranquility(Blocks.NETHERRACK, new TranquilityStack(EnumTranquilityType.FIRE, 0.5D));
api.getValueManager().setTranquility(Blocks.DIRT, new TranquilityStack(EnumTranquilityType.EARTHEN, 0.25D));
api.getValueManager().setTranquility(Blocks.FARMLAND, new TranquilityStack(EnumTranquilityType.EARTHEN, 1.0D));
api.getValueManager().setTranquility(Blocks.POTATOES, new TranquilityStack(EnumTranquilityType.CROP, 1.0D));
api.getValueManager().setTranquility(Blocks.CARROTS, new TranquilityStack(EnumTranquilityType.CROP, 1.0D));
api.getValueManager().setTranquility(Blocks.WHEAT, new TranquilityStack(EnumTranquilityType.CROP, 1.0D));
api.getValueManager().setTranquility(Blocks.NETHER_WART, new TranquilityStack(EnumTranquilityType.CROP, 1.0D));
api.getValueManager().setTranquility(Blocks.BEETROOTS, new TranquilityStack(EnumTranquilityType.CROP, 1.0D));
apiInterface.registerAltarComponent(Blocks.GLOWSTONE.getDefaultState(), ComponentType.GLOWSTONE.name());
apiInterface.registerAltarComponent(Blocks.SEA_LANTERN.getDefaultState(), ComponentType.GLOWSTONE.name());
apiInterface.registerAltarComponent(BloodMagicBlocks.BLOODSTONE.get().getDefaultState(), ComponentType.BLOODSTONE.name());

View file

@ -0,0 +1,76 @@
package wayoftime.bloodmagic.api.impl;
import java.util.Map;
import javax.annotation.Nonnull;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.ResourceLocation;
import wayoftime.bloodmagic.api.IBloodMagicValueManager;
import wayoftime.bloodmagic.incense.EnumTranquilityType;
import wayoftime.bloodmagic.incense.TranquilityStack;
import wayoftime.bloodmagic.util.BMLog;
public class BloodMagicValueManager implements IBloodMagicValueManager
{
private final Map<ResourceLocation, Integer> sacrificial;
private final Map<BlockState, TranquilityStack> tranquility;
public BloodMagicValueManager()
{
this.sacrificial = Maps.newHashMap();
this.tranquility = Maps.newHashMap();
}
@Override
public void setSacrificialValue(@Nonnull ResourceLocation entityId, int value)
{
BMLog.API_VERBOSE.info("Value Manager: Set sacrificial value of {} to {}.", entityId, value);
sacrificial.put(entityId, value);
}
@Override
public void setTranquility(@Nonnull BlockState state, @Nonnull String tranquilityType, double value)
{
EnumTranquilityType tranquility = null;
for (EnumTranquilityType type : EnumTranquilityType.values())
{
if (type.name().equalsIgnoreCase(tranquilityType))
{
tranquility = type;
break;
}
}
if (tranquility != null)
{
BMLog.API_VERBOSE.info("Value Manager: Set tranquility value of {} to {} @ {}", state, tranquilityType, value);
this.tranquility.put(state, new TranquilityStack(tranquility, value));
} else
BMLog.API.warn("Invalid tranquility type: {}.", tranquilityType);
}
public void setTranquility(Block block, TranquilityStack tranquilityStack)
{
for (BlockState state : block.getStateContainer().getValidStates())
{
BMLog.API_VERBOSE.info("Value Manager: Set tranquility value of {} to {} @ {}", state, tranquilityStack.type, tranquilityStack.value);
tranquility.put(state, tranquilityStack);
}
}
public Map<ResourceLocation, Integer> getSacrificial()
{
return ImmutableMap.copyOf(sacrificial);
}
public Map<BlockState, TranquilityStack> getTranquility()
{
return ImmutableMap.copyOf(tranquility);
}
}

View file

@ -28,6 +28,7 @@ import wayoftime.bloodmagic.client.screens.ScreenAlchemyTable;
import wayoftime.bloodmagic.client.screens.ScreenSoulForge;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.common.item.BloodMagicItems;
import wayoftime.bloodmagic.common.item.ItemSacrificialDagger;
import wayoftime.bloodmagic.common.item.sigil.ItemSigilToggleable;
import wayoftime.bloodmagic.common.item.soul.ItemSentientSword;
import wayoftime.bloodmagic.common.registries.BloodMagicEntityTypes;
@ -79,6 +80,7 @@ public class ClientEvents
registerMultiWillTool(BloodMagicItems.LESSER_GEM.get());
registerMultiWillTool(BloodMagicItems.COMMON_GEM.get());
registerMultiWillTool(BloodMagicItems.GREATER_GEM.get());
registerSacrificialKnife(BloodMagicItems.SACRIFICIAL_DAGGER.get());
ItemModelsProperties.registerProperty(BloodMagicItems.SENTIENT_SWORD.get(), BloodMagic.rl("active"), new IItemPropertyGetter()
{
@ -129,4 +131,21 @@ public class ClientEvents
}
});
}
public static void registerSacrificialKnife(Item item)
{
ItemModelsProperties.registerProperty(item, BloodMagic.rl("incense"), new IItemPropertyGetter()
{
@Override
public float call(ItemStack stack, ClientWorld world, LivingEntity entity)
{
Item item = stack.getItem();
if (item instanceof ItemSacrificialDagger)
{
return ((ItemSacrificialDagger) item).canUseForSacrifice(stack) ? 1 : 0;
}
return 0;
}
});
}
}

View file

@ -0,0 +1,57 @@
package wayoftime.bloodmagic.client;
import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.AbstractGui;
import net.minecraft.util.ResourceLocation;
public class Sprite
{
private final ResourceLocation textureLocation;
private final int textureX;
private final int textureY;
private final int textureWidth;
private final int textureHeight;
public Sprite(ResourceLocation textureLocation, int textureX, int textureY, int textureWidth, int textureHeight)
{
this.textureLocation = textureLocation;
this.textureX = textureX;
this.textureY = textureY;
this.textureWidth = textureWidth;
this.textureHeight = textureHeight;
}
public ResourceLocation getTextureLocation()
{
return textureLocation;
}
public int getTextureX()
{
return textureX;
}
public int getTextureY()
{
return textureY;
}
public int getTextureWidth()
{
return textureWidth;
}
public int getTextureHeight()
{
return textureHeight;
}
public void draw(MatrixStack matrixStack, int x, int y)
{
Minecraft.getInstance().getTextureManager().bindTexture(getTextureLocation());
AbstractGui.blit(matrixStack, x, y, 0, getTextureX(), getTextureY(), getTextureWidth(), getTextureHeight(), 256, 256);
}
}

View file

@ -1,15 +1,90 @@
package wayoftime.bloodmagic.client.hud;
import java.util.function.Consumer;
import java.util.function.Function;
import org.apache.commons.lang3.tuple.Pair;
import net.minecraft.client.resources.I18n;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Vector2f;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.ConfigManager;
import wayoftime.bloodmagic.client.Sprite;
import wayoftime.bloodmagic.client.hud.element.ElementDemonAura;
import wayoftime.bloodmagic.client.hud.element.ElementDivinedInformation;
import wayoftime.bloodmagic.tile.TileAltar;
import wayoftime.bloodmagic.tile.TileIncenseAltar;
import wayoftime.bloodmagic.util.helper.NumeralHelper;
public class Elements
{
public static void registerElements()
{
ElementRegistry.registerHandler(new ResourceLocation(BloodMagic.MODID, "demon_will_aura"), new ElementDemonAura(), new Vector2f(ConfigManager.CLIENT.demonWillGaugeX.get().floatValue(), ConfigManager.CLIENT.demonWillGaugeY.get().floatValue()));
ElementRegistry.registerHandler(BloodMagic.rl("blood_altar"), new ElementDivinedInformation<TileAltar>(2, true, TileAltar.class)
{
@Override
public void gatherInformation(Consumer<Pair<Sprite, Function<TileAltar, String>>> information)
{
// Current tier
information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), altar -> altar == null
? "IV"
: NumeralHelper.toRoman(altar.getTier().toInt())));
// Stored/Capacity
information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), altar -> String.format("%d/%d", altar == null
? 0
: altar.getCurrentBlood(), altar == null ? 10000 : altar.getCapacity())));
}
}, new Vector2f(0.01F, 0.01F));
ElementRegistry.registerHandler(new ResourceLocation(BloodMagic.MODID, "blood_altar_adv"), new ElementDivinedInformation<TileAltar>(5, false, TileAltar.class)
{
@Override
public void gatherInformation(Consumer<Pair<Sprite, Function<TileAltar, String>>> information)
{
// Current tier
information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), altar -> altar == null
? "IV"
: NumeralHelper.toRoman(altar.getTier().toInt())));
// Stored/Capacity
information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), altar -> String.format("%d/%d", altar == null
? 0
: altar.getCurrentBlood(), altar == null ? 10000 : altar.getCapacity())));
// Crafting progress/Crafting requirement
information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 32, 46, 16, 16), altar -> {
if (altar == null || !altar.isActive())
return I18n.format("hud.bloodmagic.inactive");
int progress = altar.getProgress();
int totalLiquidRequired = altar.getLiquidRequired() * altar.getStackInSlot(0).getCount();
return String.format("%d/%d", progress, totalLiquidRequired);
}));
// Consumption rate
information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 48, 46, 16, 16), altar -> altar == null
? "0"
: String.valueOf((int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1)))));
// Total charge
information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 64, 46, 16, 16), altar -> altar == null
? "0"
: String.valueOf(altar.getTotalCharge())));
}
}, new Vector2f(0.01F, 0.01F));
ElementRegistry.registerHandler(new ResourceLocation(BloodMagic.MODID, "incense_altar"), new ElementDivinedInformation<TileIncenseAltar>(2, true, TileIncenseAltar.class)
{
@Override
public void gatherInformation(Consumer<Pair<Sprite, Function<TileIncenseAltar, String>>> information)
{
// Current tranquility
information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 80, 46, 16, 16), incense -> incense == null
? "0"
: String.valueOf((int) ((100D * (int) (100 * incense.tranquility)) / 100D))));
// Sacrifice bonus
information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 96, 46, 16, 16), incense -> incense == null
? "0"
: String.valueOf((int) (100 * incense.incenseAddition))));
}
}, new Vector2f(0.01F, 0.01F));
}
}

View file

@ -0,0 +1,76 @@
package wayoftime.bloodmagic.client.hud.element;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Hand;
import wayoftime.bloodmagic.common.item.BloodMagicItems;
public abstract class ElementDivinedInformation<T extends TileEntity> extends ElementTileInformation<T>
{
private final boolean simple;
public ElementDivinedInformation(int lines, boolean simple, Class<T> tileClass)
{
super(100, lines, tileClass);
this.simple = simple;
}
@Override
public boolean shouldRender(Minecraft minecraft)
{
PlayerEntity player = Minecraft.getInstance().player;
ItemStack sigilStack = player.getHeldItem(Hand.MAIN_HAND);
boolean flag = false;
if (simple)
{
if (sigilStack.getItem() == BloodMagicItems.DIVINATION_SIGIL.get() || sigilStack.getItem() == BloodMagicItems.SEER_SIGIL.get())
flag = true;
else
flag = isFlagSigilHolding(sigilStack, true);
// if (!flag)
// {
// sigilStack = player.getHeldItem(Hand.OFF_HAND);
// if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION || sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER)
// flag = true;
// else
// flag = isFlagSigilHolding(sigilStack, true);
// }
} else
{
if (sigilStack.getItem() == BloodMagicItems.SEER_SIGIL.get())
flag = true;
else
flag = isFlagSigilHolding(sigilStack, false);
//
// if (!flag)
// {
// sigilStack = player.getHeldItem(Hand.OFF_HAND);
// if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER)
// flag = true;
// else
// flag = isFlagSigilHolding(sigilStack, false);
// }
}
return super.shouldRender(minecraft) && flag;
}
private boolean isFlagSigilHolding(ItemStack sigilStack, boolean simple)
{
// if (sigilStack.getItem() instanceof ItemSigilHolding)
// {
// List<ItemStack> internalInv = ItemSigilHolding.getInternalInventory(sigilStack);
// int currentSlot = ItemSigilHolding.getCurrentItemOrdinal(sigilStack);
// if (internalInv != null && !internalInv.get(currentSlot).isEmpty())
// {
// return (internalInv.get(currentSlot).getItem() == RegistrarBloodMagicItems.SIGIL_SEER && !simple) || (internalInv.get(currentSlot).getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION && simple);
// }
// }
return false;
}
}

View file

@ -0,0 +1,71 @@
package wayoftime.bloodmagic.client.hud.element;
import java.awt.Color;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.Lists;
import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.RayTraceResult;
import wayoftime.bloodmagic.client.Sprite;
public abstract class ElementTileInformation<T extends TileEntity> extends HUDElement
{
protected final Class<T> tileClass;
private final List<Pair<Sprite, Function<T, String>>> information;
public ElementTileInformation(int width, int lines, Class<T> tileClass)
{
super(width, 18 * lines - 2);
this.tileClass = tileClass;
this.information = Lists.newArrayList();
gatherInformation(information::add);
}
public abstract void gatherInformation(Consumer<Pair<Sprite, Function<T, String>>> information);
@SuppressWarnings("unchecked")
@Override
public void draw(MatrixStack matrixStack, float partialTicks, int drawX, int drawY)
{
RayTraceResult trace = Minecraft.getInstance().objectMouseOver;
if (trace == null || trace.getType() != RayTraceResult.Type.BLOCK)
return;
T tile = (T) Minecraft.getInstance().world.getTileEntity(((BlockRayTraceResult) trace).getPos());
int yOffset = 0;
for (Pair<Sprite, Function<T, String>> sprite : information)
{
sprite.getLeft().draw(matrixStack, drawX, drawY + yOffset);
int textY = drawY + yOffset + (sprite.getLeft().getTextureHeight() / 4);
Minecraft.getInstance().fontRenderer.drawStringWithShadow(matrixStack, (tile != null && tile.getClass() == tileClass)
? sprite.getRight().apply(tile)
: "?", drawX + sprite.getLeft().getTextureWidth() + 2, textY, Color.WHITE.getRGB());
yOffset += sprite.getLeft().getTextureHeight() + 2;
}
}
@Override
public boolean shouldRender(Minecraft minecraft)
{
RayTraceResult trace = Minecraft.getInstance().objectMouseOver;
if (trace == null || trace.getType() != RayTraceResult.Type.BLOCK)
return false;
TileEntity tile = Minecraft.getInstance().world.getTileEntity(((BlockRayTraceResult) trace).getPos());
if (tile == null || !tileClass.isAssignableFrom(tile.getClass()))
return false;
return true;
}
}

View file

@ -0,0 +1,77 @@
package wayoftime.bloodmagic.common.block;
import net.minecraft.block.Block;
import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState;
import net.minecraft.block.material.Material;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.World;
import net.minecraftforge.common.ToolType;
import wayoftime.bloodmagic.tile.TileIncenseAltar;
import wayoftime.bloodmagic.tile.TileSoulForge;
public class BlockIncenseAltar extends Block
{
protected static final VoxelShape BODY = Block.makeCuboidShape(5, 0, 5, 12, 16, 12);
public BlockIncenseAltar()
{
super(Properties.create(Material.IRON).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(0));
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context)
{
return BODY;
}
@Override
public void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState)
{
TileSoulForge forge = (TileSoulForge) world.getTileEntity(blockPos);
if (forge != null)
forge.dropItems();
super.onPlayerDestroy(world, blockPos, blockState);
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving)
{
if (!state.isIn(newState.getBlock()))
{
TileEntity tileentity = worldIn.getTileEntity(pos);
if (tileentity instanceof TileSoulForge)
{
((TileSoulForge) tileentity).dropItems();
worldIn.updateComparatorOutputLevel(pos, this);
}
super.onReplaced(state, worldIn, pos, newState, isMoving);
}
}
@Override
public boolean hasTileEntity(BlockState state)
{
return true;
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world)
{
return new TileIncenseAltar();
}
@Override
public BlockRenderType getRenderType(BlockState state)
{
return BlockRenderType.MODEL;
}
}

View file

@ -0,0 +1,24 @@
package wayoftime.bloodmagic.common.block;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import wayoftime.bloodmagic.incense.IIncensePath;
public class BlockPath extends Block implements IIncensePath
{
protected final int pathLevel;
public BlockPath(int pathLevel, Properties properties)
{
super(properties);
this.pathLevel = pathLevel;
}
@Override
public int getLevelOfPath(World world, BlockPos pos, BlockState state)
{
return pathLevel;
}
}

View file

@ -1,5 +1,6 @@
package wayoftime.bloodmagic.common.block;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.AbstractBlock.Properties;
import net.minecraft.block.Block;
import net.minecraft.block.FlowingFluidBlock;
@ -41,6 +42,7 @@ public class BloodMagicBlocks
// public static final RegistryObject<Block> BLOODSTONE = BASICBLOCKS.register("ruby_block", BloodstoneBlock::new);
public static final RegistryObject<Block> SOUL_FORGE = BLOCKS.register("soulforge", BlockSoulForge::new);
public static final RegistryObject<Block> INCENSE_ALTAR = BLOCKS.register("incensealtar", BlockIncenseAltar::new);
public static final RegistryObject<Block> ALCHEMY_ARRAY = BLOCKS.register("alchemyarray", BlockAlchemyArray::new);
public static final RegistryObject<Block> BLANK_RUNE = BASICBLOCKS.register("blankrune", () -> new BlockBloodRune(BloodRuneType.BLANK));
public static final RegistryObject<Block> SPEED_RUNE = BASICBLOCKS.register("speedrune", () -> new BlockBloodRune(BloodRuneType.SPEED));
@ -81,6 +83,15 @@ public class BloodMagicBlocks
public static final RegistryObject<Block> VENGEFUL_CRYSTAL_BLOCK = BLOCKS.register("vengefuldemoncrystal", () -> new BlockDemonCrystal(EnumDemonWillType.VENGEFUL));
public static final RegistryObject<Block> STEADFAST_CRYSTAL_BLOCK = BLOCKS.register("steadfastdemoncrystal", () -> new BlockDemonCrystal(EnumDemonWillType.STEADFAST));
public static final RegistryObject<Block> WOOD_PATH = BASICBLOCKS.register("woodbrickpath", () -> new BlockPath(2, AbstractBlock.Properties.create(Material.WOOD).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.AXE).harvestLevel(0)));
public static final RegistryObject<Block> WOOD_TILE_PATH = BASICBLOCKS.register("woodtilepath", () -> new BlockPath(2, AbstractBlock.Properties.create(Material.WOOD).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.AXE).harvestLevel(0)));
public static final RegistryObject<Block> STONE_PATH = BASICBLOCKS.register("stonebrickpath", () -> new BlockPath(4, AbstractBlock.Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(0)));
public static final RegistryObject<Block> STONE_TILE_PATH = BASICBLOCKS.register("stonetilepath", () -> new BlockPath(4, AbstractBlock.Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(0)));
public static final RegistryObject<Block> WORN_STONE_PATH = BASICBLOCKS.register("wornstonebrickpath", () -> new BlockPath(6, AbstractBlock.Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(0)));
public static final RegistryObject<Block> WORN_STONE_TILE_PATH = BASICBLOCKS.register("wornstonetilepath", () -> new BlockPath(6, AbstractBlock.Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(0)));
public static final RegistryObject<Block> OBSIDIAN_PATH = BASICBLOCKS.register("obsidianbrickpath", () -> new BlockPath(8, AbstractBlock.Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(3)));
public static final RegistryObject<Block> OBSIDIAN_TILE_PATH = BASICBLOCKS.register("obsidiantilepath", () -> new BlockPath(8, AbstractBlock.Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(3)));
private static ForgeFlowingFluid.Properties makeProperties()
{
return new ForgeFlowingFluid.Properties(LIFE_ESSENCE_FLUID, LIFE_ESSENCE_FLUID_FLOWING, FluidAttributes.builder(FLUID_STILL, FLUID_FLOWING)).bucket(LIFE_ESSENCE_BUCKET).block(LIFE_ESSENCE_BLOCK);
@ -95,6 +106,7 @@ public class BloodMagicBlocks
public static final RegistryObject<ContainerType<ContainerSoulForge>> SOUL_FORGE_CONTAINER = CONTAINERS.register("soul_forge_container", () -> IForgeContainerType.create(ContainerSoulForge::new));
public static final RegistryObject<ContainerType<ContainerAlchemicalReactionChamber>> ARC_CONTAINER = CONTAINERS.register("arc_container", () -> IForgeContainerType.create(ContainerAlchemicalReactionChamber::new));
public static final RegistryObject<ContainerType<ContainerAlchemyTable>> ALCHEMY_TABLE_CONTAINER = CONTAINERS.register("alchemy_table_container", () -> IForgeContainerType.create(ContainerAlchemyTable::new));
// public static final RegistryObject<BloodstoneBlock> BLOOD_STONE = registerNoItem("blood_stone", () -> new BloodstoneBlock());
//
//// private static <T extends Block> RegistryObject<T> register(String name, Supplier<? extends T> sup, Function<RegistryObject<T>, Supplier<? extends Item>> itemCreator)

View file

@ -46,6 +46,10 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider
ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.DUSK_RITUAL_DIVINER.get()).key('S', BloodMagicItems.DEMONIC_SLATE.get()).key('t', BloodMagicItems.DUSK_INSCRIPTION_TOOL.get()).key('d', BloodMagicItems.BASE_RITUAL_DIVINER.get()).patternLine(" S ").patternLine("tdt").patternLine(" S ").addCriterion("has_demon_slate", hasItem(BloodMagicItems.DEMONIC_SLATE.get())).build(consumer, BloodMagic.rl("ritual_diviner_1"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.BLOODSTONE_BRICK.get(), 4).key('s', BloodMagicBlocks.BLOODSTONE.get()).patternLine("ss").patternLine("ss").addCriterion("has_weak_shard", hasItem(BloodMagicItems.WEAK_BLOOD_SHARD.get())).build(consumer, BloodMagic.rl("bloodstonebrick"));
ShapelessRecipeBuilder.shapelessRecipe(BloodMagicBlocks.BLOODSTONE.get(), 8).addIngredient(Tags.Items.STONE).addIngredient(BloodMagicItems.WEAK_BLOOD_SHARD.get()).addCriterion("has_weak_shard", hasItem(BloodMagicItems.WEAK_BLOOD_SHARD.get())).build(consumer, BloodMagic.rl("largebloodstonebrick"));
ShapelessRecipeBuilder.shapelessRecipe(BloodMagicBlocks.WOOD_TILE_PATH.get(), 4).addIngredient(BloodMagicBlocks.WOOD_PATH.get()).addIngredient(BloodMagicBlocks.WOOD_PATH.get()).addIngredient(BloodMagicBlocks.WOOD_PATH.get()).addIngredient(BloodMagicBlocks.WOOD_PATH.get()).addCriterion("has_apprentice_orb", hasItem(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("path/path_woodtile"));
ShapelessRecipeBuilder.shapelessRecipe(BloodMagicBlocks.STONE_TILE_PATH.get(), 4).addIngredient(BloodMagicBlocks.STONE_PATH.get()).addIngredient(BloodMagicBlocks.STONE_PATH.get()).addIngredient(BloodMagicBlocks.STONE_PATH.get()).addIngredient(BloodMagicBlocks.STONE_PATH.get()).addCriterion("has_magician_orb", hasItem(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("path/path_stonetile"));
ShapelessRecipeBuilder.shapelessRecipe(BloodMagicBlocks.WORN_STONE_TILE_PATH.get(), 4).addIngredient(BloodMagicBlocks.WORN_STONE_PATH.get()).addIngredient(BloodMagicBlocks.WORN_STONE_PATH.get()).addIngredient(BloodMagicBlocks.WORN_STONE_PATH.get()).addIngredient(BloodMagicBlocks.WORN_STONE_PATH.get()).addCriterion("has_master_orb", hasItem(BloodMagicItems.MASTER_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("path/path_wornstonetile"));
}
private void addVanillaSmithingRecipes(Consumer<IFinishedRecipe> consumer)
@ -57,6 +61,8 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider
private void addBloodOrbRecipes(Consumer<IFinishedRecipe> consumer)
{
ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.INCENSE_ALTAR.get()).key('s', Tags.Items.STONE).key('c', Tags.Items.COBBLESTONE).key('h', Items.CHARCOAL).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).patternLine("s s").patternLine("shs").patternLine("coc").addCriterion("has_weak_orb", hasItem(BloodMagicItems.WEAK_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("incense_altar"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.BLANK_RUNE.get()).key('a', Tags.Items.STONE).key('s', Ingredient.fromItems(BloodMagicItems.SLATE.get())).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).patternLine("asa").patternLine("aoa").patternLine("aaa").addCriterion("has_weak_orb", hasItem(BloodMagicItems.WEAK_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("blood_rune_blank"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('a', Tags.Items.STONE).key('b', Ingredient.fromItems(BloodMagicItems.SLATE.get())).key('c', Ingredient.fromItems(Items.SUGAR)).key('d', BloodMagicBlocks.BLANK_RUNE.get()).patternLine("aba").patternLine("cdc").patternLine("aba").addCriterion("has_blank_rune", hasItem(BloodMagicItems.BLANK_RUNE_ITEM.get())).build(consumer, BloodMagic.rl("blood_rune_speed"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SACRIFICE_RUNE.get()).key('a', Tags.Items.STONE).key('b', BloodMagicItems.REINFORCED_SLATE.get()).key('c', Tags.Items.INGOTS_GOLD).key('d', BloodMagicBlocks.BLANK_RUNE.get()).key('e', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_APPRENTICE.get())).patternLine("aba").patternLine("cdc").patternLine("aea").addCriterion("has_apprentice_orb", hasItem(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("blood_rune_sacrifice"));
@ -78,6 +84,12 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider
ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.LAVA_CRYSTAL.get()).key('a', Tags.Items.GLASS).key('b', Items.LAVA_BUCKET).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).key('d', Tags.Items.OBSIDIAN).key('e', Tags.Items.GEMS_DIAMOND).patternLine("aba").patternLine("bcb").patternLine("ded").addCriterion("has_weak_orb", hasItem(BloodMagicItems.WEAK_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("lava_crystal"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.PRIMITIVE_HYDRATION_CELL.get()).key('B', Items.WATER_BUCKET).key('c', Tags.Items.COBBLESTONE).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MAGICIAN.get())).key('s', BloodMagicItems.SLATE.get()).patternLine("csc").patternLine("cBc").patternLine("coc").addCriterion("has_magician_orb", hasItem(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("primitive_hydration_cell"));
ShapelessRecipeBuilder.shapelessRecipe(BloodMagicBlocks.WOOD_PATH.get(), 4).addIngredient(ItemTags.PLANKS).addIngredient(ItemTags.PLANKS).addIngredient(ItemTags.PLANKS).addIngredient(ItemTags.PLANKS).addIngredient(IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_APPRENTICE.get())).addCriterion("has_apprentice_orb", hasItem(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("path/path_wood"));
ShapelessRecipeBuilder.shapelessRecipe(BloodMagicBlocks.STONE_PATH.get(), 4).addIngredient(Tags.Items.STONE).addIngredient(Tags.Items.STONE).addIngredient(Tags.Items.STONE).addIngredient(Tags.Items.STONE).addIngredient(IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MAGICIAN.get())).addCriterion("has_magician_orb", hasItem(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("path/path_stone"));
ShapelessRecipeBuilder.shapelessRecipe(BloodMagicBlocks.WORN_STONE_PATH.get(), 4).addIngredient(BloodMagicBlocks.STONE_PATH.get()).addIngredient(BloodMagicBlocks.STONE_PATH.get()).addIngredient(BloodMagicBlocks.STONE_PATH.get()).addIngredient(BloodMagicBlocks.STONE_PATH.get()).addIngredient(IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MASTER.get())).addCriterion("has_master_orb", hasItem(BloodMagicItems.MASTER_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("path/path_wornstone"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.RITUAL_READER.get()).key('s', BloodMagicItems.DEMONIC_SLATE.get()).key('g', Tags.Items.GLASS).key('i', Tags.Items.INGOTS_GOLD).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MASTER.get())).patternLine("gog").patternLine("isi").patternLine(" s ").addCriterion("has_master_orb", hasItem(BloodMagicItems.MASTER_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_reader"));
// ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('s', Items.GLASS).key('o', Ingredient.fromItems(Items.DIAMOND)).patternLine("sss").patternLine("sos").patternLine("sss").addCriterion("has_diamond", hasItem(Items.DIAMOND)).build(consumer, new ResourceLocation(BloodMagic.MODID, "speed_rune_from_standard"));
// ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('s', Items.GLASS).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).patternLine("sss").patternLine("sos").patternLine("sss").addCriterion("has_diamond", hasItem(Items.DIAMOND)).build(consumer, new ResourceLocation(BloodMagic.MODID, "speed_rune_from_orb"));
}

View file

@ -63,6 +63,7 @@ public class GeneratorItemModels extends ItemModelProvider
registerDemonTool(BloodMagicItems.SENTIENT_AXE.get());
registerDemonTool(BloodMagicItems.SENTIENT_PICKAXE.get());
registerDemonTool(BloodMagicItems.SENTIENT_SHOVEL.get());
registerSacrificialKnife(BloodMagicItems.SACRIFICIAL_DAGGER.get());
}
private void registerCustomBlockPath(Block block, String newPath)
@ -145,4 +146,14 @@ public class GeneratorItemModels extends ItemModelProvider
}
}
private void registerSacrificialKnife(Item item)
{
String path = item.getRegistryName().getPath();
ItemModelBuilder builder = getBuilder(path);
ModelFile baseKnifeFile = singleTexture("item/variants/" + path, mcLoc("item/handheld"), "layer0", modLoc("item/" + path));
ModelFile ceremonialKnifeFile = singleTexture("item/variants/" + path + "_ceremonial", mcLoc("item/handheld"), "layer0", modLoc("item/" + path + "_ceremonial"));
builder = builder.override().predicate(BloodMagic.rl("incense"), 0).model(baseKnifeFile).end().override().predicate(BloodMagic.rl("incense"), 1).model(ceremonialKnifeFile).end();
}
}

View file

@ -16,6 +16,9 @@ public class GeneratorLanguage extends LanguageProvider
@Override
protected void addTranslations()
{
// HUD
add("hud.bloodmagic.inactive", "Inactive");
// Creative Tab
add("itemGroup.bloodmagic.creativeTab", "Blood Magic");
@ -45,6 +48,17 @@ public class GeneratorLanguage extends LanguageProvider
// add("tooltip.bloodmagic.sigil.divination.currentInversion", "Current Inversion: %d");
add("tooltip.bloodmagic.sigil.divination.currentBonus", "Current Bonus: +%d%%");
add("tooltip.bloodmagic.sigil.seer.desc", "When seeing all is not enough");
add("tooltip.bloodmagic.sigil.seer.currentAltarProgress", "Current Progress: %d LP/ %s LP");
add("tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent", "Current Progress: %s");
add("tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate", "Consumption Rate: %d LP");
add("tooltip.bloodmagic.sigil.seer.currentAltarTier", "Current Tier: %d");
add("tooltip.bloodmagic.sigil.seer.currentEssence", "Current Essence: %d LP");
add("tooltip.bloodmagic.sigil.seer.currentAltarCapacity", "Current Capacity: %d LP");
add("tooltip.bloodmagic.sigil.seer.currentCharge", "Current Charge: %d");
add("tooltip.bloodmagic.sigil.seer.currentTranquility", "Current Tranquility: %d");
add("tooltip.bloodmagic.sigil.seer.currentBonus", "Current Bonus: +%d%%");
add("tooltip.bloodmagic.decoration.safe", "Safe for decoration");
add("tooltip.bloodmagic.decoration.notSafe", "Dangerous for decoration");
@ -304,6 +318,7 @@ public class GeneratorLanguage extends LanguageProvider
addBlock(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER, "Alchemical Reaction Chamber");
addBlock(BloodMagicBlocks.ALCHEMY_TABLE, "Alchemy Table");
addBlock(BloodMagicBlocks.INCENSE_ALTAR, "Incense Altar");
addBlock(BloodMagicBlocks.BLOODSTONE, "Large Bloodstone Brick");
addBlock(BloodMagicBlocks.BLOODSTONE_BRICK, "Bloodstone Brick");
@ -317,6 +332,15 @@ public class GeneratorLanguage extends LanguageProvider
addBlock(BloodMagicBlocks.DEMON_CRUCIBLE, "Demon Crucible");
addBlock(BloodMagicBlocks.DEMON_CRYSTALLIZER, "Demon Crystallizer");
addBlock(BloodMagicBlocks.WOOD_PATH, "Wooden Path");
addBlock(BloodMagicBlocks.WOOD_TILE_PATH, "Tiled Wooden Path");
addBlock(BloodMagicBlocks.STONE_PATH, "Stone Path");
addBlock(BloodMagicBlocks.STONE_TILE_PATH, "Tiled Stone Path");
addBlock(BloodMagicBlocks.WORN_STONE_PATH, "Worn Stone Path");
addBlock(BloodMagicBlocks.WORN_STONE_TILE_PATH, "Tiled Worn Stone Path");
addBlock(BloodMagicBlocks.OBSIDIAN_PATH, "Obsidian Path");
addBlock(BloodMagicBlocks.OBSIDIAN_TILE_PATH, "Tiled Obsidian Path");
// Item names
addItem(BloodMagicItems.WEAK_BLOOD_ORB, "Weak Blood Orb");
addItem(BloodMagicItems.APPRENTICE_BLOOD_ORB, "Apprentice Blood Orb");
@ -332,6 +356,7 @@ public class GeneratorLanguage extends LanguageProvider
addItem(BloodMagicItems.ICE_SIGIL, "Sigil of the Frozen Lake");
addItem(BloodMagicItems.AIR_SIGIL, "Air Sigil");
addItem(BloodMagicItems.BLOOD_LIGHT_SIGIL, "Sigil of the Blood Lamp");
addItem(BloodMagicItems.SEER_SIGIL, "Seer's Sigil");
addItem(BloodMagicBlocks.LIFE_ESSENCE_BUCKET, "Bucket of Life");
addItem(BloodMagicItems.ARCANE_ASHES, "Arcane Ashes");
@ -353,6 +378,7 @@ public class GeneratorLanguage extends LanguageProvider
addItem(BloodMagicItems.REAGENT_MAGNETISM, "Magnetism Reagent");
addItem(BloodMagicItems.REAGENT_AIR, "Air Reagent");
addItem(BloodMagicItems.REAGENT_BLOOD_LIGHT, "Blood Lamp Reagent");
addItem(BloodMagicItems.REAGENT_SIGHT, "Sight Reagent");
addItem(BloodMagicItems.PETTY_GEM, "Petty Tartaric Gem");
addItem(BloodMagicItems.LESSER_GEM, "Lesser Tartaric Gem");

View file

@ -75,6 +75,7 @@ public class GeneratorLootTable extends LootTableProvider
registerDropSelfLootTable(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get());
registerDropSelfLootTable(BloodMagicBlocks.DEMON_CRUCIBLE.get());
registerDropSelfLootTable(BloodMagicBlocks.DEMON_CRYSTALLIZER.get());
registerDropSelfLootTable(BloodMagicBlocks.INCENSE_ALTAR.get());
// registerNoDropLootTable(BloodMagicBlocks.RAW_CRYSTAL_BLOCK.get());
registerDropCrystalsLootTable(BloodMagicBlocks.RAW_CRYSTAL_BLOCK.get(), BloodMagicItems.RAW_CRYSTAL.get());

View file

@ -78,6 +78,16 @@ public class BloodMagicItems
public static final RegistryObject<Item> BLOOD_ALTAR_ITEM = ITEMS.register("altar", () -> new BlockItem(BloodMagicBlocks.BLOOD_ALTAR.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> ALCHEMY_TABLE_ITEM = ITEMS.register("alchemytable", () -> new ItemBlockAlchemyTable(BloodMagicBlocks.ALCHEMY_TABLE.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> INCENSE_ALTAR_ITEM = ITEMS.register("incensealtar", () -> new BlockItem(BloodMagicBlocks.INCENSE_ALTAR.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> WOOD_PATH_ITEM = ITEMS.register("woodbrickpath", () -> new BlockItem(BloodMagicBlocks.WOOD_PATH.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> WOOD_TILE_PATH_ITEM = ITEMS.register("woodtilepath", () -> new BlockItem(BloodMagicBlocks.WOOD_TILE_PATH.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> STONE_PATH_ITEM = ITEMS.register("stonebrickpath", () -> new BlockItem(BloodMagicBlocks.STONE_PATH.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> STONE_TILE_PATH_ITEM = ITEMS.register("stonetilepath", () -> new BlockItem(BloodMagicBlocks.STONE_TILE_PATH.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> WORN_STONE_PATH_ITEM = ITEMS.register("wornstonebrickpath", () -> new BlockItem(BloodMagicBlocks.WORN_STONE_PATH.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> WORN_STONE_TILE_PATH_ITEM = ITEMS.register("wornstonetilepath", () -> new BlockItem(BloodMagicBlocks.WORN_STONE_TILE_PATH.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> OBSIDIAN_PATH_ITEM = ITEMS.register("obsidianbrickpath", () -> new BlockItem(BloodMagicBlocks.OBSIDIAN_PATH.get(), new Item.Properties().group(BloodMagic.TAB)));
public static final RegistryObject<Item> OBSIDIAN_TILE_PATH_ITEM = ITEMS.register("obsidiantilepath", () -> new BlockItem(BloodMagicBlocks.OBSIDIAN_TILE_PATH.get(), new Item.Properties().group(BloodMagic.TAB)));
// TODO: Need to rework the above instantiations for the ItemBlocks so that it's
// done with the Blocks.
@ -90,6 +100,7 @@ public class BloodMagicItems
public static final RegistryObject<Item> MASTER_BLOOD_ORB = BASICITEMS.register("masterbloodorb", () -> new ItemBloodOrb(ORB_MASTER));
public static final RegistryObject<Item> DIVINATION_SIGIL = BASICITEMS.register("divinationsigil", () -> new ItemSigilDivination(true));
public static final RegistryObject<Item> SEER_SIGIL = BASICITEMS.register("seersigil", () -> new ItemSigilDivination(false));
public static final RegistryObject<Item> SACRIFICIAL_DAGGER = BASICITEMS.register("sacrificialdagger", () -> new ItemSacrificialDagger());
public static final RegistryObject<Item> SLATE = BASICITEMS.register("blankslate", () -> new ItemBase());
public static final RegistryObject<Item> REINFORCED_SLATE = BASICITEMS.register("reinforcedslate", () -> new ItemBase());
@ -136,6 +147,7 @@ public class BloodMagicItems
public static final RegistryObject<Item> REAGENT_MAGNETISM = BASICITEMS.register("reagentmagnetism", () -> new ItemBase());
public static final RegistryObject<Item> REAGENT_AIR = BASICITEMS.register("reagentair", () -> new ItemBase());
public static final RegistryObject<Item> REAGENT_BLOOD_LIGHT = BASICITEMS.register("reagentbloodlight", () -> new ItemBase());
public static final RegistryObject<Item> REAGENT_SIGHT = BASICITEMS.register("reagentsight", () -> new ItemBase());
// Tartaric Gems
public static final RegistryObject<Item> PETTY_GEM = ITEMS.register("soulgempetty", () -> new ItemSoulGem("petty", 64));

View file

@ -25,6 +25,7 @@ import wayoftime.bloodmagic.ConfigHandler;
import wayoftime.bloodmagic.event.SacrificeKnifeUsedEvent;
import wayoftime.bloodmagic.util.Constants;
import wayoftime.bloodmagic.util.DamageSourceBloodMagic;
import wayoftime.bloodmagic.util.helper.IncenseHelper;
import wayoftime.bloodmagic.util.helper.NBTHelper;
import wayoftime.bloodmagic.util.helper.PlayerHelper;
import wayoftime.bloodmagic.util.helper.PlayerSacrificeHelper;
@ -52,7 +53,14 @@ public class ItemSacrificialDagger extends Item
public void onPlayerStoppedUsing(ItemStack stack, World worldIn, LivingEntity entityLiving, int timeLeft)
{
if (entityLiving instanceof PlayerEntity && !entityLiving.getEntityWorld().isRemote)
PlayerSacrificeHelper.sacrificePlayerHealth((PlayerEntity) entityLiving);
if (PlayerSacrificeHelper.sacrificePlayerHealth((PlayerEntity) entityLiving))
IncenseHelper.setHasMaxIncense(stack, (PlayerEntity) entityLiving, false);
}
@Override
public boolean hasEffect(ItemStack stack)
{
return IncenseHelper.getHasMaxIncense(stack) || super.hasEffect(stack);
}
@Override
@ -114,13 +122,15 @@ public class ItemSacrificialDagger extends Item
return super.onItemRightClick(world, player, hand);
lpAdded = evt.lpAdded;
} else if (player.isSneaking())
{
lpAdded = Integer.MAX_VALUE;
}
double posX = player.getPosX();
double posY = player.getPosY();
double posZ = player.getPosZ();
world.playSound(player, posX, posY, posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat())
* 0.8F);
world.playSound(player, posX, posY, posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
for (int l = 0; l < 8; ++l)
world.addParticle(RedstoneParticleData.REDSTONE_DUST, posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), 0, 0, 0);

View file

@ -6,6 +6,7 @@ import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
@ -36,7 +37,7 @@ public class ItemSigilBase extends ItemSigil
@OnlyIn(Dist.CLIENT)
public void addInformation(ItemStack stack, World world, List<ITextComponent> tooltip, ITooltipFlag flag)
{
tooltip.add(new TranslationTextComponent(tooltipBase + "desc"));
tooltip.add(new TranslationTextComponent(tooltipBase + "desc").mergeStyle(TextFormatting.ITALIC));
// if (TextHelper.canTranslate(tooltipBase + "desc"))
// tooltip.addAll(Arrays.asList(WordUtils.wrap(TextHelper.localizeEffect(tooltipBase
// + "desc"), 30, "/cut", false).split("/cut")));

View file

@ -20,6 +20,7 @@ import wayoftime.bloodmagic.altar.IBloodAltar;
import wayoftime.bloodmagic.core.data.Binding;
import wayoftime.bloodmagic.iface.IAltarReader;
import wayoftime.bloodmagic.iface.ISigil;
import wayoftime.bloodmagic.tile.TileIncenseAltar;
import wayoftime.bloodmagic.util.ChatUtil;
import wayoftime.bloodmagic.util.helper.NetworkHelper;
import wayoftime.bloodmagic.util.helper.NumeralHelper;
@ -27,10 +28,12 @@ import wayoftime.bloodmagic.util.helper.PlayerHelper;
public class ItemSigilDivination extends ItemSigilBase implements IAltarReader
{
private final boolean isSimple;
public ItemSigilDivination(boolean simple)
{
super(simple ? "divination" : "seer");
isSimple = simple;
}
@Override
@ -51,7 +54,7 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader
super.onItemRightClick(world, player, hand);
Binding binding = getBinding(stack);
if (binding != null)
if (isSimple && binding != null)
{
int currentEssence = NetworkHelper.getSoulNetwork(binding).getCurrentEssence();
List<ITextComponent> toSend = Lists.newArrayList();
@ -73,18 +76,21 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader
int currentEssence = altar.getCurrentBlood();
int capacity = altar.getCapacity();
altar.checkTier();
ChatUtil.sendNoSpam(player, new TranslationTextComponent(tooltipBase
+ "currentAltarTier", NumeralHelper.toRoman(tier)), new TranslationTextComponent(tooltipBase
+ "currentEssence", currentEssence), new TranslationTextComponent(tooltipBase
+ "currentAltarCapacity", capacity));
if (isSimple)
{
ChatUtil.sendNoSpam(player, new TranslationTextComponent(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TranslationTextComponent(tooltipBase + "currentEssence", currentEssence), new TranslationTextComponent(tooltipBase + "currentAltarCapacity", capacity));
} else
{
ChatUtil.sendNoSpam(player, new TranslationTextComponent(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TranslationTextComponent(tooltipBase + "currentEssence", currentEssence), new TranslationTextComponent(tooltipBase + "currentAltarCapacity", capacity));
}
} else if (tile != null && tile instanceof TileIncenseAltar)
{
TileIncenseAltar altar = (TileIncenseAltar) tile;
altar.recheckConstruction();
double tranquility = altar.tranquility;
ChatUtil.sendNoSpam(player, new TranslationTextComponent(tooltipBase + "currentTranquility", (int) ((100D * (int) (100 * tranquility)) / 100d)), new TranslationTextComponent(tooltipBase + "currentBonus", (int) (100 * altar.incenseAddition)));
}
// else if (tile != null && tile instanceof TileIncenseAltar)
// {
// TileIncenseAltar altar = (TileIncenseAltar) tile;
// altar.recheckConstruction();
// double tranquility = altar.tranquility;
// ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentTranquility", (int) ((100D * (int) (100 * tranquility)) / 100d)), new TextComponentTranslation(tooltipBase + "currentBonus", (int) (100 * altar.incenseAddition)));
// } else if (tile != null && tile instanceof TileInversionPillar)
// else if (tile != null && tile instanceof TileInversionPillar)
// {
// TileInversionPillar pillar = (TileInversionPillar) tile;
// double inversion = pillar.getCurrentInversion();
@ -98,8 +104,7 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader
int currentEssence = NetworkHelper.getSoulNetwork(binding).getCurrentEssence();
List<ITextComponent> toSend = Lists.newArrayList();
if (!binding.getOwnerId().equals(player.getGameProfile().getId()))
toSend.add(new TranslationTextComponent(tooltipBase
+ "otherNetwork", binding.getOwnerName()));
toSend.add(new TranslationTextComponent(tooltipBase + "otherNetwork", binding.getOwnerName()));
toSend.add(new TranslationTextComponent(tooltipBase + "currentEssence", currentEssence));
ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()]));
}

View file

@ -8,7 +8,6 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.ActionResult;
import net.minecraft.util.ActionResultType;
@ -77,8 +76,6 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMultiWillTool
if (!stack.hasTag())
return;
Items d;
EnumDemonWillType type = this.getCurrentType(stack);
tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.soulGem." + name));
tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.will", ChatUtil.DECIMAL_FORMAT.format(getWill(type, stack))));
@ -133,8 +130,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMultiWillTool
if (soulsLeft < getMaxWill(thisType, soulGemStack))
{
double newSoulsLeft = Math.min(soulsLeft
+ soul.getWill(thisType, soulStack), getMaxWill(thisType, soulGemStack));
double newSoulsLeft = Math.min(soulsLeft + soul.getWill(thisType, soulStack), getMaxWill(thisType, soulGemStack));
soul.drainWill(thisType, soulStack, newSoulsLeft - soulsLeft);
setWill(thisType, soulGemStack, newSoulsLeft);

View file

@ -28,6 +28,7 @@ public class AlchemyArrayRecipeProvider implements ISubRecipeProvider
AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/magnetismsigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_MAGNETISM.get()), Ingredient.fromItems(BloodMagicItems.IMBUED_SLATE.get()), new ItemStack(BloodMagicItems.MAGNETISM_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "magnetismsigil"));
AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/lightsigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_BLOOD_LIGHT.get()), Ingredient.fromItems(BloodMagicItems.IMBUED_SLATE.get()), new ItemStack(BloodMagicItems.BLOOD_LIGHT_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "bloodlightsigil"));
AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/airsigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_AIR.get()), Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get()), new ItemStack(BloodMagicItems.AIR_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "airsigil"));
AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/sightsigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_SIGHT.get()), Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get()), new ItemStack(BloodMagicItems.SEER_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "seersigil"));
// AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/fastminersigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_FAST_MINER.get()), Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get()), new ItemStack(BloodMagicItems.FAST_MINER_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "frostsigil"));
// BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), new ItemStack(BloodMagicItems.WEAK_BLOOD_ORB.get()), AltarTier.ONE.ordinal(), 2000, 2, 1).build(consumer, new ResourceLocation(BloodMagic.MODID, basePath
// + "weakbloodorb"));

View file

@ -23,7 +23,7 @@ public class BloodAltarRecipeProvider implements ISubRecipeProvider
String basePath = "altar/";
// ONE
BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), new ItemStack(BloodMagicItems.WEAK_BLOOD_ORB.get()), AltarTier.ONE.ordinal(), 2000, 2, 1).build(consumer, new ResourceLocation(BloodMagic.MODID, basePath + "weakbloodorb"));
BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), new ItemStack(BloodMagicItems.WEAK_BLOOD_ORB.get()), AltarTier.ONE.ordinal(), 2000, 5, 1).build(consumer, new ResourceLocation(BloodMagic.MODID, basePath + "weakbloodorb"));
BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.STONE), new ItemStack(BloodMagicItems.SLATE.get()), AltarTier.ONE.ordinal(), 1000, 5, 5).build(consumer, new ResourceLocation(BloodMagic.MODID, basePath + "slate"));
BloodAltarRecipeBuilder.altar(Ingredient.fromItems(Items.BUCKET), new ItemStack(BloodMagicBlocks.LIFE_ESSENCE_BUCKET.get()), AltarTier.ONE.ordinal(), 1000, 5, 0).build(consumer, BloodMagic.rl(basePath + "bucket_life"));

View file

@ -40,6 +40,7 @@ public class TartaricForgeRecipeProvider implements ISubRecipeProvider
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_MAGNETISM.get()), 600, 10, Ingredient.fromTag(Tags.Items.STRING), Ingredient.fromTag(Tags.Items.INGOTS_GOLD), Ingredient.fromTag(Tags.Items.INGOTS_GOLD), Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_IRON)).build(consumer, BloodMagic.rl(basePath + "reagent_magnetism"));
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_FAST_MINER.get()), 128, 20, Ingredient.fromItems(Items.IRON_PICKAXE), Ingredient.fromItems(Items.IRON_AXE), Ingredient.fromItems(Items.IRON_SHOVEL), Ingredient.fromTag(Tags.Items.GUNPOWDER)).build(consumer, BloodMagic.rl(basePath + "reagent_fastminer"));
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_BLOOD_LIGHT.get()), 300, 10, Ingredient.fromTag(Tags.Items.DUSTS_GLOWSTONE), Ingredient.fromItems(Items.TORCH), Ingredient.fromTag(Tags.Items.DUSTS_REDSTONE), Ingredient.fromTag(Tags.Items.DUSTS_REDSTONE)).build(consumer, BloodMagic.rl(basePath + "reagent_blood_light"));
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_SIGHT.get()), 64, 0, Ingredient.fromTag(Tags.Items.DUSTS_GLOWSTONE), Ingredient.fromTag(Tags.Items.GLASS), Ingredient.fromTag(Tags.Items.GLASS), Ingredient.fromItems(BloodMagicItems.DIVINATION_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "reagent_sight"));
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicBlocks.DEMON_CRUCIBLE.get()), 400, 100, Ingredient.fromItems(Items.CAULDRON), Ingredient.fromTag(Tags.Items.STONE), Ingredient.fromTag(Tags.Items.GEMS_LAPIS), Ingredient.fromTag(Tags.Items.GEMS_DIAMOND)).build(consumer, BloodMagic.rl(basePath + "demon_crucible"));
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicBlocks.DEMON_CRYSTALLIZER.get()), 500, 100, Ingredient.fromItems(BloodMagicBlocks.SOUL_FORGE.get()), Ingredient.fromTag(Tags.Items.STONE), Ingredient.fromTag(Tags.Items.GEMS_LAPIS), Ingredient.fromTag(Tags.Items.GLASS)).build(consumer, BloodMagic.rl(basePath + "demon_crystallizer"));

View file

@ -0,0 +1,12 @@
package wayoftime.bloodmagic.incense;
public enum EnumTranquilityType
{
PLANT(),
CROP(),
TREE(),
EARTHEN(),
WATER(),
FIRE(),
LAVA(),;
}

View file

@ -0,0 +1,15 @@
package wayoftime.bloodmagic.incense;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public interface IIncensePath
{
/**
* Goes from 0 to however far this path block can be from the altar while still
* functioning. 0 represents a block that can work when it is two blocks
* horizontally away from the altar.
*/
int getLevelOfPath(World world, BlockPos pos, BlockState state);
}

View file

@ -0,0 +1,11 @@
package wayoftime.bloodmagic.incense;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public interface ITranquilityHandler
{
TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, BlockState state);
}

View file

@ -0,0 +1,60 @@
package wayoftime.bloodmagic.incense;
import net.minecraft.block.Block;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
public class IncenseAltarComponent
{
public final BlockPos offsetPos;
public final Block block;
public IncenseAltarComponent(BlockPos offsetPos, Block block)
{
this.offsetPos = offsetPos;
this.block = block;
}
public boolean doesBlockMatch(Block block)
{
return this.block == block;
}
/**
* Base rotation is north.
*/
public BlockPos getOffset(Direction rotation)
{
return new BlockPos(this.getX(rotation), offsetPos.getY(), this.getZ(rotation));
}
public int getX(Direction direction)
{
switch (direction)
{
case EAST:
return -this.offsetPos.getZ();
case SOUTH:
return -this.offsetPos.getX();
case WEST:
return this.offsetPos.getZ();
default:
return this.offsetPos.getX();
}
}
public int getZ(Direction direction)
{
switch (direction)
{
case EAST:
return this.offsetPos.getX();
case SOUTH:
return -this.offsetPos.getZ();
case WEST:
return -this.offsetPos.getX();
default:
return this.offsetPos.getZ();
}
}
}

View file

@ -0,0 +1,114 @@
package wayoftime.bloodmagic.incense;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class IncenseAltarHandler
{
public static Map<Integer, List<IncenseAltarComponent>> incenseComponentMap = new TreeMap<>();
// Incense bonus maximum applied for the tier of blocks.
public static double[] incenseBonuses = new double[] { 0.2, 0.6, 1.2, 2, 3, 4.5 };
public static double[] tranquilityRequired = new double[] { 0, 6, 14.14, 28, 44.09, 83.14 };
public static int[] roadsRequired = new int[] { 0, 1, 4, 6, 8, 10, 12 }; // TODO: Change for when the roads are
// fully implemented
public static void registerIncenseComponent(int altarLevel, IncenseAltarComponent component)
{
if (incenseComponentMap.containsKey(altarLevel))
{
incenseComponentMap.get(altarLevel).add(component);
} else
{
List<IncenseAltarComponent> list = new ArrayList<>();
list.add(component);
incenseComponentMap.put(altarLevel, list);
}
}
public static void registerIncenseComponent(int altarLevel, BlockPos offsetPos, Block block, BlockState state)
{
registerIncenseComponent(altarLevel, new IncenseAltarComponent(offsetPos, block));
}
public static double getMaxIncenseBonusFromComponents(World world, BlockPos pos)
{
double accumulatedBonus = 0;
for (int i = 0; i < incenseBonuses.length; i++)
{
double previousBonus = (i <= 0 ? 0 : incenseBonuses[i - 1]);
double nextBonus = incenseBonuses[i];
if (!incenseComponentMap.containsKey(i))
{
accumulatedBonus += (nextBonus - previousBonus);
} else
{
boolean hasAllComponentsThisTier = true;
for (IncenseAltarComponent component : incenseComponentMap.get(i))
{
BlockPos offsetPos = pos.add(component.getOffset(Direction.NORTH));
BlockState state = world.getBlockState(offsetPos);
Block block = state.getBlock();
if (component.doesBlockMatch(block))
{
hasAllComponentsThisTier = false;
} else
{
accumulatedBonus += (nextBonus - previousBonus) / incenseComponentMap.get(i).size();
}
}
if (!hasAllComponentsThisTier)
{
break;
}
}
}
return accumulatedBonus;
}
public static double getMaxIncenseBonusFromRoads(int roads)
{
double previousBonus = 0;
for (int i = 0; i < incenseBonuses.length; i++)
{
if (roads >= roadsRequired[i])
{
previousBonus = incenseBonuses[i];
} else
{
return previousBonus;
}
}
return previousBonus;
}
public static double getIncenseBonusFromComponents(World world, BlockPos pos, double tranquility, int roads)
{
double maxBonus = Math.min(getMaxIncenseBonusFromComponents(world, pos), getMaxIncenseBonusFromRoads(roads));
double possibleBonus = 0;
for (int i = 0; i < incenseBonuses.length; i++)
{
if (tranquility >= tranquilityRequired[i])
{
possibleBonus = incenseBonuses[i];
} else if (i >= 1)
{
possibleBonus += (incenseBonuses[i] - possibleBonus) * (tranquility - tranquilityRequired[i - 1]) / (tranquilityRequired[i] - tranquilityRequired[i - 1]);
break;
}
}
return Math.min(maxBonus, possibleBonus);
}
}

View file

@ -0,0 +1,33 @@
package wayoftime.bloodmagic.incense;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class IncenseTranquilityRegistry
{
public static List<ITranquilityHandler> handlerList = new ArrayList<>();
public static void registerTranquilityHandler(ITranquilityHandler handler)
{
handlerList.add(handler);
}
public static TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, BlockState state)
{
for (ITranquilityHandler handler : handlerList)
{
TranquilityStack tranq = handler.getTranquilityOfBlock(world, pos, block, state);
if (tranq != null)
{
return tranq;
}
}
return null;
}
}

View file

@ -0,0 +1,13 @@
package wayoftime.bloodmagic.incense;
public class TranquilityStack
{
public final EnumTranquilityType type;
public double value;
public TranquilityStack(EnumTranquilityType type, double value)
{
this.type = type;
this.value = value;
}
}

View file

@ -0,0 +1,31 @@
package wayoftime.bloodmagic.registry;
import net.minecraft.block.FireBlock;
import net.minecraft.block.GrassBlock;
import net.minecraft.block.LeavesBlock;
import net.minecraft.tags.BlockTags;
import wayoftime.bloodmagic.api.impl.BloodMagicAPI;
import wayoftime.bloodmagic.incense.EnumTranquilityType;
import wayoftime.bloodmagic.incense.IncenseTranquilityRegistry;
import wayoftime.bloodmagic.incense.TranquilityStack;
public class ModTranquilityHandlers
{
public static void init()
{
IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof LeavesBlock
? new TranquilityStack(EnumTranquilityType.PLANT, 1.0D)
: null);
IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof FireBlock
? new TranquilityStack(EnumTranquilityType.FIRE, 1.0D)
: null);
IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof GrassBlock
? new TranquilityStack(EnumTranquilityType.EARTHEN, 0.5D)
: null);
IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> BlockTags.LOGS.contains(block)
? new TranquilityStack(EnumTranquilityType.TREE, 1.0D)
: null);
IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> BloodMagicAPI.INSTANCE.getValueManager().getTranquility().get(state));
}
}

View file

@ -0,0 +1,206 @@
package wayoftime.bloodmagic.tile;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.registries.ObjectHolder;
import wayoftime.bloodmagic.incense.EnumTranquilityType;
import wayoftime.bloodmagic.incense.IIncensePath;
import wayoftime.bloodmagic.incense.IncenseAltarHandler;
import wayoftime.bloodmagic.incense.IncenseTranquilityRegistry;
import wayoftime.bloodmagic.incense.TranquilityStack;
import wayoftime.bloodmagic.ritual.AreaDescriptor;
import wayoftime.bloodmagic.util.helper.PlayerSacrificeHelper;
public class TileIncenseAltar extends TileInventory implements ITickableTileEntity
{
public static int maxCheckRange = 5;
public AreaDescriptor incenseArea = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11);
public Map<EnumTranquilityType, Double> tranquilityMap = new HashMap<>();
public double incenseAddition = 0; // Self-sacrifice is multiplied by 1 plus this value.
public double tranquility = 0;
public int roadDistance = 0; // Number of road blocks laid down
@ObjectHolder("bloodmagic:incensealtar")
public static TileEntityType<TileIncenseAltar> TYPE;
public TileIncenseAltar(TileEntityType<?> type)
{
super(type, 1, "incensealtar");
}
public TileIncenseAltar()
{
this(TYPE);
}
@Override
public void tick()
{
AxisAlignedBB aabb = incenseArea.getAABB(getPos());
List<PlayerEntity> playerList = getWorld().getEntitiesWithinAABB(PlayerEntity.class, aabb);
if (playerList.isEmpty())
{
return;
}
if (getWorld().getGameTime() % 100 == 0)
{
recheckConstruction();
}
boolean hasPerformed = false;
for (PlayerEntity player : playerList)
{
if (PlayerSacrificeHelper.incrementIncense(player, 0, incenseAddition, incenseAddition / 100))
{
hasPerformed = true;
}
}
if (hasPerformed)
{
if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof ServerWorld)
{
ServerWorld server = (ServerWorld) getWorld();
server.spawnParticle(ParticleTypes.FLAME, pos.getX() + 0.5, pos.getY() + 1.2, pos.getZ() + 0.5, 1, 0.02, 0.03, 0.02, 0);
}
}
}
@Override
public void deserialize(CompoundNBT tag)
{
super.deserialize(tag);
tranquility = tag.getDouble("tranquility");
incenseAddition = tag.getDouble("incenseAddition");
}
@Override
public CompoundNBT serialize(CompoundNBT tag)
{
super.serialize(tag);
tag.putDouble("tranquility", tranquility);
tag.putDouble("incenseAddition", incenseAddition);
return tag;
}
public void recheckConstruction()
{
// TODO: Check the physical construction of the incense altar to determine the
// maximum length.
int maxLength = 11; // Max length of the path. The path starts two blocks away from the center
// block.
int yOffset = 0;
Map<EnumTranquilityType, Double> tranquilityMap = new HashMap<>();
for (int currentDistance = 2; currentDistance < currentDistance + maxLength; currentDistance++)
{
boolean canFormRoad = false;
for (int i = -maxCheckRange + yOffset; i <= maxCheckRange + yOffset; i++)
{
BlockPos verticalPos = pos.add(0, i, 0);
canFormRoad = true;
level: for (int index = 0; index < 4; index++)
{
Direction horizontalFacing = Direction.byHorizontalIndex(index);
BlockPos facingOffsetPos = verticalPos.offset(horizontalFacing, currentDistance);
for (int j = -1; j <= 1; j++)
{
BlockPos offsetPos = facingOffsetPos.offset(horizontalFacing.rotateY(), j);
BlockState state = getWorld().getBlockState(offsetPos);
Block block = state.getBlock();
if (!(block instanceof IIncensePath && ((IIncensePath) block).getLevelOfPath(getWorld(), offsetPos, state) >= currentDistance - 2))
{
canFormRoad = false;
break level;
}
}
}
if (canFormRoad)
{
yOffset = i;
break;
}
}
if (canFormRoad)
{
for (int i = -currentDistance; i <= currentDistance; i++)
{
for (int j = -currentDistance; j <= currentDistance; j++)
{
if (Math.abs(i) != currentDistance && Math.abs(j) != currentDistance)
{
continue; // TODO: Can make this just set j to currentDistance to speed it up.
}
for (int y = yOffset; y <= 2 + yOffset; y++)
{
BlockPos offsetPos = pos.add(i, y, j);
BlockState state = getWorld().getBlockState(offsetPos);
Block block = state.getBlock();
TranquilityStack stack = IncenseTranquilityRegistry.getTranquilityOfBlock(getWorld(), offsetPos, block, state);
if (stack != null)
{
if (!tranquilityMap.containsKey(stack.type))
{
tranquilityMap.put(stack.type, stack.value);
} else
{
tranquilityMap.put(stack.type, tranquilityMap.get(stack.type) + stack.value);
}
}
}
}
}
} else
{
roadDistance = currentDistance - 2;
break;
}
}
this.tranquilityMap = tranquilityMap;
double totalTranquility = 0;
for (Entry<EnumTranquilityType, Double> entry : tranquilityMap.entrySet())
{
totalTranquility += entry.getValue();
}
if (totalTranquility < 0)
{
return;
}
double appliedTranquility = 0;
for (Entry<EnumTranquilityType, Double> entry : tranquilityMap.entrySet())
{
appliedTranquility += Math.sqrt(entry.getValue());
}
double bonus = IncenseAltarHandler.getIncenseBonusFromComponents(getWorld(), pos, appliedTranquility, roadDistance);
incenseAddition = bonus;
this.tranquility = appliedTranquility;
}
}

View file

@ -0,0 +1,55 @@
package wayoftime.bloodmagic.util.helper;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import wayoftime.bloodmagic.util.Constants;
public class IncenseHelper
{
public static double getCurrentIncense(PlayerEntity player)
{
CompoundNBT data = player.getPersistentData();
if (data.contains(Constants.NBT.CURRENT_INCENSE))
{
return data.getDouble(Constants.NBT.CURRENT_INCENSE);
}
return 0;
}
public static void setCurrentIncense(PlayerEntity player, double amount)
{
CompoundNBT data = player.getPersistentData();
data.putDouble(Constants.NBT.CURRENT_INCENSE, amount);
}
public static void setMaxIncense(PlayerEntity player, double amount)
{
CompoundNBT data = player.getPersistentData();
data.putDouble(Constants.NBT.MAX_INCENSE, amount);
}
public static double getMaxIncense(PlayerEntity player)
{
CompoundNBT data = player.getPersistentData();
if (data.contains(Constants.NBT.MAX_INCENSE))
{
return data.getDouble(Constants.NBT.MAX_INCENSE);
}
return 0;
}
public static void setHasMaxIncense(ItemStack stack, PlayerEntity player, boolean isMax)
{
stack = NBTHelper.checkNBT(stack);
stack.getTag().putBoolean(Constants.NBT.HAS_MAX_INCENSE, isMax);
}
public static boolean getHasMaxIncense(ItemStack stack)
{
stack = NBTHelper.checkNBT(stack);
return stack.getTag().getBoolean(Constants.NBT.HAS_MAX_INCENSE);
}
}

View file

@ -19,35 +19,35 @@ public class PlayerSacrificeHelper
public static double getPlayerIncense(PlayerEntity player)
{
return 0;
// return IncenseHelper.getCurrentIncense(player);
// return 0;
return IncenseHelper.getCurrentIncense(player);
}
public static void setPlayerIncense(PlayerEntity player, double amount)
{
// IncenseHelper.setCurrentIncense(player, amount);
IncenseHelper.setCurrentIncense(player, amount);
}
public static boolean incrementIncense(PlayerEntity player, double min, double incenseAddition, double increment)
{
return true;
// double amount = getPlayerIncense(player);
// if (amount < min || amount >= incenseAddition)
// {
// return false;
// }
//
// amount = amount + Math.min(increment, incenseAddition - amount);
// setPlayerIncense(player, amount);
//
// if (amount == incenseAddition)
// {
// IncenseHelper.setMaxIncense(player, incenseAddition);
// }
// // System.out.println("Amount of incense: " + amount + ", Increment: " +
// // increment);
//
// return true;
double amount = getPlayerIncense(player);
if (amount < min || amount >= incenseAddition)
{
return false;
}
amount = amount + Math.min(increment, incenseAddition - amount);
setPlayerIncense(player, amount);
if (amount == incenseAddition)
{
IncenseHelper.setMaxIncense(player, incenseAddition);
}
// System.out.println("Amount of incense: " + amount + ", Increment: " +
// increment);
return true;
}
/**
@ -74,8 +74,7 @@ public class PlayerSacrificeHelper
if (health > maxHealth / 10.0)
{
float sacrificedHealth = health - maxHealth / 10.0f;
int lpAdded = (int) (sacrificedHealth * ConfigHandler.values.sacrificialDaggerConversion
* getModifier(amount));
int lpAdded = (int) (sacrificedHealth * ConfigHandler.values.sacrificialDaggerConversion * getModifier(amount));
IBloodAltar altar = getAltar(player.getEntityWorld(), player.getPosition());
if (altar != null)

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "bloodmagic:block/incensealtar"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Some files were not shown because too many files have changed in this diff Show more