Compare commits

...

1068 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
Bob
060c259fa9 bals 2025-06-09 22:49:23 +02: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
HbmMods
6f598278d6
Merge pull request #2196 from abel1502/abel-bobble
Add a bobblehead of myself
2025-06-09 15:34:49 +02:00
HbmMods
6b28649094
Merge pull request #2194 from abel1502/abel-misc-tweaks-2025-06
QoL changes in bulk
2025-06-09 15:34:13 +02:00
HbmMods
47eabb8b36
Merge pull request #2198 from arantirnecrolord/master
typo correction uk_UA
2025-06-09 15:23:36 +02:00
HbmMods
63bf3a1e7c
Merge pull request #2199 from bpotato198/master
PL localisation fix
2025-06-09 15:22:56 +02:00
abel1502
d185a5ea22
Turn down mass storage sfx volume 2025-06-08 00:24:58 +03:00
BakedPotato
947ba198cc
Update pl_PL.lang 2025-06-07 18:46:31 +02:00
BakedPotato
c8ad381418
PL localisation 2025-06-07 18:24:48 +02:00
abel1502
e9888a8634
More NBT consistency
Normalize empty NBT to null NBT. Fixes stackability for empty inventories, as usual.
2025-06-07 00:28:17 +03:00
Boblet
cf82ea3796 facing oblivion to become the lode star 2025-06-06 14:03:52 +02:00
arantirnecrolord
8a93b02c94
who cares what i called it 2025-06-06 14:07:02 +03:00
abel1502
51ad12d51a
Add a notification for fan mode toggle 2025-06-05 20:49:10 +03:00
abel1502
88713946dd
Allow cycling the fan force falloff with a handdrill 2025-06-05 20:46:18 +03:00
arantirnecrolord
3b2a4aee1e
typo correction uk_UA 2025-06-05 20:27:28 +03:00
abel1502
4d0ce8b6d9
Add update packet to crates 2025-06-05 19:51:38 +03:00
abel1502
d27bda1f74
Add proper markDirty calls to tile entities 2025-06-05 18:56:40 +03:00
abel1502
84d3722c04
Save customName to NBT 2025-06-05 18:49:02 +03:00
Boblet
60f05defe0 deltarune tomorrow 2025-06-05 15:38:29 +02:00
Boblet
25e20662e4 a little gift for future me 2025-06-04 16:11:38 +02:00
abel1502
c9110aaa33
NBT consistency for crates opened from inventory 2025-06-03 23:57:43 +03:00
abel1502
c19e867bfd
Don't consume oil when suspended 2025-06-03 20:31:41 +03:00
abel1502
df8d456a90
Allow suspending autosaw with a screwdriver
Localized, though I'm not sure if it really needs to be
2025-06-03 20:26:07 +03:00
abel1502
8c196f05ca
Save forseSkip to NBT
Not included in `serialize()` and `deserialize()` because it is server-side-only
2025-06-03 20:23:14 +03:00
abel1502
f8d827d6cd
Make autosaw respect walls
Previously the blade always phased through solid walls. Now, if colliding with one, it will retract forcibly. In case there are valid targets behind a wall, it will ignore them for the next 5 degrees of rotation
2025-06-03 19:03:46 +03:00
abel1502
79d510aefb
Increase base fan force 2025-06-03 16:35:05 +03:00
abel1502
3733a8bee9
Fan force falloff
Previously, with two fans facing into each other, either one of them would completely overpower the other, or they'd cancel each other out. Now the force is inversely proportional to the distance, so the items end up in the middle
2025-06-03 15:54:46 +03:00
abel1502
d9ef97f345
Add glow 2025-06-03 14:08:02 +03:00
abel1502
20eb02e816
Fix posture and inscription 2025-06-03 12:56:36 +03:00
abel1502
61acb3db45
I turned myself into a bobblehead 2025-06-03 12:46:21 +03:00
abel1502
8a7934d274
Fix custom name for crates opened from hand 2025-06-02 23:46:01 +03:00
abel1502
997fb20129
This time for sure 2025-06-02 23:35:25 +03:00
abel1502
5fe26d5647
Fix renaming hook again
Turns out, there's a bug in Forge and the stacks are misassigned for that particular event
2025-06-02 23:35:20 +03:00
abel1502
cf26eac2c9
Fix renaming hook 2025-06-02 23:35:16 +03:00
abel1502
8970878e6b
Add look overlay to named crates
I think this is better than signs for a crate-based stockpile. Only shows the name for now, but a contents summary might be included too.
2025-06-02 21:51:54 +03:00
abel1502
6fb0b647fd
Disable repair cost increment on rename
Effectively a backport of a 1.8 feature. Relevant because otherwise a renamed crate is nbt-incompatible with itself after being placed and broken
2025-06-02 21:35:14 +03:00
abel1502
4bc07d9cbf
Add missing check 2025-06-02 21:06:47 +03:00
abel1502
0f7c8b49f3
Fix crate NBT inconsistency in crates
Apparently, a mined crate used to differ from a freshly crafted one because the former didn't have any spiders in it. The latter? Neither.
2025-06-02 20:55:01 +03:00
abel1502
169f1666e7
Retain names for storage crates 2025-06-02 20:54:46 +03:00
abel1502
7ef016ccce
Make mass storage process output instantly
Same deal as previously, this bypasses the bottleneck of tile entity ticking and network latency. This change is less relevant than the previous one, because there shift-dragging or shift-double-clicking were possible with mods, while here it only really affects autoclickers. Still, it can't hurt
2025-06-02 20:16:05 +03:00
abel1502
a6740a35e9
Make mass storage process input instantly
This allows to shift-click an entire inventory-load into a mass storage. Previously this was bottlenecked by the network latency and the tile entity tickrate.

Taking stuff out is unaffected for now, I'll see what I can do
2025-06-02 20:16:00 +03:00
abel1502
4b3430f9b1
Scrollwheel support for template folder 2025-06-02 18:50:20 +03:00
abel1502
640b0ae341
Merge remote-tracking branch 'upstream/master' into abel-misc-tweaks-2025-06 2025-06-02 18:40:37 +03:00
abel1502
4ae675aebc
Fix autocrafter output slot
This is the only case I found where a SlotPattern was supposed to support a stack size different from 1, but if there's any more, just add a `, true` to the end of the corresponsing slot constructor
2025-06-02 18:33:04 +03:00
Boblet
0c9bea7091 the selection 2025-06-02 16:58:59 +02:00
abel1502
5d7fc996e5
Make autosaw replant crops
It doesn't seem too far-fetched to suggest the seeds that fall to the ground are replanted in a natural way.

I had to replace the old ray-tracing approach with a more straightforward iteration over all possibly affected blocks (under 400, most of them skipped). In terms of performance this seems on par with the original solution (the raytrace function alone did 200 iterations).
2025-06-02 14:32:30 +03:00
HbmMods
e9b809d9dc
Merge pull request #2192 from MellowArpeggiation/sync-recipes
fix interaction max distance issue with detailed hitboxes
2025-06-02 08:21:20 +02:00
HbmMods
015ff7e5c1
Merge pull request #2189 from mlbv/1.7.10
DDA cleanup
2025-06-02 08:20:47 +02:00
George Paton
5501380d15 fix interaction max distance preventing interacting with detailed BlockDummyable hitboxes 2025-06-02 10:15:39 +10:00
abel1502
4a931a4be1
Remove angry metal drop
Considerting it is no longer used anywhere (Eye of Harmony doesn't count since the AMS is long deprecated), it felt weird to still get it 10% of the time
2025-06-02 01:04:21 +03:00
abel1502
2d33e90f93
Allow climbing freestanding chains and vines using spacebar 2025-06-02 01:00:11 +03:00
abel1502
afa0418104
Make strand caster timeout refresh on pour
Previously, if a caster has been idle for a while, the first time something is poured into it, it would spew out a partial load almost immediately. The original intention behind the timeout was instead to make the strand caster perform incomplete operations if no new material has been poured for a while. This change makes the behaviour closer to intended. Most of the time, persistent use of the caster would consistently reach full fill, and incomplete fill will only be processed at the end.
2025-06-02 00:15:36 +03:00
abel1502
8d7664f728
Integrate stack size logic directly into SlotPattern 2025-06-02 00:15:30 +03:00
abel1502
d890443150
Make wooden scaffold climbable 2025-06-02 00:14:29 +03:00
Bob
169e9c0879 lost in the sauce 2025-06-01 17:10:57 +02:00
Bob
0a1822ff10 my balls are heavy 2025-06-01 16:45:19 +02:00
Bob
0be198d21f in a rush 2025-05-31 18:04:16 +02:00
mlbv
70cd3d4071 DDA cleanup 2025-05-31 04:08:15 +08:00
HbmMods
891d4d869d
Merge pull request #2188 from MellowArpeggiation/sync-recipes
Automatic custom recipe sync for servers
2025-05-30 11:30:19 +02:00
George Paton
e6b84bd6d3 fix guard on checkNBT 2025-05-30 09:54:39 +10:00
George Paton
87a1c01fe7 disable recipe sync by default, can be enabled by server operators 2025-05-30 09:53:46 +10:00
HbmMods
95f3bcb1f5
Merge pull request #2180 from abel1502/abel-geiger-redstone
Geiger counter comparator integration
2025-05-29 18:11:25 +02:00
HbmMods
282326d3c4
Merge pull request #2183 from arantirnecrolord/master
add ukrainian translation
2025-05-29 18:10:46 +02:00
HbmMods
0c0c9d02d7
Merge pull request #2185 from Kirby7871/master
New OC functions for radar, launch pad and turrets.
2025-05-29 18:10:31 +02:00
Bob
a57e538479 go go gadget: 5 cups of coffee 2025-05-29 18:09:00 +02:00
Kirby7871
4f975293a5
Update TileEntityTurretBaseNT.java
Fixed Comma typo
2025-05-29 02:37:27 +02:00
Kirby7871
d01f54d1ba
Update TileEntityMachineRadarNT.java
Fixed a comma typo
2025-05-29 02:36:36 +02:00
Kirby7871
3a8e0048a3
Update TileEntityMachineRadarNT.java
Added an OpenComputers function, getPos().
It retuns the position of this radar.
2025-05-29 02:12:39 +02:00
Kirby7871
65f1866e8c
Update TileEntityTurretBaseNT.java
Added an OpenComputers function, getPos().
It returns the (x,y,z) coordinates of the turret in question
2025-05-29 02:06:40 +02:00
Kirby7871
087be46083
Update TileEntityLaunchPadBase.java
Added another OC (OpenComputers) function, getPos().
It returns the position of the launch pad. (x,y,z)
2025-05-29 02:01:39 +02:00
Boblet
9ff55acccf destroy tickets when we aren't using them 2025-05-28 16:56:21 +02:00
arantirnecrolord
381febd64e
Update UA 2025-05-28 16:00:43 +03:00
arantirnecrolord
30be3d5fa7
Add files via upload 2025-05-28 15:45:28 +03:00
arantirnecrolord
60f64f33f2
add translation 2025-05-28 00:28:06 +03:00
Boblet
acbea88eca now we're thinking with portals 2025-05-26 16:21:59 +02:00
abel1502
ac46cdf1ad
Fix comparator output 2025-05-26 15:18:37 +03:00
abel1502
8f2a858f52
Geiger counter comparator output 2025-05-26 14:53:07 +03:00
HbmMods
b00e3b9efb
Merge pull request #2178 from abel1502/abel-fix-2177
Fix #2177
2025-05-26 11:30:36 +02:00
abel1502
00c73d63c0
Fix #2177
The original hotfix is no longer necessary, as all remaning calls to getFullName are fully client-side
2025-05-26 12:16:20 +03:00
Boblet
38c6b4691d drooling baby safeguard 2025-05-26 10:46:22 +02:00
Boblet
e347aa4346 it's like mopping up 5 gallons of vomit 2025-05-26 10:05:03 +02:00
George Paton
7d6289b228 fix dummy blocks with detailed hitboxes not using them for clicks (interaction/breaking) 2025-05-26 10:12:46 +10:00
Bob
ce99e65b0b the spoingus 2025-05-25 22:12:33 +02:00
HbmMods
73406b4dae
Merge pull request #2167 from mlbv/1.7.10
Parallelized ray explosion
2025-05-24 14:07:22 +02:00
mlbv
1a5fda1847 Feat: accumulatedDestruction 2025-05-24 09:00:15 +08:00
mlbv
9d3860df64 Fix: Make generateSphereRays run asynchronously 2025-05-23 21:47:03 +08:00
HbmMods
630654ded7
Merge pull request #2169 from Nycticoraxnightheron/master
zh_CN update
2025-05-23 13:41:16 +02:00
Boblet
148ba19721 deploy surface-to-yellow-one missile 2025-05-23 13:40:48 +02:00
mlbv
ea430afe71 Fix: Make crate look normal 2025-05-23 19:40:45 +08:00
Justnightheron
ed59ba69f3
AUV您吉祥 2025-05-23 16:45:24 +08:00
HbmMods
4fc41c631d
Merge pull request #2168 from abel1502/abel-strand-caster-fix
Strand caster fix
2025-05-23 08:12:46 +02:00
HbmMods
051938a3cd
Merge pull request #2165 from abel1502/abel-conv-ejector-fix
Fix interaction between conveyor ejector and conveyor splitter
2025-05-23 08:10:48 +02:00
George Paton
933ecded5d send recipe JSON to all clients connecting to a server (does nothing in singleplayer, can be disabled via config) 2025-05-23 13:16:08 +10:00
abel1502
41189e5f25
I fixed it so good it stopped working
But now it does again. I'm just silly like that sometimes
2025-05-23 01:42:12 +03:00
abel1502
d3e839a9bb
Don't modify the out stack
Just in case, IDK
2025-05-23 01:08:27 +03:00
abel1502
81ca498fa8
Fix strand caster 2: electric boogaloo
Like, only cast if there is anything to cast, duh
2025-05-23 00:57:21 +03:00
abel1502
93638c3889
Fix strand caster
Also refactor it in the process, for good measure
2025-05-23 00:40:45 +03:00
Bob
6a7dabbb1e the malicious gigglefish from the silly dimension 2025-05-22 21:45:18 +02:00
mlbv
9bb9a56452 Fix: setDead() now correctly calls cancel() 2025-05-23 01:47:29 +08:00
mlbv
bf2a4b776f feat: parallelized explosion calculation
and is configurable
2025-05-23 01:01:34 +08:00
abel1502
f3a88b6afb
Apply fix to buffered items 2025-05-22 19:15:58 +03:00
abel1502
953d120fc6
Fix direction 2025-05-22 19:06:24 +03:00
abel1502
3a6f890774
Fix dupe 2025-05-22 18:51:54 +03:00
abel1502
dc66e5ac04
Conveyor ejector & splitter compat
Previously, an ejector ejecting directly into a splitter bypassed the splitting
2025-05-22 18:51:46 +03:00
Boblet
d19894fa3d kasane's titos 2025-05-22 16:36:17 +02:00
HbmMods
a47aa63d21
Merge pull request #2162 from MellowArpeggiation/master
screwdriver adjustable conveyor splitters
2025-05-22 08:06:43 +02:00
George Paton
e5cfc9cf2b add screwdriver info 2025-05-22 12:56:22 +10:00
George Paton
5459920b9c ensure pre-existing splitters initialise ratios 2025-05-22 12:51:34 +10:00
George Paton
b4ae72513b screwdriver adjustable conveyor splitters 2025-05-22 12:28:40 +10:00
Boblet
716e429772 the rim flappe on a bongfish 2025-05-21 16:29:18 +02:00
HbmMods
411d73ff9b
Merge pull request #2152 from abel1502/abel-abilities
Tool abilities GUI
2025-05-21 13:39:14 +02:00
HbmMods
e628976969
Merge pull request #2153 from Toshayo/rbmk-console-view-rotation
Added rbmk console view rotation support
2025-05-21 13:38:01 +02:00
abel1502
527459b92c
Add some null safety
In my survival playthrough, I got a crash when
a tool with AOE broke mid-operation.
This should fix it
2025-05-21 00:57:20 +03:00
abel1502
df1ee57563
Merge remote-tracking branch 'upstream/master' into abel-abilities
@HbmMods please, every commit you make is a merge conflict
2025-05-20 22:02:53 +03:00
Bob
b48b536834 thank you doctor, no more nose blood 2025-05-20 20:01:36 +02:00
Boblet
ce8099d4aa the sloplands 2025-05-20 15:55:27 +02:00
HbmMods
f73fa37659
Merge pull request #2159 from Nycticoraxnightheron/master
zh_CN update
2025-05-20 09:48:33 +02:00
HbmMods
c7f570706d
Merge pull request #2158 from MellowArpeggiation/master
the five hundredth crate dupe fix
2025-05-20 09:48:25 +02:00
Justnightheron
a8829245f4
juice 2025-05-20 14:08:40 +08:00
George Paton
4baf5e7c67 don't open conveyor sorter GUI when placing conveyors 2025-05-20 14:26:14 +10:00
George Paton
4f8c102b68 All dupes fixed and _verified_ 2025-05-20 14:21:56 +10:00
abel1502
b55d66ecac
Merge branch 'master' into abel-abilities 2025-05-19 23:16:22 +03:00
Bob
5cf209e2c1 guh 2025-05-19 21:30:25 +02:00
HbmMods
c49bbab8c9
Merge pull request #2154 from 7pheonix/master
I'm not even sure how i managed to break that
2025-05-19 16:12:40 +02:00
Boblet
9085dc5f0c 🅱️alls 2025-05-19 16:12:10 +02:00
pheo
fa25d17a45 fixed shading and green lightning in the breeder
my tummy hurt
2025-05-18 22:16:59 +01:00
abel1502
3f106f01e2
Merge branch 'master' into abel-abilities 2025-05-18 22:56:20 +03:00
Toshayo
bbc27820f1
Added rbmk console view rotation support 2025-05-18 21:20:52 +02:00
abel1502
de8b888f3e
Fix credits
Still not sure what happened, but if it was supposed
to be an æ and not a replacement char,
I can just type it by hand
2025-05-18 21:27:58 +03:00
abel1502
2c48bcb782
Minor fix
I realized I forgot to tweak this when adding
the reset button
2025-05-18 20:44:14 +03:00
abel1502
afb0c67090
Silly 2025-05-18 20:23:22 +03:00
abel1502
b85e4d2835
Fix ability listing for ability-less tools
Also I realized I don't need a linked hash map
now that I sort everything manually.
2025-05-18 20:16:03 +03:00
abel1502
4728e3c6ba
Fix visual glitch with harvest abilities 2025-05-18 16:16:58 +03:00
abel1502
aadb2d5f2a
Actually, I can refactor this to stay more true to the original 2025-05-18 15:45:44 +03:00
abel1502
25015a4f7a
Third time's the charm 2025-05-18 15:45:04 +03:00
abel1502
7c135c4a33
This time for sure 2025-05-18 15:11:54 +03:00
abel1502
92b9ab2369
Fix original block not being affected by ability 2025-05-18 14:57:54 +03:00
abel1502
05562018fc
Limit max presets 2025-05-18 14:38:21 +03:00
abel1502
c475e4f3d3
Clean up after cherry-picking
I originally did it in my local clone of NTM-Space,
and the cherry-picking seemingly carried along
a couple of features from there by accident
2025-05-18 14:25:52 +03:00
abel1502
29e69b9c49
Pat myself on the back 2025-05-18 14:19:22 +03:00
abel1502
2497d628e5
Fix explosing incompatibility 2025-05-18 14:18:22 +03:00
abel1502
cc31edff44
Change item tooltip 2025-05-18 14:18:20 +03:00
abel1502
ce64270b2c
Sort abilities consistently 2025-05-18 14:18:16 +03:00
abel1502
e23cfab649
Make explosion incompatible with harvest abilities 2025-05-18 14:18:14 +03:00
abel1502
239454e23c
Fix stuff 2025-05-18 14:18:11 +03:00
abel1502
b79b499b21
Add backwards compatibility in tool NBT 2025-05-18 14:18:08 +03:00
abel1502
c190863785
Reimplement ItemToolAbility
I'll be very impressed if it works correctly right away. But, to my credit, it does compile
2025-05-18 14:18:04 +03:00
abel1502
634836c549
Switch weapon abilities to the new system 2025-05-18 14:11:33 +03:00
abel1502
f1184f8731
Add explicit "public" to interfaces 2025-05-18 14:11:09 +03:00
abel1502
e59f8b441d
Implement ability presets 2025-05-18 14:11:07 +03:00
abel1502
853b6576ad
Rewrite weapon abilities 2025-05-18 14:11:05 +03:00
abel1502
0f22e34069
Add tooltip to gui 2025-05-18 14:11:04 +03:00
abel1502
61917ddc2f
Refactor GUIScreenToolAbility to support tooltips 2025-05-18 14:11:02 +03:00
abel1502
bf1e14c08f
Rewrite tool area abilities 2025-05-18 14:10:59 +03:00
abel1502
2982dd1f58
Begin ability refactor, rewrite tool harvest abilities 2025-05-18 14:10:37 +03:00
abel1502
caf416a27d
Tool ability selector frontend 2025-05-18 14:07:57 +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
1696 changed files with 196406 additions and 81753 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

@ -13,6 +13,8 @@ Things you should also avoid include:
* duplicate util functions (just use what we have, man)
* unused or half finished util functions (for obvious reasons)
* half finished or obviously broken features (à la "bob will fix it, i'm sure of it", please don't do that)
* updating the changelog (you're guaranteed to cause a merge conflict with that)
* any use of `I18n`, use `I18nUtil` instead
## Test your code

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 {

View File

@ -1,47 +1,27 @@
## Added
* Sandbags
* Connect to other sandbags or solid blocks
* Pretty
* Wooden barrier
* Pretty
* Automatically walls off connected solid blocks in addition to the direction it was placed in
* Some other wooden blocks like a roof, ceiling and scaffold
* Flow control pump
* The fluid equivalent to a diode
* Supports up to 10,000mB/t
* Unlike the diode, it is configured via GUI
* Can be shut off with redstone like a fluid valve
* Charge thrower
* A new weapon/tool
* Can fire two tiers of demolition charges or a grappling hook
* The grappling hook's line can be controlled via left and right mouse buttons
* Anti-materiel rifle
* Fires 12.7mm of fun
* x5 magnification scope
## Changed
* Increased bayonet damage from 5 to 7.5 hearts
* Two numeric redstone over radio signals sent over the same channel will now be added together instead of one signal replacing the other
* This means that reading the fill state of multiple batteries over the same channel should result the combined fill state of all batteries
* Halved base spread of the .22 SMG
* Certain secret guns now have a proper way of being obtained
* Demolition mini nukes now create fire again
* New server configs
* `CRATE_OPEN_HELD` can toggle whether crates can be opened when held
* `CRATE_KEEP_CONTENTS` can toggle whether crates keep their contents when broken
* `ITEM_HAZARD_DROP_TICKRATE` can change the time between ticks for dropped item hazard checks (gunpowder, lithium), default is 2, lowest is 1
* Duds now have multiple variants
* Dismantling different variants yields different drops
* Magnetic extraction can no longer be performed
* `isItemBlacklisted` on the item hazard checks now employs caching instead of doing a full ore dictionary lookup for every single check, this should make it marginally more performant
* The unfinished trains stuff is no longer listed in the creative tabs
* 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
* Fixed RoR controller having the wrong recipe
* Either fixed the crate dupe/voiding issues or made them even worse
* Fixed skeletons and pedestals allowing blocks to be placed inside the player
* Fixed artillery shells not playing the explosion animation when directly impacting entities
* Fixed bauxite and malachite vein toggles being on backwards
* Fixed pneumatic tube order settings not saving
* Fixed crash caused by launching ABMs with blank target designators
* Fixed particle source throwing errors when trying to save nonexistant particles
# 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,67 +1,80 @@
mod_version=1.0.27
# Empty build number makes a release type
mod_build_number=5334
credits=HbMinecraft,\
\ rodolphito (explosion algorithms),\
\ grangerave (explosion algorithms),\
\ Hoboy (textures, models),\
\ Drillgon200 (effects, models, porting),\
\ 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, better particle diodes),\
\ 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),\
\ LePeep (coilgun model, BDCL QC),\
\ Adam29 (liquid petroleum, ethanol, electric furnace),\
\ Pvndols (thorium fuel recipe, gas turbine),\
\ JamesH2 (blood mechanics, nitric acid, particle emitter),\
\ Lazzzycat (structures),\
\ PastaBaguette (coal horse decal),\
\ Doctor17 (russian localization)),\
\ Pashtet (russian localization),\
\ Bismarck (chinese localization),\
\ Creeper-banner (chinese localization),\
\ 5467864 (chinese localization),\
\ eeeeee0a (chinese localization),\
\ hz0909adc (chinese localization),\
\ LSKLW (chinese localization),\
\ R-Kaenbyou (chinese localization),\
\ scp-000000000 (chinese localization),\
\ UnnameTokiko (chinese localization),\
\ Herobrine 457985 (chinese localization),\
\ xxwinhere (chinese localization),\
\ Maksymisio (polish localization)\
\ el3ctro4ndre (italian localization),\
\ Pu-238 (Tom impact effects),\
\ Frooz (gun models),\
\ VT-6/24 (models, textures),\
\ Nos (models),\
\ WushiThe (models),\
\ Minecreep (models),\
\ 70k (textures, glyphid AI, strand caster, electrolyzer changes, cryolite),\
\ instantnootles (concept artist),\
\ haru315 (spiral point algorithm),\
\ Sten89 (models),\
\ Pixelguru26 (textures),\
\ TheBlueHat (textures),\
\ Burningwater202 (laminate glass),\
\ TehTemmie (reacher radiation function),\
\ Silly541 (config for safe ME drives),\
\ Voxelstice (OpenComputers integration, turbine spinup),\
\ BallOfEnergy1 (OpenComputers integration, RBMK and packet optimization, crate backpacks),\
\ sdddddf80 (recipe configs, chinese localization, custom machine holograms),\
\ Abel1502 (optimization, crate upgrade recipes, strand caster improvements, varous tweaks),\
\ Darek505 (armor rendering compatibility fix),\
\ 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),\
\ icomet (refactoring),\
\ martemen (project settings),\
\ OvermindDL1 (project settings),\
\ impbk2002 (project settings)\
mod_version=1.0.27
# Empty build number makes a release type
mod_build_number=5572
credits=HbMinecraft,\
\ rodolphito (explosion algorithms),\
\ grangerave (explosion algorithms),\
\ Hoboy (textures, models),\
\ Drillgon200 (effects, models),\
\ MartinTheDragon (calculator, chunk-based fallout, bendable cranes, pipe improvements, PWR sounds),\
\ 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),\
\ LePeep (coilgun model, BDCL QC),\
\ Adam29 (liquid petroleum, ethanol, electric furnace),\
\ Pvndols (thorium fuel recipe, gas turbine),\
\ JamesH2 (blood mechanics, nitric acid, particle emitter),\
\ Lazzzycat (structures, mob gear),\
\ PastaBaguette (coal horse decal),\
\ Doctor17 (russian localization)),\
\ Pashtet (russian localization),\
\ 7H40 (russian localization),\
\ RayzerHan (russian localization),\
\ Bismarck (chinese localization),\
\ Creeper-banner (chinese localization),\
\ 5467864 (chinese localization),\
\ eeeeee0a (chinese localization),\
\ hz0909adc (chinese localization),\
\ LSKLW (chinese localization),\
\ R-Kaenbyou (chinese localization),\
\ scp-000000000 (chinese localization),\
\ UnnameTokiko (chinese localization),\
\ 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),\
\ Nos (models),\
\ WushiThe (models),\
\ Minecreep (models),\
\ ackbarcrowbars (models),\
\ haru315 (spiral point algorithm),\
\ mlbv (threaded MK5),\
\ 70k (textures, glyphid AI, strand caster, electrolyzer changes, cryolite),\
\ instantnootles (concept artist),\
\ Sten89 (models),\
\ Pixelguru26 (textures),\
\ TheBlueHat (textures),\
\ Burningwater202 (laminate glass),\
\ TehTemmie (reacher radiation function),\
\ 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, 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),\
\ impbk2002 (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;
@ -26,6 +26,8 @@ import net.minecraft.stats.StatList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
@ -35,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);
@ -75,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;
@ -108,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) {
@ -441,8 +458,10 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
y = pos[1];
z = pos[2];
for(AxisAlignedBB aabb :this.bounding) {
AxisAlignedBB boxlet = getAABBRotationOffset(aabb, x + 0.5, y, z + 0.5, ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - offset).getRotation(ForgeDirection.UP));
ForgeDirection rot = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - offset).getRotation(ForgeDirection.UP);
for(AxisAlignedBB aabb : this.bounding) {
AxisAlignedBB boxlet = getAABBRotationOffset(aabb, x + 0.5, y, z + 0.5, rot);
if(entityBounding.intersectsWith(boxlet)) {
list.add(boxlet);
@ -467,6 +486,32 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
return AxisAlignedBB.getBoundingBox(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ).offset(x + 0.5, y + 0.5, z + 0.5);
}
// Don't mutate the xyz parameters, or the interaction max distance will bite you
@Override
public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 startVec, Vec3 endVec) {
if(!this.useDetailedHitbox()) {
return super.collisionRayTrace(world, x, y, z, startVec, endVec);
}
int[] pos = this.findCore(world, x, y, z);
if(pos == null)
return super.collisionRayTrace(world, x, y, z, startVec, endVec);
ForgeDirection rot = ForgeDirection.getOrientation(world.getBlockMetadata(pos[0], pos[1], pos[2]) - offset).getRotation(ForgeDirection.UP);
for(AxisAlignedBB aabb : this.bounding) {
AxisAlignedBB boxlet = getAABBRotationOffset(aabb, pos[0] + 0.5, pos[1], pos[2] + 0.5, rot);
MovingObjectPosition intercept = boxlet.calculateIntercept(startVec, endVec);
if(intercept != null) {
return new MovingObjectPosition(x, y, z, intercept.sideHit, intercept.hitVec);
}
}
return null;
}
@Override
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {
if(!this.useDetailedHitbox()) {
@ -500,10 +545,10 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)interp;
float exp = 0.002F;
int meta = world.getBlockMetadata(x, y, z);
ForgeDirection rot = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - offset).getRotation(ForgeDirection.UP);
ICustomBlockHighlight.setup();
for(AxisAlignedBB aabb : this.bounding) RenderGlobal.drawOutlinedBoundingBox(getAABBRotationOffset(aabb.expand(exp, exp, exp), 0, 0, 0, ForgeDirection.getOrientation(meta - offset).getRotation(ForgeDirection.UP)).getOffsetBoundingBox(x - dX + 0.5, y - dY, z - dZ + 0.5), -1);
for(AxisAlignedBB aabb : this.bounding) RenderGlobal.drawOutlinedBoundingBox(getAABBRotationOffset(aabb.expand(exp, exp, exp), 0, 0, 0, rot).getOffsetBoundingBox(x - dX + 0.5, y - dY, z - dZ + 0.5), -1);
ICustomBlockHighlight.cleanup();
}
@ -520,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]);
@ -545,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
}
}

View File

@ -1,6 +1,5 @@
package com.hbm.blocks;
import com.hbm.util.I18nUtil;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumRarity;
@ -8,6 +7,8 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import org.lwjgl.input.Keyboard;
import com.hbm.util.i18n.I18nUtil;
import java.util.List;
public interface ITooltipProvider {

File diff suppressed because it is too large Load Diff

View File

@ -83,8 +83,8 @@ public class BlockCrashedBomb extends BlockEnumMulti implements ITileEntityProvi
if(!world.isRemote) {
world.setBlockToAir(x, y, z);
EnumDudType type = EnumUtil.grabEnumSafely(EnumDudType.class, world.getBlockMetadata(x, y, z));
world.setBlockToAir(x, y, z);
if(type == type.BALEFIRE) {
EntityBalefire bf = new EntityBalefire(world);

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

@ -16,7 +16,7 @@ import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.render.block.RenderBlockMultipass;
import com.hbm.util.EnumUtil;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import api.hbm.fluidmk2.IFillableItem;
import cpw.mods.fml.relauncher.Side;

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);
@ -198,7 +198,7 @@ public class BlockBobble extends BlockContainer implements IGUIProvider, INBTTra
INTELLIGENCE( "Intelligence", "Intelligence", null, "It takes the smartest individuals to realize$there's always more to learn.", false, ScrapType.BRIDGE_BUS),
AGILITY( "Agility", "Agility", null, "Never be afraid to dodge the sensitive issues.", false, ScrapType.BRIDGE_CHIPSET),
LUCK( "Luck", "Luck", null, "There's only one way to give 110%.", false, ScrapType.BRIDGE_CMOS),
BOB( "Robert \"The Bobcat\" Katzinsky", "HbMinecraft", "Hbm's Nuclear Tech Mod", "I know where you live, " + System.getProperty("user.name"), false, ScrapType.CPU_SOCKET),
BOB( "Robert \"The Bobcat\" Katzinsky", "HbMinecraft", "Hbm's Nuclear Tech Mod", "I know where you live, " + System.getProperty("user.name"), false, ScrapType.CPU_SOCKET),
FRIZZLE( "Frooz", "Frooz", "Weapon models", "BLOOD IS FUEL", true, ScrapType.CPU_CLOCK),
PU238( "Pu-238", "Pu-238", "Improved Tom impact mechanics", null, false, ScrapType.CPU_REGISTER),
VT( "VT-6/24", "VT-6/24", "Balefire warhead model and general texturework", "You cannot unfuck a horse.", true, ScrapType.CPU_EXT),
@ -211,9 +211,10 @@ public class BlockBobble extends BlockContainer implements IGUIProvider, INBTTra
NOS( "Dr Nostalgia", "Dr Nostalgia", "SSG and Vortex models", "Take a picture, I'ma pose, paparazzi$I've been drinking, moving like a zombie", true, ScrapType.BOARD_TRANSISTOR),
DRILLGON( "Drillgon200", "Drillgon200", "1.12 Port", null, false, ScrapType.CPU_LOGIC),
CIRNO( "Cirno", "Cirno", "the only multi layered skin i had", "No brain. Head empty.", true, ScrapType.BOARD_BLANK),
MICROWAVE( "Microwave", "Microwave", "OC Compatibility and massive RBMK/packet optimizations", "they call me the food heater$john optimization", true, ScrapType.BOARD_CONVERTER),
MICROWAVE( "Microwave", "Microwave", "OC Compatibility and massive RBMK/packet optimizations", "they call me the food heater$john optimization", true, ScrapType.BOARD_CONVERTER),
PEEP( "Peep", "LePeeperSauvage", "Coilgun, Leadburster and Congo Lake models, BDCL QC", "Fluffy ears can't hide in ash, nor snow.", true, ScrapType.CARD_BOARD),
MELLOW( "MELLOWARPEGGIATION", "Mellow", "NBT Structures, industrial lighting, animation tools", "Make something cool now, ask for permission later.", true, ScrapType.CARD_PROCESSOR);
MELLOW( "MELLOWARPEGGIATION", "Mellow", "NBT Structures, industrial lighting, animation tools", "Make something cool now, ask for permission later.", true, ScrapType.CARD_PROCESSOR),
ABEL( "Abel1502", "Abel1502", "Abilities GUI, optimizations and many QoL improvements", "NANTO SUBARASHII", true, ScrapType.CPU_REGISTER);
public String name; //the title of the tooltip
public String label; //the name engraved in the socket

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.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

@ -3,7 +3,7 @@ package com.hbm.blocks.generic;
import java.util.List;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import api.hbm.item.IDepthRockTool;
import net.minecraft.block.Block;

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

@ -5,7 +5,7 @@ import java.util.List;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.blocks.ModBlocks;
import com.hbm.lib.RefStrings;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side;

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

@ -68,9 +68,6 @@ public class BlockOre extends Block {
if(this == ModBlocks.ore_nether_fire) {
return rand.nextInt(10) == 0 ? ModItems.ingot_phosphorus : ModItems.powder_fire;
}
if(this == ModBlocks.block_meteor) {
return rand.nextInt(10) == 0 ? ModItems.plate_dalekanium : Item.getItemFromBlock(ModBlocks.block_meteor);
}
if(this == ModBlocks.block_meteor_cobble) {
return ModItems.fragment_meteorite;
}

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

@ -6,6 +6,7 @@ import java.util.List;
import java.util.Random;
import com.hbm.blocks.IBlockMulti;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.ServerConfig;
@ -39,8 +40,9 @@ 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;
public class BlockStorageCrate extends BlockContainer implements IBlockMulti, ITooltipProvider {
public class BlockStorageCrate extends BlockContainer implements IBlockMulti, ILookOverlay, ITooltipProvider {
@SideOnly(Side.CLIENT)
private IIcon iconTop;
@ -152,14 +154,28 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT
}
}
if(inv instanceof TileEntityCrateBase)
nbt.setBoolean("spiders", ((TileEntityCrateBase) inv).hasSpiders);
if(inv instanceof TileEntityCrateBase) {
TileEntityCrateBase crate = (TileEntityCrateBase) inv;
// Saves memory and ensures consistency between crafted crates and mined ones
if (crate.hasSpiders) {
nbt.setBoolean("spiders", true);
}
}
if(!nbt.hasNoTags()) {
drop.stackTagCompound = nbt;
}
if(inv instanceof TileEntityCrateBase) {
TileEntityCrateBase crate = (TileEntityCrateBase) inv;
if (crate.hasCustomInventoryName()) {
drop.setStackDisplayName(crate.getInventoryName());
}
}
if (drop.hasTagCompound()) {
try {
byte[] abyte = CompressedStreamTools.compress(nbt);
byte[] abyte = CompressedStreamTools.compress(drop.stackTagCompound);
if(abyte.length > 6000) {
player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "Warning: Container NBT exceeds 6kB, contents will be ejected!"));
@ -220,8 +236,14 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT
lockable.lock();
}
}
if(inv instanceof TileEntityCrateBase) {
((TileEntityCrateBase) inv).hasSpiders = stack.stackTagCompound.getBoolean("spiders");
TileEntityCrateBase crate = (TileEntityCrateBase) inv;
crate.hasSpiders = stack.stackTagCompound.getBoolean("spiders");
if (stack.hasDisplayName()) {
crate.setCustomName(stack.getDisplayName());
}
}
}
@ -354,4 +376,20 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT
}
}
}
@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 IInventory))
return;
IInventory inv = (IInventory) te;
if (!inv.hasCustomInventoryName())
return;
ILookOverlay.printGeneric(event, inv.getInventoryName(), 0xffff00, 0x404000, new ArrayList<String>(0));
}
}

View File

@ -13,9 +13,9 @@ import com.hbm.inventory.RecipesCommon.AStack;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.RecipesCommon.MetaBlock;
import com.hbm.inventory.RecipesCommon.OreDictStack;
import com.hbm.util.I18nUtil;
import com.hbm.util.InventoryUtil;
import com.hbm.util.Tuple.Pair;
import com.hbm.util.i18n.I18nUtil;
import api.hbm.block.IToolable;
import cpw.mods.fml.relauncher.Side;
@ -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

@ -17,8 +17,8 @@ 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.I18nUtil;
import com.hbm.world.gen.INBTTransformable;
import com.hbm.util.i18n.I18nUtil;
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

@ -15,9 +15,9 @@ import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.TileEntityLoadedBase;
import com.hbm.util.BufferUtil;
import com.hbm.util.I18nUtil;
import com.hbm.util.LootGenerator;
import com.hbm.world.gen.INBTTileEntityTransformable;
import com.hbm.util.i18n.I18nUtil;
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

@ -5,6 +5,7 @@ import java.util.List;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.BlockEnumMulti;
import com.hbm.extprop.HbmPlayerProps;
import com.hbm.render.block.ISBRHUniversal;
import com.hbm.render.util.RenderBlocksNT;
import com.hbm.util.EnumUtil;
@ -16,6 +17,7 @@ import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
@ -53,7 +55,7 @@ public class BlockWoodStructure extends BlockEnumMulti implements ISBRHUniversal
EnumWoodStructure type = EnumUtil.grabEnumSafely(EnumWoodStructure.class, world.getBlockMetadata(x, y, z));
setBlockBounds(0, 0, 0, 1, 1, 1);
if(type == type.ROOF) setBlockBounds(0F, 0F, 0F, 1F, 0.1875F, 1F);
if(type == type.SCAFFOLD) setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F);
if(type == type.SCAFFOLD) setBlockBounds(0.0625F, 0F, 0.0625F, 1F - 0.0625F, 1F, 1F - 0.0625F);
if(type == type.CEILING) setBlockBounds(0F, 0.875F, 0F, 1F, 1F, 1F);
}
@ -62,6 +64,21 @@ public class BlockWoodStructure extends BlockEnumMulti implements ISBRHUniversal
setBlockBoundsBasedOnState(world, x, y, z);
super.addCollisionBoxesToList(world, x, y, z, aabb, list, collider);
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
setBlockBoundsBasedOnState(world, x, y, z);
return super.getCollisionBoundingBoxFromPool(world, x, y, z);
}
public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int i, int j, int k) {
int meta = world.getBlockMetadata(i, j, k);
EnumWoodStructure type = EnumUtil.grabEnumSafely(EnumWoodStructure.class, meta);
if (type == type.SCAFFOLD) return AxisAlignedBB.getBoundingBox(i, j, k, i + 1, j + 1, k + 1);
return super.getSelectedBoundingBoxFromPool(world, i, j, k);
}
@Override
public void renderInventoryBlock(Block block, int meta, int modelId, Object renderBlocks) {
@ -149,4 +166,18 @@ public class BlockWoodStructure extends BlockEnumMulti implements ISBRHUniversal
return true;
}
@Override
public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) {
if (entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) entity;
int meta = world.getBlockMetadata(x, y, z);
EnumWoodStructure type = EnumUtil.grabEnumSafely(EnumWoodStructure.class,meta);
if (type != type.SCAFFOLD) return;
HbmPlayerProps props = HbmPlayerProps.getData(player);
props.isOnLadder = true;
}
}
}

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

@ -7,7 +7,7 @@ import com.hbm.blocks.ITooltipProvider;
import com.hbm.render.block.ct.CT;
import com.hbm.render.block.ct.CTStitchReceiver;
import com.hbm.render.block.ct.IBlockCT;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

View File

@ -7,7 +7,7 @@ import org.lwjgl.input.Keyboard;
import com.hbm.blocks.BlockMulti;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.lib.RefStrings;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

View File

@ -6,7 +6,7 @@ import java.util.List;
import com.hbm.blocks.ILookOverlay;
import com.hbm.tileentity.machine.TileEntityHadronPower;
import com.hbm.util.BobMathUtil;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;

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

@ -8,7 +8,7 @@ import com.hbm.blocks.ILookOverlay;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityDeuteriumTower;
import com.hbm.util.BobMathUtil;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.block.material.Material;
import net.minecraft.tileentity.TileEntity;

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

@ -9,7 +9,8 @@ import com.hbm.items.machine.ItemMold;
import com.hbm.items.machine.ItemMold.Mold;
import com.hbm.items.machine.ItemScraps;
import com.hbm.tileentity.machine.TileEntityFoundryCastingBase;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;

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

@ -9,7 +9,7 @@ import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemScraps;
import com.hbm.lib.RefStrings;
import com.hbm.tileentity.machine.TileEntityFoundryOutlet;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import api.hbm.block.ICrucibleAcceptor;
import api.hbm.block.IToolable;

View File

@ -131,4 +131,22 @@ public class GeigerCounter extends BlockContainer {
return false;
}
}
@Override
public boolean hasComparatorInputOverride() {
return true;
}
@Override
public int getComparatorInputOverride(World world, int x, int y, int z, int side) {
TileEntityGeiger te = (TileEntityGeiger)world.getTileEntity(x, y, z);
if (te == null) return 0;
float rad = te.check();
// 0 at exactly 0 rads/sec
// +1 per 5 rads/sec
// 15 at 75+ rads/sec
return Math.min((int)Math.ceil(rad / 5f), 15);
}
}

View File

@ -10,7 +10,7 @@ import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityHeaterElectric;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;

View File

@ -12,7 +12,7 @@ import com.hbm.items.machine.IItemFluidIdentifier;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityHeaterHeatex;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.material.Material;

View File

@ -11,7 +11,7 @@ import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.trait.FT_Flammable;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityHeaterOilburner;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import api.hbm.block.IToolable;
import net.minecraft.block.material.Material;

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

@ -8,8 +8,9 @@ import com.hbm.blocks.ITooltipProvider;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.items.machine.IItemFluidIdentifier;
import com.hbm.tileentity.machine.TileEntityMachineAutosaw;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import api.hbm.block.IToolable;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
@ -22,7 +23,7 @@ import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
public class MachineAutosaw extends BlockContainer implements ILookOverlay, ITooltipProvider {
public class MachineAutosaw extends BlockContainer implements ILookOverlay, ITooltipProvider, IToolable {
public MachineAutosaw() {
super(Material.iron);
@ -72,6 +73,24 @@ public class MachineAutosaw extends BlockContainer implements ILookOverlay, IToo
return true;
}
@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.SCREWDRIVER)
return false;
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileEntityMachineAutosaw))
return false;
TileEntityMachineAutosaw saw = (TileEntityMachineAutosaw) te;
saw.isSuspended = !saw.isSuspended;
saw.markDirty();
return true;
}
@Override
public void printHook(Pre event, World world, int x, int y, int z) {
@ -84,6 +103,10 @@ public class MachineAutosaw extends BlockContainer implements ILookOverlay, IToo
List<String> text = new ArrayList();
text.add(saw.tank.getTankType().getLocalizedName() + ": " + saw.tank.getFill() + "/" + saw.tank.getMaxFill() + "mB");
if (saw.isSuspended) {
text.add(EnumChatFormatting.RED + "! " + I18nUtil.resolveKey(getUnlocalizedName() + ".suspended") + " !");
}
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text);
}

View File

@ -12,7 +12,7 @@ import com.hbm.main.MainRegistry;
import com.hbm.tileentity.IPersistentNBT;
import com.hbm.tileentity.machine.storage.TileEntityMachineBattery;
import com.hbm.util.BobMathUtil;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;

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;
@ -13,8 +19,8 @@ import com.hbm.lib.RefStrings;
import com.hbm.tileentity.IPersistentNBT;
import com.hbm.tileentity.TileEntityLoadedBase;
import com.hbm.util.BobMathUtil;
import com.hbm.util.I18nUtil;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.util.i18n.I18nUtil;
import api.hbm.energymk2.IEnergyProviderMK2;
import api.hbm.energymk2.IEnergyReceiverMK2;
@ -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

@ -7,7 +7,8 @@ import com.hbm.inventory.fluid.FluidType;
import com.hbm.items.machine.IItemFluidIdentifier;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.oil.TileEntityMachineCatalyticCracker;
import com.hbm.util.I18nUtil;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;

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) {

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