Compare commits

...

913 Commits

Author SHA1 Message Date
Boblet
6bb6b5426c the ground trembles with my every step 2026-01-23 14:53:39 +01:00
Boblet
492703ab23 amogus 2026-01-23 14:50:29 +01:00
Bob
b4d0122cfc monty python's horrible world of gravity 2026-01-22 21:48:48 +01:00
Boblet
f809843745 calliou is impaled on an asbestos stalagmite and dies 2026-01-22 15:38:17 +01:00
Boblet
6401ffde19 now kiss 2026-01-21 16:27:35 +01:00
Boblet
1aba934d36 e 2026-01-21 13:12:32 +01:00
Boblet
69c1ed01fa the glunch lunch 2026-01-21 13:11:28 +01:00
Boblet
e776b4c8d9 the gloach 2026-01-20 16:56:00 +01:00
HbmMods
6fa00c5771
Merge pull request #2643 from Bufka2011/master
Enhance CI workflow with version update logic
2026-01-20 11:06:19 +01:00
HbmMods
69c1f49f55
Merge pull request #2661 from Voxelstice/oc-comp-fix
OC connection with multiblocks bug fix
2026-01-20 10:33:15 +01:00
HbmMods
ade48e4ac7
Merge pull request #2656 from RayzerHan/master
Update ru_RU lang again
2026-01-20 10:32:18 +01:00
Bob
6c1fd10a50 plushby 2026-01-19 21:23:57 +01:00
Raaaaaaaaaay
a2fd0ea108
ok 2026-01-19 13:50:22 +02:00
Raaaaaaaaaay
33a4b983e5
Компонзит 2026-01-19 13:42:34 +02:00
Raaaaaaaaaay
0d431e387b
ммм 2026-01-19 13:37:10 +02:00
Raaaaaaaaaay
f0a1eaaaff
фикс 2026-01-19 13:36:01 +02:00
Raaaaaaaaaay
165fd062f4
ням 2026-01-18 20:07:30 +02:00
Voxelstice
7b18634b34 here's hoping this doesnt break anything else
OC connection with multiblocks bug fix
2026-01-17 10:42:19 +03:00
Raaaaaaaaaay
99ca4628dc
Kyiv 2026-01-15 21:29:53 +02:00
Raaaaaaaaaay
b892f0cc37
Merge branch 'HbmMods:master' into master 2026-01-15 17:58:02 +02:00
Boblet
7664cacd2f double barrel shaboing hot dog
(frot dog)
2026-01-14 15:54:59 +01:00
Raaaaaaaaaay
e96e821146
next door two 2026-01-14 09:18:38 +02:00
Raaaaaaaaaay
e02e4f6aae
next door 2026-01-14 09:15:59 +02:00
Raaaaaaaaaay
c1464f2881
Update 2026-01-14 02:01:10 +02:00
Raaaaaaaaaay
91dd4cc218
Sometimes I think the wind blows well, but the robot is a slut 2026-01-13 18:56:03 +02:00
Raaaaaaaaaay
6cadca0d89
People are idiots, and that's a fact. 2026-01-13 18:53:52 +02:00
HbmMods
5c9d71c626
Merge pull request #2649 from RayzerHan/master
Update RU_ru lang
2026-01-13 15:14:17 +01:00
Raaaaaaaaaay
bd03028170
фак 2026-01-13 16:06:08 +02:00
HbmMods
67aee6a2e0
Merge pull request #2648 from Vaern/muzzle-flashes
Visible third-person muzzle flashes from other players +self, skeleguns
2026-01-13 15:04:52 +01:00
Vaern
223fe240c1 remove redundant TODO 2026-01-12 23:55:29 -08:00
Vaern
5cb013d545 extended timeout duration
the highest duration for muzzle flashes is 150?, not under 100, so let's be safe
2026-01-12 23:39:50 -08:00
Vaern
82293e46cd copypaste hell
fixed tick issues in eventHandler, added packets to orchestra + third person rendering for every gun with built-in muzzle/laser flashes, and softened playAnimation so skeleguns use orchestra/muzzle flashes. akimbos show both firing, probably won't be changed
2026-01-12 23:33:05 -08:00
Raaaaaaaaaay
2e7af7058c
Merge branch 'HbmMods:master' into master 2026-01-12 19:58:03 +02:00
Raaaaaaaaaay
cc816b40e0
Очень познавательно, милая пони 2026-01-12 19:55:17 +02:00
Boblet
64fc72e18a margret thatcher is dead 2026-01-12 16:45:09 +01:00
Boblet
76c6222f45 post merge cleanup 2026-01-12 10:30:50 +01:00
HbmMods
2f8b0dde49
Merge pull request #2607 from WolfEclipses/METADATA
Rad Absorbers Metadata (Done now)
2026-01-12 10:19:08 +01:00
Vaern
712ae952df we ain't even done wit this we #KillingOurselves
superficial dedicated + integrated server testing worked. ran into a weird race condition on the former, though, but i doubt that's from anythng here
2026-01-11 18:17:36 -08:00
Bob
b2df165b4b the spingus 2026-01-11 22:24:04 +01:00
Wolf
90e148e022 I think I finally fixed this shit 2026-01-11 16:18:37 -05:00
WolfEclipses
52440fca2f
Merge branch 'HbmMods:master' into METADATA 2026-01-11 15:58:45 -05:00
Wolf
292b989e09 Testing??? 2026-01-11 15:56:24 -05:00
Raaaaaaaaaay
b0e0b54def
бля 2026-01-11 22:28:00 +02:00
HbmMods
51b758e103
Merge pull request #2645 from RayzerHan/master
update RU_ru lang
2026-01-11 21:00:24 +01:00
Raaaaaaaaaay
d25cef888d
Merge branch 'HbmMods:master' into master 2026-01-11 21:51:52 +02:00
Raaaaaaaaaay
62ce75f458
battery 2026-01-11 21:45:35 +02:00
Bufka2011
c146829bf4
Merge branch 'HbmMods:master' into master 2026-01-11 12:24:43 -07:00
Bufka2011
b60cf07e98
Enhance CI workflow with version update logic
Added steps to calculate days since 10/10/10 and update version files accordingly.
2026-01-11 12:24:11 -07:00
HbmMods
0e30985963
Merge pull request #2639 from ranch21/calc
calculator history
2026-01-11 20:23:09 +01:00
HbmMods
a491b16dfe
Merge pull request #2641 from sunryze-git/improved-pneumatics
improved pneumatics throughput
2026-01-11 20:22:26 +01:00
Bob
026c0d074e mirror fix 2026-01-11 20:21:02 +01:00
sunryze-git
6cc60c0234 pneumatic throughput now doesnt suck cuz we dont give up instantly 2026-01-11 14:17:00 -05:00
WolfEclipses
1f17af27f7
Merge branch 'master' into METADATA 2026-01-11 13:32:05 -05:00
HbmMods
8aa9ff2895
Merge pull request #2630 from Voxelstice/oc-bat-rework
OC compat for new batteries
2026-01-11 19:20:28 +01:00
HbmMods
5c0ff2b603
Merge branch 'master' into oc-bat-rework 2026-01-11 19:20:18 +01:00
HbmMods
3c461313bc
Merge pull request #2636 from RayzerHan/master
update RU_ru lang
2026-01-11 19:18:39 +01:00
Bob
71fb9a814d he rotates 2026-01-11 19:14:08 +01:00
ranch
27e4cd32aa gui design is my passion 2026-01-10 17:38:05 -06:00
Bob
8bdce3a4b3 been thinking about that yaoi 2026-01-10 21:31:09 +01:00
Bob
4bfce2ba92 Auto stash before merge of "master" and "origin/master" 2026-01-10 14:39:59 +01:00
WolfEclipses
5ec68643f8
Merge branch 'master' into METADATA 2026-01-09 20:52:29 -05:00
Voxelstice
65ea177ac0 consider not forgetting. thanks.
priority is outputted correctly now
2026-01-09 23:05:21 +03:00
Voxelstice
be93b9cc8c waiter! waiter! more lead acid batteries please!
adds OC compat to new battery blocks
2026-01-09 23:01:38 +03:00
Raaaaaaaaaay
439d5e52b8
электромассивы 2026-01-09 16:43:32 +02:00
Raaaaaaaaaay
72500ed749
термоядерный термоядерный 2026-01-09 16:28:44 +02:00
Boblet
f17556a0d6 fentanyl 2026-01-09 14:55:58 +01:00
HbmMods
6a732fadde
Merge pull request #2624 from ranch21/better-bars
Better electric FSB hud bars
2026-01-09 10:07:07 +01:00
HbmMods
bcb2f1a198
Merge pull request #2625 from MellowArpeggiation/msu-ui
in world UI for mass storage units
2026-01-09 10:06:37 +01:00
Boblet
79351bbd0a do you come from a vegetmite sandwich? 2026-01-09 10:05:56 +01:00
George Paton
a6087b4bef vanilla slimes also leak state who'da'fucken'thunk it 2026-01-09 14:48:52 +11:00
George Paton
9f26d04f7a buzzer beater functionality: render 3D items with fancy graphics enabled! 2026-01-09 14:08:07 +11:00
Boblet
84326bedb4 bals 2026-01-08 17:43:07 +01:00
George Paton
a0a7e000d4 drop correct meta on breaking 2026-01-08 22:26:26 +11:00
George Paton
b5b4a537c5 what the fuck is this baby doing mixed in with my bathwater 2026-01-08 22:17:25 +11:00
George Paton
7757e3cb53 add a fill progress bar 2026-01-08 22:07:21 +11:00
George Paton
b77633b152 draw the rest of the owl 2026-01-08 21:01:57 +11:00
Boblet
9ef7668702 FUCK 2026-01-08 08:52:22 +01:00
ranch
4998cd13c2 we do a little cleanup 2026-01-08 01:19:32 -06:00
ranch
1aaf568338 better electric FSB hud 2026-01-08 01:01:27 -06:00
George Paton
18a4d7a25a basic rendering of items inside MSUs (on the north face only atm) complete 2026-01-08 15:32:12 +11:00
Boblet
2b9d43891a dance the safety dance 2026-01-07 16:44:15 +01:00
HbmMods
0197ee79a7
Merge pull request #2617 from RayzerHan/master
update RU_ru lang
2026-01-07 10:52:59 +01:00
HbmMods
6297bbd6a8
Merge pull request #2618 from NarekoMichigami810/master
zh_CN update
2026-01-07 10:51:45 +01:00
道神 馴子
ad9130079e
Rape my brain 2026-01-07 17:41:15 +08:00
道神 馴子
7a39fd778f
i cum on my face 2026-01-07 17:28:48 +08:00
道神 馴子
ee0149c133
姗姗来迟 2026-01-07 16:34:31 +08:00
Raaaaaaaaaay
ee643f4407
Merge branch 'HbmMods:master' into master 2026-01-06 22:26:01 +02:00
Raaaaaaaaaay
218ad3e59e
кумавы 2026-01-06 22:24:38 +02:00
Bob
4032cc277a he thicc 2026-01-06 21:21:06 +01:00
Raaaaaaaaaay
4b4868e102
kimi 2026-01-06 22:17:28 +02:00
Raaaaaaaaaay
83d4505021
и танцевала рыбка с раком 2026-01-06 21:00:40 +02:00
Raaaaaaaaaay
0e063bbd72
up up up 2026-01-06 20:50:33 +02:00
Raaaaaaaaaay
29960cdc0a
Merge branch 'HbmMods:master' into master 2026-01-06 20:42:21 +02:00
HbmMods
d718b58269
Merge pull request #2605 from Toshayo/master
Fluid valve with counter for simpler automation
2026-01-06 19:38:13 +01:00
HbmMods
6141d1d24e
Merge branch 'master' into master 2026-01-06 19:38:02 +01:00
Bob
8619c8e67d he big 2026-01-06 19:35:39 +01:00
Raaaaaaaaaay
9c89902e56
aoh 2026-01-04 21:12:53 +02:00
Bob
b20d5f46b2 more caching because sure 2026-01-03 12:22:56 +01:00
WolfEclipses
52ae974f51
Merge branch 'master' into METADATA 2026-01-02 20:13:04 -05:00
Bob
a7afacfaf2 flavor town 2026-01-02 11:20:15 +01:00
Wolf
f089578ba7 Got rid of functionality for legacy rad absorber 2026-01-01 19:55:49 -05:00
Wolf
1e4346a54b Fixed redundant functions (there were more than I thought) xd 2026-01-01 19:40:37 -05:00
WolfEclipses
a1b83b4a67
Merge branch 'master' into METADATA 2026-01-01 18:38:27 -05:00
Raaaaaaaaaay
4e7bbda689
ня 2026-01-01 17:59:35 +02:00
HbmMods
539225cf78
Merge pull request #2608 from WolfEclipses/WATER
Infinite Water tank Recipe
2026-01-01 14:56:07 +01:00
HbmMods
195cf193c7
Merge pull request #2613 from WolfEclipses/OilQMAW
QMAW Page for crude oil
2026-01-01 14:55:47 +01:00
HbmMods
fd348a40e7
Merge pull request #2614 from PewPewCricket/master
Update PWR OpenComputers Compat
2026-01-01 14:54:26 +01:00
HbmMods
6964b4ec9d
Merge pull request #2606 from Goaty1208/master
mhmhmgmg pizza
2026-01-01 14:52:39 +01:00
PewPewCricket
1418a9be87
Merge branch 'HbmMods:master' into master 2025-12-31 19:30:45 -06:00
Bob
f87b37d7e3 well, too bad 2025-12-31 15:38:24 +01:00
PewPewCricket
871de4ae47 fix PWRangler crashing with PWRs using heat sinks 2025-12-30 18:40:08 -06:00
PewPewCricket
89b1cb1de0 allow reading core heat capacity using OC with PWRs. 2025-12-30 17:50:38 -06:00
Wolf
5dc1ee440b Forgot to account for all processing methods, need to expand in their own pages 2025-12-29 19:33:08 -05:00
Wolf
e52f70b340 QMAW Page for crude oil 2025-12-29 19:09:44 -05:00
Goaty1208
e629802bcb Cruciblelicious 2025-12-28 11:42:38 +01:00
Wolf
59bccc9be3 Why am I being asked for this so often 2025-12-27 18:46:01 -05:00
Wolf
838bcb8faa Had them swapped up somehow xd 2025-12-27 18:18:48 -05:00
Goaty1208
5100384e18 mhmhmgmg pizza
Fixed translations
2025-12-27 23:40:46 +01:00
Wolf
a8b046f46b Bringing up to date because yeah 2025-12-27 17:19:45 -05:00
WolfEclipses
6b87447ca1
Merge branch 'master' into METADATA 2025-12-27 14:01:57 -05:00
Toshayo
e601e79ad3
Updated changelog 2025-12-26 15:05:47 +01:00
Toshayo
a944c28dd4
Added fluid valve with counter 2025-12-26 14:14:20 +01:00
Bob
de2a11389c i like eating lead-sulfur batteries 2025-12-23 20:51:55 +01:00
Raaaaaaaaaay
b88d6f6cd3
aoh 2025-12-20 15:48:05 +02:00
Boblet
ef2b20d357 succumb 2025-12-17 14:55:50 +01:00
Boblet
f82a606b66 shit yourself 2025-12-16 16:16:19 +01:00
Boblet
c639be1429 67 mango mustard kendrick still water dubai labubu chocolate tralalero
please someone euthanize me
2025-12-16 15:22:51 +01:00
HbmMods
76e6e7852b
Merge pull request #2588 from RayzerHan/master
Update Ru_lang
2025-12-15 15:33:21 +01:00
Boblet
82f175105c bap 2025-12-15 15:33:10 +01:00
Boblet
fa12cfeec1 ow 2025-12-15 11:03:05 +01:00
Raaaaaaaaaay
7ee52ac56c
Merge branch 'HbmMods:master' into master 2025-12-14 22:37:42 +02:00
Bob
0fe125251b nobody saw a thing 2025-12-14 21:34:33 +01:00
Bob
5bcfd368fc yeag 2025-12-14 21:17:34 +01:00
Raaaaaaaaaay
154503a95d
руда 2025-12-13 00:04:57 +02:00
Raaaaaaaaaay
54cbb495cc
рыбка 2025-12-13 00:04:23 +02:00
Boblet
1f5fc1926c spoingus 2025-12-12 13:34:32 +01:00
Boblet
1e3e5f38d4 all our food keeps blowing up 2025-12-11 16:34:57 +01:00
Boblet
ec0613b9cf spingus 2025-12-10 16:32:34 +01:00
HbmMods
7204b3662c
Merge pull request #2581 from NarekoMichigami810/master
zh_CN update
2025-12-10 08:06:42 +01:00
Boblet
d5ac6fe239 death 2025-12-09 16:29:37 +01:00
Boblet
c916ad73e1 let the carnage begin 2025-12-09 15:27:24 +01:00
WolfEclipses
bce98561d3 Added back old ones, changed lang to OLD for them 2025-12-09 08:31:52 -05:00
道神 馴子
7129d5ee7c
沉迷勒布朗 2025-12-09 21:24:17 +08:00
WolfEclipses
003afa4071 Forgot to remove this from making the name work xd 2025-12-09 07:46:27 -05:00
WolfEclipses
7f963bdb6f I FORGOT TO ACCOUNT FOR OTHER LANGUAGES T_T 2025-12-08 22:44:49 -05:00
WolfEclipses
96298a5c31 I think this works :P we will find out that Im an
idiot in like 30seconds
2025-12-08 22:20:07 -05:00
Raaaaaaaaaay
540900d0f5
up amogus 2025-12-08 22:58:56 +02:00
Raaaaaaaaaay
10585527ae
Merge branch 'HbmMods:master' into master 2025-12-08 22:55:35 +02:00
Bob
d02b328c27 pain 2025-12-08 18:14:16 +01:00
Raaaaaaaaaay
510923d14a
beton 2025-12-08 17:31:43 +02:00
Raaaaaaaaaay
8b5cf6f321
Merge branch 'HbmMods:master' into master 2025-12-08 17:31:04 +02:00
Bob
39aa0de008 load of crap that doesn't work 2025-12-07 22:01:33 +01:00
Raaaaaaaaaay
bd17238c1c
fix recipe 2025-12-06 20:22:24 +02:00
Raaaaaaaaaay
63146394ac
Merge branch 'HbmMods:master' into master 2025-12-06 16:06:08 +02:00
Raaaaaaaaaay
7867d6c6bd
fix 2025-12-06 12:12:23 +02:00
Boblet
55b4fec00b it wasn't for a lack of trying 2025-12-05 14:38:13 +01:00
Boblet
2430fec8c6 ough 2025-12-04 15:55:00 +01:00
Raaaaaaaaaay
6cf88c673f
ой 2025-12-04 11:05:32 +02:00
Boblet
308e559229 spungus 2025-12-03 15:34:29 +01:00
Boblet
1fcfa136be perpetual agony mechanism 2025-12-01 16:54:04 +01:00
HbmMods
03e7db5d92
Merge pull request #2563 from MellowArpeggiation/structure-port
Structure Block!
2025-12-01 10:09:11 +01:00
Raaaaaaaaaay
a94005fc1f
Merge branch 'HbmMods:master' into master 2025-12-01 10:34:49 +02:00
Raaaaaaaaaay
548ede7f89
рыбки 2025-12-01 10:34:42 +02:00
Boblet
0e4ef1c45c the nightmare engine 2025-12-01 09:29:47 +01:00
George Paton
42ab196b06 structure block! 2025-12-01 13:36:31 +11:00
George Paton
a32b04ed14 all new NBTStructureLib features up to structure block (coming next) 2025-12-01 12:05:56 +11:00
HbmMods
2f841940b8
Merge pull request #2560 from RayzerHan/master
Update RU_ru lang/Qmaw
2025-11-30 22:48:16 +01:00
Bob
4141b424a9 flixes 2025-11-30 22:46:20 +01:00
Raaaaaaaaaay
afb44cd3fd
пятак гони на стол 2025-11-30 17:52:50 +02:00
Raaaaaaaaaay
096f77f3ab
танцуем с форелью 2025-11-30 17:37:55 +02:00
Raaaaaaaaaay
e2bb1e00c9
Витя станцую брейкданс на раскалённом пару 2025-11-30 17:32:28 +02:00
Raaaaaaaaaay
b43577c6cd
fix 2025-11-30 13:53:30 +02:00
Raaaaaaaaaay
818f39c1c5
fix 2025-11-29 23:46:08 +02:00
Raaaaaaaaaay
d71fee617c
ох мда 2025-11-29 23:40:32 +02:00
Raaaaaaaaaay
aa7aff5150
update QMAW, ох этот урановый концентрат 2025-11-29 23:35:32 +02:00
Raaaaaaaaaay
f6a3e44271
fix 2025-11-29 23:25:09 +02:00
Raaaaaaaaaay
6ad72b293d
update 2025-11-28 17:50:44 +02:00
Raaaaaaaaaay
bce94d0957
Merge branch 'HbmMods:master' into master 2025-11-28 17:40:11 +02:00
Boblet
3101c9b3b9 compost 2025-11-28 14:10:17 +01:00
Raaaaaaaaaay
99b19cd022
Merge branch 'HbmMods:master' into master 2025-11-28 13:08:58 +02:00
Bob
f50e0ee67c sound fix 2025-11-27 19:34:55 +01:00
HbmMods
a8c6ee4ba4
Merge pull request #2553 from Voxelstice/oc-fusion-pa
OC compat for new fusion reactor and particle accelerator
2025-11-27 16:46:18 +01:00
Voxelstice
9ab73e382f here it goes again
adds OC compat to the new fusion reactor and the particle accelerator
2025-11-27 18:17:51 +03:00
Boblet
3bdd7b4c94 evil mechanism 2025-11-27 10:51:48 +01:00
Boblet
4322892abb fugorg contraption 2025-11-26 15:50:45 +01:00
Boblet
a4a08aa9cd oughe, 2025-11-26 11:09:29 +01:00
Raaaaaaaaaay
cbff57375c
Merge branch 'HbmMods:master' into master 2025-11-26 11:00:14 +02:00
Boblet
879d9d1f8a que? 2025-11-26 08:11:55 +01:00
Raaaaaaaaaay
b9271cc81d
Merge branch 'HbmMods:master' into master 2025-11-25 16:02:14 +02:00
Boblet
fc967e8878 they took my arms 2025-11-25 13:42:02 +01:00
Boblet
7afd9901d3 no more rainbows. we homophobic now. 2025-11-25 12:49:03 +01:00
HbmMods
f91718111d
Merge pull request #2546 from NarekoMichigami810/master
zh_CN update
2025-11-25 08:29:47 +01:00
Raaaaaaaaaay
c7f5a14e42
Merge branch 'HbmMods:master' into master 2025-11-24 14:46:34 +02:00
道神 馴子
dacddfb3a1
cookie 2025-11-24 20:27:44 +08:00
Bob
4fe5128547 fusion rework in a week 2025-11-23 21:19:35 +01:00
Raaaaaaaaaay
e1cb8d00a7
Merge branch 'HbmMods:master' into master 2025-11-23 14:03:30 +02:00
Bob
2b056a8ae2 fusion breeder port fix 2025-11-23 12:47:51 +01:00
Raaaaaaaaaay
14490f9392
Merge branch 'HbmMods:master' into master 2025-11-23 11:56:39 +02:00
Bob
9aa3ac9978 plasma sparkle 2025-11-22 22:16:16 +01:00
Raaaaaaaaaay
4233a36348 fix qmaw and new ru 2025-11-21 17:47:46 +00:00
Boblet
170f155bc7 more plasmas because sure 2025-11-21 13:49:20 +01:00
Boblet
6818121b9a fusion QMAW 2025-11-21 11:24:45 +01:00
Bob
e5b93da9e4 old man yaoi 2025-11-20 21:43:57 +01:00
Boblet
71b40de7a7 the smooth taste of NEO, wake up and taste the PAIN 2025-11-20 15:59:34 +01:00
Bob
4a3db6adba magneto-plasma-sludge physics 2025-11-19 23:41:21 +01:00
Boblet
56a17c8856 NAEDOCYTE BREEDA 2025-11-19 16:57:04 +01:00
Boblet
2b5d23fbc1 blibble futuristics' greatest invention: the fugorg mechanism 2025-11-18 15:20:28 +01:00
Bob
c33d717631 the lads 2025-11-17 22:19:49 +01:00
Boblet
2e00964514 ignition 2025-11-17 16:10:19 +01:00
HbmMods
f28ebbea5c
Merge pull request #2537 from Lazzzycatwastaken/master
Fix for floating superflat structures
2025-11-17 08:24:55 +01:00
HbmMods
1d559fbfe0
Merge pull request #2538 from RayzerHan/master
ru_RU.lang and RU QMAW update
2025-11-17 08:24:21 +01:00
Bob
732f6552b6 just fucking nodespace everything at this point 2025-11-16 22:58:50 +01:00
Raaaaaaaaaay
e16a60d713
oh 2025-11-16 18:33:39 +02:00
Raaaaaaaaaay
6c4b58a192 fix 2 2025-11-16 16:30:54 +00:00
Lazzzycat
938f99318f azure latch time 2025-11-16 17:11:59 +01:00
Raaaaaaaaaay
c4c873767f
Fix 2025-11-16 18:03:58 +02:00
Raaaaaaaaaay
4b15267d4f
up 2025-11-16 17:55:05 +02:00
Raaaaaaaaaay
51380e49a7
wow 2025-11-16 17:53:10 +02:00
Raaaaaaaaaay
94db51bb37
Add files via upload
Ohh
2025-11-16 17:52:10 +02:00
Lazzzycat
84f1434131 i FUCKING HATE intellishit fuck this stupidslopware program and fuck jetbrains they can give me some brain 2025-11-16 16:26:29 +01:00
Bob
1cb8ca18cf yeah that thing too 2025-11-15 23:01:32 +01:00
Bob
de40ff388a see, you just gotta put your whole pussy into it 2025-11-15 17:19:34 +01:00
HbmMods
8ffbb512c1
Merge pull request #2536 from MellowArpeggiation/master
I CAN GO FASTER I CAN GO FASTER I CAN GO FASTER HRRRRRRRAAAAAAAAAAAA
2025-11-15 11:29:55 +01:00
George Paton
9a2a79c4c2 I CAN GO FASTER I CAN GO FASTER I CAN GO FASTER HRRRRRRRAAAAAAAAAAAA 2025-11-15 15:41:12 +11:00
Boblet
13cf418c16 mhdt 2025-11-14 15:18:07 +01:00
Bob
bb693a729d him 2025-11-13 22:19:02 +01:00
Boblet
c6a7d2aba4 my bals 2025-11-13 16:43:41 +01:00
Boblet
0c0a3c952b big chungus for playstation 3 2025-11-12 16:10:53 +01:00
HbmMods
b5fb8ae5be
Merge pull request #2530 from MellowArpeggiation/master
slag ingot slag ingot
2025-11-12 07:59:33 +01:00
George Paton
0a60e10827 remove unused imports 2025-11-12 10:05:50 +11:00
George Paton
85a0373675 fuck my chungus wife 2025-11-12 10:03:34 +11:00
HbmMods
6b30ba7d76
Merge pull request #2528 from NarekoMichigami810/master
zh_CN update
2025-11-11 19:05:21 +01:00
Boblet
f1cfe03bf3 when all of a sudden - italians 2025-11-11 16:44:06 +01:00
道神 馴子
ded4c9c53a
boy next door 2025-11-11 21:40:44 +08:00
HbmMods
0194c0d2a9
Merge pull request #2527 from sodlier/master
Fix README.md links
2025-11-11 08:04:09 +01:00
sodlier
97349a1df5
Merge pull request #1 from sodlier/readme-fix
Fix links in README.md
2025-11-10 20:14:04 -03:00
sodlier
991e3ffa1d
Fix links in README.md
Updated CurseForge link and Adoptium JDK8 download link in README.md file.

anything to put my name in the contributors tab
2025-11-10 20:09:21 -03:00
Bob
58c76bdd55 eeeeeeeeeeeeeeeeeeeeee 2025-11-10 22:07:16 +01:00
HbmMods
ab48d52265
Merge pull request #2525 from BallOfEnergy1/master
Tiny changes
2025-11-10 16:07:16 +01:00
HbmMods
eaf0cfa24a
Merge pull request #2521 from mikkerlo/push-tumznvpzvzqq
Stop mining laser if redstone is supplied.
2025-11-10 16:06:52 +01:00
Boblet
f7d2038f7e some AStack crap, fusion torus struct block 2025-11-10 15:37:35 +01:00
BallOfEnergy
ada5ccbf77
github what made you think i wanted to commit only the additions??? 2025-11-09 22:51:21 -06:00
BallOfEnergy
252659bdf0
My life is a living hell, and this will make it significantly less horrible. 2025-11-09 22:45:00 -06:00
Boblet
bc1073f734 donuts 2025-11-07 14:44:52 +01:00
Bob
9386e9d186 ough part 23 2025-11-06 22:16:08 +01:00
Boblet
a8c24cf76a glontch 2025-11-06 15:39:45 +01:00
Mikhail Semenov
6e7be25614 Stop mining laser if redstone is supplied. 2025-11-06 07:07:13 +01:00
Boblet
8b88d0f439 demoman TF2 2025-11-05 16:54:03 +01:00
Boblet
82185aa9ca what if you wanted to go to heaven, but god said "ough," 2025-11-04 16:18:12 +01:00
Boblet
b2d52e8cfa you can now cut off big man johnson's johnson 2025-11-03 16:34:31 +01:00
Bob
b278d27b9b malicious gigglefish from the silly dimension 2025-11-02 18:43:12 +01:00
Boblet
036c220317 RoR can have QMAW as a treat 2025-10-31 14:52:28 +01:00
HbmMods
a3fbb711f0
Merge pull request #2513 from MellowArpeggiation/master
fix crash in Highlands mod due to it using a deprecated biome hook
2025-10-31 09:07:59 +01:00
George Paton
09dd5e37b5 nodespace foundry channels! (also fix arc furnace only accepting one stack from IO port if it triggers it to close) 2025-10-31 14:33:09 +11:00
George Paton
176a2e58ee fix crash in highlands mod due to it using a deprecated biome hook 2025-10-31 13:00:40 +11:00
Boblet
18dabf7e8c go go gadget ovarial torsion 2025-10-30 16:40:58 +01:00
HbmMods
113a800270
Merge pull request #2509 from t3435ryt/master
Rail block harvest tools and levels
2025-10-30 10:15:56 +01:00
t3435ryt
311a9d1a31
Merge branch 'HbmMods:master' into master 2025-10-29 13:07:49 -04:00
t3435ryt
b6c60f5997 For a number of years now, work has been proceeding in order to bring perfection to the crudely conceived idea of a transmission that would not only supply inverse reactive current for use in unilateral phase detractors, but would also be capable of automatically synchronizing cardinal grammeters. Such an instrument is the turbo encabulator.
Now basically the only new principle involved is that instead of power being generated by the relative motion of conductors and fluxes, it is produced by the modial interaction of magneto-reluctance and capacitive diractance.

The original machine had a base plate of pre-famulated amulite surmounted by a malleable logarithmic casing in such a way that the two spurving bearings were in a direct line with the panametric fan. The latter consisted simply of six hydrocoptic marzlevanes, so fitted to the ambifacient lunar waneshaft that side fumbling was effectively prevented.

The main winding was of the normal lotus-o-delta type placed in panendermic semi-boloid slots of the stator, every seventh conductor being connected by a non-reversible tremie pipe to the differential girdle spring on the “up” end of the grammeters.

The turbo-encabulator has now reached a high level of development, and it’s being successfully used in the operation of novertrunnions. Moreover, whenever a forescent skor motion is required, it may also be employed in conjunction with a drawn reciprocation dingle arm, to reduce sinusoidal repleneration.
2025-10-29 13:06:38 -04:00
Bob
76d4a4a453 you can have like half a UV 2025-10-28 22:18:20 +01:00
HbmMods
0a6bddc83d
Merge pull request #2507 from mikkerlo/push-zkltxruskxvq
Change Builders Jetpack shift space behavior
2025-10-28 14:19:56 +01:00
Mikhail Semenov
efc5a88928 Change Builders Jetpack shift space behavior
Currently, pressing Shift+Space causes the jetpack to ascend, which I believe is unintentional.
This change makes that key combination do nothing.
2025-10-28 00:05:36 +01:00
Boblet
02ee44e1ce boner 2025-10-27 16:58:21 +01:00
HbmMods
9e5c4e4a8e
Merge pull request #2505 from MellowArpeggiation/boxcable
I've lost count of the number of times I've done this
2025-10-27 09:44:27 +01:00
George Paton
14d79d426c FUCK 2025-10-27 19:36:25 +11:00
HbmMods
03f8b2d80a
Merge pull request #2504 from MellowArpeggiation/boxcable
Boxcables!
2025-10-27 08:25:32 +01:00
George Paton
7161a1ef73 improve junction connections and add better textures 2025-10-27 16:35:36 +11:00
George Paton
2833d58e84 adjust cable hitboxes and make them look more like red copper 2025-10-27 14:09:04 +11:00
George Paton
6eeefc23b4 add OC support to PA dipoles 2025-10-27 13:51:26 +11:00
t3435ryt
9ce0c0ec39 For a number of years now, work has been proceeding in order to bring perfection to the crudely conceived idea of a transmission that would not only supply inverse reactive current for use in unilateral phase detractors, but would also be capable of automatically synchronizing cardinal grammeters. Such an instrument is the turbo encabulator.
Now basically the only new principle involved is that instead of power being generated by the relative motion of conductors and fluxes, it is produced by the modial interaction of magneto-reluctance and capacitive diractance.

The original machine had a base plate of pre-famulated amulite surmounted by a malleable logarithmic casing in such a way that the two spurving bearings were in a direct line with the panametric fan. The latter consisted simply of six hydrocoptic marzlevanes, so fitted to the ambifacient lunar waneshaft that side fumbling was effectively prevented.

The main winding was of the normal lotus-o-delta type placed in panendermic semi-boloid slots of the stator, every seventh conductor being connected by a non-reversible tremie pipe to the differential girdle spring on the “up” end of the grammeters.

The turbo-encabulator has now reached a high level of development, and it’s being successfully used in the operation of novertrunnions. Moreover, whenever a forescent skor motion is required, it may also be employed in conjunction with a drawn reciprocation dingle arm, to reduce sinusoidal repleneration.
2025-10-26 22:05:46 -04:00
George Paton
f9baf87289 fix PA dipole max speed penalty applying to particles that aren't turning 2025-10-27 12:42:13 +11:00
George Paton
bff3e15fb3 boxcable recipe (uses ingots for now) 2025-10-27 12:41:24 +11:00
George Paton
f297d4f856 what the fuc kis a boxcable 2025-10-27 12:30:17 +11:00
Bob
3b55d26e17 he sings 2025-10-24 22:05:04 +02:00
Boblet
dfd1aafb89 compressor QMAW 2025-10-24 11:13:49 +02:00
Boblet
75adc232f7 particle accelerator QMAW 2025-10-23 15:12:10 +02:00
HbmMods
d6f957f975
Merge pull request #2491 from mikkerlo/master
Add NEI overlay functionality so recipe on anvil can be selected via NEI.
2025-10-23 12:03:42 +02:00
Boblet
f9baf88f3c cleanup 2025-10-23 12:02:55 +02:00
HbmMods
b3aa9ab637
Merge pull request #2483 from DangerousMilk/Meteorite-Tweaks
Meteor Improvements
2025-10-23 11:55:37 +02:00
DangerousMilk
c8a0b7f89a Fixed stopping the meteor flying sound without ever initializing it. Fixed meteors destroying bedrock. Added a hardness limit to which blocks that can be replaced. 2025-10-22 21:19:22 +02:00
DangerousMilk
193f011619 Remove vlc-log 2025-10-22 20:36:38 +02:00
DangerousMilk
f2e733679c Simplified block clearing and decoration. 2025-10-22 20:36:38 +02:00
DangerousMilk
2f7c013423 Cleanup. 2025-10-22 20:36:38 +02:00
DangerousMilk
5a987621a5 Added impact crater decorations. Meteors now go into the ground on impact. Refactored some functions. 2025-10-22 20:36:37 +02:00
DangerousMilk
e7b3dff934 Fixed flySound NullPointerException. 2025-10-22 20:36:37 +02:00
DangerousMilk
51b1f3e46d Fixed the short 'blip' of the fly sound being player at the start. 2025-10-22 20:36:37 +02:00
DangerousMilk
c3c0be94e3 Made the destruction of weak blocks safe. More sound tweaks 2025-10-22 20:36:37 +02:00
DangerousMilk
f87a23d494 Deleted vlc-log.txt. 2025-10-22 20:36:37 +02:00
DangerousMilk
59ace7eaf5 Added meteorite falling sound. 2025-10-22 20:36:37 +02:00
DangerousMilk
bd8ed4920d Meteorites now break leaves and logs before landing. Made explosions fit the meteor size more. 2025-10-22 20:36:37 +02:00
Boblet
72957ef167 speedrun 2025-10-22 15:41:26 +02:00
HbmMods
b3b05d9208
Merge pull request #2492 from NarekoMichigami810/master
zh_CN update
2025-10-22 14:43:53 +02:00
道神 馴子
2d593dbeb3
Masturbate 2025-10-22 19:27:15 +08:00
Bob
cde2d39631 i'm creekflow (crashes into a mcdonalds drive thru) 2025-10-21 23:09:30 +02:00
HbmMods
38cd74536d
Merge pull request #2478 from Fyrstikkeske/master
Retain unused progress for the next craft on the blast furnace
2025-10-21 22:06:15 +02:00
Mikhail Semenov
e16be434f5 Add NEI overlay functionality so recipe on anvil can be selected via NEI.
This will allow to click plus-sign in NEI and NEI will select recipe on Anvil automatically.
2025-10-21 21:56:48 +02:00
Bob
3bf9ab1570 pneumonia 2025-10-21 21:55:14 +02:00
Boblet
bbe41c02a7 i forgor 2025-10-21 16:27:50 +02:00
Boblet
10cf45b452 "release today" and other jokes to tell yourself, volume IV 2025-10-20 16:59:54 +02:00
Boblet
907d389b43 ey jimmy, gimme a weapon mod with NOTHIN'
nuttin'??
2025-10-17 15:18:11 +02:00
Bob
ec076fb97a now with sound 2025-10-16 23:51:35 +02:00
Boblet
12e8da8750 eggplant emoji, droplets emoji, weary face emoji 2025-10-16 15:47:40 +02:00
Boblet
4d6a92e015 i think i may have creeked my flow 2025-10-15 15:13:59 +02:00
Boblet
5fd64f5d8f the thing, device 2025-10-14 16:50:39 +02:00
Boblet
fe38e61ba4 drilldo 2025-10-13 16:47:39 +02:00
Bob
db9b0501d5 conveyor stuff, yet more drill crap 2025-10-12 21:42:18 +02:00
Boblet
40a14fb440 automatic prostate exam device 2025-10-10 14:56:28 +02:00
Fyrstikkeske
6f7a23d8cc Retain unused progress for the next craft
fixes some alignment issues when minmaxxing the blast furnace.
2025-10-10 00:35:13 +02:00
Boblet
db3f58b4cd just throw a continental breakfast at my face 2025-10-09 16:57:31 +02:00
Bob
a0670eb700 anchor deez nuts ha gotem 2025-10-08 22:59:28 +02:00
Boblet
6304df71dd more plumbing, get your free toilet now 2025-10-08 16:58:39 +02:00
HbmMods
d1c5355362
Merge pull request #2475 from MellowArpeggiation/bubble-butt
Remove all remaining non-structure worldgen cascades
2025-10-08 10:28:38 +02:00
Boblet
801fdc146c scrungus 2025-10-07 16:30:21 +02:00
George Paton
7d6fea7646 fix semi-flipped oily spot gaussian distribution 2025-10-07 17:52:25 +11:00
George Paton
39603e2edb bedrock oil spots 2025-10-07 15:33:40 +11:00
George Paton
edbc062da0 reimplement oil (regular + sand) bubbles as MapGenBase 2025-10-07 12:56:14 +11:00
Boblet
054aa07318 my bals 2025-10-06 16:42:34 +02:00
George Paton
264ee49212 replace sellafield craters (already had the crater code so why not) 2025-10-06 18:38:01 +11:00
HbmMods
32c0491ca4
Merge pull request #2436 from Bufka2011/master
ru_RU.lang and RU QMAW update
2025-10-06 07:59:48 +02:00
HbmMods
3ca0e1ad4c
Merge pull request #2456 from NarekoMichigami810/master
zh_CN update
2025-10-06 07:56:36 +02:00
HbmMods
59afb41c22
Merge pull request #2449 from kelllllen/master
Some more RBMK OC compat
2025-10-06 07:56:14 +02:00
HbmMods
ab7c852d61
Merge pull request #2473 from MellowArpeggiation/master
common worldgen cascade fixes (improved worldgen performance)
2025-10-06 07:52:22 +02:00
George Paton
15d7edacb5 bonus: fix chargers never filling the last 1HE on certain armors 2025-10-06 13:34:36 +11:00
George Paton
278a7b5dfb fixing two common worldgen cascades in meteorites and flowers 2025-10-06 12:21:24 +11:00
Bob
4ef2442770 drill crap 2025-10-05 23:48:03 +02:00
Bufka2011
bbf3d29d80
Update ru_RU.lang 2025-10-04 11:50:21 -06:00
Bufka2011
8cc94738ad
Update ru_RU.lang 2025-10-04 11:48:37 -06:00
Bufka2011
ee79c8d9dc
Update ru_RU.lang 2025-10-04 11:37:29 -06:00
Bufka2011
97cb4cb6a1
Update ru_RU.lang 2025-10-04 11:26:49 -06:00
Bufka2011
9a42d65e26
Update ru_RU.lang 2025-10-04 11:21:18 -06:00
Bufka2011
f3e315297a
Update ru_RU.lang 2025-10-04 11:13:11 -06:00
Bufka2011
b1d4e99ea9
Update ru_RU.lang 2025-10-04 11:08:22 -06:00
Bufka2011
40dc8c8679
Update ru_RU.lang 2025-10-04 11:01:14 -06:00
Bufka2011
63fbbeb5c7
Update ru_RU.lang 2025-10-04 10:58:26 -06:00
Bufka2011
669c2b9b50
Update ru_RU.lang 2025-10-04 10:53:58 -06:00
Bufka2011
62366d5adb
Update ru_RU.lang 2025-10-04 10:53:06 -06:00
Bufka2011
8b6af76fa0
Update ru_RU.lang 2025-10-04 10:43:29 -06:00
Bufka2011
abe22b7f97
Update ru_RU.lang 2025-10-04 10:42:28 -06:00
Bufka2011
111f0d1114
Update ru_RU.lang 2025-10-04 10:40:56 -06:00
Bufka2011
0f5b5837b8
Update ru_RU.lang 2025-10-04 10:27:29 -06:00
Bufka2011
2796bcb892
Update ru_RU.lang 2025-10-04 10:24:32 -06:00
Bufka2011
540cf425e9
Update ru_RU.lang 2025-10-04 10:22:17 -06:00
Bufka2011
31a9000a82
Merge branch 'HbmMods:master' into master 2025-10-02 13:28:46 -06:00
Bufka2011
4710fcfc34
Update ru_RU.lang 2025-09-30 18:13:58 -06:00
Bob
9ba40044ed nothing 2025-09-28 14:35:04 +02:00
道神 馴子
bb056af18d
Merge branch 'HbmMods:master' into master 2025-09-28 14:14:28 +08:00
Bob
b710b88ed5 eh 2025-09-27 19:24:27 +02:00
Bufka2011
995f987e66
Update hss.json 2025-09-27 11:09:40 -06:00
Bufka2011
a709db58bb
Merge branch 'HbmMods:master' into master 2025-09-27 11:01:38 -06:00
Bufka2011
4f97af940c
Update ru_RU.lang 2025-09-27 11:01:25 -06:00
Boblet
a08c410a9c alt recipes galore 2025-09-26 14:12:16 +02:00
道神 馴子
a030397f71
Add files via upload 2025-09-26 20:06:36 +08:00
Boblet
a0184b1751 military green paint(?) 2025-09-25 16:45:10 +02:00
KellenHurrey
640397fdda
Merge branch 'HbmMods:master' into master 2025-09-22 15:26:50 -07:00
Kellen Hurrey
6f314c3996
Added more info to getColumnData, added control rod targets 2025-09-22 16:25:34 -06:00
Boblet
f389a25dec just fucking 3D everything i don't care anymore 2025-09-22 16:49:43 +02:00
HbmMods
bc7e00c71c
Merge pull request #2441 from Lazzzycatwastaken/crane
Crane Structure
2025-09-22 11:34:15 +02:00
HbmMods
2d64453317
Merge branch 'master' into crane 2025-09-22 11:34:08 +02:00
Boblet
c9155b55ba maybe i should push before something breaks completely 2025-09-22 11:32:20 +02:00
HbmMods
dfa1d7718b
Merge pull request #2442 from Lazzzycatwastaken/tower
Broadcaster tower
2025-09-22 11:31:39 +02:00
HbmMods
6a7acb337e
Merge pull request #2448 from MellowArpeggiation/master
Show current tool area ability next to crosshair
2025-09-22 11:28:42 +02:00
George Paton
f082094740
big dumbass momento 2025-09-22 19:16:15 +10:00
George Paton
c8fe3cc095 add client config to adjust tool hud indicator position 2025-09-22 17:33:35 +10:00
George Paton
dd3746a3d4
Merge branch 'HbmMods:master' into master 2025-09-22 17:15:02 +10:00
George Paton
dd0a604aa6 show current tool area ability next to crosshair, to prevent accidentally breaking yo shit 2025-09-22 17:14:28 +10:00
HbmMods
7285867856
Merge pull request #2443 from KellenHurrey/master
Some RBMK OC integration
2025-09-21 21:04:09 +02:00
HbmMods
b57acc2cb2
Merge pull request #2446 from BallOfEnergy1/master
Fix for TE crashes when using neutron nodespace.
2025-09-21 21:01:58 +02:00
Bob
d67b3778c3 this is the part where the T-45 fucking dies 2025-09-21 20:58:56 +02:00
BallOfEnergy
4440550a37 Small fix for erroneous crashes. 2025-09-21 10:20:23 -05:00
Bufka2011
644e188a94
Update ru_RU.lang 2025-09-20 15:24:58 -06:00
Bufka2011
72026cb772
Update ru_RU.lang 2025-09-20 15:19:17 -06:00
Bufka2011
072f226181
Merge branch 'HbmMods:master' into master 2025-09-20 10:15:44 -06:00
Kellen Hurrey
9f849e8c2d
Removed unused import 2025-09-19 11:28:19 -06:00
Kellen Hurrey
cf5bf4be8c
Added crafting data to getData and getColumnData, and made the OC pressAZ5 function play the cool sound 2025-09-19 11:25:11 -06:00
Kellen Hurrey
890eb49747
Merge remote-tracking branch 'origin/master' 2025-09-19 10:52:15 -06:00
Kellen Hurrey
ebd7ffc827
Make RBMK slotted elements have OC accessible inventories, and added a OC outgasser function that allows seeing the item that is being processed. 2025-09-19 10:51:32 -06:00
Lazzzycatwastaken
eddd75a626 When I get pantsd in class but I lowkey got a humiliation kink so I get bricked up and everyone realizes im lowkey slanging and hypes me up so I start helicoptering it on some nonchalant shi 2025-09-19 17:53:33 +02:00
Boblet
b3405d085b the skeleton's coming out, AAAAAAAAAAAAA 2025-09-19 13:02:50 +02:00
Lazzzycat
003721d4f7
creed embled unemployed drone 2025-09-19 11:50:48 +02:00
Lazzzycat
f3345f7778
Merge branch 'HbmMods:master' into crane 2025-09-19 09:31:59 +02:00
HbmMods
94e3df1751
Merge pull request #2440 from MellowArpeggiation/drilldo
This was an animated terra drill PR but the drill is getting axed so this is now just a bugfix and cleanup PR yay
2025-09-19 08:09:56 +02:00
HbmMods
d01016034f
Merge pull request #2438 from Lazzzycatwastaken/ttttt
Structure configs
2025-09-19 07:59:26 +02:00
George Paton
f7ffc694bf retract drill upon hitting depth rock 2025-09-19 12:27:10 +10:00
George Paton
7113838d68 add compact compressor to NEI handler 2025-09-19 12:08:00 +10:00
Bufka2011
96e5ea531c
Fix ru_RU.lang 2025-09-18 13:33:12 -06:00
Bufka2011
c25adf5014
Merge branch 'HbmMods:master' into master 2025-09-18 13:31:33 -06:00
Lazzzycatwastaken
f499e6cf00 setro OWNS me... (we've lost the plot) 2025-09-18 21:25:40 +02:00
Lazzzycatwastaken
daae6e9694 peak meter 100% 2025-09-18 20:17:32 +02:00
HbmMods
0916aa9b17
Merge pull request #2437 from Lazzzycatwastaken/factory
Factory rework
2025-09-18 16:51:43 +02:00
Lazzzycatwastaken
d6a10bf49a removed the parasite (title screen) 2025-09-18 16:27:03 +02:00
Lazzzycat
1f09f64176
Merge branch 'HbmMods:master' into factory 2025-09-18 16:13:38 +02:00
Lazzzycatwastaken
3dc97e8133 mr. penis (real) 2025-09-18 16:13:10 +02:00
Boblet
aaa046e4eb mischief 2025-09-18 16:08:27 +02:00
George Paton
2ffe3d0072 fix entity registration, complete with functioning spawn eggs 2025-09-18 13:12:42 +10:00
Boblet
715ecda0dd ough 2025-09-17 16:11:28 +02:00
Bufka2011
c61d7f4f89
Small ru_RU.lang fix 2025-09-15 21:16:29 -06:00
George Paton
2efce806a9 aim IAnimatedItem like a bow 2025-09-16 09:52:52 +10:00
Boblet
b9fabc3af4 ow 2025-09-15 16:27:29 +02:00
George Paton
dbd63e706f Merge branch 'master' into drilldo 2025-09-15 11:00:14 +10:00
George Paton
a79125b94d generic animation enum selection, still item specific but now a lot easier to refactor to non-item animations 2025-09-15 10:57:05 +10:00
Bob
afb559d604 sparks! 2025-09-14 22:51:27 +02:00
Boblet
c0cb28c2ad every step we take that's synchronized 2025-09-12 11:03:27 +02:00
George Paton
ada1b5245d might as well fix two issues while here:
* electrolyser metal outputs not clearing on client
* unused chunk allocation wasting RAM
2025-09-12 17:12:06 +10:00
George Paton
8c752488ee improve IAnimatedItem and move existing item animations out of the ClientProxy monolith 2025-09-12 14:39:38 +10:00
Bob
4a4606e6ed the sludge 2025-09-11 22:57:20 +02:00
HbmMods
7916d76aca
Merge pull request #2424 from R0STUS/master
PWRangler garbage improvements
2025-09-11 16:29:34 +02:00
HbmMods
463d020dad
Merge pull request #2426 from KellenHurrey/master
Add a oc function to set the custom map of redstone over radio torches
2025-09-11 16:28:07 +02:00
Boblet
4805dd800c the slow dance (it's actually rather fast) 2025-09-10 16:30:13 +02:00
Boblet
4320071a41 sesbian lex 2025-09-09 16:58:17 +02:00
Boblet
07a2e4eea3 tragic yuri 2025-09-08 16:54:05 +02:00
rost
d7f859ecab Final commit (max level added) 2025-09-08 16:03:40 +02:00
Kellen Hurrey
f6c74ce98e
Add radio method 2025-09-07 19:16:42 -06:00
Bob
966206dbf5 getting there 2025-09-07 20:53:12 +02:00
rost
675cde7321 fixes; MAX LEVEL REQUIRED 2025-09-07 14:51:23 +02:00
rost
98cf0b002b hot coolant ESTOP; MAX LEVEL REQUIRED 2025-09-07 11:14:30 +02:00
rost
3ff201bf4d fixes 2025-09-06 22:40:47 +02:00
rost
81c5bb84d3 upd 2025-09-06 22:35:29 +02:00
rost
1025f626b7 PWRangler garbage impoovments 2025-09-06 22:21:41 +02:00
HbmMods
13df9566a2
Merge pull request #2422 from Creeper-banner/bob
Update Simplified Chinese Localization for new QMAW pages
2025-09-06 16:54:28 +02:00
Bob
99aa9da490 flixes 2025-09-06 16:54:12 +02:00
CrpBnrz
465b521f19 QMAW Fix 2025-09-06 22:37:02 +08:00
CrpBnrz
0cea7393a6 More QMAW 2025-09-06 21:12:50 +08:00
CrpBnrz
7096062847 Merge branch 'bob' of https://github.com/Creeper-banner/NTMC.git into bob 2025-09-06 13:07:52 +08:00
CrpBnrz
2b612e82e9 Oil QMAW 2025-09-06 13:04:29 +08:00
Boblet
e03ad3edfb the docs 2025-09-05 15:17:05 +02:00
HbmMods
a35cb1cbd5
Merge pull request #2417 from Creeper-banner/bob
Update Simplified Chinese Localization
2025-09-04 16:56:47 +02:00
Boblet
2ed4d906c3 QMAW! 2025-09-04 16:35:34 +02:00
Creeper-banner
d4844073ae
Update zh_CN.lang 2025-09-04 22:26:01 +08:00
CrpBnrz
fba1d2a97b Update zh_CN.lang 2025-09-04 21:50:42 +08:00
CrpBnrz
45af851032 QMAW localization for free (but not for me) 2025-09-04 21:44:49 +08:00
Boblet
94accf6ed6 more QMAW for free 2025-09-03 16:25:29 +02:00
Boblet
539ecb8130 deplorable gollompus 2025-09-02 16:18:58 +02:00
Boblet
3f38c9b7d2 chlog 2025-09-01 16:43:37 +02:00
HbmMods
8f67cb6ba3
Merge pull request #2409 from MellowArpeggiation/master
fuck
2025-09-01 09:44:09 +02:00
George Paton
9a6cebe0fa stop staring at me with them big ol' eyes.
*SHHHHOOONK*
2025-09-01 17:39:27 +10:00
Boblet
ff75e7662e and then i went to the store to buy some gloop 2025-09-01 09:35:41 +02:00
Bob
7e01544c19 fresh from the juice, fresh from the juice! don't get it on your shoese 2025-08-31 15:35:43 +02:00
Bob
4e0171159e minor merge fuckup 2025-08-31 13:15:34 +02:00
HbmMods
f005680cc1
Merge pull request #2404 from Lazzzycatwastaken/forestchem
Forest chemical station
2025-08-31 13:12:07 +02:00
HbmMods
eb0dd854f0
Merge branch 'master' into forestchem 2025-08-31 13:11:54 +02:00
HbmMods
2f12549464
Merge pull request #2400 from Lazzzycatwastaken/Forwetst
Planes (useless edition)
2025-08-31 13:10:51 +02:00
HbmMods
174ce22da3
Merge branch 'master' into Forwetst 2025-08-31 13:10:45 +02:00
HbmMods
5604fa5e4a
Merge pull request #2403 from Lazzzycatwastaken/fixfordesert
Explosive suprise
2025-08-31 13:10:12 +02:00
HbmMods
bb453ce45b
Merge branch 'master' into fixfordesert 2025-08-31 13:09:19 +02:00
HbmMods
b6e9d36301
Merge branch 'master' into forestchem 2025-08-31 13:07:57 +02:00
HbmMods
a0ff23a4d1
Merge pull request #2406 from Lazzzycatwastaken/labolatory
new labolarotyyu
2025-08-31 13:07:11 +02:00
HbmMods
b456275016
Merge branch 'master' into labolatory 2025-08-31 13:07:02 +02:00
HbmMods
4d5f88896a
Merge pull request #2405 from Lazzzycatwastaken/forestpost
Forest post
2025-08-31 13:05:22 +02:00
HbmMods
6215b32f4d
Merge branch 'master' into forestpost 2025-08-31 13:00:15 +02:00
HbmMods
be78cf3a43
Merge pull request #2399 from Lazzzycatwastaken/NTMRUINS1
Sludgening is beginning
2025-08-31 12:58:38 +02:00
HbmMods
97866f1fb9
Merge branch 'master' into NTMRUINS1 2025-08-31 12:58:28 +02:00
HbmMods
1be5127582
Merge pull request #2402 from Lazzzycatwastaken/Radio-house
Radio rework (shocker)
2025-08-31 12:57:42 +02:00
HbmMods
53a63a28aa
Merge pull request #2407 from MellowArpeggiation/inventory-pronter
PWR printing tool
2025-08-31 12:49:36 +02:00
HbmMods
37926a6b8f
Merge branch 'master' into inventory-pronter 2025-08-31 12:49:30 +02:00
Bob
53d1323604 i lied, get fucked 2025-08-31 12:08:19 +02:00
Boblet
4fba0fc42a i forgor 2025-08-29 15:18:26 +02:00
George Paton
45aab4617a
Merge branch 'master' into inventory-pronter 2025-08-28 22:23:10 +10:00
George Paton
a636440d13 rotate to always show controller at bottom right 2025-08-28 15:47:22 +10:00
George Paton
c978fa8955 PWR printing device, exports a built PWR as a series of slices to be edited together for posting 2025-08-28 15:01:39 +10:00
Lazzzycatwastaken
66971b3310 SIX @SEVEN 2025-08-27 17:36:40 +02:00
Lazzzycatwastaken
92d4232472 Merge branch 'ttttt' into NTMRUINS1
# Conflicts:
#	src/main/java/com/hbm/util/LootGenerator.java
#	src/main/java/com/hbm/world/gen/NTMWorldGenerator.java
2025-08-27 17:31:40 +02:00
Lazzzycatwastaken
ee9c69cfca resolve hopefully i hope 2025-08-27 17:30:05 +02:00
Lazzzycatwastaken
5bde7c9a0d Merge branch 'ttttt' into Forwetst
# Conflicts:
#	src/main/java/com/hbm/world/gen/NTMWorldGenerator.java
2025-08-27 17:29:13 +02:00
Lazzzycatwastaken
848ac39463 resolve hopefully i hope 2025-08-27 17:24:58 +02:00
Lazzzycatwastaken
b9418dcb2e Merge branch 'ttttt' into Radio-house
# Conflicts:
#	src/main/java/com/hbm/world/gen/NTMWorldGenerator.java
2025-08-27 17:23:49 +02:00
Lazzzycatwastaken
245dbf421c Merge remote-tracking branch 'origin/forestchem' into forestchem 2025-08-27 17:21:19 +02:00
Lazzzycatwastaken
0b28311374 resolve hopefully i hope 2025-08-27 17:20:51 +02:00
Lazzzycatwastaken
c20a90e45c Merge branch 'ttttt' into forestchem
# Conflicts:
#	src/main/java/com/hbm/world/gen/NTMWorldGenerator.java
2025-08-27 17:18:42 +02:00
Lazzzycatwastaken
9a7f991092 resolve hopefully i hope 2025-08-27 17:16:07 +02:00
Lazzzycatwastaken
a24bed5337 Merge branch 'ttttt' into labolatory
# Conflicts:
#	src/main/java/com/hbm/world/gen/NTMWorldGenerator.java
2025-08-27 17:15:15 +02:00
Lazzzycatwastaken
bf3e795a66 BOIIIIIIIIIIIIIIIIII TS (type soul) getting a 20 hog code ( setro and minors? like in minecraft? I know nothing of association with setro and minors.) 2025-08-27 16:36:25 +02:00
Lazzzycatwastaken
76b51ebca9 BOIIIIIIIIIIIIIIIIII TS (type soul) getting a 20 hog code ( setro and minors? like in minecraft? I know nothing of association with setro and minors.) 2025-08-27 16:04:30 +02:00
Lazzzycatwastaken
c8bf809e9f labubu funk 2025-08-27 15:28:38 +02:00
Lazzzycatwastaken
7084dc919a Merge remote-tracking branch 'origin/NTMRUINS1' into NTMRUINS1 2025-08-27 15:13:07 +02:00
Lazzzycatwastaken
b98c8c3f98 sdsa 2025-08-27 15:12:47 +02:00
HbmMods
3f6e758cd4
Merge pull request #2397 from Bufka2011/master
ru_RU.lang update, ru_RU QMAW update and many I18n implementations (again)
2025-08-27 08:23:21 +02:00
George Paton
a000347877 yeah I was overcomplicating that, this is much better 2025-08-27 13:38:43 +10:00
George Paton
e5b29e3352 fix transparent pixel issue in wiki icon screenshitter 2025-08-27 13:12:01 +10:00
Bufka2011
5605a9c3b8 Minor changes 2025-08-26 16:25:11 -06:00
Bufka2011
708879c276 Minor ru_RU.lang changes 2025-08-26 16:21:33 -06:00
Bufka2011
95e1c97781 https://imgur.com/a/IBLwDde 2025-08-26 14:18:07 -06:00
Bufka2011
cac17dea98 Merge branch 'master' of https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT 2025-08-26 10:15:07 -06:00
Boblet
03d195fd91 ough 2025-08-26 15:49:27 +02:00
Bufka2011
2eecf17100 DODD 2025-08-25 15:52:58 -06:00
Bufka2011
48b4124c14 Manual update 2025-08-25 15:52:45 -06:00
Bufka2011
23669e6337 YES, MY QMAW (used python for this) 2025-08-25 15:14:30 -06:00
Bufka2011
6ed83ab7ec Updated swords translations 2025-08-25 14:13:45 -06:00
Bufka2011
2b3f98a850 Merge branch 'master' of https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT
# Conflicts:
#	src/main/resources/assets/hbm/manual/material/alloy.json
#	src/main/resources/assets/hbm/manual/material/aluminium.json
#	src/main/resources/assets/hbm/manual/material/arsenic.json
#	src/main/resources/assets/hbm/manual/material/arsenic_bronze.json
#	src/main/resources/assets/hbm/manual/material/bakelite.json
#	src/main/resources/assets/hbm/manual/material/bismuth.json
#	src/main/resources/assets/hbm/manual/material/bismuth_bronze.json
#	src/main/resources/assets/hbm/manual/material/bscco.json
#	src/main/resources/assets/hbm/manual/material/cadmium.json
#	src/main/resources/assets/hbm/manual/material/cadmium_steel.json
#	src/main/resources/assets/hbm/manual/material/cinnabar.json
#	src/main/resources/assets/hbm/manual/material/coke.json
#	src/main/resources/assets/hbm/manual/material/copper.json
#	src/main/resources/assets/hbm/manual/material/desh.json
#	src/main/resources/assets/hbm/manual/material/ferrouranium.json
#	src/main/resources/assets/hbm/manual/material/graphite.json
#	src/main/resources/assets/hbm/manual/material/gunmetal.json
#	src/main/resources/assets/hbm/manual/material/hss.json
#	src/main/resources/assets/hbm/manual/material/latex.json
#	src/main/resources/assets/hbm/manual/material/lead.json
#	src/main/resources/assets/hbm/manual/material/mingrade.json
#	src/main/resources/assets/hbm/manual/material/neptunium.json
#	src/main/resources/assets/hbm/manual/material/plutonium-238.json
#	src/main/resources/assets/hbm/manual/material/plutonium-239.json
#	src/main/resources/assets/hbm/manual/material/plutonium-240.json
#	src/main/resources/assets/hbm/manual/material/plutonium-241.json
#	src/main/resources/assets/hbm/manual/material/plutonium-rg.json
#	src/main/resources/assets/hbm/manual/material/plutonium.json
#	src/main/resources/assets/hbm/manual/material/polonium.json
#	src/main/resources/assets/hbm/manual/material/polymer.json
#	src/main/resources/assets/hbm/manual/material/radium.json
#	src/main/resources/assets/hbm/manual/material/rubber.json
#	src/main/resources/assets/hbm/manual/material/silicon.json
#	src/main/resources/assets/hbm/manual/material/sodium.json
#	src/main/resources/assets/hbm/manual/material/steel.json
#	src/main/resources/assets/hbm/manual/material/sulfur.json
#	src/main/resources/assets/hbm/manual/material/tantalium.json
#	src/main/resources/assets/hbm/manual/material/technetium.json
#	src/main/resources/assets/hbm/manual/material/technetium_steel.json
#	src/main/resources/assets/hbm/manual/material/thorium.json
#	src/main/resources/assets/hbm/manual/material/uranium-233.json
#	src/main/resources/assets/hbm/manual/material/uranium-235.json
#	src/main/resources/assets/hbm/manual/material/uranium-238.json
#	src/main/resources/assets/hbm/manual/material/uranium.json
#	src/main/resources/assets/hbm/manual/material/weaponsteel.json
2025-08-25 13:56:07 -06:00
Bufka2011
fcabf659af To be translated 2025-08-25 13:42:17 -06:00
Bufka2011
742595c83f I18n implementation for Meteorite Swords and Dusted Steel 2025-08-25 13:35:25 -06:00
Bufka2011
e062b4d2c3 More manual fixes 2025-08-25 13:34:06 -06:00
Bufka2011
a2a91d929a QMAW again 2025-08-25 12:47:43 -06:00
Bufka2011
7e87efcc48 QMAW 2025-08-25 12:44:22 -06:00
Bufka2011
61e10fe48f I'm tired of fixing 2025-08-25 12:25:05 -06:00
Bufka2011
518871bf2b Polonium fix 2025-08-25 12:24:33 -06:00
Bufka2011
b75e14d9fc Reader fixed 2025-08-25 12:11:43 -06:00
Bufka2011
12d2d6b8dd Fixed QMAW again 2025-08-25 12:10:30 -06:00
Bufka2011
37279845be Fixes 2025-08-25 12:02:16 -06:00
Bufka2011
d6b095c568 Fix 2025-08-25 11:36:31 -06:00
Bufka2011
f7cf05d944 QMAW desh fix 2025-08-25 11:35:20 -06:00
Bufka2011
3cbc342af5 Red copper 2025-08-25 11:23:12 -06:00
Bufka2011
ee41e9a7ed QMAW fixes 2025-08-25 11:22:43 -06:00
Bufka2011
79074e19c2 Ferrouranium 2025-08-25 11:12:51 -06:00
Bufka2011
ad9cb55b98 More QMAW fixes 2025-08-25 11:10:35 -06:00
Bufka2011
d71057bbab QMAW fixes 2025-08-25 11:08:54 -06:00
Bufka2011
8033fde2b9 Aluminium manual fix 2025-08-25 10:52:30 -06:00
Bufka2011
b209795f60 Rangefinder 2025-08-25 10:49:22 -06:00
Bufka2011
f73d81310a Minor changes 2025-08-25 10:31:57 -06:00
HbmMods
6555d6316a
Merge pull request #2368 from RealSilverMoon/rbmki18n
i18n for RBMK DODD
2025-08-25 16:32:26 +02:00
Boblet
bf0aa7d285 changelog 2025-08-25 16:30:35 +02:00
HbmMods
fbc5177918
Merge pull request #2391 from Creeper-banner/bob
Update Simplified Chinese Localization
2025-08-25 16:30:00 +02:00
CrpBnrz
4aafbdaeac Merge remote-tracking branch 'origin/temp' into bob
# Conflicts:
#	src/main/resources/assets/hbm/manual/material/alloy.json
#	src/main/resources/assets/hbm/manual/material/aluminium.json
#	src/main/resources/assets/hbm/manual/material/arsenic.json
#	src/main/resources/assets/hbm/manual/material/arsenic_bronze.json
#	src/main/resources/assets/hbm/manual/material/bakelite.json
#	src/main/resources/assets/hbm/manual/material/bismuth.json
#	src/main/resources/assets/hbm/manual/material/bismuth_bronze.json
#	src/main/resources/assets/hbm/manual/material/bscco.json
#	src/main/resources/assets/hbm/manual/material/cadmium.json
#	src/main/resources/assets/hbm/manual/material/cadmium_steel.json
#	src/main/resources/assets/hbm/manual/material/cinnabar.json
#	src/main/resources/assets/hbm/manual/material/coke.json
#	src/main/resources/assets/hbm/manual/material/copper.json
#	src/main/resources/assets/hbm/manual/material/desh.json
#	src/main/resources/assets/hbm/manual/material/ferrouranium.json
#	src/main/resources/assets/hbm/manual/material/graphite.json
#	src/main/resources/assets/hbm/manual/material/gunmetal.json
#	src/main/resources/assets/hbm/manual/material/hss.json
#	src/main/resources/assets/hbm/manual/material/latex.json
#	src/main/resources/assets/hbm/manual/material/lead.json
#	src/main/resources/assets/hbm/manual/material/mingrade.json
#	src/main/resources/assets/hbm/manual/material/neptunium.json
#	src/main/resources/assets/hbm/manual/material/plutonium-238.json
#	src/main/resources/assets/hbm/manual/material/plutonium-239.json
#	src/main/resources/assets/hbm/manual/material/plutonium-240.json
#	src/main/resources/assets/hbm/manual/material/plutonium-241.json
#	src/main/resources/assets/hbm/manual/material/plutonium-rg.json
#	src/main/resources/assets/hbm/manual/material/plutonium.json
#	src/main/resources/assets/hbm/manual/material/polonium.json
#	src/main/resources/assets/hbm/manual/material/polymer.json
#	src/main/resources/assets/hbm/manual/material/radium.json
#	src/main/resources/assets/hbm/manual/material/rubber.json
#	src/main/resources/assets/hbm/manual/material/silicon.json
#	src/main/resources/assets/hbm/manual/material/sodium.json
#	src/main/resources/assets/hbm/manual/material/steel.json
#	src/main/resources/assets/hbm/manual/material/sulfur.json
#	src/main/resources/assets/hbm/manual/material/tantalium.json
#	src/main/resources/assets/hbm/manual/material/technetium.json
#	src/main/resources/assets/hbm/manual/material/technetium_steel.json
#	src/main/resources/assets/hbm/manual/material/thorium.json
#	src/main/resources/assets/hbm/manual/material/uranium-233.json
#	src/main/resources/assets/hbm/manual/material/uranium-235.json
#	src/main/resources/assets/hbm/manual/material/uranium-238.json
#	src/main/resources/assets/hbm/manual/material/uranium.json
#	src/main/resources/assets/hbm/manual/material/weaponsteel.json
2025-08-25 22:06:36 +08:00
RealSilverMoon
4e30ac8084 A little distinction 2025-08-25 21:02:01 +08:00
HbmMods
63d5d41d48
Merge pull request #2389 from R-Kaenbyou/new-branch-1
ME Storage bus compat for Arc Furnace
2025-08-25 10:04:54 +02:00
HbmMods
fdf73a4f06
Merge pull request #2386 from abel1502/abel-better-wings
Better murky wings
2025-08-25 09:17:18 +02:00
HbmMods
dafe4a535e
Merge pull request #2374 from arantirnecrolord/master
update uk_UA
2025-08-25 09:14:03 +02:00
HbmMods
96793ec599
Merge pull request #2371 from FOlkvangrField/Multilingual-Function-Repair
Fixed the multilingual feature failure error of the "QMAW" system
2025-08-25 09:13:41 +02:00
Boblet
951c00d79d some fixes, RBMK control rod copyable 2025-08-25 09:12:09 +02:00
Bufka2011
d5e923c263 Uhuh 2025-08-24 14:28:38 -06:00
Bufka2011
9d67211ddd Fixed a joke that has been a bad joke for centuries. 2025-08-24 14:27:48 -06:00
Bufka2011
4b28ee2227 I18n implementation for cloth 2025-08-24 12:51:25 -06:00
Bufka2011
78ea52cbab I18n implementation for ItemLemon.java 2025-08-24 12:37:14 -06:00
Bufka2011
7793f9fa24 More sorting 2025-08-24 11:09:03 -06:00
Bufka2011
1d18d832e7 Sorting 2025-08-24 11:02:13 -06:00
R-Kaenbyou
14f7668a9a
Update TileEntityMachineArcFurnaceLarge.java 2025-08-23 21:09:37 -07:00
R-Kaenbyou
f0bd84fa47
Update TileEntityMachineArcFurnaceLarge.java 2025-08-23 21:02:52 -07:00
R-Kaenbyou
13b3988829
Update ContainerMachineArcFurnaceLarge.java 2025-08-23 20:42:15 -07:00
R-Kaenbyou
0a99397f30
Add files via upload 2025-08-23 20:34:07 -07:00
R-Kaenbyou
52149b098e
Update AE2CompatHandler.java 2025-08-23 20:31:37 -07:00
R-Kaenbyou
4903b2e189
Update TileEntityMachineArcFurnaceLarge.java 2025-08-23 20:18:37 -07:00
Bufka2011
54a5769dee Minor changes 2025-08-23 20:10:04 -06:00
Bufka2011
f9369f5e02 Minor changes 2025-08-23 19:14:29 -06:00
Bufka2011
90522b98db Destroyed? 2025-08-23 18:52:10 -06:00
Bufka2011
9e83f24179 Blueprint Booklet 2025-08-23 18:49:57 -06:00
Bufka2011
9a0cadaf9d I18n implementation for guns 2025-08-23 18:10:46 -06:00
Bufka2011
3f641a843b I18n implementation for bomb parts 2025-08-23 17:51:47 -06:00
Bufka2011
60b9e1fb18 I18n implementation for missiles and sattelites 2025-08-23 17:51:01 -06:00
Bufka2011
fa6b4faeee I18n for machines implementation 2025-08-23 17:09:19 -06:00
Bufka2011
fb4bca3544
Add files via upload 2025-08-23 11:13:02 -06:00
abel1502
9e99a21969
Remove unused import 2025-08-23 19:36:45 +03:00
abel1502
0ac72afa97
Make murky wings support shift+space for hovering 2025-08-23 19:36:19 +03:00
abel1502
bdd56b6062
Remove murky wings forced slowfall 2025-08-23 19:36:16 +03:00
abel1502
16824452b0
Better fine control
Shift already introduces a slowdown, no need to account for that
2025-08-23 19:33:08 +03:00
abel1502
ee1ffc98ba
Make murky wings more controllable 2025-08-23 19:31:40 +03:00
CrpBnrz
4b52afd0e1 Merge remote-tracking branch 'origin/bob' into bob 2025-08-23 15:52:39 +08:00
CrpBnrz
aa045050a1 QMAW localization created by me 2025-08-23 15:42:04 +08:00
Creeper-banner
b7dc3fb600
Merge branch 'HbmMods:master' into bob 2025-08-23 15:40:25 +08:00
Boblet
8ea7cf4080 can't wait for people to complain about this one 2025-08-22 13:06:47 +02:00
arantirnecrolord
7505b72f7a
pipirupirupirupipi 2025-08-21 13:07:19 +03:00
arantirnecrolord
763a702ed7
xd 2025-08-20 23:55:03 +03:00
arantirnecrolord
a4e1cc139f
fuck yea 2025-08-20 23:40:27 +03:00
arantirnecrolord
ecc8151919
i am alive! 2025-08-20 23:39:07 +03:00
FOlkvangrField
b4b471e5c3 Fix 2025-08-20 21:46:59 +08:00
CrpBnrz
525169743c QMAW localization from Tokiko 2025-08-20 21:28:56 +08:00
RealSilverMoon
e1d66c93a1 i18n for RBMK DODD 2025-08-19 16:23:56 +08:00
CrpBnrz
037af08963 Fix formatted strings 2025-08-19 08:15:49 +08:00
CrpBnrz
1a13e68c67 Merge remote-tracking branch 'origin/bob' into bob 2025-08-19 08:06:42 +08:00
Boblet
a0451b46a5 the glunch 2025-08-18 16:35:50 +02:00
CrpBnrz
c86aa101ba Update zh_CN.lang 2025-08-18 22:07:50 +08:00
Bob
be03467f65 slunkus the great, lord of death 2025-08-17 23:09:50 +02:00
HbmMods
b01b88cb03
Merge pull request #2361 from Bufka2011/master
QMAW russian translation and ru_RU.lang update
2025-08-17 17:58:17 +02:00
HbmMods
b7da4e7bd1
Merge pull request #2363 from abel1502/abel-buzzsaw-fix
Fix buzzsaw not replanting wheat occasionally
2025-08-17 17:57:11 +02:00
Bob
bee95f9065 scrungus 2025-08-17 17:55:28 +02:00
abel1502
d669c4372e
Fix buzzsaw not replanting wheat occasionally 2025-08-17 12:03:45 +03:00
Bufka2011
2db923173a
Update uranium.json 2025-08-15 13:11:05 -06:00
Bufka2011
9e2f116a32
Update uranium-235.json 2025-08-15 13:10:48 -06:00
Bufka2011
eaadc36618
Update steel.json 2025-08-15 13:10:29 -06:00
Bufka2011
8ef85c4d04
Update latex.json 2025-08-15 13:10:12 -06:00
Bufka2011
ffd83ebef3
Update graphite.json 2025-08-15 13:09:55 -06:00
Bufka2011
85895f7ce8
Update coke.json 2025-08-15 13:09:37 -06:00
Bufka2011
792dff062e
Update cadmium.json 2025-08-15 13:09:10 -06:00
Bufka2011
ed67caa19c
Update arsenic.json 2025-08-15 13:08:48 -06:00
Bufka2011
74bd23d76e
Update uranium-233.json 2025-08-15 13:07:16 -06:00
Bufka2011
9a47ec30f4
Update sulfur.json 2025-08-15 13:03:46 -06:00
Bufka2011
9b7332a047
Update radium.json 2025-08-15 13:00:32 -06:00
Bufka2011
098ecd3791
Update plutonium-rg.json 2025-08-15 12:59:44 -06:00
Bufka2011
de4a359002
Update plutonium-241.json 2025-08-15 12:59:18 -06:00
Bufka2011
997ed75b79
Update plutonium-239.json 2025-08-15 12:58:42 -06:00
Bufka2011
2ad1c2121d
Update neptunium.json 2025-08-15 12:58:10 -06:00
Bufka2011
9da95bbff3
Update mingrade.json 2025-08-15 12:57:05 -06:00
Bufka2011
c99f647e15
Update desh.json 2025-08-15 12:55:42 -06:00
Bufka2011
9ff54c2495
Update coke.json 2025-08-15 12:49:51 -06:00
Bufka2011
9b412c726d
Update cinnabar.json 2025-08-15 12:48:35 -06:00
Bufka2011
470f950b1a
Update aluminium.json 2025-08-15 12:46:08 -06:00
Bufka2011
4750b0eba2
Update aluminium.json 2025-08-15 12:45:41 -06:00
Bufka2011
458ee0a90e
Update weaponsteel.json 2025-08-15 12:42:02 -06:00
Bufka2011
563defd5f1
Update uranium.json 2025-08-15 12:41:27 -06:00
Bufka2011
2546cf79b7
Update uranium-238.json 2025-08-15 12:40:41 -06:00
Bufka2011
b8fa2a67d7
Update uranium-235.json 2025-08-15 12:40:04 -06:00
Bufka2011
4c162e9f37
Update uranium-233.json 2025-08-15 12:39:07 -06:00
Bufka2011
a4b49633c6
Update thorium.json 2025-08-15 12:38:13 -06:00
Bufka2011
00980d937a
Update technetium_steel.json 2025-08-15 12:37:24 -06:00
Bufka2011
c39854dbb4
Update technetium.json 2025-08-15 12:36:49 -06:00
Bufka2011
aa5c85ade5
Update tantalium.json 2025-08-15 12:36:10 -06:00
Bufka2011
cdda91f2d8
Update sulfur.json 2025-08-15 12:35:44 -06:00
Bufka2011
84c69e7803
Update steel.json 2025-08-15 12:35:04 -06:00
Bufka2011
1709848209
Update sodium.json 2025-08-15 12:34:22 -06:00
Bufka2011
f6ce5b5ae7
Update silicon.json 2025-08-15 12:33:30 -06:00
Bufka2011
bbe87c34c3
Update rubber.json 2025-08-15 12:31:34 -06:00
Bufka2011
37cee61269
Update radium.json 2025-08-15 12:30:23 -06:00
Bufka2011
81f9915e54
Update polymer.json 2025-08-15 12:28:38 -06:00
Bufka2011
8c696a6f64
Update polonium.json 2025-08-15 12:28:11 -06:00
Bufka2011
61ab6dda7b
Update plutonium.json 2025-08-15 12:27:31 -06:00
Bufka2011
96976e9fb4
Update plutonium-rg.json 2025-08-15 12:26:51 -06:00
Bufka2011
2bd11fdd71
Update plutonium-241.json 2025-08-15 12:25:58 -06:00
Bufka2011
07a6b144c8
Update plutonium-240.json 2025-08-15 12:25:18 -06:00
Bufka2011
d8a6272597
Update plutonium-239.json 2025-08-15 12:24:51 -06:00
Bufka2011
0911ddc423
Update plutonium-238.json 2025-08-15 12:24:01 -06:00
Bufka2011
8e102c3fc8
Update neptunium.json 2025-08-15 12:21:07 -06:00
Bufka2011
aaff825539
Update mingrade.json 2025-08-15 12:20:22 -06:00
Bufka2011
0748abae07
Update lead.json 2025-08-15 12:18:39 -06:00
Bufka2011
1051342526
Update latex.json 2025-08-15 12:18:22 -06:00
Bufka2011
adc57e79b4
Update hss.json 2025-08-15 12:17:24 -06:00
Bufka2011
7741330fec
Update gunmetal.json 2025-08-15 12:16:48 -06:00
Bufka2011
74b0e4e929
Update graphite.json 2025-08-15 12:16:14 -06:00
Bufka2011
a88b7ef5df
Update ferrouranium.json 2025-08-15 12:15:33 -06:00
Bufka2011
f003235381
Update desh.json 2025-08-15 12:14:15 -06:00
Bufka2011
0920358df4
Update copper.json 2025-08-15 12:12:16 -06:00
Bufka2011
75dd1ea555
Update coke.json 2025-08-15 12:10:00 -06:00
Bufka2011
6def4eaac9
Update cinnabar.json 2025-08-15 11:56:58 -06:00
Bufka2011
c841002f70
Update cadmium_steel.json 2025-08-15 11:55:30 -06:00
Bufka2011
3ddad84863
Update cadmium.json 2025-08-15 11:51:11 -06:00
Bufka2011
907d97e1ba
Update bismuth_bronze.json 2025-08-15 11:50:01 -06:00
Bufka2011
af9780f57d
Update bismuth.json 2025-08-15 11:49:28 -06:00
Bufka2011
e6901d8134
Update bakelite.json 2025-08-15 11:47:36 -06:00
Bufka2011
5f041cde7d
Update arsenic_bronze.json 2025-08-15 11:46:50 -06:00
Bufka2011
4c67d4d0c3
Update bscco.json 2025-08-15 11:45:47 -06:00
Bufka2011
bdba1fc503
Update alloy.json 2025-08-15 11:44:20 -06:00
Bufka2011
ad6c7c06a5
Update aluminium.json 2025-08-15 11:40:54 -06:00
Bufka2011
8ddc169c31
Update arsenic.json 2025-08-15 11:38:35 -06:00
Bufka2011
9b316af586
Update alloy.json 2025-08-15 11:14:49 -06:00
Bufka2011
419b207eff
Merge branch 'HbmMods:master' into master 2025-08-15 11:11:19 -06:00
Bob
ba24ed64aa pink one detected 2025-08-15 17:59:39 +02:00
Boblet
9cfdc17115 multidimensional time crystal 2025-08-14 16:20:39 +02:00
Boblet
938c28f293 work, whore 2025-08-11 11:59:28 +02:00
Boblet
b374f4088b agony 2025-08-11 11:52:48 +02:00
Boblet
5444f57cad the glunch 2025-08-11 11:14:06 +02:00
Bufka2011
0ec1e5735a
rebar 2025-08-10 18:32:07 -06:00
Bob
219db7acdf blup 2025-08-10 22:02:23 +02:00
HbmMods
afab6c7750
Merge pull request #2348 from MellowArpeggiation/master
NBTStructureLib features & /ntmlocate command
2025-08-10 20:13:56 +02:00
HbmMods
8117f9b888
Merge pull request #2343 from legendarydoge30/oc-capacitor
opencomputer capacitor
2025-08-10 20:10:24 +02:00
HbmMods
b5363ef039
Merge pull request #2341 from PewPewCricket/master
add waste barrel and vitrified waste barrel recipes to assembly machine.
2025-08-10 20:09:36 +02:00
HbmMods
6f97e04dda
Merge pull request #2338 from Bufka2011/master
ru_RU update
2025-08-10 20:09:02 +02:00
HbmMods
f523b958d6
Merge pull request #2329 from NarekoMichigami810/master
zh_CN update
2025-08-10 20:08:35 +02:00
HbmMods
a9f2762a97
Merge pull request #2326 from 70000hp/the-gog-block
Update BlockWandLogic.java
2025-08-10 20:08:15 +02:00
Bob
242c4f5b03 drowned in the slop, forgotten in the slurry 2025-08-10 20:07:53 +02:00
George Paton
3f72a93d28 tandems! checking if all the affected chunks have generated yet has NOT yet been implemented tho 2025-08-08 18:44:29 +10:00
George Paton
7213b9b84d move jiggy map 2025-08-08 16:53:13 +10:00
道神 馴子
0c5c7a4150
bee 2025-08-08 14:37:24 +08:00
道神 馴子
10e21a2676
Merge branch 'HbmMods:master' into master 2025-08-08 14:29:51 +08:00
George Paton
3877a666a6
Merge branch 'master' into master 2025-08-08 14:55:30 +10:00
George Paton
84601f685f NBTStructureLib features brought back to NTM, including:
* `/locate` command
* custom spawning rules (eg. make something always spawn at 0,0)
* code structure reorg
* extra logging for misconfigured structures
2025-08-08 14:51:45 +10:00
Bob
a7c1a42244 scat 2025-08-07 20:23:28 +02:00
Bob
e8b7504fff and that's QMAW 2025-08-07 17:45:16 +02:00
道神 馴子
e450bbc49d
only thing i love 2025-08-07 17:17:27 +08:00
道神 馴子
26f1b38df9
Merge branch 'HbmMods:master' into master 2025-08-07 15:26:57 +08:00
Bob
d70464b3d1 QMAW the second (third?) 2025-08-06 20:13:44 +02:00
LegendaryDoge30
7bfb6ac7c6 open computer
open computers capacitor
2025-08-06 02:13:36 +02:00
PewPewCricket
96f02c6a16 add yellow waste barrel and vitrified waste barrel recipes to assembly machine. 2025-08-05 14:40:46 -05:00
Bufka2011
852e89b21d
typo fix 2025-08-05 12:30:32 -06:00
道神 馴子
b7ced0b946
Merge branch 'HbmMods:master' into master 2025-08-05 11:16:59 +08:00
Bufka2011
05630028a0
Merge branch 'HbmMods:master' into master 2025-08-04 20:11:22 -06:00
Bufka2011
30a20e34e0
Update ru_RU.lang 2025-08-04 20:11:12 -06:00
Bob
a5bdfa87d9 it just works 2025-08-04 20:16:50 +02:00
Bob
69b9ea9a7d consumed by the sludge 2025-08-04 19:18:41 +02:00
Bufka2011
889cc46486
Merge branch 'HbmMods:master' into master 2025-08-01 15:59:32 -06:00
道神 馴子
bafa8d6dba
Beyond the time 2025-08-01 13:46:45 +08:00
70000hp
5f999100d1 Update BlockWandLogic.java 2025-07-31 16:10:23 -04:00
Bob
737c56ed07 PUREX 2025-07-31 21:49:31 +02:00
Bufka2011
8d63e86a98
Merge branch 'HbmMods:master' into master 2025-07-31 09:24:12 -06:00
Bufka2011
ddc6e42f55
Update ru_RU.lang 2025-07-31 09:24:06 -06:00
Bufka2011
423cbbcf79
Update ru_RU.lang 2025-07-30 15:06:04 -06:00
Bufka2011
ef3397ddb1
Update ru_RU.lang 2025-07-30 14:55:18 -06:00
Bob
daae2a5e32 exponsiv 2025-07-30 22:40:28 +02:00
Bufka2011
5b22da19c4
Update ru_RU.lang 2025-07-30 13:49:47 -06:00
Bufka2011
e6c059041e
Update ru_RU.lang 2025-07-30 13:45:48 -06:00
Bufka2011
b9332f2e81
Update ru_RU.lang 2025-07-30 13:42:46 -06:00
Bufka2011
4d25b5dc8b
Update ru_RU.lang 2025-07-30 13:42:13 -06:00
Bufka2011
55bfe1b8d2
Update ru_RU.lang 2025-07-30 13:40:16 -06:00
Bufka2011
82b02c29ea
Update ru_RU.lang 2025-07-29 13:18:25 -06:00
Bufka2011
e85ae838c6
Update ru_RU.lang 2025-07-29 12:31:33 -06:00
Bufka2011
77df7e6cde
Update ru_RU.lang 2025-07-29 12:28:14 -06:00
Bufka2011
c82e371ec8
Update ru_RU.lang 2025-07-29 11:45:26 -06:00
Bufka2011
b656e1d22e
Update ru_RU.lang 2025-07-29 11:44:03 -06:00
Bufka2011
18855018c4
Update ru_RU.lang 2025-07-29 11:41:09 -06:00
Bob
7f887a623a 🅱️alls 2025-07-27 17:10:39 +02:00
HbmMods
66e0a0252b
Merge pull request #2311 from PewPewCricket/master
Fix flow control pump oc compat (i forgot to add one line in the last commit)
2025-07-25 17:51:38 +02:00
HbmMods
7b30d17031
Merge pull request #2302 from Nycticoraxnightheron/master
zh_CN update
2025-07-25 17:51:21 +02:00
Bob
131e4fd42d yesterday's shit buffet 2025-07-25 17:50:13 +02:00
PewPewCricket
7aa8818a5b Merge branch 'master' of github.com:PewPewCricket/Hbm-s-Nuclear-Tech-GIT 2025-07-24 13:34:00 -05:00
PewPewCricket
f0679b04cc fix FCP oc compat 2025-07-24 13:30:59 -05:00
Bob
2102db6229 RBMK autoloader 2025-07-24 15:12:54 +02:00
Justnightheron
a8485bdb5a
kris 2025-07-24 00:31:25 +08:00
Justnightheron
71695de235
Merge branch 'HbmMods:master' into master 2025-07-24 00:22:35 +08:00
Bob
fd04024706 cast yourself a whole house, cast yourself a new mother,
cast a vacation straight to fucking hell
2025-07-23 16:34:11 +02:00
Bob
2f74d17823 pouring out the conk 2025-07-22 23:17:59 +02:00
Justnightheron
9d558a68f3
😭 2025-07-22 18:42:21 +08:00
Bob
05bc334274 1v1 me on twitter vro 2025-07-21 00:52:02 +02:00
Bob
b7641dcd54 now's your chance to take a [BIG SHIT] 2025-07-18 23:34:43 +02:00
HbmMods
6bbb002e34
Merge pull request #2296 from arantirnecrolord/master
update uk_UA
2025-07-18 11:13:29 +02:00
arantirnecrolord
06930f6ec8
update uk_UA 2025-07-18 11:57:22 +03:00
HbmMods
2e6ca970a7
Merge pull request #2292 from WolfEclipses/master
Modified Radiolysis machine GUI
2025-07-18 08:09:16 +02:00
HbmMods
83876e388f
Merge pull request #2294 from abel1502/abel-fix-rbmk-console
Fix RBMK console rotation
2025-07-18 08:08:15 +02:00
HbmMods
85bef7672e
Merge pull request #2295 from PewPewCricket/master
Add OpenComputers compat for fluid pump and fix CCGT allowing throttle over max when using OpenComputers callbacks
2025-07-18 08:06:53 +02:00
PewPewCricket
8686a64141 fix CCGT allowing throttle over max when using OpenComputers callbacks 2025-07-17 14:46:57 -05:00
PewPewCricket
5fb88801ec add oc compat for fluid pump 2025-07-17 14:04:52 -05:00
abel1502
0c5077b54a
Don't forget OpenComputers 2025-07-17 21:40:57 +03:00
abel1502
23487bd0d8
Fix RBMK console rotation 2025-07-17 21:26:05 +03:00
Wolf
faa87edd40 Modified Radiolysis machine GUI to show rtg pellet location, tried to match with rtg style. I can also update to new gui style used in recent commits, but decided this was a start. 2025-07-17 11:20:15 -04:00
HbmMods
cc9d04d063
Merge pull request #2291 from Nycticoraxnightheron/master
zh_CN update
2025-07-17 07:57:04 +02:00
HbmMods
5b6f8e5b3d
Merge pull request #2290 from wiesenmann/paintable-pneumatic-tubes
Add a Full Block Paintable Pneumatic Tube
2025-07-17 07:56:40 +02:00
HbmMods
563b726b62
Merge branch 'master' into paintable-pneumatic-tubes 2025-07-17 07:56:31 +02:00
HbmMods
d389a2cf84
Merge pull request #2285 from PewPewCricket/master
Add Paintable Network Cable
2025-07-17 07:54:12 +02:00
Bob
9cf7cc6643 bluh 2025-07-16 21:59:48 +02:00
Justnightheron
6bbb354a9f
Rape that wall 2025-07-16 19:46:37 +08:00
wiesenmann
af6f3d76fe german localization fix 2025-07-16 13:08:48 +02:00
wiesenmann
97556e4c5a add paintable pneumatic tube 2025-07-16 11:56:10 +02:00
PewPewCricket
8bdf209c0b Merge branch 'master' of https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT 2025-07-15 16:46:12 -05:00
Bob
f94fd70cf0 falling in love with a corporate illustration 2025-07-15 21:42:05 +02:00
Boblet
281e66b37e my love is a quickscope 2025-07-15 16:00:43 +02:00
PewPewCricket
73c2f9aa67 Merge branch 'master' of github.com:PewPewCricket/Hbm-s-Nuclear-Tech-GIT 2025-07-15 04:12:58 -05:00
PewPewCricket
fa6d8c1a54 Merge branch 'master' of https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT 2025-07-15 04:11:47 -05:00
PewPewCricket
e18cc2d729
Merge branch 'HbmMods:master' into master 2025-07-15 04:10:38 -05:00
PewPewCricket
5f8b0f6aed fix TileEntityOpenComputersCablePaintable not implementing ICopyable and add null check for ModBlocks.oc_cable_paintable in CraftingManager.java 2025-07-15 04:10:06 -05:00
HbmMods
83b3ce085e
Merge pull request #2279 from abel1502/abel-door-hitboxes
Fix door hitboxes
2025-07-15 08:32:50 +02:00
HbmMods
6374f912cb
Merge pull request #2282 from abel1502/abel-electrolyzer-persist-gui
Persist electrolyzer GUI
2025-07-15 08:31:42 +02:00
HbmMods
cf94df9e48
Merge pull request #2284 from BallOfEnergy1/patch-1
Fix server crash due to client-side var being accessed on server
2025-07-15 08:30:47 +02:00
HbmMods
9ab3bc865b
Merge pull request #2286 from Pvndols/master
CCGT V3
2025-07-15 08:26:46 +02:00
PewPewCricket
76368acbf8 remove unused imports in BlockOpenComputersCablePaintable.java 2025-07-14 20:52:12 -05:00
PewPewCricket
da605a794e
Merge branch 'HbmMods:master' into master 2025-07-14 20:50:10 -05:00
PewPewCricket
02a4bf483e add dyable cable color functionality to paintable network cable 2025-07-14 20:31:54 -05:00
Boblet
12dbb340dd half-priced salammi 2025-07-14 16:42:54 +02:00
pvn
2cd25dbfb1
Merge branch 'HbmMods:master' into master 2025-07-14 12:41:43 +02:00
Bob
c83a53b62a ass embluh 2025-07-13 23:27:29 +02:00
Pvndols
982e50556b mauricio i can't move it move it anymore
AAAAAAAAAAAAAAAAAAAAA
2025-07-13 22:47:48 +02:00
Pvndols
dc04226713 fuck 2025-07-13 22:45:05 +02:00
Pvndols
fa6497146a hopefully i didn't fuck up
CCGT changes, automode now lowers throttle when fuel low, displays fuel consumption instead of a generic power setting in the GUI, small change in GUI description, the texture now includes what should be an air filter at the tubine intake. i am NOT good at texturing.
2025-07-13 22:43:02 +02:00
Pvndols
119b8a037b Revert "the spinniest of the fidgets"
This reverts commit 2841c8b67b8f459573142bbf33b1727f57159495.
2025-07-13 22:30:34 +02:00
Pvndols
e4f980e21c Merge remote-tracking branch 'origin/master' 2025-07-13 22:23:37 +02:00
PewPewCricket
da2abe281d add paintable network cable 2025-07-13 14:57:43 -05:00
Pvndols
2841c8b67b the spinniest of the fidgets
CCGT changes, automode now lowers throttle when fuel low, displays fuel consumption instead of a generic power setting in the GUI, small change in GUI description, the texture now includes what should be an air filter at the tubine intake. i am NOT good at texturing.
2025-07-13 21:05:28 +02:00
BallOfEnergy
fb32763c88
Update PistonInserter.java; Fix server crash due to client-side variable. 2025-07-13 11:45:17 -05:00
abel1502
4b6cf3473d
Save electrolyzer GUI 2025-07-13 13:19:43 +03:00
Boblet
10d8551ce3 all zinced up 2025-07-11 14:56:46 +02:00
abel1502
f2f3e04bb0
Fix gap in secure access door 2025-07-11 15:19:33 +03:00
abel1502
3c2d49419f
Use separate collision and visual boxes on doors
Also improve the user experience with smaller doors, by making the visual hitbox cover the entire door even when open. (In repsonse to Mellow's critique)
2025-07-11 15:09:17 +03:00
abel1502
16fcac0a3c
Support collision-only/visual-only boxes on doors 2025-07-11 15:09:00 +03:00
Boblet
89100738f4 holy cungadero do i feel good 2025-07-10 16:58:37 +02:00
HbmMods
ca3af9e863
Merge pull request #2270 from Toshayo/microblocks
Added Forge MicroBlocks support
2025-07-10 08:02:26 +02:00
HbmMods
ee99c1e491
Merge pull request #2269 from 70000hp/the-bob-mlock
The Logic Block
2025-07-10 07:55:33 +02:00
Toshayo
ef54c6e23b
Added Forge MicroBlocks support 2025-07-09 23:22:51 +02:00
70000hp
e7ebc7dd07 thunder fire all your generation 2025-07-09 13:10:47 -04:00
70000hp
c33b962043 misc fix 2025-07-09 13:07:33 -04:00
70000hp
603cc10696 Interactions for the logic block 2025-07-09 13:07:33 -04:00
70000hp
541c6a1c99 Interactions for the logic block 2025-07-09 13:07:33 -04:00
70000hp
21efc6b61c Interactions for the logic block 2025-07-09 13:07:33 -04:00
70000hp
3d77afab1f disguises for the logic block 2025-07-09 13:07:33 -04:00
70000hp
714a5298a9 disguises for the logic block 2025-07-09 13:07:33 -04:00
70000hp
acb01b13e0 copy tool support and working directional offsets 2025-07-09 13:07:33 -04:00
70000hp
274995ebd6 copy tool support and working directional offsets 2025-07-09 13:07:33 -04:00
70000hp
c42e03c268 the gob block 2025-07-09 13:07:33 -04:00
70000hp
453c47c6f0 the gob block 2025-07-09 13:07:33 -04:00
Boblet
9c818f45d1 scum construction machine 2025-07-09 16:56:42 +02:00
Boblet
dcdf5c4f27 Revert "Merge pull request #2261 from 70000hp/the-lob-block"
This reverts commit f24c244730c0ae9bf83437b5d2f0d062a5482e61, reversing
changes made to 0cf9d88e36f0a7209a840419ce1f3cbf277e3a9a.
2025-07-09 09:57:49 +02:00
HbmMods
0e92a96b2a
Merge pull request #2267 from abel1502/abel-rbmk-crane-span
RBMK crane improvement
2025-07-09 08:25:19 +02:00
HbmMods
8a3c8b5e10
Merge pull request #2268 from abel1502/abel-qe-sliding-door
Stop QE sliding door model clipping
2025-07-09 08:24:34 +02:00
HbmMods
f24c244730
Merge pull request #2261 from 70000hp/the-lob-block
Dungeon Action Block, and Mob Decorator improvments
2025-07-09 08:19:43 +02:00
abel1502
19fd479170
Fix stuff 2025-07-09 01:50:09 +03:00
abel1502
0e5e114b12
Stop QE sliding door model clipping 2025-07-09 01:27:04 +03:00
abel1502
d8080835f8
Detect room bounds when linking RBMK crane 2025-07-09 01:25:58 +03:00
abel1502
097b2bb12c
Fix RBMK crane girder rendering with unequal spans 2025-07-09 01:25:54 +03:00
abel1502
8294df1aa3
Extend RBMK crane reach forward
Enables close-to-real-life reactor hall replicas, with the storage columns being located further in the reactor hall than the reactor itself
2025-07-09 01:25:45 +03:00
Boblet
0cf9d88e36 needle punch fuck machine 2025-07-08 16:46:41 +02:00
Boblet
6b1d61166f rotten grussy 2025-07-07 16:56:23 +02:00
Bob
ba220420fe the sludge 2025-07-06 22:35:26 +02:00
Bob
79c7faf55b scatman's world 2025-07-05 23:43:55 +02:00
Boblet
0880287660 assembler module 2025-07-04 15:24:28 +02:00
70000hp
360b0acabe Interactions for the logic block 2025-07-04 09:21:13 -04:00
HbmMods
b3983f7fb8
Merge pull request #2259 from abel1502/abel-abilities-fix
Fix ItemToolAbility bedrock breaking
2025-07-04 09:36:28 +02:00
70000hp
edd952ec6a Interactions for the logic block 2025-07-03 15:09:16 -04:00
Boblet
6282bd028d ough 2025-07-03 15:01:24 +02:00
abel1502
ac45637bf6
Just a bit more null checks 2025-07-03 12:26:59 +03:00
abel1502
4983002013
Fix ItemToolAbility bedrock breaking 2025-07-03 12:22:33 +03:00
Boblet
3da96091da flixes 2025-07-02 16:50:20 +02:00
70000hp
8bef7d63dd disguises for the logic block 2025-07-01 20:11:39 -04:00
Boblet
c55c8c5da1 the moon is cheese that makes you trip balls 2025-07-01 15:57:56 +02:00
HbmMods
90813de8cc
Merge pull request #2251 from Nycticoraxnightheron/master
zh_CN update
2025-07-01 11:02:55 +02:00
Justnightheron
90ab38dc44
2025-07-01 16:58:23 +08:00
HbmMods
3592deca8e
Merge pull request #2250 from MellowArpeggiation/master
Nodespace performance improvements MkII
2025-07-01 10:03:23 +02:00
George Paton
58da6f154e move door to faster network serialization, remove now unused door sync packet 2025-07-01 17:46:33 +10:00
George Paton
25a2172c6b switch to LinkedHashMap for 23x performance improvement! 2025-07-01 17:44:52 +10:00
HbmMods
8685831c04
Merge pull request #2247 from abel1502/abel-trapdoors
Add a steel trapdoor
2025-07-01 08:34:04 +02:00
70000hp
1f7131536c Merge branch 'master' into the-lob-block 2025-06-30 16:07:33 -04:00
70000hp
1a9fc72a93 copy tool support and working directional offsets 2025-06-30 15:33:26 -04:00
Lazzzycatwastaken
43f38d8679 sdsa 2025-06-30 17:38:36 +02:00
Boblet
c08a90553a FLESH 2025-06-30 16:30:59 +02:00
abel1502
533dfd6ded
Fix localization 2025-06-30 16:08:38 +03:00
abel1502
ac7f186528
Oops 2025-06-30 16:04:01 +03:00
abel1502
17b0dde444
Remove all but the steel trapdoor 2025-06-30 16:02:38 +03:00
abel1502
1da6140e2e
Merge branch 'master' of https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT into abel-trapdoors 2025-06-30 15:58:53 +03:00
HbmMods
cac082a6e2
Merge pull request #2246 from abel1502/abel-tangible-presses
Turn burner & electric press into proper pseudomultiblocks
2025-06-30 09:14:05 +02:00
abel1502
2e5882df60
Don't break the whole thing 2025-06-30 09:15:12 +03:00
abel1502
f792fdebe3
Make presses un-multiblockable with a hand drill
As per @MellowArpeggiation 's request. Meant for schenanigans with visually squishing things
2025-06-30 09:12:20 +03:00
HbmMods
4875aefba4
Merge pull request #2245 from abel1502/abel-buffer-extractor
Make conveyor extractors take items to inventory when not facing a conveyor
2025-06-30 08:01:18 +02:00
70000hp
3db1dbd277 the gob block 2025-06-29 19:11:39 -04:00
abel1502
18a310ba3a
Prevent pseudomultiblocks disappearing on chunk boundaries
If this was indeed a problem, it must've been one before my PR... I suspect maybe some of my intermediate implementations allowed this to have an effect. Regardless, this is definitely a useful fix
2025-06-30 00:25:33 +03:00
abel1502
d1497abd1e
Simplify press click handling
Turns out there is already a function for doing just that
2025-06-29 23:41:47 +03:00
Bob
3583ad66cd ough 2025-06-29 22:30:04 +02:00
abel1502
d1f50a8eb4
Fix press auto-migration 2025-06-29 15:45:52 +03:00
HbmMods
27c0c94897
Merge pull request #2241 from abel1502/abel-misc-tweaks-2
QoL tweaks 2
2025-06-29 10:31:48 +02:00
HbmMods
42d45506bd
Merge pull request #2244 from abel1502/abel-suspend-inserter
Allow stopping conveyor inserters with redstone
2025-06-29 10:23:24 +02:00
HbmMods
3658953d33
Merge pull request #2243 from Lazzzycatwastaken/zg
hotfix because github decided not to push the actual NBT file ???
2025-06-29 10:22:43 +02:00
abel1502
3b36807242
Trigger the press fix automatically 2025-06-29 02:01:25 +03:00
Bob
b89bec56c8 gun 2025-06-29 00:06:44 +02:00
abel1502
0eb87524ab
Make new press implementation savegame-compatible 2025-06-29 01:05:39 +03:00
abel1502
4a869ae2ea
Add automatic migration API to BlockDummyable 2025-06-29 01:05:10 +03:00
abel1502
41d62c49db
Remove broken & redundant transformMeta 2025-06-29 00:24:47 +03:00
abel1502
1bb88b176a
More fixes
Turns out, pseudomultiblocks are pretty complicated
2025-06-29 00:10:49 +03:00
abel1502
1f073d570c
Fix createNewTileEntity and clean up a bit 2025-06-28 23:53:38 +03:00
abel1502
f6f1c1c380
Turn presses into pseudomultiblocks
Affects burner and electrical press. They seem to have been implemented largely based on copy-pasted furnace code, and seemingly predate BlockDummyable. That meant the top two blocks of a press were intangible. Now they're in line with the rest of the machines, including the conveyor press.
2025-06-28 23:53:35 +03:00
abel1502
997e96f757
Exclude special slots 2025-06-28 23:23:39 +03:00
abel1502
db109d8bcf
Crane extractors take items to inventory when not facing a conveyor
Allows using them as an ad-hoc hopper with a small buffer. Previously their buffer was effectively rudimentary -- it was used for output, but nothing ever inputted into it.
2025-06-28 23:16:20 +03:00
abel1502
9a7124c8ff
Allow stopping conveyor inserters with redstone
A stopped inserted will still take items to its own inventory, but won't insert them into the inventory it is facing. Useful for taking out stuff from overflowing outputs, if you want to maintain a particular slot distribution.
2025-06-28 22:52:13 +03:00
abel1502
a3578e67a0
Revert "Make exhaustion only apply once"
This reverts commit 6946a70f18feb98b8297b3a68cd0c031c5dac284.
2025-06-28 22:41:11 +03:00
Lazzzycat
92bce167f3
Merge branch 'HbmMods:master' into zg 2025-06-28 21:01:25 +02:00
Lazzzycatwastaken
14377708be fuck you github 2025-06-28 21:00:53 +02:00
HbmMods
fa075a3bd4
Merge pull request #2239 from Lazzzycatwastaken/zg
fixing dickhouse glitched
2025-06-28 20:25:30 +02:00
HbmMods
62e32f70c6
Merge pull request #2226 from abel1502/abel-ae2-compat
Mass Storage AE2 compatibility
2025-06-28 19:25:45 +02:00
HbmMods
942f7fefea
Merge pull request #2235 from MerrittK/shredder_dust_fix
Shredder Preferential Ore registry.
2025-06-28 19:21:12 +02:00
HbmMods
c6fce12a0b
Merge pull request #2232 from 70000hp/port-tooltip-rfurnace
Rotary Furnace Port Tooltip
2025-06-28 19:19:35 +02:00
HbmMods
f4a1e8beed
Merge pull request #2228 from arantirnecrolord/master
uk_UA update
2025-06-28 19:16:44 +02:00
HbmMods
18a6f228c6
Merge pull request #2223 from Nycticoraxnightheron/master
zh_CN update
2025-06-28 19:16:15 +02:00
HbmMods
096cd046c5
Merge pull request #2221 from DangerousMilk/exhaust-block
Paintable Coated Variant Of The Exhaust Pipe.
2025-06-28 19:15:59 +02:00
Lazzzycat
a70410f5dd
Merge branch 'HbmMods:master' into Forwetst 2025-06-28 18:24:36 +02:00
Lazzzycat
f3ee962e8e
Merge branch 'HbmMods:master' into NTMRUINS1 2025-06-28 18:24:28 +02:00
Lazzzycat
bfe043b81d
Merge branch 'HbmMods:master' into Radio-house 2025-06-28 18:24:15 +02:00
Lazzzycat
f5db461bfd
Merge branch 'HbmMods:master' into forestchem 2025-06-28 18:23:45 +02:00
Lazzzycat
36080e183a
Merge branch 'HbmMods:master' into forestpost 2025-06-28 18:23:36 +02:00
abel1502
6946a70f18
Make exhaustion only apply once 2025-06-28 04:08:02 +03:00
abel1502
5a0dabc5a9
Bunch all mined blocks in one spot
Solves the problem of veinmined stuff being stuck in enclosed pockets, even with a magnet active
2025-06-28 04:07:42 +03:00
abel1502
71c1eaf430
Change flat AoE icon 2025-06-28 04:06:11 +03:00
abel1502
b400b88701
Add flat AoE ability 2025-06-28 04:06:03 +03:00
abel1502
f820ae32e2
Fix crate locked slot 2025-06-28 04:04:02 +03:00
abel1502
a40d0b3513
Make doors click-through when open
Currently clicking on anything beyond an open door just makes it close, despite there being no indications for that and the colliders clearly already not being there.
2025-06-28 04:03:41 +03:00
abel1502
0b5731266e
Hide spotlights on maps 2025-06-28 04:03:28 +03:00
abel1502
dec8c9c43a
Wow mojang is stupid
Or at least the mapping author is. How could I not get that `getBlocksMovement` should return if the block DOESN'T block movement, that's so obvious, why would I ever think otherwise
2025-06-28 04:03:12 +03:00
abel1502
466f12e6e2
Fix pathfinding on spotlights 2025-06-28 04:02:57 +03:00
Lazzzycatwastaken
32fc58821a sludge 2025-06-27 21:23:53 +02:00
Bob
03693e7c0a girl dinner (a bottle of whiskey) 2025-06-26 00:32:37 +02:00
MerrittK
57b0cc4727
Merge branch 'HbmMods:master' into shredder_dust_fix 2025-06-25 15:16:49 -04:00
MerrittK
89b145fde8 Merge branch 'shredder_dust_fix' of https://github.com/MerrittK/Hbm-s-Nuclear-Tech-GIT into shredder_dust_fix 2025-06-25 15:15:14 -04:00
MerrittK
a982616f89 I had to reinvent the wheel because of a different config implementation. 2025-06-25 15:12:00 -04:00
Boblet
2a7033bb76 lord of the lockerroom ft. big macintosh and his massive gun 2025-06-25 15:59:05 +02:00
70000hp
7737ac7989 Rotary Furnace Port Tooltip
Says what it does on the tin, hovering over the rotary furnace steam, fluid, and fuel ports, tells you what each one is for

Also gets rid of a vanilla obfuscation ID variable on a NTM class for strange reasons
2025-06-24 17:46:18 -04:00
MerrittK
46c59eace3
Merge branch 'HbmMods:master' into shredder_dust_fix 2025-06-24 10:41:40 -04:00
MerrittK
18d8fe292c Fixed Advanced rocketry moon turf compat 2025-06-24 10:40:21 -04:00
Boblet
f416b9ad44 born to shit (forced to wipe) 2025-06-24 15:58:10 +02:00
arantirnecrolord
1615096a84
i just don't know 2025-06-24 09:23:32 +03:00
Boblet
78c33e904d <agony> 2025-06-23 16:58:46 +02:00
Bob
3e3b651d11 i hereby name thee "sexy" 2025-06-22 16:11:06 +02:00
Justnightheron
25a7222cf2
Merge branch 'HbmMods:master' into master 2025-06-21 00:43:18 +08:00
Boblet
c2354adbc3 IFluidRegisterListener 2025-06-20 14:47:15 +02:00
arantirnecrolord
5a12d14948
fuck 2025-06-20 12:47:17 +03:00
arantirnecrolord
014a253e43
хімічний завод uk_UA 2025-06-20 12:09:26 +03:00
arantirnecrolord
dd5e4e1343
Merge branch 'HbmMods:master' into master 2025-06-20 12:07:55 +03:00
abel1502
149e79f550
Fix crash without AE2 2025-06-20 02:26:31 +03:00
abel1502
d15ab7079a
Reduce dependencies
If I understand it correctly, the implementation rule is there to include anything we use in the mod that is not part of the API? If so, I don't use anything like that. Anyway, it compiles, and it runs, so I'm happy with it. Revert this if issues arise, I guess
2025-06-20 02:00:49 +03:00
abel1502
2744ab322c
Fix annotations
Turns out the InterfaceList is obligatory, even if there's only one interface
2025-06-20 02:00:45 +03:00
abel1502
eaa2dfa23d
Add optional interface annotations 2025-06-20 01:42:38 +03:00
abel1502
9b08adc314
Mass Storage AE2 compat 2025-06-20 01:28:35 +03:00
Bob
381ef334b2 yet more chemfac crap 2025-06-19 21:27:56 +02:00
Boblet
570ad03802 who's been drawing dyx 2025-06-18 16:27:14 +02:00
Justnightheron
06a1b9163d
M78 2025-06-18 16:57:55 +08:00
DangerousMilk
ad4b1733d5 Fixed NBT data not saving. 2025-06-17 20:30:54 +02:00
Boblet
5aee91636c i stuck my ballsack in the coolant line & it got obliterated by delta P 2025-06-17 16:30:00 +02:00
DangerousMilk
474148110d Added the TileEntity to the TileMappings. Removed unnecessary canConnectTo function and TileEntityPipePaintable import 2025-06-17 14:23:45 +02:00
HbmMods
983f91edc5
Merge pull request #2215 from mlbv/master
mk5 performance improvement
2025-06-17 08:14:36 +02:00
DangerousMilk
155595772c Added recipe and changed function order to make more sense. 2025-06-16 17:48:05 +02:00
Boblet
5f08488268 d'oh 2025-06-16 16:17:31 +02:00
Bob
1e26546c79 chemfac chemfac 2025-06-15 22:40:59 +02:00
DangerousMilk
b328130edb Added paintable coated variant of the exhaust pipe. 2025-06-15 19:55:37 +02:00
mlbv
baad5cefbe feat: add RESOLUTION_FACTOR
Introduce RESOLUTION_FACTOR to scale ray density for tuning. Consider exposing this in BombConfig for runtime configuration.
2025-06-14 08:30:42 +08:00
abel1502
8ad065b891
Make bunker use a sturdy trapdoor 2025-06-13 21:19:46 +03:00
Boblet
3303df8345 ough 2025-06-13 14:47:50 +02:00
mlbv
7dab92f3b2 Perf: better caching 2025-06-13 12:39:27 +08:00
mlbv
d65cc18dd8 perf: pre-size maps to avoid overhead 2025-06-13 05:19:40 +08:00
abel1502
d4d552b9dd
Fix bounding box 2025-06-12 22:43:46 +03:00
abel1502
11fc058690
Fix trapdoor operation 2025-06-12 22:18:58 +03:00
abel1502
ae593a8188
Add metal trapdoors
By analogy with metal ladders. Felt weird to cap one off with a wooden hatch. Also, the mod's trapdoors are climbable if placed above a ladder.
2025-06-12 22:08:00 +03:00
Boblet
590da72fbb whatever, go my jerma 2025-06-12 16:11:02 +02:00
mlbv
a9567d986b refactor 2025-06-12 16:48:37 +08:00
HbmMods
f4af494d2a
Merge pull request #2207 from abel1502/abel-hotfix-2025-06
Hotfix my big PR again
2025-06-11 22:32:04 +02:00
abel1502
9c3e6e2ce4
Me stupid 2025-06-11 19:55:08 +03:00
HbmMods
959570c230
Merge pull request #2204 from mlbv/master
Fix chunkloading
2025-06-11 11:33:03 +02:00
mlbv
105f44a36a description update 2025-06-11 17:26:45 +08:00
mlbv
79dcb69ed2 some refactor 2025-06-11 10:18:21 +08:00
Bob
f2991e4518 dagoth ur yaoi 2025-06-10 22:59:04 +02:00
arantirnecrolord
37546b252d
🅰️ss 2025-06-10 20:35:59 +03:00
Boblet
6bfca4e1fe 🅱️alls 2025-06-10 15:32:47 +02:00
HbmMods
f03dca7470
Merge pull request #2202 from Nycticoraxnightheron/master
zh_CN update
2025-06-10 08:20:16 +02:00
HbmMods
cb8c95278c
Merge pull request #2201 from abel1502/abel-hotfix-2025-06
Hotfix my big PR
2025-06-10 08:19:44 +02:00
Justnightheron
9dbe596401
LENS 2025-06-10 14:04:20 +08:00
abel1502
57eba8e6ec
Fix scroll direction
Apparently, I forgot to cherry-pick the commit where I'd inverted it
2025-06-09 23:45:41 +03:00
Lazzzycat
e21b14b979
Merge branch 'HbmMods:master' into Radio-house 2025-05-11 19:46:30 +02:00
Lazzzycat
149e51288f
Merge branch 'HbmMods:master' into NTMRUINS1 2025-05-11 19:46:17 +02:00
Lazzzycat
14746a76b3
Merge branch 'HbmMods:master' into Forwetst 2025-05-11 19:46:00 +02:00
Lazzzycat
b95e9b6e80
Merge branch 'HbmMods:master' into forestchem 2025-05-11 19:45:39 +02:00
Lazzzycat
59df04d608
Merge branch 'HbmMods:master' into forestpost 2025-05-11 19:45:31 +02:00
Lazzzycatwastaken
f69a1d8876 AAAAAAAAAAAAAAAAAAAAAA 2025-05-11 16:49:47 +02:00
Lazzzycatwastaken
b485558e13 ☢☢☢☢☢☢☢☢☢☢☢ 2025-05-11 16:17:29 +02:00
Lazzzycatwastaken
791b4c7687 Top 5 easiest people to scam:
1. You
2. You
3. You
4. You
5. You
2025-05-11 15:36:52 +02:00
Lazzzycatwastaken
1eecfbca85 whos getting the best head:
A. Alvin
B. Theodore
C. Simon
(Secret option) Me
2025-05-09 19:38:11 +02:00
Lazzzycatwastaken
22aefff48d get to work on the mob spawners bugboy 2025-05-06 23:18:28 +02:00
1410 changed files with 157107 additions and 49572 deletions

View File

@ -7,27 +7,46 @@
# Yes this is a mostly untouched Github actions template
name: Java CI with Gradle
on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Set up JDK 8
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'temurin' # Temurin because it's default :P
# Calculate days since 10/10/10
- name: Calculate days since 10/10/10
id: calculate_days
run: |
start_date="2010-10-10"
current_date=$(date +%Y-%m-%d)
days_since=$(( ($(date -d "$current_date" +%s) - $(date -d "$start_date" +%s)) / 86400 ))
echo "days=$days_since" >> $GITHUB_OUTPUT
# Update version files with proper sed syntax
- name: Update version files
run: |
days=${{ steps.calculate_days.outputs.days }}
# Use proper sed syntax for Linux runners
sed -i "s/public static final String VERSION = \".*\";/public static final String VERSION = \"1.0.27 BETA ($days)\";/" src/main/java/com/hbm/lib/RefStrings.java
sed -i "s/mod_build_number=.*/mod_build_number=$days/" gradle.properties
# Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
- name: Setup Gradle
@ -41,5 +60,3 @@ jobs:
with:
# A file, directory or wildcard pattern that describes what to upload
path: ./build/libs

View File

@ -2,7 +2,7 @@
[NTM on Modrinth](https://modrinth.com/mod/ntm)
[NTM on CurseForge](https://minecraft.curseforge.com/projects/hbms-nuclear-tech-mod?gameCategorySlug=mc-mods&projectID=235439)
[NTM on CurseForge](https://www.curseforge.com/minecraft/mc-mods/hbms-nuclear-tech-mod)
[Official NTM Wiki](https://nucleartech.wiki/wiki/Main_Page)
@ -10,9 +10,9 @@
**This is for 1.7.10!** For 1.12, check out these projects:
* NTM Reloaded: https://github.com/TheOriginalGolem/Hbm-s-Nuclear-Tech-GIT/releases
* NTM Community Edition (WarFactory): https://github.com/MisterNorwood/Hbm-s-Nuclear-Tech-CE
* NTM Extended Edition (Alcater): https://github.com/Alcatergit/Hbm-s-Nuclear-Tech-GIT/releases
* NTM Community Edition (WarFactory): https://codeberg.org/MrNorwood/Hbm-s-Nuclear-Tech-CE
* NTM Reloaded: https://github.com/TheOriginalGolem/Hbm-s-Nuclear-Tech-GIT/releases
For 1.18, try Martin's remake: https://codeberg.org/MartinTheDragon/Nuclear-Tech-Mod-Remake/releases
@ -25,7 +25,7 @@ Simply navigate to "Releases" on the right side of the page, download links for
Tired of waiting until the next version comes out? Here is a tutorial on how to compile the very newest version yourself:
Please note that these installation instructions are assuming you're running Microsoft Windows operating system. Linux users should know what to do by looking at the same guide.
1. Make sure you have JDK8 installed. If not, download it from [adoptium.net](https://adoptium.net/?variant=openjdk8&jvmVariant=hotspot)
1. Make sure you have JDK8 installed. If not, download it from [adoptium.net](https://adoptium.net/temurin/releases?version=8)
2. If you don't have git installed, download&install it from [here](https://git-scm.com/downloads).
3. Open up "Git Bash":
* Press Windows Button, type "Git Bash" and press ENTER

View File

@ -6,6 +6,7 @@ import java.nio.file.StandardCopyOption
buildscript {
repositories {
maven { url = 'https://maven.ntmr.dev/proxy/' }
maven { url = 'https://maven.minecraftforge.net/' }
maven { url = 'https://plugins.gradle.org/m2' }
mavenCentral()
@ -67,6 +68,10 @@ eclipse.classpath.file.whenMerged { cp ->
}
repositories {
maven {
name = 'Blerg'
url = 'https://maven.ntmr.dev/proxy/'
}
maven {
name = 'ModMaven'
url = 'https://modmaven.dev'
@ -79,6 +84,18 @@ repositories {
// name = "CurseForge"
// url = "https://minecraft.curseforge.com/api/maven/"
//}
maven {
name = "Jitpack"
url = "https://jitpack.io"
}
maven {
name = "CurseMaven"
url = "https://cursemaven.com"
}
maven {
name = "OpenComputers"
url = "https://maven.cil.li/"
}
}
dependencies {
@ -94,6 +111,8 @@ dependencies {
compileOnly "inventorytweaks:InventoryTweaks:1.59-dev:deobf"
implementation "li.cil.oc:OpenComputers:MC1.7.10-1.5.+:api"
compileOnly "com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta.56-GTNH:dev"
}
processResources {

104
changelog
View File

@ -1,81 +1,27 @@
## Added
* Two new anti-material rifle variants
* .50 BMG demolisher rounds are finally usable
* Added a special ammo type exclusive to one of the variants
* Starmetal .50 BMG now returns
* Overall better armor piercing stats than DU
* Not compatible with the M2, only usable in amat rifles
* Reworked chemical plant
* No longer needs template items for everything, comes with a convenient recipe selector GUI
* Three item and three fluids for in and outputs
* Slots are locked to the ingredients they accept, allowing for better performance and shift click support
* Item IO now works like most other machines instead of using chutes
* If the center block right above the chemplant is not air, it will render with a frame, making chemplant stacking actually nice to look at
* Now has a more convenient 3x3 footprint
* Features 12 access ports, more than enough for full coverage of the entire machine's IO
* Has an optional slot for template items separate from the recipe selector (i.e. secret recipes) (doesn't work yet since we don't have secret recipe :P)
* Ports are now standardized, no longer are fluids connected to ports that look like copper contacts
* Can't use upgrades just yet
## Changed
* Added Ukrainian localization
* The RBMK console's grid can now be rotated using a screwdriver
* Tool abilities have changed
* Right-clicking while holding ALT now opens a configuration window
* The configuration window allows creation of tool presets
* Area and block abilities can now be toggled independently from each other. For example, the vein miner ability can be combined with silk touch
* Clicking on the same ability allows switching between levels
* Updated textures for the armor and gun modification tables
* Ported the fire extinguisher to the SEDNA gun system, eliminating the final remaining ItemGunBase gun
* Water extinguishers can now wash away foam blocks
* Obliterated Fabsol's vodka
* Tier 4 heart piece is now called "heart of darkness"
* Thermal sights now render dead mobs in black
* Guns now have unique scope overlays instead of reusing the .44 scope for everything
* The new chemplant has slightly altered recipes
* Very basic mixing recipes (e.g. coolant) have been removed, it's now required to use the mixer
* Water to hydrogen peroxide is now 1,000 : 1,000 (instead of 1,000 : 800)
* Sulfuric acid's peroxide requirement has been adjusted accordingly
* Nitric acid has an alternate recipe using air and water, however it takes 4x as long and has a base consumption of 2kHE/t
* Desh now only takes 5 seconds to produce instead of 15
* Laminate now only takes 50mB of either fluid per recipe and processes much quicker
* Ducrete now uses U238 in the form of ferrouranium, decreasing U238 needed, and no longer requires gravel at all
* All recipes for nuclear fuel production now have a higher base consumption
* Base consumption in general has been tweaked for many later-game recipes. Many recipes however still use the old 100HE/t rate
* Cordite now uses sawdust instead of wood planks and sugar
* Kevlar is now made from aromatics, nitric acid and chlorine (or phosgene in 528 mode)
* Electrolysis using the chemplant has been removed. Hydrogen can be made using water and coal (or coke), and oxygen can be distilled from intake air
* Solid nuclear waste can also be vitrified now
* Thorium salt reprocessing now only has a 50% chance to produce a U233 nugget and a 25% chance to produce nuclear waste, making it less absurdly powerful and easier to deal with the waste
* Glyphid meat processing is now less autistic
* Making rusty steel now only takes 2 seconds per recipe
* Perfluoromethyl can now also be made in the chemical plant (technically, the process isn't just simple mixing after all)
* Recipe changes are still subject to balancing
* Removed niter to nitric acid liquefaction recipe
* Updated N2 model
* Glow in the dark paint not included (yet)
* Wooden scaffolds now have a slightly smaller hitbox and are climbable
* Hanging chains and vines can now be climbed by holding space
* Hopefully fixed the strand caster being weird for good
* Removed angry metal drop from meteorites (use the assembler recipe)
* The automatic buzzsaw can now handle crops
* The automatic buzzsaw will no longer clip through walls when extending
* The automatic buzzsaw can be turned off using a screwdriver
* Template folders now support page turning via scrolling
* Named crates will now show their names in the GUI as well as as a tooltip
* Vanilla anvils no longer increase experience costs when renaming an item
* Fans now have diminishing force, old behavior can be restored with the hand drill
* Updated russian localization
* Rad absorbers now use metadata, existing blocks will be converted automatically
* Fissure bombs that go off in crater biomes now create fissures with metadata 1 which creates radioactive volcanic lava
* If a crater biome is created on top of an existing fissure, it will keep producing normal volcanic lava
* Simplified the battery socket's client packets, reducing CPU load
* Muzzle flashes on guns now work in third person mode, including on other players and on NPCs, making it more apparent when you're being fired at
* This includes non-standard special effects like the .44 gap flash and the .35-800 ejector plume
* Removed the old unused satelite deco blocks, freeing up 6 block IDs
* Crucibles that smelt metal with no template set will no place the metal in the recipe stack instead of the waste stack, this should make it easier to get a recipe to work in the many, many cases where people add the template after smelting the material
* Battery sockets and the FENSU now support the copy tool
* Removed unused displaylist support from the model loader
* DLs have been long phased out in favor of VBOs anyway
* Rebranded canned horse slime
* Now with extra bone marrow
* Updated the deuterium tower's model
* Increased the energy requirement for welding osmiridium
## Fixed
* Conveyor ejectors should now correctly place items onto the back of splitters instead of on the output belts
* Fixed strand caster fluid gauges going out of bounds
* Fixed arc welder and soldering station not changing buffer size based on upgrade, preventing use of higher overdrive tiers
* Fixed non-standard template folder recipes not using the correct icon
* Fixed jetpack flight time not resetting when equipped like armor, causing kicks on servers that don't have flying cheats allowed
* Fixed missing energy damage category localization
* Fixed server crash caused by tool abilities
* Fixed chunkloading entities not releasing their loading tickets properly
* Potentially fixed a dupe issue related to tool abilities
* Fixed certain sky features not being as bright as they should be
* Fixed detailed hitboxes behaving weird
* Fixed issue where empty crates would retain irrelevant NBT data, rendering them unstackable with freshly crafted crates
# Fixed
* Potentially fixed yet another issue regarding crates
* Fixed battery socket `fillpercent` RoR function always assuming a max power of 1
* Fixed issue where multiblock ports would generate many OpenComputers component entries
* Fixed RBMK automatic control rods having incorrect settings when using the copy tool
* Fixed battery sockets producing junk debug data in the logs
* Fixed an issue where the charging station would crash when trying to charge certain items
* Fixed the DFC's core component not dropping its contents when mined
* Fixed audio problems with guns

View File

@ -1,15 +1,15 @@
mod_version=1.0.27
# Empty build number makes a release type
mod_build_number=5356
mod_build_number=5572
credits=HbMinecraft,\
\ rodolphito (explosion algorithms),\
\ grangerave (explosion algorithms),\
\ Hoboy (textures, models),\
\ Drillgon200 (effects, models, porting),\
\ Drillgon200 (effects, models),\
\ MartinTheDragon (calculator, chunk-based fallout, bendable cranes, pipe improvements, PWR sounds),\
\ Alcater (GUI textures, porting),\
\ MellowArpeggiation (new animation system, turbine sounds, sound fixes, industrial lights, conveyor wand, NBT structures),\
\ Alcater (GUI textures),\
\ MellowArpeggiation (new animation system, turbine sounds, sound fixes, industrial lights, conveyor wand, NBT structures, MSU displays),\
\ Pheo (textures, various machines, models, weapons),\
\ Vær (gas centrifuges, better worldgen, ZIRNOX, CP-1 parts, starter guide, new cyclotron, weapon animations),\
\ UFFR (RTG pellets, guns, casings, euphemium capacitor, nucleartech.wiki),\
@ -22,6 +22,7 @@ credits=HbMinecraft,\
\ Doctor17 (russian localization)),\
\ Pashtet (russian localization),\
\ 7H40 (russian localization),\
\ RayzerHan (russian localization),\
\ Bismarck (chinese localization),\
\ Creeper-banner (chinese localization),\
\ 5467864 (chinese localization),\
@ -34,8 +35,10 @@ credits=HbMinecraft,\
\ Herobrine 457985 (chinese localization),\
\ xxwinhere (chinese localization),\
\ Nycticoraxnightheron (chinese localization),\
\ NarekoMichigami810 (chinese localization),\
\ Maksymisio (polish localization)\
\ el3ctro4ndre (italian localization),\
\ Goaty1208 (italian localization),\
\ Pu-238 (Tom impact effects),\
\ Frooz (gun models),\
\ VT-6/24 (models, textures),\
@ -55,18 +58,22 @@ credits=HbMinecraft,\
\ Silly541 (config for safe ME drives),\
\ Voxelstice (OpenComputers integration, turbine spinup),\
\ BallOfEnergy1 (OpenComputers integration, RBMK and packet optimization, crate backpacks),\
\ PewPewCricket (OpenComputers integration),\
\ kelllllen (OpenComputers integration),\
\ sdddddf80 (recipe configs, chinese localization, custom machine holograms),\
\ Abel1502 (abilities GUI, optimization, crate upgrade recipes, strand caster improvements, varous tweaks),\
\ Darek505 (armor rendering compatibility fix),\
\ ranch21 (improved HUD gauges),\
\ SuperCraftAlex (tooltips)\
\ Ice-Arrow (research reactor tweaks),\
\ 245tt (anvil GUI improvements),\
\ KoblizekXD (doors),\
\ FOlkvangrField (custom machine parts),\
\ RosaTryp (centrifuge config),\
\ Toshayo (satellite loot system, project settings, gradle curse task, OpenComputers integration),\
\ Toshayo (satellite loot system, project settings, gradle curse task, OpenComputers integration, fluid counter valve),\
\ Dash (PA particle serialization fix),\
\ archiecarrot123 (armor rendering compatibility fix),\
\ mikkerlo (mining laser & builder's jetpack improvements),\
\ icomet (refactoring),\
\ martemen (project settings),\
\ OvermindDL1 (project settings),\

View File

@ -3,6 +3,7 @@ package api.hbm.block;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
@Deprecated
public interface IDrillInteraction {
/**

View File

@ -1,5 +1,6 @@
package api.hbm.block;
@Deprecated
public interface IMiningDrill {
/**

View File

@ -11,8 +11,8 @@ public interface IBatteryItem {
public void dischargeBattery(ItemStack stack, long i);
public long getCharge(ItemStack stack);
public long getMaxCharge(ItemStack stack);
public long getChargeRate();
public long getDischargeRate();
public long getChargeRate(ItemStack stack);
public long getDischargeRate(ItemStack stack);
/** Returns a string for the NBT tag name of the long storing power */
public default String getChargeTagName() {

View File

@ -2,7 +2,6 @@ package api.hbm.energymk2;
import com.hbm.handler.threading.PacketThreading;
import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.util.Compat;
import api.hbm.energymk2.Nodespace.PowerNode;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
@ -25,7 +24,7 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 {
public default void tryProvide(World world, int x, int y, int z, ForgeDirection dir) {
TileEntity te = Compat.getTileStandard(world, x, y, z);
TileEntity te = TileAccessCache.getTileOrCache(world, x, y, z);
boolean red = false;
if(te instanceof IEnergyConductorMK2) {
@ -43,7 +42,7 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 {
if(te instanceof IEnergyReceiverMK2 && te != this) {
IEnergyReceiverMK2 rec = (IEnergyReceiverMK2) te;
if(rec.canConnect(dir.getOpposite())) {
if(rec.canConnect(dir.getOpposite()) && rec.allowDirectProvision()) {
long provides = Math.min(this.getPower(), this.getProviderSpeed());
long receives = Math.min(rec.getMaxPower() - rec.getPower(), rec.getReceiverSpeed());
long toTransfer = Math.min(provides, receives);

View File

@ -3,7 +3,6 @@ package api.hbm.energymk2;
import com.hbm.handler.threading.PacketThreading;
import com.hbm.interfaces.NotableComments;
import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.util.Compat;
import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.energymk2.Nodespace.PowerNode;
@ -31,12 +30,15 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 {
public default long getReceiverSpeed() {
return this.getMaxPower();
}
/** Whether a provider can provide power by touching the block (i.e. via proxies), bypassing the need for a network entirely */
public default boolean allowDirectProvision() { return true; }
public default void trySubscribe(World world, DirPos pos) { trySubscribe(world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); }
public default void trySubscribe(World world, int x, int y, int z, ForgeDirection dir) {
TileEntity te = Compat.getTileStandard(world, x, y, z);
TileEntity te = TileAccessCache.getTileOrCache(world, x, y, z);
boolean red = false;
if(te instanceof IEnergyConductorMK2) {

View File

@ -16,6 +16,7 @@ import net.minecraft.world.World;
*
* @author hbm
*/
@NotableComments
public class Nodespace {
public static final PowerNetProvider THE_POWER_PROVIDER = new PowerNetProvider();

View File

@ -78,7 +78,7 @@ public class PowerNetMK2 extends NodeNet<IEnergyReceiverMK2, IEnergyProviderMK2,
for(Pair<IEnergyReceiverMK2, Long> entry : list) {
double weight = (double) entry.getValue() / (double) (priorityDemand);
long toSend = (long) Math.max(toTransfer * weight, 0D);
long toSend = (long) Math.min(Math.max(toTransfer * weight, 0D), entry.getValue());
energyUsed += (toSend - entry.getKey().transferPower(toSend)); //leftovers are subtracted from the intended amount to use up
}

View File

@ -5,7 +5,6 @@ import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.uninos.GenNode;
import com.hbm.uninos.UniNodespace;
import com.hbm.util.Compat;
import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority;
@ -28,7 +27,7 @@ public interface IFluidReceiverMK2 extends IFluidUserMK2 {
public default void trySubscribe(FluidType type, World world, int x, int y, int z, ForgeDirection dir) {
TileEntity te = Compat.getTileStandard(world, x, y, z);
TileEntity te = TileAccessCache.getTileOrCache(world, x, y, z);
boolean red = false;
if(te instanceof IFluidConnectorMK2) {

View File

@ -0,0 +1,9 @@
package api.hbm.fluidmk2;
public interface IFluidRegisterListener {
/**
* Called when the fluid registry initializes all fluids. Use CompatFluidRegistry to create new instances of FluidType, which are automatically registered.
*/
public void onFluidsLoad();
}

View File

@ -6,7 +6,6 @@ import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.uninos.GenNode;
import com.hbm.uninos.UniNodespace;
import com.hbm.util.Compat;
import com.hbm.util.fauxpointtwelve.DirPos;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
@ -30,7 +29,7 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 {
public default void tryProvide(FluidType type, int pressure, World world, int x, int y, int z, ForgeDirection dir) {
TileEntity te = Compat.getTileStandard(world, x, y, z);
TileEntity te = TileAccessCache.getTileOrCache(world, x, y, z);
boolean red = false;
if(te instanceof IFluidConnectorMK2) {

View File

@ -1,10 +1,3 @@
/**
*
*/
/**
* @author hbm
*
*/
package api.hbm.fluidmk2;
/*
@ -13,4 +6,19 @@ It's rather shrimple: the shiny new energy system using universal nodespace, but
Has a few extra bits and pieces for handling, but the concept is basically the same.
Sounds good?
*/
/*
Quick explanation for implementing new fluids via addon:
Fluids are subject to /ntmreload so they get wiped and rebuilt using the init function in Fluids, which means that if fluids
are simply added externally during startup, they are removed permanently until the game restarts. Same concept as with recipes, really.
To fix this we need to make sure that externally registered fluids are re-registered during reload, for that purpose we have
IFluidRegisterListener, a simple interface with a small method that runs whenever the fluid list is reloaded. IFluidRegisterListeners
need to be registered with CompatExternal.registerFluidRegisterListener to be used, make sure to do this during PreInit.
Inside the IFluidRegisterListener, fluids can be added using CompatFluidRegistry.registerFluid, which will generate a Fluid instance
using the supplied arguments and automatically register it. Do note that like with custom fluids, fluids need numeric IDs assigned manually.
To prevent collisions with stock fluids when NTM updates, make sure to choose a high starting ID (e.g. 10,000).
The fluid created by registerFluid can have traits added to them, just like how NTM does it with its stock fluids.
*/

View File

@ -1,7 +1,55 @@
package api.hbm.tile;
import java.util.HashMap;
import java.util.Map;
import com.hbm.util.Compat;
import com.hbm.util.Tuple.Quartet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
/** For anything that should be removed off networks when considered unloaded, only affects providers and receivers, not links. Must not necessarily be a tile. */
public interface ILoadedTile {
public boolean isLoaded();
// should we gunk this into the API? no, but i don't care
public static class TileAccessCache {
public static Map<Quartet, TileAccessCache> cache = new HashMap();
public static int NULL_CACHE = 20;
public static int NONNULL_CACHE = 60;
public TileEntity tile;
public long expiresOn;
public TileAccessCache(TileEntity tile, long expiresOn) {
this.tile = tile;
this.expiresOn = expiresOn;
}
public boolean hasExpired(long worldTime) {
if(tile != null && tile.isInvalid()) return true;
if(worldTime >= expiresOn) return true;
if(tile instanceof ILoadedTile && !((ILoadedTile) tile).isLoaded()) return true;
return false;
}
public static Quartet publicCumRag = new Quartet(0, 0, 0, 0);
public static TileEntity getTileOrCache(World world, int x, int y, int z) {
publicCumRag.mangle(x, y, z, world.provider.dimensionId);
TileAccessCache cache = TileAccessCache.cache.get(publicCumRag);
if(cache == null || cache.hasExpired(world.getTotalWorldTime())) {
TileEntity tile = Compat.getTileStandard(world, x, y, z);
cache = new TileAccessCache(tile, world.getTotalWorldTime() + (tile == null ? NULL_CACHE : NONNULL_CACHE));
TileAccessCache.cache.put(publicCumRag.clone(), cache);
return tile;
} else {
return cache.tile;
}
}
}
}

View File

@ -5,7 +5,7 @@ import com.hbm.handler.ThreeInts;
import com.hbm.interfaces.ICopiable;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.IPersistentNBT;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
@ -37,7 +37,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable, INBTTransformable {
public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable, INBTBlockTransformable {
public BlockDummyable(Material mat) {
super(mat);
@ -77,27 +77,20 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
super.onNeighborBlockChange(world, x, y, z, block);
if(world.isRemote || safeRem)
if(safeRem)
return;
int metadata = world.getBlockMetadata(x, y, z);
// if it's an extra, remove the extra-ness
if(metadata >= extra)
metadata -= extra;
ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite();
Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
if(b != this) {
world.setBlockToAir(x, y, z);
}
destroyIfOrphan(world, x, y, z);
}
public void updateTick(World world, int x, int y, int z, Random rand) {
super.updateTick(world, x, y, z, rand);
destroyIfOrphan(world, x, y, z);
}
private void destroyIfOrphan(World world, int x, int y, int z) {
if(world.isRemote)
return;
@ -110,10 +103,32 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite();
Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
if(b != this) {
world.setBlockToAir(x, y, z);
// An extra precaution against multiblocks on chunk borders being erroneously deleted.
// Technically, this might be used to persist ghost dummy blocks by manipulating
// loaded chunks and block destruction, but this gives no benefit to the player,
// cannot be done accidentally, and is definitely preferable to multiblocks
// just vanishing when their chunks are unloaded in an unlucky way.
if(b != this && world.checkChunksExist(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1)) {
if (isLegacyMonoblock(world, x, y, z)) {
fixLegacyMonoblock(world, x, y, z);
} else {
world.setBlockToAir(x, y, z);
}
}
}
// Override this when turning a single block into a pseudo-multiblock.
// If this returns true, instead of being deleted as an orphan, the block
// will be promoted to a core of a dummyable, however without any dummies.
// This is only called if the block is presumed an orphan, so you don't
// need to check that here.
protected boolean isLegacyMonoblock(World world, int x, int y, int z) {
return false;
}
protected void fixLegacyMonoblock(World world, int x, int y, int z) {
// Promote to a lone core block with the same effective rotation as before the change
world.setBlockMetadataWithNotify(x, y, z, offset + world.getBlockMetadata(x, y, z), 3);
}
public int[] findCore(World world, int x, int y, int z) {
@ -550,6 +565,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
@Override
public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) {
int[] pos = findCore(world, x, y, z);
if(pos == null) return;
TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]);
if (tile instanceof ICopiable)
((ICopiable) tile).pasteSettings(nbt, index, world, player, pos[0], pos[1], pos[2]);
@ -575,7 +591,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
meta -= extra;
}
meta = INBTTransformable.transformMetaDeco(meta, coordBaseMode);
meta = INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
if(isOffset) {
meta += offset;

View File

@ -80,4 +80,5 @@ public class BlockEnums {
FLUORESCENT,
HALOGEN
}
}

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,7 @@ package com.hbm.blocks.bomb;
import com.hbm.blocks.ModBlocks;
import com.hbm.entity.item.EntityTNTPrimedBase;
import com.hbm.explosion.ExplosionNukeSmall;
import com.hbm.world.biome.BiomeGenCraterBase;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
@ -16,6 +17,8 @@ public class BlockFissureBomb extends BlockTNTBase {
int range = 5;
boolean crater = world.getBiomeGenForCoords((int) Math.floor(x), (int) Math.floor(z)) instanceof BiomeGenCraterBase;
for(int i = -range; i <= range; i++) {
for(int j = -range; j <= range; j++) {
for(int k = -range; k <= range; k++) {
@ -27,7 +30,7 @@ public class BlockFissureBomb extends BlockTNTBase {
Block block = world.getBlock(a, b, c);
if(block == ModBlocks.ore_bedrock) {
world.setBlock(a, b, c, ModBlocks.ore_volcano);
world.setBlock(a, b, c, ModBlocks.ore_volcano, crater ? 1 : 0, 3);
} else if(block == ModBlocks.ore_bedrock_oil) {
world.setBlock(a, b, c, Blocks.bedrock);
}

View File

@ -151,7 +151,7 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setInteger("tier", this.volcanoTimer);
nbt.setInteger("timer", this.volcanoTimer);
}
private boolean shouldGrow() {

View File

@ -3,16 +3,17 @@ package com.hbm.blocks.bomb;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.BombConfig;
import com.hbm.entity.effect.EntityCloudFleija;
import com.hbm.entity.effect.EntityCloudFleijaRainbow;
import com.hbm.entity.effect.EntityNukeTorex;
import com.hbm.entity.grenade.EntityGrenadeZOMG;
import com.hbm.entity.logic.EntityBalefire;
import com.hbm.entity.logic.EntityNukeExplosionMK3;
import com.hbm.entity.logic.EntityNukeExplosionMK5;
import com.hbm.entity.projectile.EntityFallingNuke;
import com.hbm.explosion.ExplosionChaos;
import com.hbm.explosion.ExplosionLarge;
import com.hbm.interfaces.IBomb;
import com.hbm.interfaces.NotableComments;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.bomb.TileEntityNukeCustom;
@ -30,10 +31,10 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
// this entire class sucks ass
@NotableComments
public class NukeCustom extends BlockContainer implements IBomb {
public TileEntityNukeCustom tetn = new TileEntityNukeCustom();
private static boolean keepInventory = false;
private final static Random field_149933_a = new Random();
@ -134,6 +135,7 @@ public class NukeCustom extends BlockContainer implements IBomb {
public static final int maxAmat = 350;
public static final int maxSchrab = 250;
// genuinely some of the worst fucking code i've ever written
public static void explodeCustom(World worldObj, double xCoord, double yCoord, double zCoord, float tnt, float nuke, float hydro, float amat, float dirty, float schrab, float euph) {
dirty = Math.min(dirty, 100);
@ -141,8 +143,23 @@ public class NukeCustom extends BlockContainer implements IBomb {
/// EUPHEMIUM ///
if(euph > 0) {
EntityGrenadeZOMG zomg = new EntityGrenadeZOMG(worldObj, xCoord, yCoord, zCoord);
ExplosionChaos.zomgMeSinPi(worldObj, xCoord, yCoord, zCoord, 1000, null, zomg);
EntityNukeExplosionMK3 ex = new EntityNukeExplosionMK3(worldObj);
ex.posX = xCoord;
ex.posY = yCoord;
ex.posZ = zCoord;
ex.destructionRange = 150;
ex.speed = BombConfig.blastSpeed;
ex.coefficient = 1.0F;
ex.waste = false;
worldObj.spawnEntityInWorld(ex);
worldObj.playSoundEffect(xCoord, yCoord, zCoord, "random.explode", 100000.0F, 1.0F);
EntityCloudFleijaRainbow cloud = new EntityCloudFleijaRainbow(worldObj, 50);
cloud.posX = xCoord;
cloud.posY = yCoord;
cloud.posZ = zCoord;
worldObj.spawnEntityInWorld(cloud);
// SCHRABIDIUM ///
} else if(schrab > 0) {

View File

@ -59,8 +59,15 @@ public class CoriumFinite extends GenericFiniteFluid {
@Override
public void updateTick(World world, int x, int y, int z, Random rand) {
super.updateTick(world, x, y, z, rand);
// COFH core apparently replaces the water block class with an incompatible type which breaks
// the finite fluid implementation. can't recreate the issue, but according to the provided log
// it seems like this shitty band aid might work
try {
super.updateTick(world, x, y, z, rand);
} catch(ClassCastException ex) {
if(!world.isRemote) world.setBlockToAir(x, y, z);
}
if(!world.isRemote && rand.nextInt(10) == 0 && world.getBlock(x, y - 1, z) != this) {

View File

@ -2,38 +2,79 @@ package com.hbm.blocks.generic;
import java.util.Random;
import com.hbm.blocks.BlockEnumMulti;
import com.hbm.blocks.IBlockMulti;
import com.hbm.handler.radiation.ChunkRadiationManager;
import com.hbm.lib.RefStrings;
import net.minecraft.block.Block;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.material.Material;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
public class BlockAbsorber extends Block {
public class BlockAbsorber extends BlockEnumMulti implements IBlockMulti {
float absorb = 0;
// Enum for tiers they are in order of meta data, 0, 1, 2, 3 for Base, Red, Green, Pink
public static enum EnumAbsorberTier {
public BlockAbsorber(Material mat, float ab) {
super(mat);
BASE(2.5F, "absorber"), RED(10F, "absorber_red"), GREEN(100F, "absorber_green"), PINK(10000F, "absorber_pink");
public final float absorbAmount;
public final String textureName;
private EnumAbsorberTier(float absorb, String texture) {
this.absorbAmount = absorb;
this.textureName = texture;
}
}
public BlockAbsorber(Material mat) {
super(mat, EnumAbsorberTier.class, true, true);
this.setTickRandomly(true);
absorb = ab;
this.setBlockName("rad_absorber");
}
public EnumAbsorberTier getTier(int meta) {
return EnumAbsorberTier.values()[rectify(meta)];
}
@Override
public int tickRate(World world) {
public String getUnlocalizedName(ItemStack stack) {
EnumAbsorberTier tier = getTier(stack.getItemDamage());
String tierName = net.minecraft.util.StatCollector.translateToLocal("tile.rad_absorber." + tier.name().toLowerCase());
return tierName;
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(net.minecraft.client.renderer.texture.IIconRegister reg) {
icons = new IIcon[EnumAbsorberTier.values().length];
for(int i = 0; i < icons.length; i++) {
icons[i] = reg.registerIcon(RefStrings.MODID + ":" + EnumAbsorberTier.values()[i].textureName);
}
}
// All that rad math shit that was on there already, did not touch this
// -Wolf
@Override
public int tickRate(World world) {
return 10;
}
@Override
public void updateTick(World world, int x, int y, int z, Random rand) {
ChunkRadiationManager.proxy.decrementRad(world, x, y, z, absorb);
world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world));
EnumAbsorberTier tier = getTier(world.getBlockMetadata(x, y, z));
ChunkRadiationManager.proxy.decrementRad(world, x, y, z, tier.absorbAmount);
world.scheduleBlockUpdate(x, y, z, this, tickRate(world));
}
@Override
public void onBlockAdded(World world, int x, int y, int z) {
super.onBlockAdded(world, x, y, z);
world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world));
world.scheduleBlockUpdate(x, y, z, this, tickRate(world));
}
}

View File

@ -4,8 +4,8 @@ import com.hbm.inventory.gui.GUIScreenBobble;
import com.hbm.items.special.ItemPlasticScrap.ScrapType;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.world.gen.INBTTileEntityTransformable;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTTileEntityTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
@ -34,7 +34,7 @@ import net.minecraft.world.World;
import java.util.List;
import java.util.Random;
public class BlockBobble extends BlockContainer implements IGUIProvider, INBTTransformable {
public class BlockBobble extends BlockContainer implements IGUIProvider, INBTBlockTransformable {
public BlockBobble() {
super(Material.iron);

View File

@ -7,6 +7,7 @@ import static net.minecraftforge.common.util.ForgeDirection.WEST;
import com.hbm.lib.RefStrings;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -20,23 +21,23 @@ import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class BlockChain extends Block {
public class BlockChain extends Block implements INBTBlockTransformable {
@SideOnly(Side.CLIENT)
private IIcon iconEnd;
public BlockChain(Material mat) {
super(mat);
}
public boolean isOpaqueCube() {
return false;
}
public boolean renderAsNormalBlock() {
return false;
}
public static int renderID = RenderingRegistry.getNextAvailableRenderId();
public int getRenderType() {
@ -47,7 +48,7 @@ public class BlockChain extends Block {
public boolean isLadder(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) {
return true;
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
@ -60,14 +61,14 @@ public class BlockChain extends Block {
if(world.isSideSolid(x, y - 1, z, ForgeDirection.UP, false) || (world.getBlock(x, y - 1, z) == this && world.getBlockMetadata(x, y, z) == world.getBlockMetadata(x, y - 1, z)))
return this.blockIcon;
return this.iconEnd;
}
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
return null;
}
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {
func_149797_b(world.getBlockMetadata(x, y, z));
@ -76,11 +77,11 @@ public class BlockChain extends Block {
}
public void func_149797_b(int meta) {
float f = 0.125F;
if(meta == 0) {
this.minX = 3 * f;
this.minY = 0;
this.minZ = 3 * f;
@ -109,24 +110,24 @@ public class BlockChain extends Block {
this.setBlockBounds(0.0F, 0.0F, 3 * f, f, 1.0F, 5 * f);
}
}
@SideOnly(Side.CLIENT)
public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) {
this.setBlockBoundsBasedOnState(world, x, y, z);
return super.getSelectedBoundingBoxFromPool(world, x, y, z);
}
public boolean canPlaceBlockAt(World world, int x, int y, int z) {
if(world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN) || world.getBlock(x, y + 1, z) == this)
return true;
return world.isSideSolid(x - 1, y, z, EAST ) ||
world.isSideSolid(x + 1, y, z, WEST ) ||
world.isSideSolid(x, y, z - 1, SOUTH) ||
world.isSideSolid(x, y, z + 1, NORTH);
}
public int onBlockPlaced(World world, int x, int y, int z, int side, float p_149660_6_, float p_149660_7_, float p_149660_8_, int meta)
{
int j1 = meta;
@ -142,12 +143,12 @@ public class BlockChain extends Block {
if(side == 5 && world.isSideSolid(x - 1, y, z, EAST))
j1 = 5;
if(j1 == 0) {
if(world.getBlock(x, y + 1, z) == this)
return world.getBlockMetadata(x, y + 1, z);
if(world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))
return 0;
}
@ -155,30 +156,30 @@ public class BlockChain extends Block {
if(j1 == 0) {
if(world.isSideSolid(x, y, z + 1, NORTH))
j1 = 2;
if(world.isSideSolid(x, y, z - 1, SOUTH))
j1 = 3;
if(world.isSideSolid(x + 1, y, z, WEST))
j1 = 4;
if(world.isSideSolid(x - 1, y, z, EAST))
j1 = 5;
}
return j1;
}
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
int l = world.getBlockMetadata(x, y, z);
boolean flag = false;
if(world.getBlock(x, y + 1, z) == this && world.getBlockMetadata(x, y, z) == world.getBlockMetadata(x, y + 1, z)) {
super.onNeighborBlockChange(world, x, y, z, block);
return;
}
if(world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN) && world.getBlockMetadata(x, y, z) == 0) {
super.onNeighborBlockChange(world, x, y, z, block);
return;
@ -201,4 +202,12 @@ public class BlockChain extends Block {
super.onNeighborBlockChange(world, x, y, z, block);
}
@Override
public int transformMeta(int meta, int coordBaseMode) {
if (coordBaseMode == 0) return meta;
if (meta == 0) return meta;
if (meta == 1) return meta;
return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
}
}

View File

@ -1,26 +1,15 @@
package com.hbm.blocks.generic;
import java.util.List;
import java.util.Random;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.blocks.ModBlocks;
import com.hbm.items.ModItems;
import com.hbm.util.i18n.I18nUtil;
import api.hbm.block.IDrillInteraction;
import api.hbm.block.IMiningDrill;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer;
public class BlockCluster extends Block implements IDrillInteraction, ITooltipProvider {
public class BlockCluster extends Block {
public BlockCluster(Material mat) {
super(mat);
@ -28,32 +17,7 @@ public class BlockCluster extends Block implements IDrillInteraction, ITooltipPr
@Override
public Item getItemDropped(int i, Random rand, int j) {
return null;
}
@Override
public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) {
if(player instanceof FakePlayer || player == null) {
return;
}
if(!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops") && !world.restoringBlockSnapshots) {
Item drop = getDrop();
if(drop == null)
return;
float f = 0.7F;
double mX = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
double mY = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
double mZ = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
EntityItem entityitem = new EntityItem(world, (double) x + mX, (double) y + mY, (double) z + mZ, new ItemStack(drop));
entityitem.delayBeforeCanPickup = 10;
world.spawnEntityInWorld(entityitem);
}
return getDrop();
}
private Item getDrop() {
@ -65,24 +29,4 @@ public class BlockCluster extends Block implements IDrillInteraction, ITooltipPr
return null;
}
@Override
public boolean canBreak(World world, int x, int y, int z, int meta, IMiningDrill drill) {
return drill.getDrillRating() > 70 || world.rand.nextFloat() < 0.05;
}
@Override
public ItemStack extractResource(World world, int x, int y, int z, int meta, IMiningDrill drill) {
return drill.getDrillRating() <= 70 ? new ItemStack(getDrop()) : null;
}
@Override
public float getRelativeHardness(World world, int x, int y, int z, int meta, IMiningDrill drill) {
return this.getBlockHardness(world, x, y, z);
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.tile.cluster"));
}
}

View File

@ -1,78 +0,0 @@
package com.hbm.blocks.generic;
import java.util.Random;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class BlockCoalBurning extends BlockOutgas {
public BlockCoalBurning(Material mat) {
super(mat, false, 1, false);
this.setTickRandomly(true);
}
@Override
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World world, int x, int y, int z, Random rand) {
super.randomDisplayTick(world, x, y, z, rand);
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
if(dir == ForgeDirection.DOWN)
continue;
if(world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).getMaterial() == Material.air) {
double ix = x + 0.5F + dir.offsetX + rand.nextDouble() - 0.5D;
double iy = y + 0.5F + dir.offsetY + rand.nextDouble() - 0.5D;
double iz = z + 0.5F + dir.offsetZ + rand.nextDouble() - 0.5D;
if(dir.offsetX != 0)
ix = x + 0.5F + dir.offsetX * 0.5 + rand.nextDouble() * 0.125 * dir.offsetX;
if(dir.offsetY != 0)
iy = y + 0.5F + dir.offsetY * 0.5 + rand.nextDouble() * 0.125 * dir.offsetY;
if(dir.offsetZ != 0)
iz = z + 0.5F + dir.offsetZ * 0.5 + rand.nextDouble() * 0.125 * dir.offsetZ;
world.spawnParticle("flame", ix, iy, iz, 0.0, 0.0, 0.0);
world.spawnParticle("smoke", ix, iy, iz, 0.0, 0.0, 0.0);
world.spawnParticle("smoke", ix, iy, iz, 0.0, 0.1, 0.0);
}
}
}
@Override
public Item getItemDropped(int i, Random rand, int j) {
return null;
}
public void breakBlock(World world, int x, int y, int z, Block block, int i) {
super.breakBlock(world, x, y, z, block, i);
world.setBlock(x, y, z, Blocks.fire);
for(int ix = -2; ix <= 2; ix++) {
for(int iy = -2; iy <= 2; iy++) {
for(int iz = -2; iz <= 2; iz++) {
if(Math.abs(ix + iy + iz) < 5 && world.getBlock(x + ix, y + iy, z + iz) == Blocks.air) {
world.setBlock(x + ix, y + iy, z + iz, this.getGas());
}
}
}
}
}
@Override
public void onEntityWalking(World world, int x, int y, int z, Entity entity) {
entity.setFire(3);
}
}

View File

@ -1,33 +0,0 @@
package com.hbm.blocks.generic;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.world.World;
public class BlockCoalOil extends Block {
public BlockCoalOil(Material mat) {
super(mat);
}
@Override
public void updateTick(World world, int x, int y, int z, Random rand) {
world.setBlock(x, y, z, ModBlocks.ore_coal_oil_burning);
}
@Override
public Item getItemDropped(int i, Random rand, int j) {
return Items.coal;
}
@Override
public int quantityDropped(Random rand) {
return 2 + rand.nextInt(2);
}
}

View File

@ -5,8 +5,10 @@ import java.util.List;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.interfaces.Spaghetti;
import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret;
import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemBatteryPack.EnumBatteryPack;
import net.minecraft.block.BlockFalling;
import net.minecraft.block.material.Material;
@ -16,6 +18,7 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
@Spaghetti("this is implemented in the most braindead fucking way imaginable") // TODO: rework this unholy abomination using configurable loot pools
public class BlockCrate extends BlockFalling {
List<ItemStack> crateList;
@ -69,22 +72,16 @@ public class BlockCrate extends BlockFalling {
// Lead Crate
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_uranium, 10);
// BlockCrate.addToListWithWeight(leadList, ModItems.ingot_u235, 5);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_u238, 8);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_plutonium, 7);
// BlockCrate.addToListWithWeight(leadList, ModItems.ingot_pu238, 5);
// BlockCrate.addToListWithWeight(leadList, ModItems.ingot_pu239, 4);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_pu240, 6);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_neptunium, 7);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_uranium_fuel, 8);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_plutonium_fuel, 7);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_mox_fuel, 6);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_uranium, 10);
// BlockCrate.addToListWithWeight(leadList, ModItems.nugget_u235, 5);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_u238, 8);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_plutonium, 7);
// BlockCrate.addToListWithWeight(leadList, ModItems.nugget_pu238, 5);
// BlockCrate.addToListWithWeight(leadList, ModItems.nugget_pu239, 4);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_pu240, 6);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_neptunium, 7);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_uranium_fuel, 8);
@ -96,7 +93,6 @@ public class BlockCrate extends BlockFalling {
BlockCrate.addToListWithWeight(leadList, ModItems.cell_puf6, 8);
BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg, 6);
BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg_weak, 7);
BlockCrate.addToListWithWeight(leadList, ModItems.tritium_deuterium_cake, 5);
BlockCrate.addToListWithWeight(leadList, ModItems.powder_yellowcake, 10);
// Metal Crate
@ -107,17 +103,15 @@ public class BlockCrate extends BlockFalling {
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_diesel), 8);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_rtg_grey), 4);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.red_pylon), 9);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_battery), 8);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_lithium_battery), 5);
BlockCrate.addToListWithWeight(metalList, new ItemStack(ModItems.battery_pack, 1, EnumBatteryPack.BATTERY_LEAD.ordinal()), 10);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 8);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_assembler), 10);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_assembly_machine), 10);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_fluidtank), 7);
BlockCrate.addToListWithWeight(metalList, ModItems.centrifuge_element, 6);
BlockCrate.addToListWithWeight(metalList, ModItems.motor, 8);
BlockCrate.addToListWithWeight(metalList, ModItems.coil_tungsten, 7);
BlockCrate.addToListWithWeight(metalList, ModItems.photo_panel, 3);
BlockCrate.addToListWithWeight(metalList, ModItems.coil_copper, 10);
BlockCrate.addToListWithWeight(metalList, ModItems.tank_steel, 9);
BlockCrate.addToListWithWeight(metalList, ModItems.blade_titanium, 3);
BlockCrate.addToListWithWeight(metalList, ModItems.piston_selenium, 6);

View File

@ -2,7 +2,7 @@ package com.hbm.blocks.generic;
import com.hbm.blocks.BlockMulti;
import com.hbm.lib.RefStrings;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side;
@ -15,7 +15,7 @@ import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class BlockDecoCRT extends BlockMulti implements INBTTransformable {
public class BlockDecoCRT extends BlockMulti implements INBTBlockTransformable {
protected String[] variants = new String[] {"crt_clean", "crt_broken", "crt_blinking", "crt_bsod"};
@SideOnly(Side.CLIENT) protected IIcon[] icons;
@ -77,7 +77,7 @@ public class BlockDecoCRT extends BlockMulti implements INBTTransformable {
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTTransformable.transformMetaDecoModel(meta, coordBaseMode);
return INBTBlockTransformable.transformMetaDecoModel(meta, coordBaseMode);
}
}

View File

@ -1,7 +1,7 @@
package com.hbm.blocks.generic;
import com.hbm.blocks.BlockEnumMulti;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraft.block.material.Material;
@ -12,7 +12,7 @@ import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockDecoModel extends BlockEnumMulti implements INBTTransformable {
public class BlockDecoModel extends BlockEnumMulti implements INBTBlockTransformable {
public BlockDecoModel(Material mat, Class<? extends Enum> theEnum, boolean multiName, boolean multiTexture) {
super(mat, theEnum, multiName, multiTexture);

View File

@ -2,7 +2,7 @@ package com.hbm.blocks.generic;
import com.hbm.blocks.BlockMulti;
import com.hbm.lib.RefStrings;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side;
@ -17,7 +17,7 @@ import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockDecoToaster extends BlockMulti implements INBTTransformable {
public class BlockDecoToaster extends BlockMulti implements INBTBlockTransformable {
protected String[] variants = new String[] {"toaster_iron", "toaster_steel", "toaster_wood"};
@SideOnly(Side.CLIENT) protected IIcon[] icons;
@ -94,7 +94,7 @@ public class BlockDecoToaster extends BlockMulti implements INBTTransformable {
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTTransformable.transformMetaDecoModel(meta, coordBaseMode);
return INBTBlockTransformable.transformMetaDecoModel(meta, coordBaseMode);
}
}

View File

@ -17,6 +17,8 @@ import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
@ -92,7 +94,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb {
@Override
public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB entityBox, List collidingBoxes, Entity entityIn) {
AxisAlignedBB box = getBoundingBox(worldIn, x, y ,z);
AxisAlignedBB box = getBoundingBox(worldIn, x, y, z, true);
box = AxisAlignedBB.getBoundingBox(
Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ),
Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ));
@ -111,11 +113,27 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb {
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z);
AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z, true);
if(aabb.minX == aabb.maxX && aabb.minY == aabb.maxY && aabb.minZ == aabb.maxZ) return null;
return aabb;
}
// Enables clicking through the open door
@Override
public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 startVec, Vec3 endVec) {
AxisAlignedBB box = getBoundingBox(world, x, y, z, false);
box = AxisAlignedBB.getBoundingBox(
Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ),
Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ)
);
MovingObjectPosition intercept = box.calculateIntercept(startVec, endVec);
if(intercept != null) {
return new MovingObjectPosition(x, y, z, intercept.sideHit, intercept.hitVec);
}
return null;
}
@Override //should fix AI pathfinding
public boolean getBlocksMovement(IBlockAccess world, int x, int y, int z) { //btw the method name is the exact opposite of that it's doing, check net.minecraft.pathfinding.PathNavigate#512
return hasExtra(world.getBlockMetadata(x, y, z)); //if it's open
@ -140,11 +158,11 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb {
@Override
public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) {
return getBoundingBox(world, x, y, z);
return getBoundingBox(world, x, y, z, false);
//return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1);
}
public AxisAlignedBB getBoundingBox(World world, int x, int y, int z) {
public AxisAlignedBB getBoundingBox(World world, int x, int y, int z, boolean forCollision) {
int meta = world.getBlockMetadata(x, y, z);
TileEntity te = world.getTileEntity(x, y, z);
int[] core = this.findCore(world, x, y, z);
@ -155,7 +173,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb {
TileEntity te2 = world.getTileEntity(core[0], core[1], core[2]);
ForgeDirection dir = ForgeDirection.getOrientation(te2.getBlockMetadata() - BlockDummyable.offset);
BlockPos pos = new BlockPos(x - core[0], y - core[1], z - core[2]).rotate(Rotation.getBlockRotation(dir).add(Rotation.COUNTERCLOCKWISE_90));
AxisAlignedBB box = type.getBlockBound(pos.getX(), pos.getY(), pos.getZ(), open);
AxisAlignedBB box = type.getBlockBound(pos.getX(), pos.getY(), pos.getZ(), open, forCollision);
switch(te2.getBlockMetadata() - offset){
case 2: return AxisAlignedBB.getBoundingBox(x + 1 - box.minX, y + box.minY, z + 1 - box.minZ, x + 1 - box.maxX, y + box.maxY, z + 1 - box.maxZ);

View File

@ -55,7 +55,8 @@ public class BlockFissure extends BlockContainer implements IBlockMultiPass {
@Override
public void updateTick(World world, int x, int y, int z, Random rand) {
if(world.getBlock(x, y + 1, z).isReplaceable(world, x, y + 1, z)) world.setBlock(x, y + 1, z, ModBlocks.volcanic_lava_block);
boolean crater = world.getBlockMetadata(x, y, z) != 0;
if(world.getBlock(x, y + 1, z).isReplaceable(world, x, y + 1, z)) world.setBlock(x, y + 1, z, crater ? ModBlocks.rad_lava_block : ModBlocks.volcanic_lava_block);
}
@Override

View File

@ -4,7 +4,7 @@ import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.items.ModItems;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -21,7 +21,7 @@ import net.minecraft.util.Vec3;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockModDoor extends Block implements INBTTransformable {
public class BlockModDoor extends Block implements INBTBlockTransformable {
@SideOnly(Side.CLIENT)
private IIcon[] field_150017_a;
@SideOnly(Side.CLIENT)
@ -400,6 +400,6 @@ public class BlockModDoor extends Block implements INBTTransformable {
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTTransformable.transformMetaDoor(meta, coordBaseMode);
return INBTBlockTransformable.transformMetaDoor(meta, coordBaseMode);
}
}

View File

@ -0,0 +1,79 @@
package com.hbm.blocks.generic;
import java.util.Locale;
import java.util.Random;
import com.hbm.blocks.BlockEnumMulti;
import com.hbm.lib.RefStrings;
import net.minecraft.block.Block;
import net.minecraft.block.BlockFalling;
import net.minecraft.block.material.Material;
import net.minecraft.entity.item.EntityFallingBlock;
import net.minecraft.world.World;
public class BlockNTMSand extends BlockEnumMulti {
public BlockNTMSand(Material mat) {
super(mat, EnumSandType.class, true, true);
}
@Override
public void onBlockAdded(World world, int x, int y, int z) {
world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world));
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block b) {
world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world));
}
@Override
public void updateTick(World world, int x, int y, int z, Random rand) {
if(!world.isRemote) {
this.fall(world, x, y, z);
}
}
private void fall(World world, int x, int y, int z) {
if(BlockFalling.func_149831_e(world, x, y - 1, z) && y >= 0) {
byte b0 = 32;
if(!BlockFalling.fallInstantly && world.checkChunksExist(x - b0, y - b0, z - b0, x + b0, y + b0, z + b0)) {
if(!world.isRemote) {
EntityFallingBlock entityfallingblock = new EntityFallingBlock(world, x + 0.5, y + 0.5, z + 0.5, this, world.getBlockMetadata(x, y, z));
world.spawnEntityInWorld(entityfallingblock);
}
} else {
world.setBlockToAir(x, y, z);
while(BlockFalling.func_149831_e(world, x, y - 1, z) && y > 0) {
--y;
}
if(y > 0) {
world.setBlock(x, y, z, this);
}
}
}
}
@Override
public int tickRate(World p_149738_1_) {
return 2;
}
@Override
public String getTextureMultiName(Enum num) {
return RefStrings.MODID + ":sand_" + num.name().toLowerCase(Locale.US);
}
@Override
public String getUnlocalizedMultiName(Enum num) {
return "tile.sand_" + num.name().toLowerCase(Locale.US);
}
public static enum EnumSandType {
BORON, LEAD, URANIUM, POLONIUM, QUARTZ
}
}

View File

@ -0,0 +1,60 @@
package com.hbm.blocks.generic;
import net.minecraft.block.Block;
import net.minecraft.block.BlockTrapDoor;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockNTMTrapdoor extends BlockTrapDoor {
public BlockNTMTrapdoor(Material material) {
super(material);
}
@Override
public boolean isLadder(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) {
int meta = world.getBlockMetadata(x, y, z);
// isOpen
if (!func_150118_d(meta))
return false;
Block blockBelow = world.getBlock(x, y - 1, z);
return blockBelow != null && blockBelow.isLadder(world, x, y - 1, z, entity);
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
// Make the hitbox in-line with ladders, if relevant
if (isLadder(world, x, y, z, null)) {
int meta = world.getBlockMetadata(x, y, z);
float thickness = 0.125F;
if ((meta & 3) == 0)
return AxisAlignedBB.getBoundingBox(x, y, z + 1F - thickness, x + 1F, y + 1F, z + 1F);
if ((meta & 3) == 1)
return AxisAlignedBB.getBoundingBox(x, y, z, x + 1F, y + 1F, z + thickness);
if ((meta & 3) == 2)
return AxisAlignedBB.getBoundingBox(x + 1F - thickness, y, z, x + 1F, y + 1F, z + 1F);
if ((meta & 3) == 3)
return AxisAlignedBB.getBoundingBox(x, y, z, x + thickness, y + 1F, z + 1F);
}
return super.getCollisionBoundingBoxFromPool(world, x, y, z);
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
// The original code prevented manual operation of Material.iron trapdoors. This bypasses that behavior
int meta = world.getBlockMetadata(x, y, z);
world.setBlockMetadataWithNotify(x, y, z, meta ^ 4, 2);
world.playAuxSFXAtEntity(player, 1003, x, y, z, 0);
return true;
}
}

View File

@ -50,7 +50,7 @@ public class BlockOutgas extends BlockOre {
if(this == ModBlocks.ancient_scrap)
return ModBlocks.gas_radon_tomb;
if(this == ModBlocks.ore_coal_oil_burning || this == ModBlocks.ore_nether_coal) {
if(this == ModBlocks.ore_nether_coal) {
return ModBlocks.gas_monoxide;
}

View File

@ -4,7 +4,7 @@ import java.util.List;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.lib.RefStrings;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side;
@ -17,7 +17,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
public class BlockPipe extends Block implements ITooltipProvider, INBTTransformable {
public class BlockPipe extends Block implements ITooltipProvider, INBTBlockTransformable {
@SideOnly(Side.CLIENT)
private IIcon sideIcon;
@ -96,7 +96,7 @@ public class BlockPipe extends Block implements ITooltipProvider, INBTTransforma
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTTransformable.transformMetaPillar(meta, coordBaseMode);
return INBTBlockTransformable.transformMetaPillar(meta, coordBaseMode);
}
}

View File

@ -10,49 +10,33 @@ import net.minecraft.item.Item;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
@Deprecated
public class BlockPlasma extends Block {
public BlockPlasma(Material p_i45394_1_) {
super(p_i45394_1_);
this.setTickRandomly(true);
this.setTickRandomly(true);
}
@Override
public void updateTick(World world, int x, int y, int z, Random rand)
{
if (world.getGameRules().getGameRuleBooleanValue("doFireTick"))
world.setBlock(x, y, z, Blocks.air);
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_)
{
return null;
}
@Override
public void onEntityCollidedWithBlock(World p_149670_1_, int p_149670_2_, int p_149670_3_, int p_149670_4_, Entity p_149670_5_)
{
p_149670_5_.setFire(10);
p_149670_5_.setInWeb();
}
@Override
public boolean isOpaqueCube()
{
return false;
}
@Override
public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_)
{
public void updateTick(World world, int x, int y, int z, Random rand) {
if(world.getGameRules().getGameRuleBooleanValue("doFireTick"))
world.setBlock(x, y, z, Blocks.air);
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) {
return null;
}
@Override
public boolean renderAsNormalBlock()
{
return false;
}
}
@Override
public void onEntityCollidedWithBlock(World p_149670_1_, int p_149670_2_, int p_149670_3_, int p_149670_4_, Entity p_149670_5_) {
p_149670_5_.setFire(10);
p_149670_5_.setInWeb();
}
@Override public boolean isOpaqueCube() { return false; }
@Override public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { return null; }
@Override public boolean renderAsNormalBlock() { return false; }
}

View File

@ -5,8 +5,8 @@ import java.util.Random;
import com.hbm.blocks.IBlockMulti;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.world.gen.INBTTileEntityTransformable;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTTileEntityTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -29,7 +29,7 @@ import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider, INBTTransformable {
public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider, INBTBlockTransformable {
public BlockPlushie() {
super(Material.cloth);
@ -96,12 +96,16 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z);
if(world.isRemote) {
TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z);
plushie.squishTimer = 11;
return true;
} else {
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.squeakyToy", 0.25F, 1F);
if(plushie.type == PlushieType.HUNDUN) {
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.hunduns_magnificent_howl", 100F, 1F);
} else {
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.squeakyToy", 0.25F, 1F);
}
return true;
}
}
@ -155,7 +159,8 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti
NONE( "NONE", null),
YOMI( "Yomi", "Hi! Can I be your rabbit friend?"),
NUMBERNINE( "Number Nine", "None of y'all deserve coal."),
POOH( "Winnie the Pooh", "Beloved children's character with no malicious intent.");
HUNDUN( "Hundun", "混沌"),
DERG( "Dragon", "Squeeze him.");
public String label;
public String inscription;

View File

@ -0,0 +1,497 @@
package com.hbm.blocks.generic;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.ClientConfig;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.items.ModItems;
import com.hbm.items.tool.ItemRebarPlacer;
import com.hbm.lib.Library;
import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.main.ServerProxy;
import com.hbm.render.block.ISBRHUniversal;
import com.hbm.render.util.RenderBlocksNT;
import com.hbm.tileentity.IBufPacketReceiver;
import com.hbm.tileentity.TileEntityLoadedBase;
import com.hbm.tileentity.network.TileEntityPipeBaseNT;
import com.hbm.uninos.GenNode;
import com.hbm.uninos.INetworkProvider;
import com.hbm.uninos.UniNodespace;
import com.hbm.uninos.networkproviders.RebarNetwork;
import com.hbm.uninos.networkproviders.RebarNetworkProvider;
import com.hbm.util.BobMathUtil;
import com.hbm.util.Compat;
import com.hbm.util.InventoryUtil;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.fluidmk2.IFluidReceiverMK2;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class BlockRebar extends BlockContainer implements ISBRHUniversal {
@SideOnly(Side.CLIENT) protected IIcon concrete;
public BlockRebar() {
super(Material.iron);
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister reg) {
super.registerBlockIcons(reg);
this.concrete = reg.registerIcon(RefStrings.MODID + ":concrete_liquid");
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityRebar();
}
@Override public int getRenderType() { return renderID; }
@Override public boolean isOpaqueCube() { return false; }
@Override public boolean renderAsNormalBlock() { return false; }
@Override
@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) {
return true;
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
TileEntity tile = world.getTileEntity(x, y, z);
if(!(tile instanceof TileEntityRebar)) return;
TileEntityRebar rebar = (TileEntityRebar) tile;
rebar.hasConnection = false;
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
TileEntity neighbor = Compat.getTileStandard(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
if(neighbor instanceof TileEntityPipeBaseNT) {
rebar.hasConnection = true;
return;
}
}
}
public static class TileEntityRebar extends TileEntityLoadedBase implements IFluidReceiverMK2, IBufPacketReceiver {
public Block concrete;
public int concreteMeta;
public int progress;
public int prevProgress;
protected RebarNode node;
public boolean hasConnection = false;
public TileEntityRebar setup(Block b, int m) {
this.concrete = b;
this.concreteMeta = m;
return this;
}
@Override
public void updateEntity() {
long time = worldObj.getTotalWorldTime();
if(!worldObj.isRemote) {
if(prevProgress != progress) {
worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this);
prevProgress = progress;
}
if(this.progress >= 1_000) {
if(concrete != null && ItemRebarPlacer.isValidConk(Item.getItemFromBlock(concrete), concreteMeta)) {
worldObj.setBlock(xCoord, yCoord, zCoord, concrete, concreteMeta, 3);
} else {
worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.concrete_rebar);
}
return;
}
if(time % 60 == 0) {
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
this.trySubscribe(Fluids.CONCRETE, worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir);
}
}
if(this.node == null || this.node.expired) {
this.node = (RebarNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, RebarNetworkProvider.THE_PROVIDER);
if(this.node == null || this.node.expired) {
this.node = this.createNode();
UniNodespace.createNode(worldObj, this.node);
}
}
this.networkPackNT(100);
}
}
@Override
public void invalidate() {
super.invalidate();
if(!worldObj.isRemote) {
if(this.node != null) {
UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, RebarNetworkProvider.THE_PROVIDER);
}
}
}
@Override public void serialize(ByteBuf buf) { buf.writeInt(progress); }
@Override public void deserialize(ByteBuf buf) { this.progress = buf.readInt(); }
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.progress = nbt.getInteger("progress");
this.hasConnection = nbt.getBoolean("hasConnection");
if(nbt.hasKey("block")) {
this.concrete = Block.getBlockById(nbt.getInteger("block"));
this.concreteMeta = nbt.getInteger("meta");
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setInteger("progress", this.progress);
nbt.setBoolean("hasConnection", this.hasConnection);
if(this.concrete != null) {
nbt.setInteger("block", Block.getIdFromBlock(this.concrete));
nbt.setInteger("meta", this.concreteMeta);
}
}
public RebarNode createNode() {
TileEntity tile = (TileEntity) this;
return new RebarNode(RebarNetworkProvider.THE_PROVIDER, new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections(
new DirPos(tile.xCoord + 1, tile.yCoord, tile.zCoord, Library.POS_X),
new DirPos(tile.xCoord - 1, tile.yCoord, tile.zCoord, Library.NEG_X),
new DirPos(tile.xCoord, tile.yCoord + 1, tile.zCoord, Library.POS_Y),
new DirPos(tile.xCoord, tile.yCoord - 1, tile.zCoord, Library.NEG_Y),
new DirPos(tile.xCoord, tile.yCoord, tile.zCoord + 1, Library.POS_Z),
new DirPos(tile.xCoord, tile.yCoord, tile.zCoord - 1, Library.NEG_Z)
);
}
@Override
public FluidTank[] getAllTanks() {
FluidTank tank = new FluidTank(Fluids.CONCRETE, 1_000);
tank.setFill(progress);
return new FluidTank[] {tank};
}
@Override
public long transferFluid(FluidType type, int pressure, long amount) {
if(type != Fluids.CONCRETE) return amount;
if(this.node == null || this.node.expired || !this.node.hasValidNet()) return amount;
List<TileEntityRebar> lowestLinks = new ArrayList();
int lowestY = 256;
int progress = 0;
int capacity = 0;
for(Object o : this.node.net.links) {
RebarNode node = (RebarNode) o;
int y = node.positions[0].getY(); //rebar can only have one pos, there's no multiblock rebar
if(y < lowestY) {
lowestY = y;
progress = 0;
capacity = 0;
lowestLinks.clear();
}
if(y == lowestY) {
TileEntity tile = worldObj.getTileEntity(node.positions[0].getX(), y, node.positions[0].getZ());
if(!(tile instanceof TileEntityRebar)) continue;
TileEntityRebar rebar = (TileEntityRebar) tile;
progress += rebar.progress;
capacity += 1_000;
lowestLinks.add(rebar);
}
}
if(capacity > 0 && !lowestLinks.isEmpty()) {
int maxSpeed = 50;
int maxAccept = (int) BobMathUtil.min(capacity - progress, amount, maxSpeed * lowestLinks.size());
int target = Math.min((progress + maxAccept) / lowestLinks.size(), 1_000);
for(TileEntityRebar rebar : lowestLinks) {
if(rebar.progress >= target) continue;
int delta = target - rebar.progress;
if(delta > amount) continue;
rebar.progress += delta;
amount -= delta;
}
}
return amount;
}
@Override
public long getDemand(FluidType type, int pressure) {
return 10_000;
}
}
public static class RebarNode extends GenNode<RebarNetwork> {
public RebarNode(INetworkProvider<RebarNetwork> provider, BlockPos... positions) {
super(provider, positions);
}
@Override
public RebarNode setConnections(DirPos... connections) {
super.setConnections(connections);
return this;
}
}
@Override
public void renderInventoryBlock(Block block, int meta, int modelId, Object renderBlocks) {
GL11.glPushMatrix();
RenderBlocks renderer = (RenderBlocks) renderBlocks;
GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
double o = 0.25D;
renderer.setRenderBounds(0.4375D - o, 0D, 0.4375D - o, 0.5625D - o, 1D, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0.4375D - o, 0D, 0.4375D + o, 0.5625D - o, 1D, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0.4375D + o, 0D, 0.4375D - o, 0.5625D + o, 1D, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0.4375D + o, 0D, 0.4375D + o, 0.5625D + o, 1D, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0D, 0.4375D - o, 0.4375D - o, 1D, 0.5625D - o, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0D, 0.4375D - o, 0.4375D + o, 1D, 0.5625D - o, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0D, 0.4375D + o, 0.4375D - o, 1D, 0.5625D + o, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0D, 0.4375D + o, 0.4375D + o, 1D, 0.5625D + o, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0.4375D - o, 0.4375D - o, 0D, 0.5625D - o, 0.5625D - o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0.4375D - o, 0.4375D + o, 0D, 0.5625D - o, 0.5625D + o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0.4375D + o, 0.4375D - o, 0D, 0.5625D + o, 0.5625D - o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0.4375D + o, 0.4375D + o, 0D, 0.5625D + o, 0.5625D + o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
GL11.glPopMatrix();
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, Object renderBlocks) {
RenderBlocksNT renderer = RenderBlocksNT.INSTANCE.setWorld(world);
Tessellator tessellator = Tessellator.instance;
tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
tessellator.setColorOpaque_F(1, 1, 1);
double o = 0.25D;
double min = -0.001;
double max = 1.001;
if(ClientConfig.RENDER_REBAR_SIMPLE.get()) {
renderer.setRenderBounds(0.4375D, min, 0.4375D, 0.5625D, max, 0.5625D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(min, 0.4375D, 0.4375D, max, 0.5625D, 0.5625D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.4375D, 0.4375D, min, 0.5625D, 0.5625D, max); renderer.renderStandardBlock(block, x, y, z);
} else {
renderer.setRenderBounds(0.4375D - o, min, 0.4375D - o, 0.5625D - o, max, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.4375D - o, min, 0.4375D + o, 0.5625D - o, max, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.4375D + o, min, 0.4375D - o, 0.5625D + o, max, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.4375D + o, min, 0.4375D + o, 0.5625D + o, max, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(min, 0.4375D - o, 0.4375D - o, max, 0.5625D - o, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(min, 0.4375D - o, 0.4375D + o, max, 0.5625D - o, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(min, 0.4375D + o, 0.4375D - o, max, 0.5625D + o, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(min, 0.4375D + o, 0.4375D + o, max, 0.5625D + o, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.4375D - o, 0.4375D - o, min, 0.5625D - o, 0.5625D - o, max); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.4375D - o, 0.4375D + o, min, 0.5625D - o, 0.5625D + o, max); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.4375D + o, 0.4375D - o, min, 0.5625D + o, 0.5625D - o, max); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.4375D + o, 0.4375D + o, min, 0.5625D + o, 0.5625D + o, max); renderer.renderStandardBlock(block, x, y, z);
}
/*TileEntity tile = world.getTileEntity(x, y, z);
if(tile instanceof TileEntityRebar) {
TileEntityRebar rebar = (TileEntityRebar) tile;
if(rebar.progress > 0) {
double height = rebar.progress / 1000D;
renderer.setOverrideBlockTexture(concrete);
renderer.setRenderBounds(0, 0, 0, 1, height, 1); renderer.renderStandardBlock(block, x, y, z);
renderer.clearOverrideBlockTexture();
}
}*/
return true;
}
// from ModEventHandlerClient.onRenderWorldLastEvent
@SideOnly(Side.CLIENT)
public static void renderRebar(List tiles, float interp) {
List<TileEntityRebar> rebars = new ArrayList();
for(Object o : tiles) {
if(!(o instanceof TileEntityRebar)) continue;
TileEntityRebar rebar = (TileEntityRebar) o;
if(rebar.progress > 0) rebars.add(rebar);
if(rebars.size() >= ClientConfig.RENDER_REBAR_LIMIT.get()) break;
}
Minecraft mc = Minecraft.getMinecraft();
EntityPlayer player = mc.thePlayer;
World world = mc.theWorld;
double dx = player.prevPosX + (player.posX - player.prevPosX) * interp;
double dy = player.prevPosY + (player.posY - player.prevPosY) * interp;
double dz = player.prevPosZ + (player.posZ - player.prevPosZ) * interp;
if(!rebars.isEmpty()) {
GL11.glPushMatrix();
GL11.glShadeModel(GL11.GL_SMOOTH);
//RenderHelper.enableStandardItemLighting();
EntityRenderer entityRenderer = mc.entityRenderer;
entityRenderer.enableLightmap(interp);
RenderBlocksNT renderer = RenderBlocksNT.INSTANCE.setWorld(world);
renderer.setOverrideBlockTexture(((BlockRebar) ModBlocks.rebar).concrete);
mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture);
Tessellator tess = Tessellator.instance;
tess.startDrawingQuads();
for(TileEntityRebar rebar : rebars) {
tess.setTranslation(-dx, -dy, -dz);
tess.setColorRGBA_F(1F, 1F, 1F, 1F);
renderer.setRenderBounds(0, 0, 0, 1, rebar.progress / 1000D, 1);
renderer.renderStandardBlock(ModBlocks.rebar, rebar.xCoord, rebar.yCoord, rebar.zCoord);
}
tess.draw();
tess.setTranslation(0, 0, 0);
renderer.clearOverrideBlockTexture();
entityRenderer.disableLightmap(interp);
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glPopMatrix();
}
if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.rebar_placer && player.getHeldItem().hasTagCompound() &&
player.getHeldItem().stackTagCompound.hasKey("pos") && mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {
int[] pos = player.getHeldItem().stackTagCompound.getIntArray("pos");
MovingObjectPosition mop = mc.objectMouseOver;
ForgeDirection dir = ForgeDirection.getOrientation(mop.sideHit);
int iX = mop.blockX + dir.offsetX;
int iY = mop.blockY + dir.offsetY;
int iZ = mop.blockZ + dir.offsetZ;
double minX = Math.min(pos[0], iX) + 0.125;
double maxX = Math.max(pos[0], iX) + 0.875;
double minY = Math.min(pos[1], iY) + 0.125;
double maxY = Math.max(pos[1], iY) + 0.875;
double minZ = Math.min(pos[2], iZ) + 0.125;
double maxZ = Math.max(pos[2], iZ) + 0.875;
GL11.glPushMatrix();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glColor3f(1F, 1F, 1F);
Tessellator tess = Tessellator.instance;
tess.setTranslation(-dx, -dy, -dz);
tess.startDrawing(GL11.GL_LINES);
tess.setBrightness(240);
tess.setColorRGBA_F(1F, 1F, 1F, 1F);
// top
tess.addVertex(minX, maxY, minZ);
tess.addVertex(minX, maxY, maxZ);
tess.addVertex(minX, maxY, maxZ);
tess.addVertex(maxX, maxY, maxZ);
tess.addVertex(maxX, maxY, maxZ);
tess.addVertex(maxX, maxY, minZ);
tess.addVertex(maxX, maxY, minZ);
tess.addVertex(minX, maxY, minZ);
// bottom
tess.addVertex(minX, minY, minZ);
tess.addVertex(minX, minY, maxZ);
tess.addVertex(minX, minY, maxZ);
tess.addVertex(maxX, minY, maxZ);
tess.addVertex(maxX, minY, maxZ);
tess.addVertex(maxX, minY, minZ);
tess.addVertex(maxX, minY, minZ);
tess.addVertex(minX, minY, minZ);
// sides
tess.addVertex(minX, minY, minZ);
tess.addVertex(minX, maxY, minZ);
tess.addVertex(maxX, minY, minZ);
tess.addVertex(maxX, maxY, minZ);
tess.addVertex(maxX, minY, maxZ);
tess.addVertex(maxX, maxY, maxZ);
tess.addVertex(minX, minY, maxZ);
tess.addVertex(minX, maxY, maxZ);
tess.draw();
tess.setTranslation(0, 0, 0);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glPopMatrix();
int rebarLeft = InventoryUtil.countAStackMatches(player, new ComparableStack(ModBlocks.rebar), true);
int rebarRequired = (Math.max(pos[0], iX) - Math.min(pos[0], iX) + 1) * (Math.max(pos[1], iY) - Math.min(pos[1], iY) + 1) * (Math.max(pos[2], iZ) - Math.min(pos[2], iZ) + 1);
MainRegistry.proxy.displayTooltip((rebarRequired > rebarLeft ? EnumChatFormatting.RED : EnumChatFormatting.GREEN) + (rebarLeft + " / " + rebarRequired), 1_000, ServerProxy.ID_CABLE);
}
}
}

View File

@ -11,6 +11,7 @@ import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
@ -66,7 +67,7 @@ public class BlockReeds extends Block {
@Override
public Item getItemDropped(int meta, Random rand, int fortune) {
return null;
return Items.stick;
}
@Override

View File

@ -152,7 +152,7 @@ public class BlockToolConversion extends BlockMulti implements IToolable, ILookO
public static void registerRecipes() {
conversions.put(new Pair(ToolType.BOLT, new MetaBlock(ModBlocks.watz_end, 0)), new Pair(new AStack[] {new OreDictStack(OreDictManager.DURA.bolt(), 4)}, new MetaBlock(ModBlocks.watz_end, 1)));
conversions.put(new Pair(ToolType.TORCH, new MetaBlock(ModBlocks.fusion_conductor, 0)), new Pair(new AStack[] {new OreDictStack(OreDictManager.STEEL.plateCast())}, new MetaBlock(ModBlocks.fusion_conductor, 1)));
conversions.put(new Pair(ToolType.TORCH, new MetaBlock(ModBlocks.fusion_component, 0)), new Pair(new AStack[] {new OreDictStack(OreDictManager.STEEL.plateCast())}, new MetaBlock(ModBlocks.fusion_component, 1)));
conversions.put(new Pair(ToolType.TORCH, new MetaBlock(ModBlocks.icf_component, 1)), new Pair(new AStack[] {new OreDictStack(OreDictManager.ANY_BISMOIDBRONZE.plateCast())}, new MetaBlock(ModBlocks.icf_component, 2)));
conversions.put(new Pair(ToolType.BOLT, new MetaBlock(ModBlocks.icf_component, 3)), new Pair(new AStack[] {new OreDictStack(OreDictManager.STEEL.plateCast()), new OreDictStack(OreDictManager.DURA.bolt(), 4)}, new MetaBlock(ModBlocks.icf_component, 4)));
}

View File

@ -18,7 +18,7 @@ import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.TileEntityLoadedBase;
import com.hbm.util.BufferUtil;
import com.hbm.util.i18n.I18nUtil;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.common.registry.GameRegistry;
@ -37,7 +37,6 @@ import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
@ -47,7 +46,7 @@ import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotation, INBTTransformable, IGUIProvider, ILookOverlay {
public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotation, INBTBlockTransformable, IGUIProvider, ILookOverlay {
private IIcon iconTop;
private IIcon iconSide;
@ -123,7 +122,7 @@ public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotatio
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTTransformable.transformMetaDeco(meta, coordBaseMode);
return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
}
@Override
@ -135,10 +134,10 @@ public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotatio
TileEntityWandJigsaw jigsaw = (TileEntityWandJigsaw) te;
if(!player.isSneaking()) {
Block block = getBlock(world, player.getHeldItem());
Block block = ModBlocks.getBlockFromStack(player.getHeldItem());
if(block == ModBlocks.wand_air) block = Blocks.air;
if(block != null && block != ModBlocks.wand_jigsaw && block != ModBlocks.wand_loot) {
if(block != null && !ModBlocks.isStructureBlock(block, false)) {
jigsaw.replaceBlock = block;
jigsaw.replaceMeta = player.getHeldItem().getItemDamage();
@ -155,13 +154,6 @@ public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotatio
return false;
}
private Block getBlock(World world, ItemStack stack) {
if(stack == null) return null;
if(!(stack.getItem() instanceof ItemBlock)) return null;
return ((ItemBlock) stack.getItem()).field_150939_a;
}
@Override
@SideOnly(Side.CLIENT)
public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {

View File

@ -0,0 +1,345 @@
package com.hbm.blocks.generic;
import api.hbm.block.IToolable;
import com.hbm.blocks.IBlockSideRotation;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.StructureConfig;
import com.hbm.interfaces.IBomb;
import com.hbm.interfaces.ICopiable;
import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.TileEntityLoadedBase;
import com.hbm.util.BufferUtil;
import com.hbm.util.i18n.I18nUtil;
import com.hbm.world.gen.nbt.INBTTileEntityTransformable;
import com.hbm.world.gen.util.LogicBlockActions;
import com.hbm.world.gen.util.LogicBlockConditions;
import com.hbm.world.gen.util.LogicBlockInteractions;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList;
import java.util.List;
public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb {
@SideOnly(Side.CLIENT) protected IIcon iconTop;
public BlockWandLogic() {
super(Material.iron);
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_logic");
this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_logic_top");
}
@Override
public IIcon getIcon(int side, int meta) {
return (side <= 1) ? iconTop : blockIcon;
}
@Override
public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) {
if(side == 0) return IBlockSideRotation.topToBottom(world.getBlockMetadata(x, y, z));
if(side == 1) return world.getBlockMetadata(x, y, z);
return 0;
}
@Override
public int getRenderType() {
return IBlockSideRotation.getRenderType();
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
if (i == 0) world.setBlockMetadataWithNotify(x, y, z, 3, 2);
if (i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2);
if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2);
if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2);
ForgeDirection dir = ForgeDirection.UNKNOWN;
switch(i){
case 0: dir = ForgeDirection.SOUTH;break;
case 1: dir = ForgeDirection.WEST; break;
case 2: dir = ForgeDirection.NORTH;break;
case 3: dir = ForgeDirection.EAST; break;
}
TileEntity te = world.getTileEntity(x, y, z);
if(te instanceof TileEntityWandLogic)
((TileEntityWandLogic)te).placedRotation = dir.ordinal();
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) {
ItemStack stack = player.getHeldItem();
if (stack != null && stack.getItem() instanceof ItemBlock && !player.isSneaking()) {
ItemBlock ib = (ItemBlock) stack.getItem();
Block block = ib.field_150939_a;
if (block.renderAsNormalBlock() && block != this) {
TileEntity tile = world.getTileEntity(x, y, z);
if(tile instanceof TileEntityWandLogic){
TileEntityWandLogic logic = (TileEntityWandLogic) tile;
logic.disguise = block;
logic.disguiseMeta = stack.getItemDamage() & 15;
return true;
}
}
}
return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ);
}
@Override
public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) {
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileEntityWandLogic)) return false;
TileEntityWandLogic logic = (TileEntityWandLogic) te;
switch(tool) {
case SCREWDRIVER:
List<String> actionNames = LogicBlockActions.getActionNames();
int indexA = actionNames.indexOf(logic.actionID);
indexA += player.isSneaking() ? -1 : 1;
indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1);
logic.actionID = actionNames.get(indexA);
return true;
case DEFUSER:
List<String> conditionNames = LogicBlockConditions.getConditionNames();
int indexC = conditionNames.indexOf(logic.conditionID);
indexC += player.isSneaking() ? -1 : 1;
indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1);
logic.conditionID = conditionNames.get(indexC);
return true;
case HAND_DRILL:
List<String> interactionNames = LogicBlockInteractions.getInteractionNames();
int indexI = interactionNames.indexOf(logic.interactionID);
indexI += player.isSneaking() ? -1 : 1;
indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1);
logic.interactionID = interactionNames.get(indexI);
return true;
default: return false;
}
}
@Override
public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileEntityWandLogic)) return;
TileEntityWandLogic logic = (TileEntityWandLogic) te;
List<String> text = new ArrayList<>();
text.add("Action: " + logic.actionID);
text.add("Condition: " + logic.conditionID);
text.add("Interaction: " + (logic.interactionID != null ? logic.interactionID : "None"));
String block;
if(logic.disguise != null && logic.disguise != Blocks.air)
block = I18nUtil.resolveKey(logic.disguise.getUnlocalizedName() + ".name");
else
block = "None";
text.add("Disguise Block: " + block);
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text);
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back");
list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back");
list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle forwards through the interaction list, shift click to go back");
list.add(EnumChatFormatting.YELLOW + "Use a detonator to transform");
}
@Override
public TileEntity createNewTileEntity(World worldIn, int meta) {
return new TileEntityWandLogic();
}
@Override
public BombReturnCode explode(World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileEntityWandLogic)) return null;
((TileEntityWandLogic) te).triggerReplace = true;
return BombReturnCode.TRIGGERED;
}
public static class TileEntityWandLogic extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable {
private boolean triggerReplace;
public int placedRotation;
Block disguise;
int disguiseMeta = -1;
public String actionID = "FODDER_WAVE";
public String conditionID = "PLAYER_CUBE_5";
public String interactionID;
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
if(triggerReplace) {
// On the first tick of this TE, replace with intended block and fill with loot
replace();
} else {
networkPackNT(15);
}
}
}
private void replace() {
if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandLogic)) {
MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a logic block but we're doing a TE update as if it is, cancelling!");
return;
}
worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.logic_block);
TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord);
if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) {
MainRegistry.logger.warn("TE for logic block set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!");
te = ModBlocks.wand_logic.createTileEntity(worldObj, 0);
worldObj.setTileEntity(xCoord, yCoord, zCoord, te);
}
if(te instanceof LogicBlock.TileEntityLogicBlock){
LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) te;
logic.actionID = actionID;
logic.conditionID = conditionID;
logic.interactionID = interactionID;
logic.direction = ForgeDirection.getOrientation(placedRotation);
logic.disguise = disguise;
logic.disguiseMeta = disguiseMeta;
}
}
@Override
public void transformTE(World world, int coordBaseMode) {
triggerReplace = !StructureConfig.debugStructures;
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setString("actionID", actionID);
nbt.setString("conditionID", conditionID);
if(interactionID != null)
nbt.setString("interactionID", interactionID);
nbt.setInteger("rotation", placedRotation);
if(disguise != null){
nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString());
nbt.setInteger("disguiseMeta", disguiseMeta);
}
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
actionID = nbt.getString("actionID");
conditionID = nbt.getString("conditionID");
if(nbt.hasKey("interactionID"))
interactionID = nbt.getString("interactionID");
placedRotation = nbt.getInteger("rotation");
if(nbt.hasKey("disguise")){
disguise = Block.getBlockFromName(nbt.getString("disguise"));
disguiseMeta = nbt.getInteger("disguiseMeta");
}
}
@Override
public void serialize(ByteBuf buf) {
buf.writeInt(placedRotation);
BufferUtil.writeString(buf, actionID);
BufferUtil.writeString(buf, conditionID);
BufferUtil.writeString(buf, interactionID);
buf.writeInt(Block.getIdFromBlock(disguise));
buf.writeInt(disguiseMeta);
}
@Override
public void deserialize(ByteBuf buf) {
placedRotation = buf.readInt();
actionID = BufferUtil.readString(buf);
conditionID = BufferUtil.readString(buf);
interactionID = BufferUtil.readString(buf);
disguise = Block.getBlockById(buf.readInt());
disguiseMeta = buf.readInt();
}
@Override
public NBTTagCompound getSettings(World world, int x, int y, int z) {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setString("actionID", actionID);
nbt.setString("conditionID", conditionID);
if(interactionID != null)
nbt.setString("interactionID", interactionID);
if(disguise != null){
nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString());
nbt.setInteger("disguiseMeta", disguiseMeta);
}
return nbt;
}
@Override
public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) {
actionID = nbt.getString("actionID");
conditionID = nbt.getString("conditionID");
interactionID = nbt.getString("interactionID");
if(nbt.hasKey("disguise")){
disguise = Block.getBlockFromName(nbt.getString("disguise"));
disguiseMeta = nbt.getInteger("disguiseMeta");
}
}
}
}

View File

@ -17,7 +17,7 @@ import com.hbm.tileentity.TileEntityLoadedBase;
import com.hbm.util.BufferUtil;
import com.hbm.util.LootGenerator;
import com.hbm.util.i18n.I18nUtil;
import com.hbm.world.gen.INBTTileEntityTransformable;
import com.hbm.world.gen.nbt.INBTTileEntityTransformable;
import com.mojang.authlib.GameProfile;
import api.hbm.block.IToolable;
@ -33,7 +33,6 @@ import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
@ -82,7 +81,7 @@ public class BlockWandLoot extends BlockContainer implements ILookOverlay, ITool
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 3, 2);
if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2);
@ -153,17 +152,14 @@ public class BlockWandLoot extends BlockContainer implements ILookOverlay, ITool
}
private Block getLootableBlock(World world, ItemStack stack) {
if(stack == null) return null;
Block block = ModBlocks.getBlockFromStack(stack);
if(block == null) return null;
if(stack.getItem() instanceof ItemBlock) {
Block block = ((ItemBlock) stack.getItem()).field_150939_a;
if(block == ModBlocks.deco_loot) return block;
if(block == ModBlocks.deco_loot) return block;
if(block instanceof ITileEntityProvider) {
TileEntity te = ((ITileEntityProvider) block).createNewTileEntity(world, 12);
if(te instanceof IInventory) return block;
}
if(block instanceof ITileEntityProvider) {
TileEntity te = ((ITileEntityProvider) block).createNewTileEntity(world, 12);
if(te instanceof IInventory) return block;
}
return null;

View File

@ -0,0 +1,573 @@
package com.hbm.blocks.generic;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.lwjgl.input.Keyboard;
import com.hbm.blocks.IBlockMulti;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.StructureConfig;
import com.hbm.interfaces.IControlReceiver;
import com.hbm.inventory.gui.element.GuiFileList;
import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toserver.NBTControlPacket;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.TileEntityLoadedBase;
import com.hbm.util.BufferUtil;
import com.hbm.util.Tuple.Pair;
import com.hbm.util.i18n.I18nUtil;
import com.hbm.world.gen.nbt.NBTStructure;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.event.ClickEvent;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.Container;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
public class BlockWandStructure extends BlockContainer implements IBlockMulti, IGUIProvider, ILookOverlay {
private IIcon saveIcon;
private IIcon loadIcon;
public BlockWandStructure() {
super(Material.iron);
}
@Override
public TileEntity createNewTileEntity(World worldIn, int meta) {
return new TileEntityWandStructure();
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
saveIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_structure_save");
loadIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_structure_load");
}
@Override
public IIcon getIcon(int side, int meta) {
if(meta == 1) return loadIcon;
return saveIcon;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileEntityWandStructure)) return false;
TileEntityWandStructure structure = (TileEntityWandStructure) te;
if(!player.isSneaking()) {
Block block = ModBlocks.getBlockFromStack(player.getHeldItem());
if(block != null && !ModBlocks.isStructureBlock(block, true)) {
Pair<Block, Integer> bm = new Pair<Block, Integer>(block, player.getHeldItem().getItemDamage());
if(structure.blacklist.contains(bm)) {
structure.blacklist.remove(bm);
} else {
structure.blacklist.add(bm);
}
return true;
}
if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z);
return true;
}
return false;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) {
list.add(new ItemStack(itemIn, 1, 0));
list.add(new ItemStack(itemIn, 1, 1));
}
@Override
public int getSubCount() {
return 2;
}
@Override
public String getUnlocalizedName(ItemStack stack) {
int meta = stack.getItemDamage();
if(meta == 1) return getUnlocalizedName() + ".load";
return getUnlocalizedName() + ".save";
}
@Override
public int damageDropped(int meta) {
return meta;
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
return null;
}
@Override
public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
int meta = world.getBlockMetadata(x, y, z);
TileEntityWandStructure structure = (TileEntityWandStructure) world.getTileEntity(x, y, z);
if(meta == 1) return new GuiStructureLoad(structure);
return new GuiStructureSave(structure);
}
@Override
public void printHook(Pre event, World world, int x, int y, int z) {
if(world.getBlockMetadata(x, y, z) != 0) return;
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileEntityWandStructure)) return;
TileEntityWandStructure structure = (TileEntityWandStructure) te;
List<String> text = new ArrayList<String>();
text.add(EnumChatFormatting.GRAY + "Name: " + EnumChatFormatting.RESET + structure.name);
text.add(EnumChatFormatting.GRAY + "Blacklist:");
for (Pair<Block, Integer> bm : structure.blacklist) {
text.add(EnumChatFormatting.RED + "- " + bm.getKey().getUnlocalizedName() + " : " + bm.getValue());
}
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".save.name"), 0xffff00, 0x404000, text);
}
public static class TileEntityWandStructure extends TileEntityLoadedBase implements IControlReceiver {
public String name = "";
public int sizeX = 1;
public int sizeY = 1;
public int sizeZ = 1;
public Set<Pair<Block, Integer>> blacklist = new HashSet<>();
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
networkPackNT(256);
}
}
public void saveStructure(EntityPlayer player) {
if(name.isEmpty()) {
player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Could not save: invalid name"));
return;
}
if(sizeX <= 0 || sizeY <= 0 || sizeZ <= 0) {
player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Could not save: invalid dimensions"));
return;
}
Pair<Block, Integer> air = new Pair<Block, Integer>(Blocks.air, 0);
blacklist.add(air);
File file = NBTStructure.quickSaveArea(name + ".nbt", worldObj, xCoord, yCoord + 1, zCoord, xCoord + sizeX - 1, yCoord + sizeY, zCoord + sizeZ - 1, blacklist);
blacklist.remove(air);
if(file == null) {
player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed to save structure"));
return;
}
ChatComponentText fileText = new ChatComponentText(file.getName());
fileText.getChatStyle().setChatClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, file.getParentFile().getAbsolutePath()));
fileText.getChatStyle().setUnderlined(true);
player.addChatMessage(new ChatComponentText("Saved structure as ").appendSibling(fileText));
}
public void loadStructure(EntityPlayer player) {
if(name.isEmpty()) {
player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Could not load: no filename specified"));
return;
}
File structureDirectory = new File(Minecraft.getMinecraft().mcDataDir, "structures");
structureDirectory.mkdir();
File structureFile = new File(structureDirectory, name + ".nbt");
boolean previousDebug = StructureConfig.debugStructures;
StructureConfig.debugStructures = true;
try {
NBTStructure structure = new NBTStructure(structureFile);
sizeX = structure.getSizeX();
sizeY = structure.getSizeY();
sizeZ = structure.getSizeZ();
structure.build(worldObj, xCoord, yCoord + 1, zCoord, 0, false, true);
worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 3);
player.addChatMessage(new ChatComponentText("Structure loaded"));
} catch (FileNotFoundException ex) {
player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Could not load: file not found"));
} finally {
StructureConfig.debugStructures = previousDebug;
}
}
@Override
public void serialize(ByteBuf buf) {
BufferUtil.writeString(buf, name);
buf.writeInt(sizeX);
buf.writeInt(sizeY);
buf.writeInt(sizeZ);
buf.writeInt(blacklist.size());
for(Pair<Block, Integer> bm : blacklist) {
buf.writeInt(Block.getIdFromBlock(bm.getKey()));
buf.writeInt(bm.getValue());
}
}
@Override
public void deserialize(ByteBuf buf) {
name = BufferUtil.readString(buf);
sizeX = buf.readInt();
sizeY = buf.readInt();
sizeZ = buf.readInt();
int count = buf.readInt();
blacklist = new HashSet<>();
for(int i = 0; i < count; i++) {
Block block = Block.getBlockById(buf.readInt());
int meta = buf.readInt();
blacklist.add(new Pair<Block, Integer>(block, meta));
}
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
name = nbt.getString("name");
sizeX = nbt.getInteger("sizeX");
sizeY = nbt.getInteger("sizeY");
sizeZ = nbt.getInteger("sizeZ");
int[] blocks = nbt.getIntArray("blocks");
int[] metas = nbt.getIntArray("metas");
blacklist = new HashSet<>();
for (int i = 0; i < blocks.length; i++) {
blacklist.add(new Pair<Block, Integer>(Block.getBlockById(blocks[i]), metas[i]));
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setString("name", name);
nbt.setInteger("sizeX", sizeX);
nbt.setInteger("sizeY", sizeY);
nbt.setInteger("sizeZ", sizeZ);
nbt.setIntArray("blocks", blacklist.stream().mapToInt(b -> Block.getIdFromBlock(b.getKey())).toArray());
nbt.setIntArray("metas", blacklist.stream().mapToInt(b -> b.getValue()).toArray());
}
@Override
public boolean hasPermission(EntityPlayer player) {
return true;
}
public void receiveControl(NBTTagCompound data) {}
@Override
public void receiveControl(EntityPlayer player, NBTTagCompound nbt) {
readFromNBT(nbt);
markDirty();
if(nbt.getBoolean("save")) {
saveStructure(player);
}
if(nbt.getBoolean("load")) {
loadStructure(player);
}
}
@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getRenderBoundingBox() {
return INFINITE_EXTENT_AABB;
}
@Override
@SideOnly(Side.CLIENT)
public double getMaxRenderDistanceSquared() {
return 65536.0D;
}
}
@SideOnly(Side.CLIENT)
public static class GuiStructureSave extends GuiScreen {
private final TileEntityWandStructure tile;
private GuiTextField textName;
private GuiTextField textSizeX;
private GuiTextField textSizeY;
private GuiTextField textSizeZ;
private GuiButton performAction;
private boolean saveOnClose = false;
public GuiStructureSave(TileEntityWandStructure tile) {
this.tile = tile;
}
@Override
public void initGui() {
Keyboard.enableRepeatEvents(true);
textName = new GuiTextField(fontRendererObj, width / 2 - 150, 50, 300, 20);
textName.setText(tile.name);
textSizeX = new GuiTextField(fontRendererObj, width / 2 - 150, 100, 50, 20);
textSizeX.setText("" + tile.sizeX);
textSizeY = new GuiTextField(fontRendererObj, width / 2 - 100, 100, 50, 20);
textSizeY.setText("" + tile.sizeY);
textSizeZ = new GuiTextField(fontRendererObj, width / 2 - 50, 100, 50, 20);
textSizeZ.setText("" + tile.sizeZ);
performAction = new GuiButton(0, width / 2 - 150, 150, 300, 20, "SAVE");
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
drawDefaultBackground();
textName.drawTextBox();
textSizeX.drawTextBox();
textSizeY.drawTextBox();
textSizeZ.drawTextBox();
performAction.drawButton(mc, mouseX, mouseY);
super.drawScreen(mouseX, mouseY, partialTicks);
}
@Override
public void onGuiClosed() {
Keyboard.enableRepeatEvents(false);
NBTTagCompound data = new NBTTagCompound();
tile.writeToNBT(data);
data.setString("name", textName.getText());
try { data.setInteger("sizeX", Integer.parseInt(textSizeX.getText())); } catch (Exception ex) {}
try { data.setInteger("sizeY", Integer.parseInt(textSizeY.getText())); } catch (Exception ex) {}
try { data.setInteger("sizeZ", Integer.parseInt(textSizeZ.getText())); } catch (Exception ex) {}
if(saveOnClose) data.setBoolean("save", true);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, tile.xCoord, tile.yCoord, tile.zCoord));
}
@Override
protected void keyTyped(char typedChar, int keyCode) {
super.keyTyped(typedChar, keyCode);
textName.textboxKeyTyped(typedChar, keyCode);
textSizeX.textboxKeyTyped(typedChar, keyCode);
textSizeY.textboxKeyTyped(typedChar, keyCode);
textSizeZ.textboxKeyTyped(typedChar, keyCode);
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) {
super.mouseClicked(mouseX, mouseY, mouseButton);
textName.mouseClicked(mouseX, mouseY, mouseButton);
textSizeX.mouseClicked(mouseX, mouseY, mouseButton);
textSizeY.mouseClicked(mouseX, mouseY, mouseButton);
textSizeZ.mouseClicked(mouseX, mouseY, mouseButton);
if(performAction.mousePressed(mc, mouseX, mouseY)) {
saveOnClose = true;
mc.displayGuiScreen(null);
mc.setIngameFocus();
}
}
@Override
public boolean doesGuiPauseGame() {
return false;
}
}
@SideOnly(Side.CLIENT)
public static class GuiStructureLoad extends GuiScreen {
private final TileEntityWandStructure tile;
private GuiTextField textName;
private GuiFileList fileList;
private GuiButton performAction;
private boolean loadOnClose = false;
private static File structureDirectory = new File(Minecraft.getMinecraft().mcDataDir, "structures");
private static String nameFilter = "";
private static final FileFilter structureFilter = new FileFilter() {
public boolean accept(File file) {
if(!file.isFile() || !file.getName().endsWith(".nbt")) return false;
return nameFilter.isEmpty() || file.getName().contains(nameFilter);
}
};
public GuiStructureLoad(TileEntityWandStructure tile) {
this.tile = tile;
}
@Override
public void initGui() {
Keyboard.enableRepeatEvents(true);
textName = new GuiTextField(fontRendererObj, width / 2 - 150, 50, 300, 20);
textName.setText(tile.name);
nameFilter = tile.name;
structureDirectory.mkdir();
fileList = new GuiFileList(mc, structureDirectory.listFiles(structureFilter), this::selectFile, nameFilter, width, height, 70, height - 90, 16);
performAction = new GuiButton(0, width / 2 - 150, height - 70, 300, 20, "LOAD");
}
public void selectFile(File file) {
String fileName = file.getName();
textName.setText(fileName.substring(0, fileName.length() - 4));
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
fileList.drawScreen(mouseX, mouseY, partialTicks);
textName.drawTextBox();
performAction.drawButton(mc, mouseX, mouseY);
super.drawScreen(mouseX, mouseY, partialTicks);
}
@Override
public void onGuiClosed() {
Keyboard.enableRepeatEvents(false);
NBTTagCompound data = new NBTTagCompound();
tile.writeToNBT(data);
data.setString("name", textName.getText());
if(loadOnClose) data.setBoolean("load", true);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, tile.xCoord, tile.yCoord, tile.zCoord));
}
@Override
protected void keyTyped(char typedChar, int keyCode) {
super.keyTyped(typedChar, keyCode);
textName.textboxKeyTyped(typedChar, keyCode);
if(!nameFilter.equals(textName.getText())) {
nameFilter = textName.getText();
fileList = new GuiFileList(mc, structureDirectory.listFiles(structureFilter), this::selectFile, nameFilter, width, height, 70, height - 90, 16);
}
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) {
super.mouseClicked(mouseX, mouseY, mouseButton);
textName.mouseClicked(mouseX, mouseY, mouseButton);
fileList.func_148179_a(mouseX, mouseY, mouseButton);
fileList.select(textName.getText());
if(performAction.mousePressed(mc, mouseX, mouseY)) {
loadOnClose = true;
mc.displayGuiScreen(null);
mc.setIngameFocus();
}
}
@Override
protected void mouseMovedOrUp(int mouseX, int mouseY, int state) {
super.mouseMovedOrUp(mouseX, mouseY, state);
fileList.func_148181_b(mouseX, mouseY, state);
}
@Override
public boolean doesGuiPauseGame() {
return false;
}
}
}

View File

@ -0,0 +1,430 @@
package com.hbm.blocks.generic;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.input.Keyboard;
import com.hbm.blocks.IBlockSideRotation;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ModBlocks;
import com.hbm.interfaces.IControlReceiver;
import com.hbm.items.ModItems;
import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toserver.NBTControlPacket;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.TileEntityLoadedBase;
import com.hbm.util.BufferUtil;
import com.hbm.util.i18n.I18nUtil;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import com.hbm.world.gen.nbt.NBTStructure;
import com.hbm.world.gen.nbt.NBTStructure.JigsawConnection;
import com.hbm.world.gen.nbt.SpawnCondition;
import com.hbm.world.gen.nbt.JigsawPiece;
import com.hbm.world.gen.nbt.JigsawPool;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockPistonBase;
import net.minecraft.block.material.Material;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
import net.minecraftforge.common.util.ForgeDirection;
/**
* You're familiar with Billy Mitchell, World Video Game Champion? He could probably do it.
* So I gotta find a way to harness his power. And I think I've found a way.
*
* THAT'S RIGHT, WE'RE GONNA CHEAT.
*
* NBTStructures have the inherent flaws of the vanilla structure system: Structures are composed
* before terrain gen even kicks in, placement order of components are arbitrary and certain
* connected parts will fall apart due to unexpected variance in the terrain. Not good.
* The solution: Simply delay generation of parts using a tile entity that checks if the chunks
* in front of it are loaded, and then places a random part from the chosen pool. When this happens,
* the player is usually still far far away so they'll be none the wiser. Chunk load checks help
* prevent forced chunk loading and all the lag that comes with that.
*
* The system is named after tandem shaped charges: Make a hole with the first charge, then deliver
* the actual payload.
*
* @author hbm, Mellow
*/
public class BlockWandTandem extends BlockContainer implements IBlockSideRotation, INBTBlockTransformable, IGUIProvider, ILookOverlay {
private IIcon iconTop;
private IIcon iconSide;
private IIcon iconBack;
public BlockWandTandem() {
super(Material.iron);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityWandTandem();
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) {
int l = BlockPistonBase.determineOrientation(world, x, y, z, player);
world.setBlockMetadataWithNotify(x, y, z, l, 2);
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem");
this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem_top");
this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem_side");
this.iconBack = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem_back");
}
@Override
public IIcon getIcon(int side, int meta) {
if(side == meta) return blockIcon;
if(IBlockSideRotation.isOpposite(side, meta)) return iconBack;
if(side <= 1) return iconTop;
if(side > 3 && meta <= 1) return iconTop;
return iconSide;
}
@Override
public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) {
if(side == 0) return IBlockSideRotation.topToBottom(getRotationFromSide(world, x, y, z, 1));
int meta = world.getBlockMetadata(x, y, z);
if(side == meta || IBlockSideRotation.isOpposite(side, meta)) return 0;
// downwards facing has no changes, upwards flips anything not handled already
if(meta == 0) return 0;
if(meta == 1) return 3;
// top (and bottom) is rotated fairly normally
if(side == 1) {
switch(meta) {
case 2: return 3;
case 3: return 0;
case 4: return 1;
case 5: return 2;
}
}
// you know what I aint explaining further, it's a fucking mess here
if(meta == 2) return side == 4 ? 2 : 1;
if(meta == 3) return side == 4 ? 1 : 2;
if(meta == 4) return side == 2 ? 1 : 2;
if(meta == 5) return side == 2 ? 2 : 1;
return 0;
}
@Override
public int getRenderType() {
return IBlockSideRotation.getRenderType();
}
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileEntityWandTandem)) return false;
TileEntityWandTandem jigsaw = (TileEntityWandTandem) te;
if(player.getHeldItem() != null && player.getHeldItem().getItem() == Items.paper) {
TileEntityWandTandem.copyMode = true;
if(!player.getHeldItem().hasTagCompound()) {
player.getHeldItem().stackTagCompound = new NBTTagCompound();
jigsaw.writeToNBT(player.getHeldItem().stackTagCompound);
} else {
jigsaw.readFromNBT(player.getHeldItem().stackTagCompound);
jigsaw.markDirty();
}
TileEntityWandTandem.copyMode = false;
return true;
}
if(!player.isSneaking()) {
Block block = ModBlocks.getBlockFromStack(player.getHeldItem());
if(block == ModBlocks.wand_air) block = Blocks.air;
if(block != null && !ModBlocks.isStructureBlock(block, false)) {
jigsaw.replaceBlock = block;
jigsaw.replaceMeta = player.getHeldItem().getItemDamage();
jigsaw.markDirty();
return true;
}
if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.wand_s) return false;
if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z);
return true;
}
return false;
}
@Override
@SideOnly(Side.CLIENT)
public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new GuiWandTandem((TileEntityWandTandem) world.getTileEntity(x, y, z));
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
return null;
}
@Override
public void printHook(Pre event, World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileEntityWandTandem)) return;
TileEntityWandTandem jigsaw = (TileEntityWandTandem) te;
List<String> text = new ArrayList<String>();
text.add(EnumChatFormatting.GRAY + "Target pool: " + EnumChatFormatting.RESET + jigsaw.pool);
text.add(EnumChatFormatting.GRAY + "Target name: " + EnumChatFormatting.RESET + jigsaw.target);
text.add(EnumChatFormatting.GRAY + "Turns into: " + EnumChatFormatting.RESET + GameRegistry.findUniqueIdentifierFor(jigsaw.replaceBlock).toString());
text.add(EnumChatFormatting.GRAY + " with meta: " + EnumChatFormatting.RESET + jigsaw.replaceMeta);
text.add(EnumChatFormatting.GRAY + "Joint type: " + EnumChatFormatting.RESET + (jigsaw.isRollable ? "Rollable" : "Aligned"));
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text);
}
public static class TileEntityWandTandem extends TileEntityLoadedBase implements IControlReceiver {
public static boolean copyMode = false;
private String pool = "default";
private String target = "default";
private Block replaceBlock = Blocks.air;
private int replaceMeta = 0;
private boolean isRollable = true; // sets joint type, rollable joints can be placed in any orientation for vertical jigsaw connections
private boolean isArmed = false;
private SpawnCondition structure;
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
tryGenerate();
networkPackNT(15);
}
}
private void tryGenerate() {
if(!this.isArmed || target == null || target.isEmpty() || pool == null || pool.isEmpty()) return;
JigsawPool pool = structure.getPool(this.pool);
if(pool == null) return;
JigsawPiece nextPiece = pool.get(worldObj.rand);
if(nextPiece == null) return;
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata());
List<JigsawConnection> connectionPool = nextPiece.structure.getConnectionPool(dir, target);
if(connectionPool == null) return;
JigsawConnection toConnection = connectionPool.get(worldObj.rand.nextInt(connectionPool.size()));
int nextCoordBase = directionOffsetToCoordBase(dir.getOpposite(), toConnection.dir);
BlockPos pos = new BlockPos(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ);
// offset the starting point to the connecting point
int ox = nextPiece.structure.rotateX(toConnection.pos.x, toConnection.pos.z, nextCoordBase);
int oy = toConnection.pos.y;
int oz = nextPiece.structure.rotateZ(toConnection.pos.x, toConnection.pos.z, nextCoordBase);
nextPiece.structure.build(worldObj, nextPiece, pos.getX() - ox, pos.getY() - oy, pos.getZ() - oz, nextCoordBase, structure.name);
worldObj.setBlock(xCoord, yCoord, zCoord, replaceBlock, replaceMeta, 2);
}
private int directionOffsetToCoordBase(ForgeDirection from, ForgeDirection to) {
for(int i = 0; i < 4; i++) {
if(from == to) return i % 4;
from = from.getRotation(ForgeDirection.DOWN);
}
return 0;
}
@Override
public void serialize(ByteBuf buf) {
BufferUtil.writeString(buf, pool);
BufferUtil.writeString(buf, target);
buf.writeInt(Block.getIdFromBlock(replaceBlock));
buf.writeInt(replaceMeta);
buf.writeBoolean(isRollable);
}
@Override
public void deserialize(ByteBuf buf) {
pool = BufferUtil.readString(buf);
target = BufferUtil.readString(buf);
replaceBlock = Block.getBlockById(buf.readInt());
replaceMeta = buf.readInt();
isRollable = buf.readBoolean();
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
if(!copyMode) {
super.writeToNBT(nbt);
nbt.setInteger("direction", this.getBlockMetadata());
if(isArmed) {
nbt.setBoolean("isArmed", isArmed);
nbt.setString("structure", structure.name);
}
}
nbt.setString("pool", pool);
nbt.setString("target", target);
nbt.setString("block", GameRegistry.findUniqueIdentifierFor(replaceBlock).toString());
nbt.setInteger("meta", replaceMeta);
nbt.setBoolean("roll", isRollable);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
if(!copyMode) {
super.readFromNBT(nbt);
isArmed = nbt.getBoolean("isArmed");
structure = NBTStructure.getStructure(nbt.getString("structure"));
}
pool = nbt.getString("pool");
target = nbt.getString("target");
replaceBlock = Block.getBlockFromName(nbt.getString("block"));
replaceMeta = nbt.getInteger("meta");
isRollable = nbt.getBoolean("roll");
}
@Override
public boolean hasPermission(EntityPlayer player) {
return true;
}
@Override
public void receiveControl(NBTTagCompound nbt) {
readFromNBT(nbt);
markDirty();
}
public void arm(SpawnCondition structure) {
isArmed = true;
this.structure = structure;
}
}
public static class GuiWandTandem extends GuiScreen {
private final TileEntityWandTandem jigsaw;
private GuiTextField textPool;
private GuiTextField textTarget;
private GuiButton jointToggle;
public GuiWandTandem(TileEntityWandTandem jigsaw) {
this.jigsaw = jigsaw;
}
@Override
public void initGui() {
Keyboard.enableRepeatEvents(true);
textPool = new GuiTextField(fontRendererObj, this.width / 2 - 150, 50, 300, 20);
textPool.setText(jigsaw.pool);
textTarget = new GuiTextField(fontRendererObj, this.width / 2 + 10, 100, 140, 20);
textTarget.setText(jigsaw.target);
jointToggle = new GuiButton(0, this.width / 2 + 60, 150, 90, 20, jigsaw.isRollable ? "Rollable" : "Aligned");
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
drawDefaultBackground();
drawString(fontRendererObj, "Target pool:", this.width / 2 - 150, 37, 0xA0A0A0);
textPool.drawTextBox();
drawString(fontRendererObj, "Target name:", this.width / 2 + 10, 87, 0xA0A0A0);
textTarget.drawTextBox();
drawString(fontRendererObj, "Joint type:", this.width / 2 + 60, 137, 0xA0A0A0);
jointToggle.drawButton(mc, mouseX, mouseY);
super.drawScreen(mouseX, mouseY, partialTicks);
}
@Override
public void onGuiClosed() {
Keyboard.enableRepeatEvents(false);
NBTTagCompound data = new NBTTagCompound();
jigsaw.writeToNBT(data);
data.setString("pool", textPool.getText());
data.setString("target", textTarget.getText());
data.setBoolean("roll", jointToggle.displayString == "Rollable");
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, jigsaw.xCoord, jigsaw.yCoord, jigsaw.zCoord));
}
@Override
protected void keyTyped(char typedChar, int keyCode) {
super.keyTyped(typedChar, keyCode);
textPool.textboxKeyTyped(typedChar, keyCode);
textTarget.textboxKeyTyped(typedChar, keyCode);
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) {
super.mouseClicked(mouseX, mouseY, mouseButton);
textPool.mouseClicked(mouseX, mouseY, mouseButton);
textTarget.mouseClicked(mouseX, mouseY, mouseButton);
if(jointToggle.mousePressed(mc, mouseX, mouseY)) {
jointToggle.displayString = jointToggle.displayString == "Rollable" ? "Aligned" : "Rollable";
}
}
@Override public boolean doesGuiPauseGame() { return false; }
}
}

View File

@ -6,7 +6,7 @@ import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.tileentity.deco.TileEntityDecoBlock;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import api.hbm.block.IToolable;
import cpw.mods.fml.client.registry.RenderingRegistry;
@ -25,7 +25,7 @@ import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class DecoBlock extends BlockContainer implements IToolable, INBTTransformable {
public class DecoBlock extends BlockContainer implements IToolable, INBTBlockTransformable {
Random rand = new Random();
@ -185,6 +185,6 @@ public class DecoBlock extends BlockContainer implements IToolable, INBTTransfor
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTTransformable.transformMetaDeco(meta, coordBaseMode);
return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
}
}

View File

@ -1,7 +1,7 @@
package com.hbm.blocks.generic;
import com.hbm.tileentity.deco.TileEntityDecoPoleSatelliteReceiver;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
@ -11,7 +11,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTTransformable {
public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTBlockTransformable {
public DecoPoleSatelliteReceiver(Material p_i45386_1_) {
super(p_i45386_1_);
@ -61,7 +61,7 @@ public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTTra
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTTransformable.transformMetaDeco(meta, coordBaseMode);
return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
}
}

View File

@ -1,6 +1,6 @@
package com.hbm.blocks.generic;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraft.block.BlockContainer;
@ -11,7 +11,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class DecoTapeRecorder extends BlockContainer implements INBTTransformable {
public class DecoTapeRecorder extends BlockContainer implements INBTBlockTransformable {
public DecoTapeRecorder(Material p_i45386_1_) {
super(p_i45386_1_);
@ -63,7 +63,7 @@ public class DecoTapeRecorder extends BlockContainer implements INBTTransformabl
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTTransformable.transformMetaDeco(meta, coordBaseMode);
return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
}
}

View File

@ -81,6 +81,7 @@ public class DungeonSpawner extends BlockContainer {
public static Function<TileEntityDungeonSpawner, Boolean> CON_ABERRATOR = (tile) -> {
World world = tile.getWorldObj();
if(world.difficultySetting.ordinal() == 0) return false;
int x = tile.xCoord;
int y = tile.yCoord;
int z = tile.zCoord;
@ -122,7 +123,11 @@ public class DungeonSpawner extends BlockContainer {
TileEntity te = world.getTileEntity(x, y + 18, z);
if(te instanceof TileEntitySkeletonHolder) {
TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te;
skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal());
if(world.rand.nextInt(5) == 0) {
skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal());
} else {
skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1);
}
skeleton.markDirty();
world.markBlockForUpdate(x, y + 18, z);
}

View File

@ -0,0 +1,162 @@
package com.hbm.blocks.generic;
import com.hbm.world.gen.util.LogicBlockActions;
import com.hbm.world.gen.util.LogicBlockConditions;
import com.hbm.world.gen.util.LogicBlockInteractions;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.function.Consumer;
import java.util.function.Function;
public class LogicBlock extends BlockContainer {
public LogicBlock() {
super(Material.rock);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new LogicBlock.TileEntityLogicBlock();
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {
TileEntity tile = world.getTileEntity(x, y, z);
if(tile instanceof LogicBlock.TileEntityLogicBlock){
LogicBlock.TileEntityLogicBlock logicBlock = (LogicBlock.TileEntityLogicBlock) tile;
if(logicBlock.disguise != null){
return logicBlock.disguise.getIcon(side, logicBlock.disguiseMeta);
}
}
return super.getIcon(world, x, y, z, side);
}
@Override
public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) {
TileEntity te = worldIn.getTileEntity(x, y, z);
if(te instanceof LogicBlock.TileEntityLogicBlock && ((LogicBlock.TileEntityLogicBlock) te).interaction != null) {
((LogicBlock.TileEntityLogicBlock) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ});
return true;
}
return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ);
}
public static class TileEntityLogicBlock extends TileEntity {
//phase is incremented per condition check, timer counts since last condition check by default
public int phase = 0;
public int timer = 0;
public Block disguise;
public int disguiseMeta;
/**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/
public String conditionID = "PLAYER_CUBE_5";
public String actionID = "FODDER_WAVE";
/**Interactions are called on right click, and passes on the parameters of the right click to consumer*/
public String interactionID;
public Function<LogicBlock.TileEntityLogicBlock, Boolean> condition;
public Consumer<LogicBlock.TileEntityLogicBlock> action;
/**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/
public Consumer<Object[]> interaction;
public EntityPlayer player;
public ForgeDirection direction = ForgeDirection.UNKNOWN;
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
if(action == null){
action = LogicBlockActions.actions.get(actionID);
}
if(condition == null){
condition = LogicBlockConditions.conditions.get(conditionID);
}
if(interaction == null && interactionID != null){
interaction = LogicBlockInteractions.interactions.get(interactionID);
}
if(action == null || condition == null){
worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air);
return;
}
action.accept(this);
if(condition.apply(this)) {
phase++;
timer = 0;
} else {
timer++;
}
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setInteger("phase", phase);
nbt.setString("actionID", actionID);
nbt.setString("conditionID", conditionID);
if(interactionID != null)
nbt.setString("interactionID", interactionID);
nbt.setInteger("direction", direction.ordinal());
if(disguise != null){
nbt.setInteger("disguiseMeta", disguiseMeta);
nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString());
}
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.phase = nbt.getInteger("phase");
this.actionID = nbt.getString("actionID");
this.conditionID = nbt.getString("conditionID");
if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID");
this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction"));
if(nbt.hasKey("disguise")){
disguiseMeta = nbt.getInteger("disguiseMeta");
disguise = Block.getBlockFromName(nbt.getString("disguise"));
}
}
@Override
public Packet getDescriptionPacket() {
NBTTagCompound nbt = new NBTTagCompound();
this.writeToNBT(nbt);
return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt);
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
this.readFromNBT(pkt.func_148857_g());
}
}
}

View File

@ -79,7 +79,7 @@ public class TritiumLamp extends Block implements ISpotlight {
private void updateBeam(World world, int x, int y, int z) {
if(!isOn) return;
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) Spotlight.propagateBeam(world, x, y, z, dir, getBeamLength());
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) Spotlight.propagateBeam(world, x, y, z, dir, getBeamLength(), getMeta());
}
@Override
@ -98,6 +98,12 @@ public class TritiumLamp extends Block implements ISpotlight {
return new ItemStack(getOff());
}
protected int getMeta() {
if(this == ModBlocks.lamp_tritium_green_off || this == ModBlocks.lamp_tritium_green_on) return Spotlight.META_GREEN;
if(this == ModBlocks.lamp_tritium_blue_off || this == ModBlocks.lamp_tritium_blue_on) return Spotlight.META_BLUE;
return Spotlight.META_YELLOW;
}
protected Block getOff() {
if(this == ModBlocks.lamp_tritium_green_on) return ModBlocks.lamp_tritium_green_off;
if(this == ModBlocks.lamp_tritium_blue_on) return ModBlocks.lamp_tritium_blue_off;

View File

@ -2,8 +2,9 @@ package com.hbm.blocks.machine;
import net.minecraft.block.material.Material;
public class BlockCMFlux extends BlockPillar{
public BlockCMFlux(Material mat, String top) {
super(mat, top);
}
public class BlockCMFlux extends BlockPillar {
public BlockCMFlux(Material mat, String top) {
super(mat, top);
}
}

View File

@ -2,8 +2,9 @@ package com.hbm.blocks.machine;
import net.minecraft.block.material.Material;
public class BlockCMHeat extends BlockPillar{
public BlockCMHeat(Material mat, String top) {
super(mat, top);
}
public class BlockCMHeat extends BlockPillar {
public BlockCMHeat(Material mat, String top) {
super(mat, top);
}
}

View File

@ -0,0 +1,13 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.generic.BlockToolConversion;
import net.minecraft.block.material.Material;
public class BlockFusionComponent extends BlockToolConversion {
public BlockFusionComponent() {
super(Material.iron);
this.addVariant(".bscco_welded", ".blanket", ".motor");
}
}

View File

@ -0,0 +1,16 @@
package com.hbm.blocks.machine;
import com.hbm.tileentity.machine.TileEntityFusionTorusStruct;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public class BlockFusionTorusStruct extends BlockContainer {
public BlockFusionTorusStruct(Material mat) { super(mat); }
@Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityFusionTorusStruct(); }
@Override public boolean isOpaqueCube() { return false; }
}

View File

@ -1,25 +0,0 @@
package com.hbm.blocks.machine;
import com.hbm.tileentity.machine.TileEntityITERStruct;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public class BlockITERStruct extends BlockContainer {
public BlockITERStruct(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityITERStruct();
}
@Override
public boolean isOpaqueCube() {
return false;
}
}

View File

@ -1,7 +1,7 @@
package com.hbm.blocks.machine;
import com.hbm.main.MainRegistry;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.Block;
@ -17,7 +17,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public abstract class BlockMachineBase extends BlockContainer implements INBTTransformable {
public abstract class BlockMachineBase extends BlockContainer implements INBTBlockTransformable {
int guiID = -1;
protected boolean rotatable = false;
@ -115,6 +115,6 @@ public abstract class BlockMachineBase extends BlockContainer implements INBTTra
@Override
public int transformMeta(int meta, int coordBaseMode) {
if(!rotatable) return meta;
return INBTTransformable.transformMetaDeco(meta, coordBaseMode);
return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
}
}

View File

@ -33,6 +33,7 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
@ -40,7 +41,8 @@ public class BlockMassStorage extends BlockContainer implements IBlockMulti, ILo
@SideOnly(Side.CLIENT) private IIcon[] iconTop;
@SideOnly(Side.CLIENT) private IIcon[] iconSide;
@SideOnly(Side.CLIENT) private IIcon[] iconFront;
public BlockMassStorage() {
super(Material.iron);
}
@ -50,15 +52,23 @@ public class BlockMassStorage extends BlockContainer implements IBlockMulti, ILo
public void registerBlockIcons(IIconRegister iconRegister) {
this.iconTop = new IIcon[4];
this.iconSide = new IIcon[4];
this.iconFront = new IIcon[4];
this.iconTop[0] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_top_iron");
this.iconSide[0] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_side_iron");
this.iconFront[0] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_front_iron");
this.iconTop[1] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_top_desh");
this.iconSide[1] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_side_desh");
this.iconFront[1] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_front_desh");
this.iconTop[2] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_top");
this.iconSide[2] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_side");
this.iconFront[2] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_front");
this.iconTop[3] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_top_wood");
this.iconSide[3] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_side_wood");
this.iconFront[3] = iconRegister.registerIcon(RefStrings.MODID + ":mass_storage_front_wood");
}
@Override
@ -74,20 +84,24 @@ public class BlockMassStorage extends BlockContainer implements IBlockMulti, ILo
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int metadata) {
int meta = this.rectify(metadata);
return side == 1 ? this.iconTop[meta] : (side == 0 ? this.iconTop[meta] : this.iconSide[meta]);
int dir = (metadata / getSubCount()) + 2;
if(side == 0 || side == 1) return iconTop[meta];
if(side == dir) return iconFront[meta];
return iconSide[meta];
}
@Override
public int damageDropped(int meta) {
return meta;
return rectify(meta);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityMassStorage(getCapacity(meta));
}
public int getCapacity(int meta) {
meta = rectify(meta);
return meta == 3 ? 100 : meta == 0 ? 10_000 : meta == 1 ? 100_000 : meta == 2 ? 1_000_000 : 0;
}
@ -108,121 +122,129 @@ public class BlockMassStorage extends BlockContainer implements IBlockMulti, ILo
return false;
}
}
private static boolean dropInv = true;
@Override
public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) {
if(!player.capabilities.isCreativeMode && !world.isRemote && willHarvest) {
ItemStack drop = new ItemStack(this, 1, world.getBlockMetadata(x, y, z));
ItemStack drop = new ItemStack(this, 1, rectify(world.getBlockMetadata(x, y, z)));
ISidedInventory inv = (ISidedInventory)world.getTileEntity(x, y, z);
NBTTagCompound nbt = new NBTTagCompound();
if(inv != null) {
for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack stack = inv.getStackInSlot(i);
if(stack == null)
continue;
NBTTagCompound slot = new NBTTagCompound();
stack.writeToNBT(slot);
nbt.setTag("slot" + i, slot);
}
}
if(inv instanceof TileEntityLockableBase) {
TileEntityLockableBase lockable = (TileEntityLockableBase) inv;
if(lockable.isLocked()) {
nbt.setInteger("lock", lockable.getPins());
nbt.setDouble("lockMod", lockable.getMod());
}
}
if(inv instanceof TileEntityMassStorage && nbt.func_150296_c().size() > 0) {
TileEntityMassStorage storage = (TileEntityMassStorage) inv;
nbt.setInteger("stack", storage.getStockpile());
}
if(!nbt.hasNoTags()) {
drop.stackTagCompound = nbt;
}
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, drop));
}
dropInv = false;
boolean flag = world.setBlockToAir(x, y, z);
dropInv = true;
return flag;
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) {
ISidedInventory inv = (ISidedInventory)world.getTileEntity(x, y, z);
if(inv != null && stack.hasTagCompound()) {
for(int i = 0; i < inv.getSizeInventory(); i++) {
inv.setInventorySlotContents(i, ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("slot" + i)));
}
if(inv instanceof TileEntityMassStorage) {
TileEntityMassStorage storage = (TileEntityMassStorage) inv;
if(stack.stackTagCompound.hasKey("lock")) {
storage.setPins(stack.stackTagCompound.getInteger("lock"));
storage.setMod(stack.stackTagCompound.getDouble("lockMod"));
storage.lock();
}
storage.setStockpile(stack.stackTagCompound.getInteger("stack"));
}
}
super.onBlockPlacedBy(world, x, y, z, player, stack);
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
int meta = stack.getItemDamage();
if(i == 0) world.setBlockMetadataWithNotify(x, y, z, meta, 2);
if(i == 1) world.setBlockMetadataWithNotify(x, y, z, meta + 3 * getSubCount(), 2);
if(i == 2) world.setBlockMetadataWithNotify(x, y, z, meta + 1 * getSubCount(), 2);
if(i == 3) world.setBlockMetadataWithNotify(x, y, z, meta + 2 * getSubCount(), 2);
}
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int meta) {
if(dropInv) {
ISidedInventory sided = (ISidedInventory) world.getTileEntity(x, y, z);
Random rand = world.rand;
if(sided != null) {
for(int i1 = 0; i1 < sided.getSizeInventory(); ++i1) {
if(i1 == 1) continue; //do NOT drop the filter item
ItemStack itemstack = sided.getStackInSlot(i1);
if(itemstack != null) {
float f = rand.nextFloat() * 0.8F + 0.1F;
float f1 = rand.nextFloat() * 0.8F + 0.1F;
float f2 = rand.nextFloat() * 0.8F + 0.1F;
while(itemstack.stackSize > 0) {
int j1 = rand.nextInt(21) + 10;
if(j1 > itemstack.stackSize) {
j1 = itemstack.stackSize;
}
itemstack.stackSize -= j1;
EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
if(itemstack.hasTagCompound()) {
entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy());
}
float f3 = 0.05F;
entityitem.motionX = (float) rand.nextGaussian() * f3;
entityitem.motionY = (float) rand.nextGaussian() * f3 + 0.2F;
@ -231,7 +253,7 @@ public class BlockMassStorage extends BlockContainer implements IBlockMulti, ILo
}
}
}
world.func_147453_f(x, y, z, block);
}
}
@ -251,51 +273,51 @@ public class BlockMassStorage extends BlockContainer implements IBlockMulti, ILo
@Override
public void printHook(Pre event, World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileEntityMassStorage))
return;
TileEntityMassStorage storage = (TileEntityMassStorage) te;
List<String> text = new ArrayList();
String title = "Empty";
boolean full = storage.type != null;
if(full) {
title = storage.type.getDisplayName();
text.add(String.format(Locale.US, "%,d", storage.getStockpile()) + " / " + String.format(Locale.US, "%,d", storage.getCapacity()));
double percent = (double) storage.getStockpile() / (double) storage.getCapacity();
int charge = (int) Math.floor(percent * 10_000D);
int color = ((int) (0xFF - 0xFF * percent)) << 16 | ((int)(0xFF * percent) << 8);
text.add("&[" + color + "&]" + (charge / 100D) + "%");
}
ILookOverlay.printGeneric(event, title, full ? 0xffff00 : 0x00ffff, full ? 0x404000 : 0x004040, text);
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
if(!stack.hasTagCompound()) return;
ItemStack type = ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("slot1"));
if(type != null) {
list.add(EnumChatFormatting.GOLD + type.getDisplayName());
list.add(String.format(Locale.US, "%,d", stack.stackTagCompound.getInteger("stack")) + " / " + String.format(Locale.US, "%,d", getCapacity(stack.getItemDamage())));
}
}
@Override
public boolean hasComparatorInputOverride() {
return true;
}
@Override
public int getComparatorInputOverride(World world, int x, int y, int z, int side) {
return ((TileEntityMassStorage) world.getTileEntity(x, y, z)).redstone;

View File

@ -1,52 +0,0 @@
package com.hbm.blocks.machine;
import com.hbm.tileentity.machine.TileEntityPlasmaStruct;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class BlockPlasmaStruct extends BlockContainer {
public BlockPlasmaStruct(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityPlasmaStruct();
}
public boolean isOpaqueCube() {
return false;
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
if(i == 0)
{
world.setBlockMetadataWithNotify(x, y, z, 2, 2);
}
if(i == 1)
{
world.setBlockMetadataWithNotify(x, y, z, 5, 2);
}
if(i == 2)
{
world.setBlockMetadataWithNotify(x, y, z, 3, 2);
}
if(i == 3)
{
world.setBlockMetadataWithNotify(x, y, z, 4, 2);
}
}
}

View File

@ -1,6 +1,7 @@
package com.hbm.blocks.machine;
import com.hbm.tileentity.machine.TileEntityCharger;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
@ -12,8 +13,8 @@ import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class Charger extends BlockContainer {
public class Charger extends BlockContainer implements INBTBlockTransformable {
public Charger(Material mat) {
super(mat);
}
@ -22,17 +23,17 @@ public class Charger extends BlockContainer {
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityCharger();
}
@Override
public int getRenderType(){
return -1;
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
@ -40,9 +41,9 @@ public class Charger extends BlockContainer {
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
if(i == 0) {
world.setBlockMetadataWithNotify(x, y, z, 2, 2);
}
@ -60,13 +61,13 @@ public class Charger extends BlockContainer {
@Override
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {
float f = 0.0625F;
switch(world.getBlockMetadata(x, y, z)) {
case 2: this.setBlockBounds(5 * f, 0.25F, 12 * f, 11 * f, 0.75F, 1F); break;
case 3: this.setBlockBounds(5 * f, 0.25F, 0F, 11 * f, 0.75F, 4 * f); break;
case 4: this.setBlockBounds(12 * f, 0.25F, 5 * f, 1F, 0.75F, 11 * f); break;
case 5: this.setBlockBounds(0F, 0.25F, 5 * f, 4 * f, 0.75F, 11 * f); break;
default: this.setBlockBounds(5 * f, 0.25F, 5 * f, 11 * f, 0.75F, 11 * f); break;
case 2: this.setBlockBounds(5 * f, 0.25F, 12 * f, 11 * f, 0.75F, 1F); break;
case 3: this.setBlockBounds(5 * f, 0.25F, 0F, 11 * f, 0.75F, 4 * f); break;
case 4: this.setBlockBounds(12 * f, 0.25F, 5 * f, 1F, 0.75F, 11 * f); break;
case 5: this.setBlockBounds(0F, 0.25F, 5 * f, 4 * f, 0.75F, 11 * f); break;
default: this.setBlockBounds(5 * f, 0.25F, 5 * f, 11 * f, 0.75F, 11 * f); break;
}
}
@ -75,4 +76,9 @@ public class Charger extends BlockContainer {
this.setBlockBoundsBasedOnState(world, x, y, z);
return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ);
}
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
}
}

View File

@ -1,12 +1,18 @@
package com.hbm.blocks.machine;
import java.util.Random;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.machine.TileEntityCore;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
@ -50,5 +56,43 @@ public class CoreCore extends BlockContainer {
return false;
}
}
private Random rand = new Random();
// shitty copy pasted crap for the 50th time because i hate this block
@Override
public void breakBlock(World world, int x, int y, int z, Block b, int m) {
TileEntityCore core = (TileEntityCore) world.getTileEntity(x, y, z);
if(core != null) {
for(int i1 = 0; i1 < core.getSizeInventory(); ++i1) {
ItemStack itemstack = core.getStackInSlot(i1);
if(itemstack != null) {
float f = this.rand.nextFloat() * 0.8F + 0.1F;
float f1 = this.rand.nextFloat() * 0.8F + 0.1F;
float f2 = this.rand.nextFloat() * 0.8F + 0.1F;
while(itemstack.stackSize > 0) {
int j1 = this.rand.nextInt(21) + 10;
if(j1 > itemstack.stackSize) j1 = itemstack.stackSize;
itemstack.stackSize -= j1;
EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
if(itemstack.hasTagCompound()) entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy());
float f3 = 0.05F;
entityitem.motionX = (float) this.rand.nextGaussian() * f3;
entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F;
entityitem.motionZ = (float) this.rand.nextGaussian() * f3;
world.spawnEntityInWorld(entityitem);
}
}
}
world.func_147453_f(x, y, z, b);
}
super.breakBlock(world, x, y, z, b, m);
}
}

View File

@ -4,10 +4,10 @@ import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.machine.FloodlightBeam.TileEntityFloodlightBeam;
import com.hbm.util.Compat;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import api.hbm.block.IToolable;
import api.hbm.energymk2.IEnergyReceiverMK2;
import com.hbm.world.gen.INBTTransformable;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
@ -28,7 +28,7 @@ import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class Floodlight extends BlockContainer implements IToolable, INBTTransformable {
public class Floodlight extends BlockContainer implements IToolable, INBTBlockTransformable {
public Floodlight(Material mat) {
super(mat);

View File

@ -4,11 +4,17 @@ import java.util.ArrayList;
import java.util.List;
import com.hbm.blocks.ModBlocks;
import com.hbm.inventory.material.NTMMaterial;
import com.hbm.inventory.material.Mats.MaterialStack;
import com.hbm.items.machine.ItemScraps;
import com.hbm.lib.Library;
import com.hbm.lib.RefStrings;
import com.hbm.tileentity.machine.TileEntityFoundryChannel;
import com.hbm.uninos.GenNode;
import com.hbm.uninos.INetworkProvider;
import com.hbm.uninos.networkproviders.FoundryNetwork;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.block.ICrucibleAcceptor;
import cpw.mods.fml.client.registry.RenderingRegistry;
@ -41,7 +47,7 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor
public FoundryChannel() {
super(Material.rock);
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
@ -65,16 +71,16 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor
@Override
public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) {
List<AxisAlignedBB> bbs = new ArrayList();
bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.3125D, x + 0.6875D, y + 0.5D, z + 0.6875D));
if(canConnectTo(world, x, y, z, Library.POS_X)) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.6875D, y, z + 0.3125D, x + 1D, y + 0.5D, z + 0.6875D));
if(canConnectTo(world, x, y, z, Library.NEG_X)) bbs.add(AxisAlignedBB.getBoundingBox(x, y, z + 0.3125D, x + 0.3125D, y + 0.5D, z + 0.6875D));
if(canConnectTo(world, x, y, z, Library.POS_Z)) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.6875D, x + 0.6875D, y + 0.5D, z + 1D));
if(canConnectTo(world, x, y, z, Library.NEG_Z)) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z, x + 0.6875D, y + 0.5D, z + 0.3125D));
for(AxisAlignedBB bb : bbs) {
if(entityBounding.intersectsWith(bb)) {
list.add(bb);
@ -120,23 +126,23 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor
public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) {
return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack);
}
@Override
public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) {
return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack);
}
public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir) {
if(dir == ForgeDirection.UP || dir == ForgeDirection.DOWN || dir == ForgeDirection.UNKNOWN)
return false;
Block b = world.getBlock(x + dir.offsetX, y, z + dir.offsetZ);
int meta = world.getBlockMetadata(x + dir.offsetX, y, z + dir.offsetZ);
if((b == ModBlocks.foundry_outlet || b == ModBlocks.foundry_slagtap) && meta == dir.ordinal())
return true;
return b == ModBlocks.foundry_channel || b == ModBlocks.foundry_mold;
}
@ -146,25 +152,25 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor
public int getRenderType() {
return renderID;
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(world.isRemote) {
return true;
}
TileEntityFoundryChannel cast = (TileEntityFoundryChannel) world.getTileEntity(x, y, z);
if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) {
if(cast.amount > 0) {
ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount));
@ -176,19 +182,18 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor
}
cast.amount = 0;
cast.type = null;
cast.propagateMaterial(null);
cast.markDirty();
world.markBlockForUpdate(x, y, z);
}
return true;
}
return false;
}
@Override
public void breakBlock(World world, int x, int y, int z, Block b, int i) {
TileEntityFoundryChannel channel = (TileEntityFoundryChannel) world.getTileEntity(x, y, z);
if(channel.amount > 0) {
ItemStack scrap = ItemScraps.create(new MaterialStack(channel.type, channel.amount));
@ -196,7 +201,24 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor
world.spawnEntityInWorld(item);
channel.amount = 0;
}
super.breakBlock(world, x, y, z, b, i);
}
public static class FoundryNode extends GenNode<FoundryNetwork> {
public NTMMaterial type;
public FoundryNode(INetworkProvider<FoundryNetwork> provider, BlockPos... positions) {
super(provider, positions);
}
@Override
public FoundryNode setConnections(DirPos... connections) {
super.setConnections(connections);
return this;
}
}
}

View File

@ -1,34 +0,0 @@
package com.hbm.blocks.machine;
import com.hbm.lib.RefStrings;
import com.hbm.tileentity.machine.TileEntityMachineAmgen;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
public class MachineAmgen extends BlockContainer {
@SideOnly(Side.CLIENT)
private IIcon iconTop;
public MachineAmgen(Material p_i45386_1_) {
super(p_i45386_1_);
}
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
return new TileEntityMachineAmgen();
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":block_deprecated");
}
}

View File

@ -0,0 +1,55 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.BlockDummyable;
import com.hbm.handler.MultiblockHandlerXR;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityMachineAnnihilator;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class MachineAnnihilator extends BlockDummyable {
public MachineAnnihilator() {
super(Material.iron);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachineAnnihilator();
if(meta >= 6) return new TileEntityProxyCombo().inventory().fluid();
return null;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
return standardOpenBehavior(world, x, y, z, player, side);
}
@Override public int[] getDimensions() { return new int[] {2, 0, 4, 4, 1, 1}; }
@Override public int getOffset() { return 4; }
@Override
protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) {
return super.checkRequirement(world, x, y, z, dir, o) &&
MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * (o - 3), y, z + dir.offsetZ * (o - 3), new int[] {8, -2, 1, 1, 1, 1}, x, y, z, dir);
}
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * (o - 3), y, z + dir.offsetZ * (o - 3), new int[] {8, -2, 1, 1, 1, 1}, this, dir);
x += dir.offsetX * o;
z += dir.offsetZ * o;
ForgeDirection rot = dir.getRotation(ForgeDirection.UP);
this.makeExtra(world, x + dir.offsetX * 3 + rot.offsetX, y, z + dir.offsetZ * 3 + rot.offsetZ);
this.makeExtra(world, x + dir.offsetX * 3 - rot.offsetX, y, z + dir.offsetZ * 3 - rot.offsetZ);
this.makeExtra(world, x + dir.offsetX * 4, y, z + dir.offsetZ * 4);
}
}

View File

@ -1,288 +0,0 @@
package com.hbm.blocks.machine;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.machine.TileEntityMachineArcFurnace;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class MachineArcFurnace extends BlockContainer {
private final Random field_149933_a = new Random();
private final boolean isActive;
private static boolean keepInventory;
@SideOnly(Side.CLIENT)
private IIcon iconFront;
@SideOnly(Side.CLIENT)
private IIcon iconTop;
@SideOnly(Side.CLIENT)
private IIcon iconBottom;
@SideOnly(Side.CLIENT)
private IIcon iconRods;
public MachineArcFurnace(boolean blockState) {
super(Material.iron);
isActive = blockState;
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
this.iconFront = iconRegister.registerIcon(RefStrings.MODID + (this.isActive ? ":machine_arc_furnace_front_on" : ":machine_arc_furnace_front_off"));
this.iconTop = iconRegister.registerIcon(RefStrings.MODID + (this.isActive ? ":machine_arc_furnace_top_on" : ":machine_arc_furnace_top"));
this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":machine_arc_furnace_bottom");
this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":machine_arc_furnace_side");
this.iconRods = iconRegister.registerIcon(RefStrings.MODID + ":machine_arc_furnace_top_rods");
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int metadata) {
if(this == ModBlocks.machine_arc_furnace_off) {
if(side == 1 && metadata > 5) {
return iconRods;
}
}
if(metadata > 5)
metadata -= 4;
if(side == 0)
return this.iconBottom;
if(side == 1)
return this.iconTop;
return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon);
}
@Override
public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_)
{
return Item.getItemFromBlock(ModBlocks.machine_arc_furnace_off);
}
@Override
public void onBlockAdded(World world, int x, int y, int z) {
super.onBlockAdded(world, x, y, z);
this.setDefaultDirection(world, x, y, z);
}
private void setDefaultDirection(World world, int x, int y, int z) {
if(!world.isRemote)
{
Block block1 = world.getBlock(x, y, z - 1);
Block block2 = world.getBlock(x, y, z + 1);
Block block3 = world.getBlock(x - 1, y, z);
Block block4 = world.getBlock(x + 1, y, z);
byte b0 = 3;
if(block1.func_149730_j() && !block2.func_149730_j())
{
b0 = 3;
}
if(block2.func_149730_j() && !block1.func_149730_j())
{
b0 = 2;
}
if(block3.func_149730_j() && !block4.func_149730_j())
{
b0 = 5;
}
if(block4.func_149730_j() && !block3.func_149730_j())
{
b0 = 4;
}
world.setBlockMetadataWithNotify(x, y, z, b0, 2);
}
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
if(i == 0)
{
world.setBlockMetadataWithNotify(x, y, z, 2, 2);
}
if(i == 1)
{
world.setBlockMetadataWithNotify(x, y, z, 5, 2);
}
if(i == 2)
{
world.setBlockMetadataWithNotify(x, y, z, 3, 2);
}
if(i == 3)
{
world.setBlockMetadataWithNotify(x, y, z, 4, 2);
}
if(itemStack.hasDisplayName())
{
((TileEntityMachineArcFurnace)world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName());
}
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(world.isRemote)
{
return true;
} else if(!player.isSneaking())
{
TileEntityMachineArcFurnace entity = (TileEntityMachineArcFurnace) world.getTileEntity(x, y, z);
if(entity != null)
{
FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z);
}
return true;
} else {
return false;
}
}
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
return new TileEntityMachineArcFurnace();
}
public static void updateBlockState(boolean isProcessing, World world, int x, int y, int z) {
int i = world.getBlockMetadata(x, y, z);
TileEntity entity = world.getTileEntity(x, y, z);
keepInventory = true;
if(isProcessing)
{
world.setBlock(x, y, z, ModBlocks.machine_arc_furnace_on);
}else{
world.setBlock(x, y, z, ModBlocks.machine_arc_furnace_off);
}
keepInventory = false;
world.setBlockMetadataWithNotify(x, y, z, i, 2);
if(entity != null) {
entity.validate();
world.setTileEntity(x, y, z, entity);
}
}
@Override
public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_)
{
if (!keepInventory)
{
TileEntityMachineArcFurnace tileentityfurnace = (TileEntityMachineArcFurnace)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_);
if (tileentityfurnace != null)
{
for (int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1)
{
ItemStack itemstack = tileentityfurnace.getStackInSlot(i1);
if (itemstack != null)
{
float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
while (itemstack.stackSize > 0)
{
int j1 = this.field_149933_a.nextInt(21) + 10;
if (j1 > itemstack.stackSize)
{
j1 = itemstack.stackSize;
}
itemstack.stackSize -= j1;
EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
if (itemstack.hasTagCompound())
{
entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
}
float f3 = 0.05F;
entityitem.motionX = (float)this.field_149933_a.nextGaussian() * f3;
entityitem.motionY = (float)this.field_149933_a.nextGaussian() * f3 + 0.2F;
entityitem.motionZ = (float)this.field_149933_a.nextGaussian() * f3;
p_149749_1_.spawnEntityInWorld(entityitem);
}
}
}
p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_);
}
}
super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_);
}
@Override
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int x, int y, int z, Random rand)
{
if (isActive)
{
int l = p_149734_1_.getBlockMetadata(x, y, z);
float f = x + 0.5F;
float f1 = y + 0.0F + rand.nextFloat() * 6.0F / 16.0F;
float f2 = z + 0.5F;
float f3 = 0.52F;
float f4 = rand.nextFloat() * 0.6F - 0.3F;
if (l == 4)
{
p_149734_1_.spawnParticle("smoke", f - f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
p_149734_1_.spawnParticle("flame", f - f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
}
else if (l == 5)
{
p_149734_1_.spawnParticle("smoke", f + f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
p_149734_1_.spawnParticle("flame", f + f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
}
else if (l == 2)
{
p_149734_1_.spawnParticle("smoke", f + f4, f1, f2 - f3, 0.0D, 0.0D, 0.0D);
p_149734_1_.spawnParticle("flame", f + f4, f1, f2 - f3, 0.0D, 0.0D, 0.0D);
}
else if (l == 3)
{
p_149734_1_.spawnParticle("smoke", f + f4, f1, f2 + f3, 0.0D, 0.0D, 0.0D);
p_149734_1_.spawnParticle("flame", f + f4, f1, f2 + f3, 0.0D, 0.0D, 0.0D);
}
}
}
@Override
@SideOnly(Side.CLIENT)
public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_)
{
return Item.getItemFromBlock(ModBlocks.machine_arc_furnace_off);
}
}

View File

@ -11,6 +11,7 @@ import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
@Deprecated
public class MachineAssembler extends BlockDummyable {
public MachineAssembler(Material p_i45386_1_) {

View File

@ -0,0 +1,88 @@
package com.hbm.blocks.machine;
import java.util.ArrayList;
import java.util.List;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.tileentity.TileEntityProxyDyn;
import com.hbm.tileentity.machine.TileEntityMachineAssemblyFactory;
import com.hbm.util.fauxpointtwelve.DirPos;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
import net.minecraftforge.common.util.ForgeDirection;
public class MachineAssemblyFactory extends BlockDummyable implements ITooltipProvider, ILookOverlay {
public MachineAssemblyFactory(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachineAssemblyFactory();
if(meta >= 6) return new TileEntityProxyDyn().inventory().power().fluid();
return null;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
return this.standardOpenBehavior(world, x, y, z, player, 0);
}
@Override public int[] getDimensions() { return new int[] {2, 0, 2, 2, 2, 2}; }
@Override public int getOffset() { return 2; }
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
x -= dir.offsetX * 2;
z -= dir.offsetZ * 2;
for(int i = -2; i <= 2; i++) for(int j = -2; j <= 2; j++) {
if(Math.abs(i) == 2 || Math.abs(j) == 2) this.makeExtra(world, x + i, y, z + j);
}
ForgeDirection rot = dir.getRotation(ForgeDirection.UP);
for(int i = -2; i <= 2; i++) {
this.makeExtra(world, x + dir.offsetX * i + rot.offsetX * 2, y + 2, z + dir.offsetZ * i + rot.offsetZ * 2);
this.makeExtra(world, x + dir.offsetX * i - rot.offsetX * 2, y + 2, z + dir.offsetZ * i - rot.offsetZ * 2);
}
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
this.addStandardInfo(stack, player, list, ext);
}
@Override
public void printHook(Pre event, World world, int x, int y, int z) {
int[] pos = this.findCore(world, x, y, z);
if(pos == null) return;
TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]);
if(!(te instanceof TileEntityMachineAssemblyFactory)) return;
TileEntityMachineAssemblyFactory assemfac = (TileEntityMachineAssemblyFactory) te;
DirPos[] cool = assemfac.getCoolPos();
for(DirPos dirPos : cool) if(dirPos.compare(x + dirPos.getDir().offsetX, y, z + dirPos.getDir().offsetZ)) {
List<String> text = new ArrayList();
text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + assemfac.water.getTankType().getLocalizedName());
text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + assemfac.lps.getTankType().getLocalizedName());
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text);
break;
}
}
}

View File

@ -0,0 +1,45 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.BlockDummyable;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class MachineAssemblyMachine extends BlockDummyable {
public MachineAssemblyMachine(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachineAssemblyMachine();
if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid();
return null;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
return this.standardOpenBehavior(world, x, y, z, player, 0);
}
@Override public int[] getDimensions() { return new int[] {2, 0, 1, 1, 1, 1}; }
@Override public int getOffset() { return 1; }
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
x -= dir.offsetX;
z -= dir.offsetZ;
for(int i = -1; i <= 1; i++) for(int j = -1; j <= 1; j++) {
if(i != 0 || j != 0) this.makeExtra(world, x + i, y, z + j);
}
}
}

View File

@ -10,6 +10,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
@Deprecated
public class MachineAssemfac extends BlockDummyable {
public MachineAssemfac(Material mat) {

View File

@ -3,6 +3,12 @@ package com.hbm.blocks.machine;
import java.util.ArrayList;
import java.util.List;
import com.hbm.handler.CompatHandler;
import cpw.mods.fml.common.Optional;
import li.cil.oc.api.machine.Arguments;
import li.cil.oc.api.machine.Callback;
import li.cil.oc.api.machine.Context;
import li.cil.oc.api.network.SimpleComponent;
import org.lwjgl.input.Keyboard;
import com.hbm.blocks.ILookOverlay;
@ -149,13 +155,15 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP
player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1);
player.addExhaustion(0.025F);
}
public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT, IRORValueProvider {
@Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")})
public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT, IRORValueProvider, SimpleComponent, CompatHandler.OCComponent {
public long power;
protected long maxPower;
public long powerReceived;
public long powerSent;
public long lastPowerReceived;
public long lastPowerSent;
public TileEntityCapacitor() { }
@ -198,6 +206,8 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP
networkPackNT(15);
this.lastPowerSent = powerSent;
this.lastPowerReceived = powerReceived;
this.powerSent = 0;
this.powerReceived = 0;
}
@ -315,5 +325,69 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP
if((PREFIX_VALUE + "fillpercent").equals(name)) return "" + this.power * 100 / this.maxPower;
return null;
}
// opencomputer
@Override
@Optional.Method(modid = "OpenComputers")
public String getComponentName() {
return "capacitor";
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getEnergy(Context context, Arguments args) {
return new Object[] {power};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getMaxEnergy(Context context, Arguments args) {
return new Object[] {maxPower};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getEnergySent(Context context, Arguments args) {
return new Object[] {lastPowerReceived};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getEnergyReceived(Context context, Arguments args) { return new Object[] {lastPowerSent}; }
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getInfo(Context context, Arguments args) {
return new Object[] {power, maxPower, lastPowerReceived, lastPowerSent};
}
@Override
@Optional.Method(modid = "OpenComputers")
public String[] methods() {
return new String[] {
"getEnergy",
"getMaxEnergy",
"getEnergySent",
"getEnergyReceived",
"getInfo"
};
}
@Override
@Optional.Method(modid = "OpenComputers")
public Object[] invoke(String method, Context context, Arguments args) throws Exception {
switch(method) {
case ("getEnergy"):
return getEnergy(context, args);
case ("getMaxEnergy"):
return getMaxEnergy(context, args);
case ("getEnergySent"):
return getEnergySent(context, args);
case ("getEnergyReceived"):
return getEnergyReceived(context, args);
case ("getInfo"):
return getEnergyReceived(context, args);
}
throw new NoSuchMethodException();
}
}
}

View File

@ -10,6 +10,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
@Deprecated
public class MachineChemfac extends BlockDummyable {
public MachineChemfac(Material mat) {

View File

@ -0,0 +1,88 @@
package com.hbm.blocks.machine;
import java.util.ArrayList;
import java.util.List;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.tileentity.TileEntityProxyDyn;
import com.hbm.tileentity.machine.TileEntityMachineChemicalFactory;
import com.hbm.util.fauxpointtwelve.DirPos;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
import net.minecraftforge.common.util.ForgeDirection;
public class MachineChemicalFactory extends BlockDummyable implements ITooltipProvider, ILookOverlay {
public MachineChemicalFactory(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachineChemicalFactory();
if(meta >= 6) return new TileEntityProxyDyn().inventory().power().fluid();
return null;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
return this.standardOpenBehavior(world, x, y, z, player, 0);
}
@Override public int[] getDimensions() { return new int[] {2, 0, 2, 2, 2, 2}; }
@Override public int getOffset() { return 2; }
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
x -= dir.offsetX * 2;
z -= dir.offsetZ * 2;
for(int i = -2; i <= 2; i++) for(int j = -2; j <= 2; j++) {
if(Math.abs(i) == 2 || Math.abs(j) == 2) this.makeExtra(world, x + i, y, z + j);
}
ForgeDirection rot = dir.getRotation(ForgeDirection.UP);
for(int i = -2; i <= 2; i++) {
this.makeExtra(world, x + dir.offsetX * i + rot.offsetX * 2, y + 2, z + dir.offsetZ * i + rot.offsetZ * 2);
this.makeExtra(world, x + dir.offsetX * i - rot.offsetX * 2, y + 2, z + dir.offsetZ * i - rot.offsetZ * 2);
}
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
this.addStandardInfo(stack, player, list, ext);
}
@Override
public void printHook(Pre event, World world, int x, int y, int z) {
int[] pos = this.findCore(world, x, y, z);
if(pos == null) return;
TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]);
if(!(te instanceof TileEntityMachineChemicalFactory)) return;
TileEntityMachineChemicalFactory chemfac = (TileEntityMachineChemicalFactory) te;
DirPos[] cool = chemfac.getCoolPos();
for(DirPos dirPos : cool) if(dirPos.compare(x + dirPos.getDir().offsetX, y, z + dirPos.getDir().offsetZ)) {
List<String> text = new ArrayList();
text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + chemfac.water.getTankType().getLocalizedName());
text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + chemfac.lps.getTankType().getLocalizedName());
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text);
break;
}
}
}

View File

@ -1,6 +1,7 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.BlockDummyable;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityMachineChemicalPlant;
import net.minecraft.block.material.Material;
@ -18,6 +19,7 @@ public class MachineChemicalPlant extends BlockDummyable {
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachineChemicalPlant();
if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid();
return null;
}

View File

@ -5,6 +5,7 @@ import java.util.List;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ICustomBlockHighlight;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.inventory.material.Mats.MaterialStack;
import com.hbm.items.machine.ItemScraps;
import com.hbm.main.MainRegistry;
@ -27,7 +28,7 @@ import net.minecraft.world.World;
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
import net.minecraftforge.common.util.ForgeDirection;
public class MachineCrucible extends BlockDummyable implements ICrucibleAcceptor {
public class MachineCrucible extends BlockDummyable implements ICrucibleAcceptor, ITooltipProvider {
public MachineCrucible() {
super(Material.rock);
@ -181,4 +182,9 @@ public class MachineCrucible extends BlockDummyable implements ICrucibleAcceptor
@Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; }
@Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return null; }
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
this.addStandardInfo(stack, player, list, ext);
}
}

View File

@ -1,129 +1,80 @@
package com.hbm.blocks.machine;
import java.util.Random;
import com.hbm.main.MainRegistry;
import com.hbm.blocks.BlockDummyable;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityMachineEPress;
import com.hbm.world.gen.INBTTransformable;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import api.hbm.block.IToolable;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class MachineEPress extends BlockContainer implements INBTTransformable {
public class MachineEPress extends BlockDummyable implements IToolable {
private final Random field_149933_a = new Random();
private static boolean keepInventory;
public MachineEPress(Material p_i45386_1_) {
super(p_i45386_1_);
public MachineEPress(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
return new TileEntityMachineEPress();
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachineEPress();
if(meta >= 6) return new TileEntityProxyCombo(true, false, false);
return null;
}
@Override
public int getRenderType() {
return -1;
public int[] getDimensions() {
return new int[] {2, 0, 0, 0, 0, 0};
}
@Override
public boolean isOpaqueCube() {
return false;
public int getOffset() {
return 0;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) {
if(!keepInventory) {
ISidedInventory tileentityfurnace = (ISidedInventory) p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_);
if(tileentityfurnace != null) {
for(int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) {
ItemStack itemstack = tileentityfurnace.getStackInSlot(i1);
if(itemstack != null) {
float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
while(itemstack.stackSize > 0) {
int j1 = this.field_149933_a.nextInt(21) + 10;
if(j1 > itemstack.stackSize) {
j1 = itemstack.stackSize;
}
itemstack.stackSize -= j1;
EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
if(itemstack.hasTagCompound()) {
entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy());
}
float f3 = 0.05F;
entityitem.motionX = (float) this.field_149933_a.nextGaussian() * f3;
entityitem.motionY = (float) this.field_149933_a.nextGaussian() * f3 + 0.2F;
entityitem.motionZ = (float) this.field_149933_a.nextGaussian() * f3;
p_149749_1_.spawnEntityInWorld(entityitem);
}
}
}
p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_);
}
}
super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_);
protected boolean isLegacyMonoblock(World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
return te != null && te instanceof TileEntityMachineEPress;
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2);
if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2);
if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2);
if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2);
super.onBlockPlacedBy(world, x, y, z, player, itemStack);
if(itemStack.hasDisplayName()) {
((TileEntityMachineEPress) world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName());
int[] pos = this.findCore(world, x, y, z);
if(pos != null) {
TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(pos[0], pos[1], pos[2]);
if(entity != null) {
entity.setCustomName(itemStack.getDisplayName());
}
}
}
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(world.isRemote) {
return true;
} else if(!player.isSneaking()) {
TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(x, y, z);
if(entity != null) {
FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z);
}
return true;
} else {
return false;
}
return this.standardOpenBehavior(world, x, y, z, player, 0);
}
// Un-multiblickable with a hand drill for schenanigans
@Override
public int transformMeta(int meta, int coordBaseMode) {
return INBTTransformable.transformMetaDeco(meta, coordBaseMode);
public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) {
if (tool != ToolType.HAND_DRILL)
return false;
int meta = world.getBlockMetadata(x, y, z);
if (meta >= 12)
return false;
safeRem = true;
world.setBlockToAir(x, y, z);
safeRem = false;
return true;
}
}

View File

@ -35,7 +35,7 @@ public class MachineElectrolyser extends BlockDummyable {
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
return this.standardOpenBehavior(world, x, y, z, player, 0);
return this.standardOpenBehavior(world, x, y, z, player, -1);
}
@Override

View File

@ -6,13 +6,12 @@ import java.util.List;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.IPersistentInfoProvider;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.IPersistentNBT;
import com.hbm.tileentity.machine.storage.TileEntityMachineBattery;
import com.hbm.tileentity.machine.storage.TileEntityMachineFENSU;
import com.hbm.util.BobMathUtil;
import com.hbm.util.i18n.I18nUtil;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
@ -30,43 +29,21 @@ public class MachineFENSU extends BlockDummyable implements ILookOverlay, IPersi
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12)
return new TileEntityMachineFENSU();
if(meta >= 12) return new TileEntityMachineFENSU();
return null;
}
@Override
public int[] getDimensions() {
return new int[] {4, 0, 1, 1, 2, 2};
}
@Override
public int getOffset() {
return 1;
}
@Override public int[] getDimensions() { return new int[] {4, 0, 1, 1, 2, 2}; }
@Override public int getOffset() { return 1; }
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(world.isRemote)
{
return true;
} else if(!player.isSneaking())
{
int[] pos = this.findCore(world, x, y, z);
if(pos == null)
return false;
TileEntityMachineFENSU entity = (TileEntityMachineFENSU) world.getTileEntity(pos[0], pos[1], pos[2]);
if(entity != null)
{
FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]);
}
return true;
} else {
return false;
}
return this.standardOpenBehavior(world, x, y, z, player, 0);
}
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
return IPersistentNBT.getDrops(world, x, y, z, this);
}
@Override

View File

@ -116,7 +116,7 @@ public class MachineFan extends BlockContainer implements IToolable, ITooltipPro
double coeff = push;
if(!falloff) {
if(falloff) {
double dist = e.getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
coeff *= 1.5 * (1 - dist / range / 2);
}

View File

@ -1,21 +1,14 @@
package com.hbm.blocks.machine;
import java.util.Random;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ModBlocks;
import com.hbm.inventory.material.Mats;
import com.hbm.items.ModItems;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityITER;
import com.hbm.tileentity.machine.TileEntityITERStruct;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
@ -25,6 +18,7 @@ import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
@Deprecated
public class MachineITER extends BlockDummyable {
public MachineITER() {
@ -43,11 +37,6 @@ public class MachineITER extends BlockDummyable {
return null;
}
@Override
public Item getItemDropped(int i, Random rand, int j) {
return null;
}
@Override
public int[] getDimensions() {
//because we'll implement our own gnarly behavior here
@ -238,28 +227,5 @@ public class MachineITER extends BlockDummyable {
public int getOffset() {
return 7;
}
public static boolean drop = true;
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int i) {
if(i >= 12 && drop) {
for(int l = 0; l < 4; l++) {
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.fusion_conductor, 64)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.plate_cast, 64, Mats.MAT_STEEL.id)));
}
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.fusion_conductor, 36)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.plate_cast, 36, Mats.MAT_STEEL.id)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.fusion_center, 64)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.fusion_motor, 4)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.reinforced_glass, 8)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.struct_iter_core, 1)));
}
super.breakBlock(world, x, y, z, block, i);
}
}

View File

@ -0,0 +1,54 @@
package com.hbm.blocks.machine;
import java.util.List;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityMachinePUREX;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class MachinePUREX extends BlockDummyable implements ITooltipProvider {
public MachinePUREX(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachinePUREX();
if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid();
return null;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
return this.standardOpenBehavior(world, x, y, z, player, 0);
}
@Override public int[] getDimensions() { return new int[] {4, 0, 2, 2, 2, 2}; }
@Override public int getOffset() { return 2; }
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
x += dir.offsetX * o;
z += dir.offsetZ * o;
for(int i = -2; i <= 2; i++) for(int j = -2; j <= 2; j++) {
if(Math.abs(i) == 2 || Math.abs(j) == 2) this.makeExtra(world, x + i, y, z + j);
}
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
this.addStandardInfo(stack, player, list, ext);
}
}

View File

@ -4,6 +4,7 @@ import com.hbm.blocks.ITooltipProvider;
import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR;
import com.hbm.handler.threading.PacketThreading;
import com.hbm.items.ModItems;
import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.packet.toclient.AuxParticlePacketNT;
@ -80,6 +81,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv
if(!controller.assembled) {
assemble(world, x, y, z, player);
} else {
if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.pwr_printer) return false;
FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z);
}

View File

@ -1,26 +1,19 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ModBlocks;
import com.hbm.handler.MultiblockHandlerXR;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityMachinePlasmaHeater;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.Random;
public class MachinePlasmaHeater extends BlockDummyable {
public MachinePlasmaHeater() {
@ -39,11 +32,6 @@ public class MachinePlasmaHeater extends BlockDummyable {
return null;
}
@Override
public Item getItemDropped(int i, Random rand, int j) {
return null;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(world.isRemote)
@ -133,19 +121,4 @@ public class MachinePlasmaHeater extends BlockDummyable {
public int getOffset() {
return 1;
}
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int i) {
if(i >= 12) {
for(int l = 0; l < 2; l++)
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.fusion_heater, 64)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.fusion_heater, 7)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.struct_plasma_core, 1)));
}
super.breakBlock(world, x, y, z, block, i);
}
}

View File

@ -0,0 +1,20 @@
package com.hbm.blocks.machine;
import com.hbm.tileentity.machine.TileEntityMachinePrecAss;
import net.minecraft.block.material.Material;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public class MachinePrecAss extends MachineAssemblyMachine {
public MachinePrecAss(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachinePrecAss();
return super.createNewTileEntity(world, meta);
}
}

View File

@ -1,105 +1,64 @@
package com.hbm.blocks.machine;
import java.util.Random;
import com.hbm.main.MainRegistry;
import com.hbm.blocks.BlockDummyable;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityMachinePress;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import api.hbm.block.IToolable;
import net.minecraft.block.material.Material;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public class MachinePress extends BlockContainer {
private final Random field_149933_a = new Random();
private static boolean keepInventory;
public class MachinePress extends BlockDummyable implements IToolable {
public MachinePress(Material p_i45386_1_) {
super(p_i45386_1_);
public MachinePress(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
return new TileEntityMachinePress();
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachinePress();
if(meta >= 6) return new TileEntityProxyCombo(true, false, false);
return null;
}
@Override
public int getRenderType() {
return -1;
public int[] getDimensions() {
return new int[] {2, 0, 0, 0, 0, 0};
}
@Override
public boolean isOpaqueCube() {
return false;
public int getOffset() {
return 0;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) {
if(!keepInventory) {
TileEntityMachinePress tileentityfurnace = (TileEntityMachinePress) p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_);
if(tileentityfurnace != null) {
for(int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) {
ItemStack itemstack = tileentityfurnace.getStackInSlot(i1);
if(itemstack != null) {
float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
while(itemstack.stackSize > 0) {
int j1 = this.field_149933_a.nextInt(21) + 10;
if(j1 > itemstack.stackSize) {
j1 = itemstack.stackSize;
}
itemstack.stackSize -= j1;
EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
if(itemstack.hasTagCompound()) {
entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy());
}
float f3 = 0.05F;
entityitem.motionX = (float) this.field_149933_a.nextGaussian() * f3;
entityitem.motionY = (float) this.field_149933_a.nextGaussian() * f3 + 0.2F;
entityitem.motionZ = (float) this.field_149933_a.nextGaussian() * f3;
p_149749_1_.spawnEntityInWorld(entityitem);
}
}
}
p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_);
}
}
super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_);
protected boolean isLegacyMonoblock(World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
return te != null && te instanceof TileEntityMachinePress;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(world.isRemote) {
return true;
} else if(!player.isSneaking()) {
TileEntityMachinePress entity = (TileEntityMachinePress) world.getTileEntity(x, y, z);
if(entity != null) {
FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z);
}
return true;
} else {
return false;
}
return this.standardOpenBehavior(world, x, y, z, player, 0);
}
// Un-multiblickable with a hand drill for schenanigans
@Override
public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) {
if (tool != ToolType.HAND_DRILL)
return false;
int meta = world.getBlockMetadata(x, y, z);
if (meta >= 12)
return false;
safeRem = true;
world.setBlockToAir(x, y, z);
safeRem = false;
return true;
}
}

View File

@ -24,7 +24,6 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.stats.StatList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.EnumChatFormatting;
@ -87,27 +86,11 @@ public class MachineRefinery extends BlockDummyable implements IPersistentInfoPr
public int getOffset() {
return 1;
}
@Override
public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) {
if(!player.capabilities.isCreativeMode) {
harvesters.set(player);
this.dropBlockAsItem(world, x, y, z, meta, 0);
harvesters.set(null);
}
}
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
return IPersistentNBT.getDrops(world, x, y, z, this);
}
@Override
public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) {
player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1);
player.addExhaustion(0.025F);
}
@Override
public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) {

View File

@ -1,15 +1,22 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ILookOverlay;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityMachineRotaryFurnace;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.common.util.ForgeDirection;
public class MachineRotaryFurnace extends BlockDummyable {
import java.util.ArrayList;
import java.util.List;
public class MachineRotaryFurnace extends BlockDummyable implements ILookOverlay {
public MachineRotaryFurnace(Material mat) {
super(mat);
@ -56,4 +63,54 @@ public class MachineRotaryFurnace extends BlockDummyable {
//solid fuel
this.makeExtra(world, x + dir.offsetX + rot.offsetX, y, z + dir.offsetZ + rot.offsetZ);
}
@Override
public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) {
int[] pos = this.findCore(world, x, y, z);
if(pos == null) return;
TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]);
if(!(te instanceof TileEntityMachineRotaryFurnace)) return;
TileEntityMachineRotaryFurnace furnace = (TileEntityMachineRotaryFurnace) te;
ForgeDirection dir = ForgeDirection.getOrientation(furnace.getBlockMetadata() - offset);
List<String> text = new ArrayList<>();
//steam
if(hitCheck(dir, pos[0], pos[1], pos[2], -1, -1, 0, x, y, z) || hitCheck(dir, pos[0], pos[1], pos[2], -1, -2, 0, x, y, z)) {
text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + furnace.tanks[1].getTankType().getLocalizedName());
text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + furnace.tanks[2].getTankType().getLocalizedName());
}
//fluids
if(hitCheck(dir, pos[0], pos[1], pos[2], 1, 2, 0, x, y, z) || hitCheck(dir, pos[0], pos[1], pos[2], -1, 2, 0, x, y, z)) {
text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + furnace.tanks[0].getTankType().getLocalizedName());
}
if(hitCheck(dir, pos[0], pos[1], pos[2], 1, 1, 0, x, y, z)) {
text.add(EnumChatFormatting.YELLOW + "-> " + EnumChatFormatting.RESET + "Fuel");
}
if(!text.isEmpty()) {
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text);
}
}
protected boolean hitCheck(ForgeDirection dir, int coreX, int coreY, int coreZ, int exDir, int exRot, int exY, int hitX, int hitY, int hitZ) {
ForgeDirection turn = dir.getRotation(ForgeDirection.DOWN);
int iX = coreX + dir.offsetX * exDir + turn.offsetX * exRot;
int iY = coreY + exY;
int iZ = coreZ + dir.offsetZ * exDir + turn.offsetZ * exRot;
return iX == hitX && iZ == hitZ && iY == hitY;
}
}

View File

@ -1,133 +0,0 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.ModBlocks;
import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.machine.TileEntityMachineSchrabidiumTransmutator;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import java.util.Random;
public class MachineSchrabidiumTransmutator extends BlockContainer {
private final Random field_149933_a = new Random();
private static boolean keepInventory;
@SideOnly(Side.CLIENT)
//private IIcon iconFront;
private IIcon iconTop;
private IIcon iconBottom;
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
this.iconTop = iconRegister.registerIcon(RefStrings.MODID + (":transmutator_top"));
this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + (":transmutator_bottom"));
this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":transmutator_side");
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int metadata) {
return side == 1 ? this.iconTop : (side == 0 ? this.iconBottom : this.blockIcon);
}
public MachineSchrabidiumTransmutator(Material p_i45386_1_) {
super(p_i45386_1_);
}
@Override
public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_)
{
return Item.getItemFromBlock(ModBlocks.machine_schrabidium_transmutator);
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(world.isRemote)
{
return true;
} else if(!player.isSneaking())
{
TileEntityMachineSchrabidiumTransmutator entity = (TileEntityMachineSchrabidiumTransmutator) world.getTileEntity(x, y, z);
if(entity != null)
{
FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z);
}
return true;
} else {
return false;
}
}
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
return new TileEntityMachineSchrabidiumTransmutator();
}
@Override
public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_)
{
if (!keepInventory)
{
TileEntityMachineSchrabidiumTransmutator tileentityfurnace = (TileEntityMachineSchrabidiumTransmutator)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_);
if (tileentityfurnace != null)
{
for (int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1)
{
ItemStack itemstack = tileentityfurnace.getStackInSlot(i1);
if (itemstack != null)
{
float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F;
while (itemstack.stackSize > 0)
{
int j1 = this.field_149933_a.nextInt(21) + 10;
if (j1 > itemstack.stackSize)
{
j1 = itemstack.stackSize;
}
itemstack.stackSize -= j1;
EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
if (itemstack.hasTagCompound())
{
entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
}
float f3 = 0.05F;
entityitem.motionX = (float)this.field_149933_a.nextGaussian() * f3;
entityitem.motionY = (float)this.field_149933_a.nextGaussian() * f3 + 0.2F;
entityitem.motionZ = (float)this.field_149933_a.nextGaussian() * f3;
p_149749_1_.spawnEntityInWorld(entityitem);
}
}
}
p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_);
}
}
super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_);
}
}

View File

@ -26,12 +26,8 @@ public class MachineSolarBoiler extends BlockDummyable implements ILookOverlay {
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12)
return new TileEntitySolarBoiler();
if(meta >= extra)
return new TileEntityProxyCombo(false, false, true);
if(meta >= 12) return new TileEntitySolarBoiler();
if(meta >= extra) return new TileEntityProxyCombo(false, false, true);
return null;
}

View File

@ -2,39 +2,31 @@ package com.hbm.blocks.machine;
import com.hbm.blocks.ModBlocks;
import com.hbm.lib.RefStrings;
import com.hbm.tileentity.machine.TileEntityMachineTransformer;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
public class MachineTransformer extends BlockContainer {
long buffer;
int delay;
public class MachineTransformer extends Block {
@SideOnly(Side.CLIENT)
private IIcon iconTop;
public MachineTransformer(Material p_i45394_1_, long b, int d) {
super(p_i45394_1_);
buffer = b;
delay = d;
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
if(this == ModBlocks.machine_transformer || this == ModBlocks.machine_transformer_20) {
if(this == ModBlocks.machine_transformer) {
this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":machine_transformer_top_iron");
this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":machine_transformer_iron");
}
if(this == ModBlocks.machine_transformer_dnt || this == ModBlocks.machine_transformer_dnt_20) {
if(this == ModBlocks.machine_transformer_dnt) {
this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":machine_transformer_top");
this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":machine_transformer");
}
@ -45,9 +37,4 @@ public class MachineTransformer extends BlockContainer {
public IIcon getIcon(int side, int metadata) {
return side == 1 ? this.iconTop : (side == 0 ? this.iconTop : this.blockIcon);
}
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
return new TileEntityMachineTransformer();
}
}

View File

@ -282,8 +282,6 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid
if(this.slot != null) {
BufferUtil.writeNBT(buf, slot.stackTagCompound);
}
this.turnProgress = 2;
}
@Override

View File

@ -1,7 +1,6 @@
package com.hbm.blocks.machine;
import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemBattery;
import com.hbm.tileentity.machine.TileEntityRadiobox;
import net.minecraft.block.Block;
@ -47,31 +46,17 @@ public class Radiobox extends BlockContainer {
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
if(i == 0)
{
world.setBlockMetadataWithNotify(x, y, z, 2, 2);
}
if(i == 1)
{
world.setBlockMetadataWithNotify(x, y, z, 5, 2);
}
if(i == 2)
{
world.setBlockMetadataWithNotify(x, y, z, 3, 2);
}
if(i == 3)
{
world.setBlockMetadataWithNotify(x, y, z, 4, 2);
}
if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2);
if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2);
if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2);
if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2);
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(world.isRemote)
{
if(world.isRemote) {
return true;
} else if(!player.isSneaking())
{
} else if(!player.isSneaking()) {
TileEntityRadiobox box = (TileEntityRadiobox)world.getTileEntity(x, y, z);
if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.battery_spark && !box.infinite) {
@ -93,78 +78,53 @@ public class Radiobox extends BlockContainer {
return true;
} else {
//FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_radiobox, world, x, y, z);
//return true;
return false;
}
}
@Override
public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_, int p_149719_4_)
{
public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_, int p_149719_4_) {
int te = p_149719_1_.getBlockMetadata(p_149719_2_, p_149719_3_, p_149719_4_);
float f = 0.0625F;
this.setBlockBounds(0.0F, 0.0F, 2*f, 1.0F, 1.0F, 14*f);
switch(te)
{
float f = 0.0625F;
this.setBlockBounds(0.0F, 0.0F, 2 * f, 1.0F, 1.0F, 14 * f);
switch(te) {
case 4:
case 8:
this.setBlockBounds(11*f, 1*f, 4*f, 16*f, 15*f, 12*f);
break;
case 8: this.setBlockBounds(11 * f, 1 * f, 4 * f, 16 * f, 15 * f, 12 * f); break;
case 2:
case 6:
this.setBlockBounds(4*f, 1*f, 11*f, 12*f, 15*f, 16*f);
break;
case 6: this.setBlockBounds(4 * f, 1 * f, 11 * f, 12 * f, 15 * f, 16 * f); break;
case 5:
case 9:
this.setBlockBounds(0*f, 1*f, 4*f, 5*f, 15*f, 12*f);
break;
case 9: this.setBlockBounds(0 * f, 1 * f, 4 * f, 5 * f, 15 * f, 12 * f); break;
case 3:
case 7:
this.setBlockBounds(4*f, 1*f, 0*f, 12*f, 15*f, 5*f);
break;
case 7: this.setBlockBounds(4 * f, 1 * f, 0 * f, 12 * f, 15 * f, 5 * f); break;
}
}
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
int te = world.getBlockMetadata(x, y, z);
float f = 0.0625F;
this.setBlockBounds(0.0F, 0.0F, 2*f, 1.0F, 1.0F, 14*f);
switch(te)
{
float f = 0.0625F;
this.setBlockBounds(0.0F, 0.0F, 2 * f, 1.0F, 1.0F, 14 * f);
switch(te) {
case 4:
case 8:
this.setBlockBounds(11*f, 1*f, 4*f, 16*f, 15*f, 12*f);
break;
case 8: this.setBlockBounds(11 * f, 1 * f, 4 * f, 16 * f, 15 * f, 12 * f); break;
case 2:
case 6:
this.setBlockBounds(4*f, 1*f, 11*f, 12*f, 15*f, 16*f);
break;
case 6: this.setBlockBounds(4 * f, 1 * f, 11 * f, 12 * f, 15 * f, 16 * f); break;
case 5:
case 9:
this.setBlockBounds(0*f, 1*f, 4*f, 5*f, 15*f, 12*f);
break;
case 9: this.setBlockBounds(0 * f, 1 * f, 4 * f, 5 * f, 15 * f, 12 * f); break;
case 3:
case 7:
this.setBlockBounds(4*f, 1*f, 0*f, 12*f, 15*f, 5*f);
break;
case 7: this.setBlockBounds(4 * f, 1 * f, 0 * f, 12 * f, 15 * f, 5 * f); break;
}
return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ);
}
public void breakBlock(World world, int x, int y, int z, Block b, int m) {
public void breakBlock(World world, int x, int y, int z, Block b, int m) {
TileEntityRadiobox box = (TileEntityRadiobox)world.getTileEntity(x, y, z);
if(box.infinite) world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.battery_spark)));
if(box.infinite) {
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, ItemBattery.getEmptyBattery(ModItems.battery_spark)));
}
super.breakBlock(world, x, y, z, b, m);
}
super.breakBlock(world, x, y, z, b, m);
}
}

View File

@ -4,9 +4,9 @@ import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.world.World;
public class RailBooster extends RailGeneric {
public RailBooster() {
super();
public RailBooster(String tool, int harvestLevel) {
super(tool, harvestLevel);
this.setMaxSpeed(1.0F);
this.setFlexible(false);
}

View File

@ -17,19 +17,20 @@ import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class RailGeneric extends BlockRailBase implements ITooltipProvider {
@SideOnly(Side.CLIENT)
protected IIcon turnedIcon;
protected static final float baseSpeed = 0.4F;
protected float maxSpeed = 0.4F;
protected boolean slopable = true;
protected boolean flexible = true;
public RailGeneric() {
public RailGeneric(String tool, int harvestLevel) {
super(false);
setHarvestLevel(tool, harvestLevel);
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta) {
@ -40,16 +41,16 @@ public class RailGeneric extends BlockRailBase implements ITooltipProvider {
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister reg) {
super.registerBlockIcons(reg);
if(flexible)
this.turnedIcon = reg.registerIcon(this.getTextureName() + "_turned");
}
@Override
public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) {
return maxSpeed;
}
public RailGeneric setMaxSpeed(float speed) {
this.maxSpeed = speed;
return this;
@ -59,7 +60,7 @@ public class RailGeneric extends BlockRailBase implements ITooltipProvider {
public boolean isFlexibleRail(IBlockAccess world, int y, int x, int z) {
return !isPowered();
}
public RailGeneric setFlexible(boolean flexible) {
this.flexible = flexible;
return this;
@ -69,7 +70,7 @@ public class RailGeneric extends BlockRailBase implements ITooltipProvider {
public boolean canMakeSlopes(IBlockAccess world, int x, int y, int z) {
return true;
}
public RailGeneric setSlopable(boolean slopable) {
this.slopable = slopable;
return this;
@ -78,15 +79,15 @@ public class RailGeneric extends BlockRailBase implements ITooltipProvider {
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
float speed = this.maxSpeed / this.baseSpeed;
if(speed != 1F) {
list.add((speed > 1 ? EnumChatFormatting.BLUE : EnumChatFormatting.RED) + "Speed: " + ((int) (speed * 100)) + "%");
}
if(!flexible) {
list.add(EnumChatFormatting.RED + "Cannot be used for turns!");
}
if(!slopable) {
list.add(EnumChatFormatting.RED + "Cannot be used for slopes!");
}

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