Compare commits

...

1450 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
Bob
345fe2ef06 i have a headache 2025-05-18 21:37:41 +02:00
Bob
ef5059a9a6 playing DOOM on my gucci smart toilet 2025-05-18 21:24:19 +02: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
HbmMods
3e35f0ac47
Merge pull request #2150 from Nycticoraxnightheron/master
zh_CN update
2025-05-16 14:47:54 +02:00
Boblet
f7baf332cb even more flixes 2025-05-16 14:46:12 +02:00
Night Heron
d360ebe6cc
Add files via upload 2025-05-15 23:14:21 +08:00
Boblet
9f758c49bc dud crap 2025-05-15 16:01:15 +02:00
Boblet
a43986603b more INDEX crap 2025-05-14 11:51:30 +02:00
Boblet
4ce7e396be doing absolutely nothing again 2025-05-13 16:25:39 +02:00
HbmMods
0c9fc86c12
Merge pull request #2143 from ackbarscrowbars/master
Small Scaffold Tweaks
2025-05-13 13:25:50 +02:00
HbmMods
58f8ba8f8c
Merge pull request #2144 from WushiThe/new3
prototype remodel
2025-05-13 13:25:29 +02:00
HbmMods
5d9ef5ae67
Merge pull request #2148 from 7H40/patch-1
Update ru_RU.lang
2025-05-13 13:24:57 +02:00
Bob
74992ede71 bop 2025-05-12 23:29:59 +02:00
LegendaryDoge30
273590a96b bombbs
added solinium bomb and changed the rendering because it was fucked up
2025-05-12 13:30:12 +02: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
7H40
6696f3b736 Update ru_RU.lang 2025-05-11 16:49:42 +03: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
7H40
db0dbafe75
Update ru_RU.lang
tj_TJ.lang  --> ru_RU.lang
2025-05-11 06:17:38 +03:00
LegendaryDoge30
be84b21867 prototype
nina
2025-05-10 17:39:07 +02:00
HbmMods
763b6ec020
Merge pull request #2139 from Toshayo/opencomputers-steam-fluid-id-fix
Better steam turbine OpenComputers integration
2025-05-10 16:43:23 +02:00
HbmMods
6b65c79704
Merge pull request #2140 from Nycticoraxnightheron/master
zh_CN update
2025-05-10 16:42:23 +02:00
HbmMods
1ffe752ef6
Merge pull request #2142 from WushiThe/new2
ibm computer remodel
2025-05-10 16:42:05 +02:00
Bob
a1402daec2 charge thrower animations 2025-05-10 16:40:39 +02:00
ackbarscrowbars
2c68f3a57c
Rusted Scaffold Texture
Thought I'd just throw this in with the others, while I'm at it.
2025-05-09 18:06:55 -05:00
ackbarscrowbars
19c481c6d7
Yellow Scaffold Less Bright
While technically usable, the brightness was always just a little too contrasting when I tried using the yellow scaffold in builds. Apparently I'm not the only one, so might as well.
2025-05-09 17:20:13 -05:00
ackbarscrowbars
5b1121e0e4
Small Tweak to Steel Scaffold Texture
It had a dot that made the tiling look weird.
2025-05-09 17:17:35 -05:00
ackbarscrowbars
14eac38f3e
Fixed Scaffold UV + Cleaned Up Model
It had a bunch of erroneous sharps and extra vertices.
2025-05-09 17:14:30 -05:00
LegendaryDoge30
f3a9c0f787 puter 2025-05-10 00:12:33 +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
Night Heron
805ee3a998
cumming 2025-05-09 23:30:40 +08:00
Toshayo
15fb0c1ad7
Improved steam turbine OpenComputers integration + documented 2025-05-09 16:35:36 +02:00
Toshayo
be2edd87d8
Fixed wrong tank type. getInfo returns input tank type and setType also works with input tank type 2025-05-09 16:18:41 +02:00
Toshayo
03c5466c0e
Fixed id mismatch in steam turbine OpenComputers integration 2025-05-09 16:18:41 +02:00
HbmMods
20b46c3884
Merge pull request #2137 from abel1502/abel-veinminer
Make veinminer follow diagonals
2025-05-09 14:54:58 +02:00
Boblet
17de40d7b2 kill all zebras 2025-05-09 14:52:10 +02:00
Bob
21088af66f i cast: delete everything in that general direction 2025-05-08 23:10:21 +02:00
Boblet
71998aca41 bobms 2025-05-08 16:58:05 +02:00
abel1502
0d141f56b1
Fix import 2025-05-08 15:09:31 +03:00
abel1502
7d1a164bf7
Make veinminer follow diagonals 2025-05-08 15:07:16 +03:00
Bob
ca9b9f7b6c why do they call it the oven when you of in the cold food out hot eat th 2025-05-07 22:40:56 +02:00
Boblet
d8d3263493 grungus 2025-05-07 16:49:00 +02:00
Lazzzycatwastaken
22aefff48d get to work on the mob spawners bugboy 2025-05-06 23:18:28 +02:00
Bob
58166fda33 comical amounts of explosives 2025-05-06 21:55:11 +02:00
Boblet
b508f2f534 trench warfare special 2025-05-06 16:42:11 +02:00
Bob
af8cc78ad5 go go gadget 15 kilos of high explosive 2025-05-05 22:44:21 +02:00
Boblet
d4a25205a7 what the fuck - is happening - in this world of pure imagination 2025-05-05 16:29:31 +02:00
Bob
82d3523ea1 i have achieved stability (ability to stab) 2025-05-04 22:55:00 +02:00
Bob
dbbe55a990 RTTY control 2025-05-03 17:54:31 +02:00
HbmMods
0ab4f215b1
Merge pull request #2126 from MellowArpeggiation/master
NBT Structure fixes
2025-05-02 14:38:28 +02:00
Boblet
01df6f20c2 "music neva stops, no" - hatsune miku 2025-05-02 11:40:07 +02:00
George Paton
11d4412b83 fix NBT structure rotations for pipes
guard against funky generation bugs
fix missing cherenkov radiation visuals
2025-05-02 11:31:26 +10:00
HbmMods
4b5d9664bf
Merge pull request #2125 from Nycticoraxnightheron/master
zh_CN update
2025-05-01 21:46:14 +02:00
Bob
3cd9fc7b7c INDEX reader 2025-05-01 21:45:46 +02:00
Night Heron
82d6c0a923
Inside the Cable Temple 2025-05-02 00:14:50 +08:00
Bob
0685f231fe post merge cleanup 2025-05-01 11:43:47 +02:00
HbmMods
13b862d14e
Merge pull request #2120 from 7pheonix/master
Tinted Vegetation
2025-05-01 11:42:30 +02:00
pheo
592d52270c Merge remote-tracking branch 'origin/master' into pheo-tinted-veg-test 2025-05-01 10:41:28 +01:00
pheo
395acea899 now you're thinking with OOP 2025-05-01 10:41:21 +01:00
pheo
6b6c9635a3
Merge branch 'master' into master 2025-05-01 10:15:52 +01:00
Bob
edc870dff1 the ammo belt is shaped like an infinity symbol 2025-05-01 10:46:36 +02:00
pheo
64d3cdcf78
Update changelog 2025-04-30 15:38:58 +01:00
pheo
0aeeda9113 Merge remote-tracking branch 'origin/master' into pheo-tinted-veg-test 2025-04-30 15:35:54 +01:00
pheo
f0db8853e6 Minor Cleanup 2025-04-30 15:35:34 +01:00
pheo
c2a2a99a80
Merge branch 'HbmMods:master' into master 2025-04-30 15:31:29 +01:00
Boblet
c636632dc3 flamethrower improvements, 12 gauge flechette fix 2025-04-30 16:18:37 +02:00
Boblet
4fd4aa819b crate dupe fix(?) 2025-04-30 12:43:36 +02:00
pheo
f74b5a337c
Merge branch 'HbmMods:master' into master 2025-04-29 22:01:48 +01:00
pheo
152de687f2 terrible hacks, part 2 2025-04-29 21:57:53 +01:00
Bob
e518ef48c9 good monring and good night 2025-04-29 21:46:10 +02:00
HbmMods
f7659acde1
Merge pull request #2113 from Lazzzycatwastaken/dsss
full set zombie balance
2025-04-29 08:00:14 +02:00
pheo
108b581df2 tinted vegetation 2025-04-28 23:05:59 +01:00
Boblet
30f41fe1b0 sat dock fix, AP&DU nerf 2025-04-28 16:46:52 +02:00
Bob
f42b4b3dd4 nothing some booze and some paracetamol and jacking off and killing myse
lf can't fix
2025-04-27 21:52:30 +02:00
Lazzzycatwastaken
f1ad376a5d dsads 2025-04-27 20:24:21 +02:00
Lazzzycatwastaken
29979ab319 Welcome to balancing academy! are you ready to begin learning?
Lazzzycat: *gulps*
alc: *shakes head*
Yes 7 they say in unison
2025-04-27 20:13:31 +02:00
Boblet
13741930ca more crap 2025-04-25 15:07:49 +02:00
HbmMods
c1d3aad937
Merge pull request #2106 from archiecarrot123/master
Reduce calls to System.currentTimeMillis
2025-04-25 10:10:34 +02:00
Archie Halliwell
f45cffd9ce copy muffintime's changes 2025-04-25 13:58:10 +10:00
Archie Halliwell
1fbb8fafb9 reduce calls to System.currentTimeMillis 2025-04-25 13:49:50 +10:00
Bob
96a7058f38 pew pew 2025-04-24 22:26:58 +02:00
Boblet
91e98a9013 some cleanup 2025-04-23 16:39:42 +02:00
Boblet
89f4da4ab4 pew pew 2025-04-22 16:28:53 +02:00
HbmMods
334cffe04e
Merge pull request #2099 from Lazzzycatwastaken/structur
fix for Ticking entity crash when spawning skeletors with guns
2025-04-22 08:21:28 +02:00
Lazzzycatwastaken
28d3664781 everybody gets a gun 2025-04-21 23:04:04 +02:00
HbmMods
312162734b
Merge pull request #2095 from Lazzzycatwastaken/structur
MORE ARMOR FOR ZOMBINE!!!
2025-04-21 17:39:57 +02:00
HbmMods
31dc235dc1
Merge pull request #2098 from Dash1269/ntmain-accelerator-tweaks
PA Dipole tweaks and particle serialisation
2025-04-21 17:37:53 +02:00
Bob
39c8a6711b 3 BIG SHOTS FROM [KITCHEN GUN] 2025-04-21 17:34:18 +02:00
Dosh
64b2525e04
serialise PASource particle to nbt 2025-04-21 23:57:07 +10:00
Dosh
e1dd8c80b4
ignore dipole coil penalties unless redirecting particle 2025-04-21 22:09:34 +10:00
Lazzzycatwastaken
03a6af791f what 2025-04-20 18:20:09 +02:00
Lazzzycatwastaken
0907997bec 1.1k elo boosted twisted - puppet mage gets mled to death by my 112 yo 430 hp deto katana. 2025-04-20 15:46:36 +02:00
Lazzzycatwastaken
1fa4dca870 Joe: YEAH, ARE YOU READY TEAM JOE?
Joe: We're gonna become the BEST detectives!
Quagmire: Giggity, let's do this!
Peter: All Right!
2025-04-20 14:48:05 +02:00
Dosh
2b37164ed6
automatic formatting 2025-04-20 18:20:13 +10:00
Bob
9ba8f797dc post merge cleanup 2025-04-19 17:59:14 +02:00
HbmMods
89377e9164
Merge pull request #2080 from WushiThe/new
geiger
2025-04-19 17:49:19 +02:00
HbmMods
cacf041cab
Merge pull request #2069 from Lazzzycatwastaken/conccoloredcrack
replacing sloppium structure
2025-04-19 17:47:59 +02:00
HbmMods
dc6faed2d9
Merge branch 'master' into conccoloredcrack 2025-04-19 17:47:07 +02:00
HbmMods
031c78b80e
Merge pull request #2084 from Lazzzycatwastaken/structur
Sloppelite structrute
2025-04-19 17:45:17 +02:00
HbmMods
0213916a42
Merge pull request #2088 from Darek505/Rotation-fixes
Fix armor arm offset
2025-04-19 17:44:08 +02:00
Bob
d9498cb2dc augh 2025-04-19 17:43:49 +02:00
Darek505
8221615898 Fix armor arm offset 2025-04-19 14:15:57 +03:00
Lazzzycatwastaken
0b0c5bc043 i forgot to change the loot amount so that it doesnt put 239013129 items into the crate 2025-04-18 19:48:47 +02:00
Lazzzycatwastaken
416ae78c6a PlaymakerJd struggles during Cuhlouts popcorn reading stream 2025-04-18 19:41:41 +02:00
Boblet
5372884c50 i spilled my tomato sauce 2025-04-18 14:40:18 +02:00
LegendaryDoge30
ef2fba2a52 geiger
counter
2025-04-18 13:59:39 +02:00
Boblet
78089b2265 yesterday's shit buffet 2025-04-18 07:49:30 +02:00
Bob
eeefb0e4eb trenchie: the return 2025-04-17 21:11:17 +02:00
Boblet
c6966aa7dc biome test 2025-04-16 16:49:47 +02:00
Boblet
1193b0f51f spring cleaning 2025-04-15 16:28:06 +02:00
HbmMods
1533a43e19
Merge pull request #2073 from MellowArpeggiation/master
Only delete connected conveyors, and only when crouching
2025-04-15 08:01:42 +02:00
George Paton
0338c6a8fd only delete connected conveyors, and only when crouching 2025-04-15 13:57:33 +10:00
Lazzzycatwastaken
7e81a7b5c2 github bent me over and fucked me in every hole now i need therapy 2025-04-14 22:13:14 +02:00
Boblet
6d67a31dff become one with the cicadas. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 2025-04-14 16:49:36 +02:00
Lazzzycatwastaken
edc701e129 the devil couldnt reach me so he made me implement shitty code and then remove it and end up not implementing shit 2025-04-13 17:49:19 +02:00
Lazzzycatwastaken
fe52d7aed1 think of the lamest dude u know ... he listen to 2hollis don't he 2025-04-13 17:43:24 +02:00
Lazzzycatwastaken
0cc70760ab Imagine being an artic fox
You could run up on the opps in da snow
Id probably miss human things like fortnite and geek bars
But I'd prolly be tuff ngl
2025-04-13 17:39:58 +02:00
Bob
975b7ff722 mh 2025-04-13 15:59:50 +02:00
Lazzzycatwastaken
c6cd707894 you're not bricked up right now while you read this,
you have serious issue, you're on social media, bro, every 10 seconds you swipe,
you see the baddest girl on the planet, and you're sitting here soft,
oh lazy, but it would be weird if i was bricked while watching you talk,
how was that weird, is it weird to have high testosterone levels?
you need savor before it's too late bro, it might be your only shot.
2025-04-13 15:23:05 +02:00
Bob
3d0b8f0fec top 5 videos, starring top 5 videos 2025-04-13 14:27:27 +02:00
Lazzzycat
fb8e3b522f
Merge branch 'HbmMods:master' into zg 2025-04-13 05:02:35 -07:00
Bob
624bb35b72 sure, why not 2025-04-12 16:37:40 +02:00
HbmMods
d3e29bf5da
Merge pull request #2062 from Nycticoraxnightheron/master
Still an update for zh_CN
2025-04-11 20:05:30 +02:00
Night Heron
abc58c1dc2
Munburger is another mooncake 2025-04-12 01:47:30 +08:00
Night Heron
36c56501bd
Merge branch 'HbmMods:master' into master 2025-04-12 01:31:51 +08:00
Bob
1f6d4bf55b the part i forgot to push 2025-04-11 19:26:33 +02:00
Night Heron
985966d8a1
Merge branch 'HbmMods:master' into master 2025-04-12 01:24:25 +08:00
tuffpad
0c25ba0c1c im at tmobile currently and cant check whether this even fucking works so thats great 2025-04-11 15:28:56 +02:00
tuffpad
12c54d66e7 im at tmobile currently and cant check whether this even fucking works so thats great 2025-04-11 15:28:35 +02:00
Boblet
16f9c4ad16 more JSON tomfuckery 2025-04-11 13:17:56 +02:00
Night Heron
3be4d9a6bc
SALMIAKKI😋 2025-04-11 01:38:47 +08:00
Night Heron
0cb6d3530f
Merge branch 'HbmMods:master' into master 2025-04-11 01:24:41 +08:00
Boblet
345d6e8710 this machine can suck all day long 2025-04-10 16:41:31 +02:00
Bob
f5456e54b3 competitive hog cranking 2025-04-09 21:32:15 +02:00
Boblet
7b3e3284b3 it's like elonmusk hype tube except it's the exact opposite and it works 2025-04-09 16:54:37 +02:00
Boblet
98bc692d29 this is the last fucking refactor PR 2025-04-09 11:53:16 +02:00
Boblet
1282e525da bocci the cock 2025-04-08 16:37:39 +02:00
Boblet
4c501d209f we don't need a new action every 3 microseconds 2025-04-08 10:34:24 +02:00
Boblet
7a49ec2cae what are you doing in here? 2025-04-08 08:12:41 +02:00
Bob
955a349793 pfft 2025-04-07 23:09:09 +02:00
Boblet
fb19e4d93f everybody do the yoinky splinky 2025-04-07 16:53:08 +02:00
HbmMods
097907820b
Merge pull request #2052 from Lazzzycatwastaken/zg
Naval mine updat
2025-04-06 23:00:46 +02:00
HbmMods
e6bd1fef4a
Merge pull request #2048 from Lazzzycatwastaken/ttttt
RT gaynator new ui
2025-04-06 22:59:09 +02:00
Lazzzycatwastaken
5d3860a4f6 Texas just banned furries in schools. This was to make sure kids don't have fun. But you know what Texas won't ban? Being able to carry an AR-15 wherever you go. I love America, because furry suit sales will now decline and instead kids will turn to using firearms. Do you know what this means? We're going to be needing more bullets, which means the copper trade is going to skyrocket. This means you as a Mesopotamian copper merchant could make a lot of profit. 2025-04-06 16:10:14 +02:00
Lazzzycatwastaken
574c4f1ca2 Top 5 people i'd scam out of all their money:
1. You
2. You
3. You
4. You
5. You
2025-04-05 23:47:16 +02:00
Night Heron
c2d33ba043
Delete zh_CN.lang 2025-04-06 04:49:50 +08:00
Lazzzycatwastaken
8c6f2150fd SAD-slime ahh dih 👌
PAD-P.Diddy ahh dih 💀
RAD-radioactive ahh dih ☢
DAD-Doofenshmirtz ahh dih 🎩
GAD-gurt ahh dih 🍦
VAD-veiny ahh dih 🍇
UAD-united arab emirates 🇦🇪
CAD-creative ahh dih 🧠
2025-04-05 19:02:44 +02:00
Lazzzycat
da9b0750f7
Merge branch 'HbmMods:master' into ttttt 2025-04-05 18:33:31 +02:00
Lazzzycatwastaken
2d5ddd049d SAD-slime ahh dih 👌
PAD-P.Diddy ahh dih 💀
RAD-radioactive ahh dih ☢
DAD-Doofenshmirtz ahh dih 🎩
GAD-gurt ahh dih 🍦
VAD-veiny ahh dih 🍇
UAD-united arab emirates 🇦🇪
CAD-creative ahh dih 🧠
2025-04-05 18:33:06 +02:00
HbmMods
61c22602a4
Merge pull request #2040 from Nycticoraxnightheron/master
zh_CN update
2025-04-05 11:51:06 +02:00
Boblet
e23636044a moderate amounts of tomfoolery 2025-04-04 15:04:00 +02:00
Bob
c8ebf180ab WHERE TUBE 2025-04-03 21:51:56 +02:00
Boblet
8ed0411a27 baby steps 2025-04-03 16:51:31 +02:00
Boblet
a0b593a93e yeah whatever 2025-04-02 17:01:50 +02:00
Night Heron
63a68cf9ea
Qinhuangdao 2025-04-02 21:16:03 +08:00
HbmMods
532e27bf0a
Merge pull request #2038 from ackbarscrowbars/ackbarscrowbars-blehg-1
Laser Pistol Model & Textures
2025-04-02 09:41:21 +02:00
HbmMods
4aa7d195c0
Merge pull request #2036 from EverMine/master
Models refactoring, bugfixes
2025-04-02 09:40:58 +02:00
Bob
b9047ac593 yeah so what 2025-04-01 22:32:49 +02:00
IOcmet
484ff585d1
I forgot to make it static 2025-04-01 20:37:23 +03:00
ackbarscrowbars
79cace83b3
Add files via upload 2025-04-01 12:05:07 -05:00
ackbarscrowbars
445da9b38e
Add files via upload 2025-04-01 12:00:34 -05:00
HbmMods
6aad688485
Merge pull request #2037 from WushiThe/fleijaa
Fleija remodel
2025-04-01 16:57:41 +02:00
Boblet
e2b3b480c1 creekflow crashing its mercedes into a mcdonalds 2025-04-01 16:50:55 +02:00
LegendaryDoge30
85d29fc326 gone
i removed that
2025-04-01 13:00:10 +02:00
LegendaryDoge30
8d39fb7174 uhhh
why did they move around
2025-04-01 12:13:16 +02:00
LegendaryDoge30
9f86ef1980 fleija
fleija remodel
2025-04-01 12:09:31 +02:00
ItsMakar
bfede6d87b Refactor models, fix ModelArmorBase compatibility with SkinPort and Galacticraft 2025-04-01 13:06:57 +03:00
HbmMods
7fe7960dba
Merge pull request #2035 from Vaern/texture-test
added lightstone, variants, recipes, stairs, slabs
2025-03-31 22:22:21 +02:00
Vaern
c629b1e79b added lightstone, variants, recipes, stairs, slabs 2025-03-31 11:48:56 -07:00
HbmMods
df88ed481b
Merge pull request #2034 from WushiThe/naval-mine-test
smooth naval mine
2025-03-31 16:23:18 +02:00
Boblet
917ccb871c andrew tolvern is dead 2025-03-31 16:22:16 +02:00
LegendaryDoge30
f6d2ff3f5a smooth ball
made the shading on the naval mine smooth
2025-03-31 13:22:13 +02:00
HbmMods
26dcc1730d
Merge pull request #2033 from MellowArpeggiation/conveyor-upstream
Conveyor Mayhem
2025-03-31 11:31:47 +02:00
George Paton
f465758bfd whoops that was meant to be _client side_ 2025-03-31 18:27:25 +11:00
George Paton
4a0ac6e95f how the hell did this get indented like that 2025-03-31 18:20:13 +11:00
George Paton
e02142d255 new conveyor wand item that masquerades as a conveyor block, performing autoplacement! (from downstream spacefork) 2025-03-31 18:19:34 +11:00
HbmMods
54d2314496
Merge pull request #2031 from Lazzzycatwastaken/AAAAAAAAAAAAAAA
im mining my naval
2025-03-31 08:24:44 +02:00
HbmMods
c1e5ae5c30
Merge pull request #2032 from Millymilo00/master
Add OpenComputers support for the Coker
2025-03-31 08:03:22 +02:00
HbmMods
f43cf194cd
Merge pull request #2022 from BallOfEnergy1/Optimization
Toolbox Flixes!
2025-03-31 08:01:00 +02:00
Milo
32d3b6722f the commit 2025-03-30 19:54:23 -06:00
Bob
3323356c73 waser wifle 2025-03-30 23:08:05 +02:00
BallOfEnergy
12af0abed9 random fuckin fix
apparently this fixes all those `ntm_null` component issues
2025-03-30 14:51:20 -05:00
Lazzzycatwastaken
5c9f6962e2 -=*######*==
-########################=
                     =################################+
                  *######################################*
                ############################################
             -################################################=
            ####################################################
          ########################################################
         ############################*=############################
        ###########################...-..###########################+
      *###########################......##*#=########################+
     =#################################:....##########################+
     #####....=+....##.......+#.....##-..##..###.....####........######
    #######..-###..####.=#..*###...##..*####:..##...######..-####-######
   -########..###:..##*.##..*###...#...######...#...######..-###########+
   #########*..##...##.*##.........#...######...#...######......#########
   ##########..=..#..-.###..*###...#...######..:#...######..-############
  +###########...##...####..*###...##...####...##...###:##..-####.#######*
  #############.*###.:###....=#.....###.....:###........#........-########
  ########################################################################
  ############......###*......-##+...:##:..+####..#####....=...###########
  *##########*..######...####=..##-..####.:####....#####..####...#########
   ###########*...*###..######..+#-..####.:####.#..#####..####+..########+
   ##############...##..######..+#-..####.:###.***..####..####+..########
   *#########=####*..#..-####+..##+..####.+##-.###..-###..####..:########
    #########*......###*..##..-####.......##:..###....#....-...##=-#####
    =####################....-#.=######################################=
     *######################*:-########################################
      ###############-*###:-##.#++#+..:#.##.#.*#.##:##...#############
       ##############-*###..##.#++*:##+#.--.#.*#.-*:#.##=############
        *#############**#*##*##*####**##*##*####*#####**###########*
          ########################################################
           *#####################################################
             ##################################################
               ##############################################
                 =########################################=
                    +##################################*
                        +##########################+
                              ################
2025-03-30 19:44:48 +02:00
Lazzzycatwastaken
1ecbc015a3 le ponge die bob
new rust steel deco block (no more shittium recolor)
updated carrier to use it
naval mine model and texture swapped to legendarydoge30's
new effects for naval mine explosion (out of water and in water both have different effects)
crafting recipies added for all new things
dos uno
2025-03-30 19:00:30 +02:00
Lazzzycatwastaken
1b53215e61 i fucking forgot to remove this so ig 🌈 2025-03-30 00:42:02 +01:00
Lazzzycatwastaken
7e54c5478b Merge remote-tracking branch 'origin/AAAAAAAAAAAAAAA' into AAAAAAAAAAAAAAA 2025-03-30 00:36:18 +01:00
Lazzzycatwastaken
00f98ac456 Jamesh_2 Today at 22:03
Strapons work
ughhfhfd
2025-03-30 00:35:29 +01:00
BallOfEnergy
aaff6b9b70 Dupe fix!!! 2025-03-28 19:50:27 -05:00
BallOfEnergy
fa6d2a4e56 Fix rare crash related to toolboxing with a null NBT.
Fix toolboxes not popping when swapping hotbars, even when >6KB limit.
2025-03-28 18:31:31 -05:00
BallOfEnergy
b1a778c949 Merge remote-tracking branch 'upstream/master' into Optimization 2025-03-28 18:06:33 -05:00
Boblet
6ae779cb23 it's not rocket science 2025-03-28 14:34:31 +01:00
HbmMods
b1f4dfd984
Merge pull request #2021 from MellowArpeggiation/rbmk-crafting
Full RBMK crafting chains
2025-03-28 09:44:54 +01:00
HbmMods
77ca4e5c77
Merge pull request #2018 from Voxelstice/rbmk-console-xenon-bar
RBMK console fuel rod xenon bar
2025-03-28 09:43:41 +01:00
George Paton
fe2dddec3b bonus: fix cascading worldgen lag on depth deposits 2025-03-28 19:10:12 +11:00
BallOfEnergy
e9376c788c oh i kinda want this changed
one less warning lmao
2025-03-27 21:17:16 -05:00
BallOfEnergy
e79eae78a7 am I stupid?
Fix a few issues related to naming.
Fix toolboxes blocking all radiation.
Add toolbox tooltip.
Swap toolbox operations; clicking now swaps hotbars and shift-clicking opens the inventory for easier access (recommended by Mellow).
2025-03-27 21:16:29 -05:00
George Paton
2c4dc279b6 Merge branch 'master' into rbmk-crafting 2025-03-28 11:21:57 +11:00
Bob
f177c8899a i feel so shrigma 2025-03-27 22:12:19 +01:00
Voxelstice
9028ca87b0 Segmentation fault (core dumped)
makes the xenon bar on fuel rods work in the RBMK console
2025-03-27 18:43:21 +03:00
Boblet
f9f1e1c73e go go gadget: replace uterus with 30lb bowling ball 2025-03-27 16:02:35 +01:00
HbmMods
2d48960e2d
Merge pull request #2016 from WushiThe/contributing
1 single parenthesis
2025-03-27 08:28:33 +01:00
LegendaryDoge30
300f005de4 flux
added a single parenthesis to the thorium rbmk fuel flux function
2025-03-26 18:18:39 +01:00
Boblet
9943a73f2a groundbreaking changes 2025-03-26 16:53:07 +01:00
HbmMods
473bdd67c4
Merge pull request #2006 from Lazzzycatwastaken/AAAAAAAAAAAAAAA
Ocean structures
2025-03-26 09:37:27 +01:00
HbmMods
4e08e107a8
Merge pull request #2012 from MellowArpeggiation/master
More NBTStructure improvements from OUTER SPACE
2025-03-26 09:28:00 +01:00
HbmMods
088a640d8f
Merge pull request #2014 from Toshayo/master
Fixed crate item movement prevention applying to all held items
2025-03-26 09:25:16 +01:00
George Paton
86ce0f6509 if rod is hot, only show cooling recipe, if rod is cold, show only disassembly recipe 2025-03-26 11:50:35 +11:00
Toshayo
ca8a7a72f9
Fixed crate item movement prevention applying to all held items (let me move this coal powder) 2025-03-25 21:13:23 +01:00
Boblet
b90741f640 you've creeked your last flow, pardner 2025-03-25 15:48:29 +01:00
George Paton
a2f5eeada7 Add crafting recipes for RBMK fuel cooling, rod disassembly, and waste decaying 2025-03-25 16:42:00 +11:00
George Paton
20bd424cd4 fix rare crash when generating structures 2025-03-25 12:23:18 +11:00
George Paton
dfd5d2c2a6 They Came From OUTER SPACE 2025-03-25 10:29:21 +11:00
Lazzzycatwastaken
d625a9a9d9 Fixed doors on oil rig,
Fixed waterlogging on aircraft carrier
Balanced loot on aircraft carrier
Removed derrick from oil rig and made it a purely cosmetic build
removed asphalt from carrier because it made you 100x faster in water, and flung you across half the ocean.
2025-03-24 22:12:11 +01:00
Lazzzycat
375b4581e5
Merge branch 'HbmMods:master' into AAAAAAAAAAAAAAA 2025-03-24 20:53:31 +01:00
Lazzzycatwastaken
7731b4c1e8 Fixed boat deleting blocks under it or sum 2025-03-24 17:39:11 +01:00
Boblet
79d3b0cbb7 the infinite agony generator 2025-03-24 16:01:13 +01:00
Boblet
7146e20fb3 f u c k 2025-03-24 10:38:15 +01:00
HbmMods
659bd662bf
Merge pull request #2011 from MellowArpeggiation/master
fix switching barrel types not updating fluid net
2025-03-24 10:34:27 +01:00
George Paton
177e5a245e dingleberry blues 2025-03-24 20:00:01 +11:00
George Paton
b5d76afb8c fix switching barrel types not updating fluid net 2025-03-24 19:56:04 +11:00
HbmMods
4c58d9a084
Merge pull request #2005 from BallOfEnergy1/Optimization
Toolboxes!
2025-03-24 08:09:17 +01:00
HbmMods
5e9399a696
Merge pull request #2010 from MellowArpeggiation/master
Fix fluidnet bugs
2025-03-24 07:54:55 +01:00
George Paton
141e80bfcb batteries and fluid tanks now block propagation if not set to buffer mode (which the player can circumvent by cabling/piping around them, which gives them the choice of behaviour, and is more intuitive) 2025-03-24 16:09:56 +11:00
George Paton
62485c6854 fluid tank handling updated to match energy storage blocks, allowing for more consistent tank leveling behaviour 2025-03-24 15:05:56 +11:00
George Paton
f00f2c7ca3 fix compat shim incorrectly subscribing receiving tanks 2025-03-24 12:25:06 +11:00
George Paton
6db42e6d4b fix fluid valves not deactivating (was clearing power net rather than fluid net connections) 2025-03-24 11:49:53 +11:00
Bob
d6c15c8ff2 the malicious gigglefish from the silly dimension 2025-03-23 21:46:56 +01:00
Lazzzycatwastaken
6ceba52f95 Added beached patrol boat 2025-03-23 18:12:26 +01:00
Lazzzycatwastaken
9806d53b45 forgorred to commit ts 2025-03-23 16:25:36 +01:00
Lazzzycatwastaken
7d642f155c Fixed retardation code
Oilrig building upgraded and made it spawn always on the same Y
2025-03-23 16:17:16 +01:00
Lazzzycatwastaken
eb8971dc2e Added oil rig.
Made all structures rarer (via null spawn weight)
2025-03-23 13:27:38 +01:00
Lazzzycatwastaken
e318c83023 Yes i've planted the oil rig malware bob 👿 2025-03-23 00:47:32 +01:00
Bob
737fb1e432 go go gadget HIV 2025-03-22 23:29:02 +01:00
Lazzzycatwastaken
8bb91eda3c Oil Rig item pool 2025-03-22 21:33:25 +01:00
Lazzzycatwastaken
7ae8693841 Sunken Aircraft Carrier structure added. 2025-03-22 19:10:06 +01:00
BallOfEnergy
9839107c4e New GUI, also some index fixes. 2025-03-22 13:07:04 -05:00
BallOfEnergy
b139e084fb Merge remote-tracking branch 'upstream/master' into Optimization 2025-03-22 00:12:50 -05:00
BallOfEnergy
f27234879f BOO! surprise feature!
Completely revamped toolboxes, now they swap hotbars!
2025-03-22 00:12:32 -05:00
HbmMods
07618f6a60
Merge pull request #2002 from EverMine/master
Add missing adding to neiShredderRecipes in CompatRecipeRegistry
2025-03-21 19:23:31 +01:00
ItsMakar
cf5e0e7d12 No fucking way i did that mistake 2025-03-21 17:52:00 +02:00
ItsMakar
291a34103a Add missing adding to neiShredderRecipes in CompatRecipeRegistry 2025-03-21 16:42:49 +02:00
Boblet
3ac7a8cdd6 i cast: testicular contortion 2025-03-21 15:21:32 +01:00
HbmMods
fc716379c9
Merge pull request #2001 from Vaern/master
G3 Attachments
2025-03-21 07:55:42 +01:00
HbmMods
4ceadec5c6
Merge branch 'master' into master 2025-03-21 07:55:32 +01:00
HbmMods
ffa8a0c5bb
Merge pull request #1998 from BallOfEnergy1/Optimization
Crates, but backpacks!
2025-03-21 07:51:46 +01:00
Vaern
4ef77bad1f added g3 attachments, fixed g3 model, changed/fixed anims + orchestra 2025-03-20 22:17:32 -07:00
Bob
9f0fd19ef8 the good shit 2025-03-20 22:57:39 +01:00
Boblet
51b7c71534 good god, we gonna rock down to electric avenue 2025-03-20 15:42:37 +01:00
BallOfEnergy
725baf37ff Merge remote-tracking branch 'upstream/master' into Optimization 2025-03-19 22:01:34 -05:00
BallOfEnergy
8608796a09 ok i want this
listen ok im proud of them and i dont want them to fade
2025-03-19 20:44:39 -05:00
Bob
1538932316 guns are great, but why not make them better? 2025-03-19 22:13:42 +01:00
BallOfEnergy
c73ec3a0ac i fucked around, i found out
this shit WORKS
2025-03-19 13:31:56 -05:00
BallOfEnergy
0a59fa86a0 Merge remote-tracking branch 'upstream/master' into Optimization
# Conflicts:
#	src/main/java/api/hbm/fluid/IFluidConnector.java
#	src/main/java/api/hbm/fluid/IFluidUser.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java
#	src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java
2025-03-19 13:28:38 -05:00
Boblet
5a9f3e75dc YOU KNOW HOW WE DO IT 2025-03-19 16:28:55 +01:00
Bob
ccc80781b2 ok that's it i've had enough 2025-03-18 21:20:57 +01:00
Boblet
7b80e9fb64 oh, in the distance i could see a pale light 2025-03-18 16:53:41 +01:00
Boblet
360daaa524 Merge branch 'master' of https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT 2025-03-17 17:00:12 +01:00
Boblet
b5166ca517 augh 2025-03-17 17:00:07 +01:00
HbmMods
850679ca94
Merge pull request #1982 from KellenHurrey/master
Added a keybind for toggling the magnet armor modifications
2025-03-17 08:09:59 +01:00
HbmMods
11e9bc22ed
Merge pull request #1985 from Toshayo/master
Support for more unusual pylons
2025-03-17 08:09:03 +01:00
Bob
6d1165ba33 guh 2025-03-16 20:28:44 +01:00
KellenHurrey
a6f3cd54eb
Merge branch 'HbmMods:master' into master 2025-03-14 09:34:02 -07:00
Boblet
900f8e6959 flowing my creek so hard rn you wouldn't believe 2025-03-14 14:28:13 +01:00
KellenHurrey
86a805bd92
Merge branch 'HbmMods:master' into master 2025-03-13 21:39:31 -07:00
Toshayo
98f4b22a19
Upgraded base pylon code to support more unusual pylon types 2025-03-13 23:10:08 +01:00
Toshayo
5ead78349c
Updated TileEntityPylonBase and RenderPylonBase according .editorconfig 2025-03-13 23:08:19 +01:00
Boblet
3c2ddf4d64 *vomits* 2025-03-13 16:58:15 +01:00
KellenHurrey
f461851228 magnet keybinds 2025-03-12 12:30:08 -07:00
HbmMods
2bdbfda243
Merge pull request #1981 from KellenHurrey/master
There i fixed chunkloading drones
2025-03-12 09:07:22 +01:00
KellenHurrey
d1e4d1572f wholy shit i actually fixed chunkloading drones (and added a new util class) 2025-03-11 22:28:00 -07:00
Bob
20cb0f6f5d ba-dee-ya, say do u rember? ba-dee-ya, wen u feeled happy
ba-dee-ya, alway rember happy day!
2025-03-10 21:56:35 +01:00
Boblet
565d5c1129 go go gadget: detonate nutsack 2025-03-10 16:57:02 +01:00
Bob
0ca1be3d6f goober 2025-03-09 22:03:34 +01:00
BallOfEnergy
ac81021ddf small fix 2025-03-08 17:34:08 -06:00
BallOfEnergy
c6ca31eb23 what was i doing again?
seriously someone idk what i was doing
help
2025-03-08 17:26:12 -06:00
BallOfEnergy
52b781ea9f Merge remote-tracking branch 'upstream/master' into Optimization
# Conflicts:
#	src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java
#	src/main/java/com/hbm/items/weapon/ItemAmmoArty.java
#	src/main/java/com/hbm/items/weapon/sedna/factory/ConfettiUtil.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java
2025-03-07 22:06:13 -06:00
HbmMods
3da9f7c56f
Merge pull request #1973 from MellowArpeggiation/master
Fix comically long 9mm reload animation snapping
2025-03-07 08:05:23 +01:00
George Paton
df5253df1b
Merge branch 'HbmMods:master' into master 2025-03-07 16:50:40 +11:00
George Paton
1afe84a871 shit idiot brain fungus the sequel 2025-03-07 16:49:56 +11:00
Boblet
5d24e76601 compat for (hopefully) robust external recipe registering 2025-03-06 14:25:30 +01:00
Bob
a78dae4a8e alright i'm tired 2025-03-05 21:58:20 +01:00
HbmMods
23928d3d7b
Merge pull request #1970 from KellenHurrey/master
Make RBMK Rods actually be a SimpleComponent
2025-03-05 18:56:50 +01:00
Boblet
e21fe3eecc config crap 2025-03-05 16:57:50 +01:00
KellenHurrey
3bf526419e
Make RBMK Rods actually be a SimpleComponent 2025-03-04 17:23:43 -08:00
Boblet
ed4421b2e2 burned old textures, better sludge 2025-03-04 16:50:33 +01:00
HbmMods
5a9b65095d
Merge pull request #1965 from Toshayo/master
Redstone-over-Radio OpenComputers integration + Mining satellite NEI handler
2025-03-03 20:20:06 +01:00
Boblet
00cacbbadc damage fix, mas36 anim error, server config command 2025-03-03 16:05:28 +01:00
Toshayo
228fbf506d
Added satellite NEI handler 2025-03-03 11:20:40 +01:00
Toshayo
d13d0679b7
Added OpenComputers integration for redstone-over-radio receiver/transmitter 2025-03-03 11:20:40 +01:00
Bob
1238933bca yeag 2025-03-02 22:49:29 +01:00
HbmMods
3a5c943c0a
Merge pull request #1962 from MellowArpeggiation/master
fix vertibirds spawning unburied
2025-03-01 09:47:27 +01:00
George Paton
18d21a0f13 fix vertibirds spawning unburied 2025-03-01 10:40:44 +11:00
HbmMods
299f514f99
Merge pull request #1960 from 70000hp/windows-95
rotary furnace fuel thing
2025-02-28 08:31:19 +01:00
HbmMods
4c2639ecf4
Merge pull request #1961 from MellowArpeggiation/master
Performance boost for RBMKs (thanks DEKO)
2025-02-28 08:28:48 +01:00
George Paton
dc70967279 death by one million hashmap lookups (68ms -> 8ms over 60 seconds) 2025-02-28 11:56:03 +11:00
70000hp
1574f90a4d Merge branch 'master' into windows-95 2025-02-27 16:59:03 -05:00
Boblet
fb414ad80a yes we know your name now fuck off 2025-02-27 16:38:40 +01:00
HbmMods
3ae27afe4d
Merge pull request #1959 from Vaern/master
spent casings prrrrrr!!!
2025-02-27 10:30:24 +01:00
HbmMods
fa93b944b5
Merge pull request #1958 from MellowArpeggiation/master
Fix #1918 - RBMKs turning off when chunks unload, a world is quit, or a dimension unloads
2025-02-27 10:27:15 +01:00
Vaern
e6aa3f232d remove unused imports 2025-02-26 23:42:07 -08:00
Vaern
247f3eace8 finishing touches 2025-02-26 23:38:28 -08:00
Vaern
b789482f3d added initial rotvel to orchestras, flixes 2025-02-26 23:29:12 -08:00
George Paton
9da32595ff 4x rarer meteor dungeons 2025-02-26 19:36:47 +11:00
Vaern
b3e8fad079 added initial rotational momentums to casingCreator
remind me tomorrow to set the rest of the constants n add a lil randomess
2025-02-26 00:21:06 -08:00
George Paton
a6b1a9068b fix crash caused by placing piles immediately adjacent to RBMKs 2025-02-26 16:33:04 +11:00
George Paton
bb84ebe209 Fix #1918 - make sure node caching is per world, remove nodes from cache correctly, and prevent unloading dimensions immediately ceasing all reactivity. Also fixes rod information not updating unless the GUI is open 2025-02-26 15:38:31 +11:00
Vaern
ec311a6d54 removed unnecessary shit, fixed muzzle flash
prolly gonna figure out a systematic solution to customizing spent casing ejection/maxAge based on receiver
2025-02-25 19:46:02 -08:00
Boblet
fd500f8a98 and now for the boring part 2025-02-25 16:56:48 +01:00
Vaern
c5c6beb453 Finished casing physics
added initial momentums as a test
2025-02-24 23:47:48 -08:00
Vaern
747d0006b2 set casing models as vbos, will test later 2025-02-24 15:04:24 -08:00
Bob
06caf11654 yeah that's all the bugs that needed fixing 2025-02-24 21:43:44 +01:00
Boblet
bd3b52cd36 nodespace is dead, let's wear its skin 2025-02-24 14:45:23 +01:00
Vaern
61bba7974f added rotational momentum, better bounces to spent casings
turret's cases do not rotate for some reason!
2025-02-23 22:06:16 -08:00
Bob
0ccf81443a the malicious gigglefish from the silly dimension 2025-02-23 18:39:11 +01:00
Boblet
c3e532ab33 good god - we gonna rock down to electric avenue 2025-02-21 15:18:45 +01:00
Boblet
d20c190c3e the de-genericizing 2025-02-20 16:55:46 +01:00
HbmMods
e6e11a3a1c
Merge pull request #1949 from EverMine/locale_update
Locale updates
2025-02-20 08:35:11 +01:00
ItsMakar
223e0d2855 Fix some typos in en_US locale 2025-02-20 09:32:13 +02:00
ItsMakar
66feaf292f Merge branch 'locale_update' of https://github.com/EverMine/Hbm-s-Nuclear-Tech-GIT into locale_update 2025-02-20 09:31:25 +02:00
IOcmet
d802645bc3
Merge branch 'HbmMods:master' into locale_update 2025-02-20 09:31:08 +02:00
HbmMods
c855f67cda
Merge pull request #1948 from Dash1269/ntmain-rotaryfurnace-fix
Fix rotary furnace not saving output material
2025-02-20 08:22:09 +01:00
HbmMods
4fd9d5b0fa
Merge pull request #1947 from EverMine/rendering_fix
Replace manual matrix restoration in haze and radiation fog particle renderers to glPushMatrix and glPopMatrix
2025-02-20 08:21:37 +01:00
ItsMakar
f9e22ddab0 some localization for ru_RU ™️ 2025-02-20 09:20:51 +02:00
Dosh
b28cb312dc
fixed rotary furnace not saving output material 2025-02-20 16:39:19 +11:00
Dosh
c12948b330
automatic formatting 2025-02-20 16:37:50 +11:00
ItsMakar
a5fa13c32e Replace manual matrix restoration in haze and radiation fog particle renderers to glPushMatrix and glPopMatrix 2025-02-20 04:03:03 +02:00
IOcmet
093d23e700
Merge branch 'HbmMods:master' into locale_update 2025-02-20 00:59:29 +02:00
Boblet
4c82dfcdcb scraping out old crap 2025-02-19 16:37:17 +01:00
ItsMakar
d4f62675c4 Update ru_RU.lang 2025-02-19 07:43:13 +02:00
IOcmet
20646c407b
Merge branch 'HbmMods:master' into locale_update 2025-02-19 03:30:48 +02:00
Boblet
c3eb6035aa deplorable gollompus 2025-02-18 16:21:38 +01:00
HbmMods
23db8e3d86
Merge pull request #1943 from Vaern/idk
added mas-36 model, texture
2025-02-18 13:13:41 +01:00
Vaern
de8324ce9b added mas-36 model, texture 2025-02-17 10:14:54 -08:00
Boblet
18dfb21ca4 UNINOS 2025-02-17 16:59:17 +01:00
Bob
fd04bf9b3f a whole lot of nothing 2025-02-16 23:16:26 +01:00
HbmMods
4444038f35
Merge pull request #1937 from Creeper-banner/bob
Update zh_CN.lang for next release
2025-02-16 11:22:56 +01:00
IOcmet
beae7b31fe
Update ru_RU locale, rearrange it to en_US order and remove unused keys 2025-02-15 07:56:48 +02:00
Boblet
b1d5540887 my quest for beans has taken me to many places 2025-02-14 15:08:45 +01:00
Boblet
4aaf3ec864 new objective: kill ronald reagan 2025-02-13 16:45:38 +01:00
Creeper-banner
0262fcc984
Add files via upload 2025-02-12 17:11:58 +08:00
70000hp
3a7e974541 adjustments 2025-02-11 18:17:29 -05:00
70000hp
89fe899f2a Rotary Furnace Fuel Tweak
Better fuels speed up the rotary furnace, but require more steam
Steam requirements scale with speed nonlinearly, being x^1.5
2025-02-11 17:50:35 -05:00
Boblet
4972f4023a thorn glognuts for only 5 bintar 2025-02-11 16:46:14 +01:00
Boblet
614f5db7dc fuck! 2025-02-10 16:53:37 +01:00
HbmMods
d34624a224
Merge pull request #1935 from MellowArpeggiation/master
forgot the black book safe pool oops
2025-02-10 10:12:03 +01:00
George Paton
940f45813a forgot the black book safe pool oops 2025-02-10 20:07:59 +11:00
HbmMods
6043d1df80
Merge pull request #1934 from MellowArpeggiation/moige
NBT Structures + new Meteor Dungeon + bonus stuff
2025-02-10 08:57:53 +01:00
HbmMods
27afb9eb7b
Merge pull request #1930 from darkalit/master
Return OC integration with Energy storage block
2025-02-10 08:06:44 +01:00
HbmMods
1a24b8df67
Merge pull request #1928 from Toshayo/master
Night vision toggling with HUD
2025-02-10 08:02:31 +01:00
HbmMods
2968d927bc
Merge branch 'master' into master 2025-02-10 08:02:24 +01:00
George Paton
98a334575d forgot the jigsaw block side rotating code 2025-02-10 15:57:03 +11:00
George Paton
0dea47ff87 add glowstone loot and force 3x3loot to always spawn, even at size limit 2025-02-10 12:21:45 +11:00
George Paton
8994d2e0b1 add nbt vertibird spawning and remove unused meteor dungeon code 2025-02-10 12:21:17 +11:00
George Paton
c1a2f8d270 stack jetpack tanks to 16, and don't consume them if jetpack is already full 2025-02-10 11:43:30 +11:00
George Paton
7f0c483cb1 improved meteor dungeon stair piece, added loot fallback, and prevent structures generating too far horizontally from the start point 2025-02-10 11:36:31 +11:00
BallOfEnergy
aceb313fec Merge remote-tracking branch 'refs/remotes/upstream/master' into Optimization
# Conflicts:
#	src/main/java/com/hbm/handler/WeaponAbility.java
#	src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java
#	src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java
2025-02-09 18:02:29 -06:00
BallOfEnergy
352cee350f Merge remote-tracking branch 'origin/Optimization' into Optimization 2025-02-09 18:01:03 -06:00
BallOfEnergy
e2d64ff376 Fix for main issue #1933. 2025-02-09 18:00:52 -06:00
George Paton
977bd3e2b5 Add access transformer for mojang being a stupid butt 2025-02-10 09:59:06 +11:00
Bob
5341f5d255 EOTT 2025-02-09 18:38:30 +01:00
George Paton
4fb7df8b3e Merge branch 'master' into moige 2025-02-09 18:39:57 +11:00
George Paton
3dbe648ebe bring NBTStructures to NTMain! 2025-02-09 18:39:15 +11:00
Bob
f74ce297f8 chromatic aberration 2025-02-08 23:19:33 +01:00
darkalit
4a95dc1240 Return OC integration with Energy storage block 2025-02-07 23:57:28 +02:00
Toshayo
b462b30156
Night vision toggling with HUD 2025-02-07 13:07:39 +01:00
Boblet
b60db5b911 pain 2025-02-06 16:48:29 +01:00
HbmMods
fe9808f621
Merge pull request #1924 from Dash1269/ntmain-pa-detector-fix
PA Detector fixes and improved diagnostics
2025-02-06 15:00:30 +01:00
Boblet
8522b584d4 undo all of the PA stuff 2025-02-06 15:00:19 +01:00
Dosh
5f1a4509f2
PA Detector fixes and improved diagnostics 2025-02-07 00:08:31 +11:00
Boblet
bd59ae5970 flixes 2025-02-05 16:45:49 +01:00
HbmMods
d4d5340a33
Merge pull request #1920 from Creeper-banner/bob
Update zh_CN.lang for X5230
2025-02-05 11:17:02 +01:00
Creeper-banner
2f2c2438d5
Add files via upload 2025-02-05 17:47:58 +08:00
HbmMods
d363177e7f
Merge pull request #1917 from TheCrazyInsanity/master
Simple Github action to build on push & pr
2025-02-05 08:06:21 +01:00
HbmMods
1f5c58b7bb
Merge pull request #1914 from Nycticoraxnightheron/master
zh_CN update
2025-02-05 08:04:42 +01:00
Boblet
27bd64eafc a botched nosejob 2025-02-04 16:54:02 +01:00
TheCrazyInsanity
4b32e2665b
I forgot to make it upload artifacts
:3c
2025-02-03 18:01:30 -05:00
TheCrazyInsanity
7206cad26a
Create build.yml
Github actions template to build an artifact on push or pr
2025-02-03 17:50:45 -05:00
Boblet
a814e581b9 time to eat 40lbs of dynamite then die 2025-02-03 16:24:41 +01:00
Night Heron
3b1a578d71
I hate eszopiclone 2025-02-03 14:57:30 +08:00
George Paton
c49161ab39 Merge branch 'master' into moige 2025-02-03 10:44:17 +11:00
George Paton
a581cb74d0 Refueling Station! Refuels armor, attached armor mods, and any held items! Now Black Mesa themed! 2025-02-03 10:38:47 +11:00
Bob
6027ad963b fuck off 2025-02-02 22:05:58 +01:00
George Paton
18af968073 updated boble 2025-02-01 20:21:46 +11:00
George Paton
6d920ce91d sorters default to bedrock sorting now too 2025-02-01 20:02:21 +11:00
George Paton
c4e973dc03 oops: fix sorter filter crash 2025-02-01 20:00:24 +11:00
George Paton
b6d4e95ec9 bedrock ore grade filters! 2025-02-01 19:35:46 +11:00
BallOfEnergy
642945e7ac
Merge branch 'HbmMods:master' into Optimization 2025-01-13 08:16:55 -06:00
BallOfEnergy
9fa148c218 just in case I disappear, here's particle threading and crate backpacks, along with spider crates, though opening a spider crate in the inventory will not spawn spiders yet. 2025-01-12 19:21:17 -06:00
2893 changed files with 318879 additions and 278095 deletions

62
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,62 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
# 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
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
- name: Build with Gradle Wrapper
run: ./gradlew build
- name: Upload a Build Artifact
uses: actions/upload-artifact@v4.6.0
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) * duplicate util functions (just use what we have, man)
* unused or half finished util functions (for obvious reasons) * 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) * 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 ## Test your code
@ -20,6 +22,9 @@ This should go without saying, but please don't PR code that was never actually
**Addendum:** Because apparently some people think that testing is somehow optional, it is now **mandatory** to test the code both on a client and on a server. If the PR contains compat code, the game has to work **with and without** the mod that the compat is for. **Addendum:** Because apparently some people think that testing is somehow optional, it is now **mandatory** to test the code both on a client and on a server. If the PR contains compat code, the game has to work **with and without** the mod that the compat is for.
## No refactor PRs
Your refactors suck ass and usually something ends up breaking.
## Communication ## Communication
If you're planning on adding some new thing or doing a grand change, it's best to ask whether that's a good idea before spending 50 hours on a project that won't end up getting merged, due to issues that could have been entirely avoidable with communication. If you're planning on adding some new thing or doing a grand change, it's best to ask whether that's a good idea before spending 50 hours on a project that won't end up getting merged, due to issues that could have been entirely avoidable with communication.

View File

@ -2,7 +2,7 @@
[NTM on Modrinth](https://modrinth.com/mod/ntm) [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) [Official NTM Wiki](https://nucleartech.wiki/wiki/Main_Page)
@ -10,8 +10,9 @@
**This is for 1.7.10!** For 1.12, check out these projects: **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 Extended Edition (Alcater): https://github.com/Alcatergit/Hbm-s-Nuclear-Tech-GIT/releases
* 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 For 1.18, try Martin's remake: https://codeberg.org/MartinTheDragon/Nuclear-Tech-Mod-Remake/releases
@ -24,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: 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. 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). 2. If you don't have git installed, download&install it from [here](https://git-scm.com/downloads).
3. Open up "Git Bash": 3. Open up "Git Bash":
* Press Windows Button, type "Git Bash" and press ENTER * Press Windows Button, type "Git Bash" and press ENTER

View File

@ -6,6 +6,7 @@ import java.nio.file.StandardCopyOption
buildscript { buildscript {
repositories { repositories {
maven { url = 'https://maven.ntmr.dev/proxy/' }
maven { url = 'https://maven.minecraftforge.net/' } maven { url = 'https://maven.minecraftforge.net/' }
maven { url = 'https://plugins.gradle.org/m2' } maven { url = 'https://plugins.gradle.org/m2' }
mavenCentral() mavenCentral()
@ -67,6 +68,10 @@ eclipse.classpath.file.whenMerged { cp ->
} }
repositories { repositories {
maven {
name = 'Blerg'
url = 'https://maven.ntmr.dev/proxy/'
}
maven { maven {
name = 'ModMaven' name = 'ModMaven'
url = 'https://modmaven.dev' url = 'https://modmaven.dev'
@ -79,6 +84,18 @@ repositories {
// name = "CurseForge" // name = "CurseForge"
// url = "https://minecraft.curseforge.com/api/maven/" // 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 { dependencies {
@ -94,6 +111,8 @@ dependencies {
compileOnly "inventorytweaks:InventoryTweaks:1.59-dev:deobf" compileOnly "inventorytweaks:InventoryTweaks:1.59-dev:deobf"
implementation "li.cil.oc:OpenComputers:MC1.7.10-1.5.+:api" 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 { processResources {

View File

@ -1,11 +1,27 @@
## Changed ## Changed
* Blast doors will now pulverize any block that gets in their way during closing * Updated russian localization
* The nuclear and RTG furnaces will be retired, their recipes have been removed but they remain operational for now * Rad absorbers now use metadata, existing blocks will be converted automatically
* Changed the magnetron recipe to be 3 copper plates and 4 tungsten wires * Fissure bombs that go off in crater biomes now create fissures with metadata 1 which creates radioactive volcanic lava
* Added recipes to some secret ammo types * 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
* Fixed the CCGT's steam output breaking as soon as the steam buffer runs full * Potentially fixed yet another issue regarding crates
* Fixed crash caused by mobs holding belt-fed guns * Fixed battery socket `fillpercent` RoR function always assuming a max power of 1
* Fixed boiler heat input being way too low due to operation order (diffusion was applied AFTER the input heat was capped) * Fixed issue where multiblock ports would generate many OpenComputers component entries
* Fixed stinger playing its lockon sound on the wrong side * 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,24 +1,28 @@
mod_version=1.0.27 mod_version=1.0.27
# Empty build number makes a release type # Empty build number makes a release type
mod_build_number=5224 mod_build_number=5572
credits=HbMinecraft,\ credits=HbMinecraft,\
\ rodolphito (explosion algorithms),\ \ rodolphito (explosion algorithms),\
\ grangerave (explosion algorithms),\ \ grangerave (explosion algorithms),\
\ Hoboy (textures, models),\ \ Hoboy (textures, models),\
\ Drillgon200 (effects, models, porting),\ \ Drillgon200 (effects, models),\
\ MartinTheDragon (calculator, chunk-based fallout, bendable cranes, pipe improvements, PWR sounds),\ \ MartinTheDragon (calculator, chunk-based fallout, bendable cranes, pipe improvements, PWR sounds),\
\ Alcater (GUI textures, porting),\ \ Alcater (GUI textures),\
\ MellowArpeggiation (new animation system, turbine sounds, sound fixes, industrial lights, better particle diodes),\ \ MellowArpeggiation (new animation system, turbine sounds, sound fixes, industrial lights, conveyor wand, NBT structures, MSU displays),\
\ Pheo (textures, various machines, models, weapons),\ \ Pheo (textures, various machines, models, weapons),\
\ Vær (gas centrifuges, better worldgen, ZIRNOX, CP-1 parts, starter guide, new cyclotron, weapon animations),\ \ 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),\ \ LePeep (coilgun model, BDCL QC),\
\ Adam29 (liquid petroleum, ethanol, electric furnace),\ \ Adam29 (liquid petroleum, ethanol, electric furnace),\
\ Pvndols (thorium fuel recipe, gas turbine),\ \ Pvndols (thorium fuel recipe, gas turbine),\
\ JamesH2 (blood mechanics, nitric acid, particle emitter),\ \ JamesH2 (blood mechanics, nitric acid, particle emitter),\
\ Lazzzycat (structures, mob gear),\
\ PastaBaguette (coal horse decal),\ \ PastaBaguette (coal horse decal),\
\ Doctor17 (russian localization)),\ \ Doctor17 (russian localization)),\
\ Pashtet (russian localization),\ \ Pashtet (russian localization),\
\ 7H40 (russian localization),\
\ RayzerHan (russian localization),\
\ Bismarck (chinese localization),\ \ Bismarck (chinese localization),\
\ Creeper-banner (chinese localization),\ \ Creeper-banner (chinese localization),\
\ 5467864 (chinese localization),\ \ 5467864 (chinese localization),\
@ -30,16 +34,22 @@ credits=HbMinecraft,\
\ UnnameTokiko (chinese localization),\ \ UnnameTokiko (chinese localization),\
\ Herobrine 457985 (chinese localization),\ \ Herobrine 457985 (chinese localization),\
\ xxwinhere (chinese localization),\ \ xxwinhere (chinese localization),\
\ Nycticoraxnightheron (chinese localization),\
\ NarekoMichigami810 (chinese localization),\
\ Maksymisio (polish localization)\ \ Maksymisio (polish localization)\
\ el3ctro4ndre (italian localization),\ \ el3ctro4ndre (italian localization),\
\ Goaty1208 (italian localization),\
\ Pu-238 (Tom impact effects),\ \ Pu-238 (Tom impact effects),\
\ UFFR (RTG pellets, guns, casings, euphemium capacitor),\
\ Frooz (gun models),\ \ Frooz (gun models),\
\ VT-6/24 (models, textures),\ \ VT-6/24 (models, textures),\
\ Nos (models),\ \ Nos (models),\
\ WushiThe (models),\
\ Minecreep (models),\ \ Minecreep (models),\
\ 70k (textures, glyphid AI, strand caster, electrolyzer changes),\ \ ackbarcrowbars (models),\
\ haru315 (spiral point algorithm),\ \ haru315 (spiral point algorithm),\
\ mlbv (threaded MK5),\
\ 70k (textures, glyphid AI, strand caster, electrolyzer changes, cryolite),\
\ instantnootles (concept artist),\
\ Sten89 (models),\ \ Sten89 (models),\
\ Pixelguru26 (textures),\ \ Pixelguru26 (textures),\
\ TheBlueHat (textures),\ \ TheBlueHat (textures),\
@ -47,16 +57,24 @@ credits=HbMinecraft,\
\ TehTemmie (reacher radiation function),\ \ TehTemmie (reacher radiation function),\
\ Silly541 (config for safe ME drives),\ \ Silly541 (config for safe ME drives),\
\ Voxelstice (OpenComputers integration, turbine spinup),\ \ Voxelstice (OpenComputers integration, turbine spinup),\
\ BallOfEnergy1 (OpenComputers integration),\ \ BallOfEnergy1 (OpenComputers integration, RBMK and packet optimization, crate backpacks),\
\ PewPewCricket (OpenComputers integration),\
\ kelllllen (OpenComputers integration),\
\ sdddddf80 (recipe configs, chinese localization, custom machine holograms),\ \ sdddddf80 (recipe configs, chinese localization, custom machine holograms),\
\ Abel1502 (optimization, crate upgrade recipes, strand caster improvements, varous tweaks),\ \ Abel1502 (abilities GUI, optimization, crate upgrade recipes, strand caster improvements, varous tweaks),\
\ Darek505 (armor rendering compatibility fix),\
\ ranch21 (improved HUD gauges),\
\ SuperCraftAlex (tooltips)\ \ SuperCraftAlex (tooltips)\
\ Ice-Arrow (research reactor tweaks),\ \ Ice-Arrow (research reactor tweaks),\
\ 245tt (anvil GUI improvements),\ \ 245tt (anvil GUI improvements),\
\ KoblizekXD (doors),\ \ KoblizekXD (doors),\
\ FOlkvangrField (custom machine parts),\ \ FOlkvangrField (custom machine parts),\
\ RosaTryp (centrifuge config),\ \ RosaTryp (centrifuge config),\
\ Toshayo (satellite loot system, project settings, gradle curse task),\ \ 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),\ \ martemen (project settings),\
\ OvermindDL1 (project settings),\ \ OvermindDL1 (project settings),\
\ impbk2002 (project settings)\ \ impbk2002 (project settings)\

View File

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

View File

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

View File

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

View File

@ -1,8 +1,7 @@
package api.hbm.energymk2; package api.hbm.energymk2;
import com.hbm.packet.PacketDispatcher; import com.hbm.handler.threading.PacketThreading;
import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.util.Compat;
import api.hbm.energymk2.Nodespace.PowerNode; import api.hbm.energymk2.Nodespace.PowerNode;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; 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) { 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; boolean red = false;
if(te instanceof IEnergyConductorMK2) { if(te instanceof IEnergyConductorMK2) {
@ -43,7 +42,7 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 {
if(te instanceof IEnergyReceiverMK2 && te != this) { if(te instanceof IEnergyReceiverMK2 && te != this) {
IEnergyReceiverMK2 rec = (IEnergyReceiverMK2) te; 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 provides = Math.min(this.getPower(), this.getProviderSpeed());
long receives = Math.min(rec.getMaxPower() - rec.getPower(), rec.getReceiverSpeed()); long receives = Math.min(rec.getMaxPower() - rec.getPower(), rec.getReceiverSpeed());
long toTransfer = Math.min(provides, receives); long toTransfer = Math.min(provides, receives);
@ -62,7 +61,7 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 {
data.setDouble("mX", dir.offsetX * (red ? 0.025 : 0.1)); data.setDouble("mX", dir.offsetX * (red ? 0.025 : 0.1));
data.setDouble("mY", dir.offsetY * (red ? 0.025 : 0.1)); data.setDouble("mY", dir.offsetY * (red ? 0.025 : 0.1));
data.setDouble("mZ", dir.offsetZ * (red ? 0.025 : 0.1)); data.setDouble("mZ", dir.offsetZ * (red ? 0.025 : 0.1));
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25));
} }
} }
} }

View File

@ -1,9 +1,9 @@
package api.hbm.energymk2; package api.hbm.energymk2;
import com.hbm.handler.threading.PacketThreading;
import com.hbm.interfaces.NotableComments; import com.hbm.interfaces.NotableComments;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.util.Compat; import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.energymk2.Nodespace.PowerNode; import api.hbm.energymk2.Nodespace.PowerNode;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
@ -31,9 +31,14 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 {
return this.getMaxPower(); 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) { 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; boolean red = false;
if(te instanceof IEnergyConductorMK2) { if(te instanceof IEnergyConductorMK2) {
@ -58,7 +63,7 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 {
data.setDouble("mX", -dir.offsetX * (red ? 0.025 : 0.1)); data.setDouble("mX", -dir.offsetX * (red ? 0.025 : 0.1));
data.setDouble("mY", -dir.offsetY * (red ? 0.025 : 0.1)); data.setDouble("mY", -dir.offsetY * (red ? 0.025 : 0.1));
data.setDouble("mZ", -dir.offsetZ * (red ? 0.025 : 0.1)); data.setDouble("mZ", -dir.offsetZ * (red ? 0.025 : 0.1));
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25));
} }
} }
@ -76,31 +81,6 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 {
} }
} }
/**
* Project MKUltra was an illegal human experiments program designed and undertaken by the U.S. Central Intelligence Agency (CIA)
* to develop procedures and identify drugs that could be used during interrogations to weaken people and force confessions through
* brainwashing and psychological torture. It began in 1953 and was halted in 1973. MKUltra used numerous methods to manipulate
* its subjects' mental states and brain functions, such as the covert administration of high doses of psychoactive drugs (especially LSD)
* and other chemicals without the subjects' consent, electroshocks, hypnosis, sensory deprivation, isolation, verbal and sexual
* abuse, and other forms of torture.
* MKUltra was preceded by Project Artichoke. It was organized through the CIA's Office of Scientific Intelligence and coordinated
* with the United States Army Biological Warfare Laboratories. The program engaged in illegal activities, including the
* use of U.S. and Canadian citizens as unwitting test subjects. MKUltra's scope was broad, with activities carried
* out under the guise of research at more than 80 institutions aside from the military, including colleges and universities,
* hospitals, prisons, and pharmaceutical companies. The CIA operated using front organizations, although some top officials at these
* institutions were aware of the CIA's involvement.
* MKUltra was revealed to the public in 1975 by the Church Committee of the United States Congress and Gerald Ford's United States
* President's Commission on CIA activities within the United States (the Rockefeller Commission). Investigative efforts were hampered
* by CIA Director Richard Helms's order that all MKUltra files be destroyed in 1973; the Church Committee and Rockefeller Commission
* investigations relied on the sworn testimony of direct participants and on the small number of documents that survived Helms's order.
* In 1977, a Freedom of Information Act request uncovered a cache of 20,000 documents relating to MKUltra, which led to Senate hearings.
* Some surviving information about MKUltra was declassified in 2001.
* */
public default ConnectionPriority getPriority() {
return ConnectionPriority.NORMAL;
}
/** More is better-er */
public enum ConnectionPriority { public enum ConnectionPriority {
LOWEST, LOWEST,
LOW, LOW,
@ -108,4 +88,8 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 {
HIGH, HIGH,
HIGHEST HIGHEST
} }
public default ConnectionPriority getPriority() {
return ConnectionPriority.NORMAL;
}
} }

View File

@ -1,161 +1,41 @@
package api.hbm.energymk2; package api.hbm.energymk2;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Set;
import com.hbm.interfaces.NotableComments; import com.hbm.interfaces.NotableComments;
import com.hbm.uninos.GenNode;
import com.hbm.uninos.UniNodespace;
import com.hbm.uninos.networkproviders.PowerNetProvider;
import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.util.fauxpointtwelve.DirPos;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.World; import net.minecraft.world.World;
/** /**
* The "Nodespace" is an intermediate, "ethereal" layer of abstraction that tracks nodes (i.e. cables) even when they are no longer loaded, allowing continued operation even when unloaded * The dead fucking corpse of nodespace MK1.
* @author hbm * A fantastic proof of concept, but ultimately it was killed for being just not that versatile.
* This class is mostly just a compatibility husk that should allow uninodespace to slide into the mod with as much lubrication as it deserves.
* *
* @author hbm
*/ */
@NotableComments
public class Nodespace { public class Nodespace {
/** Contains all "NodeWorld" instances, i.e. lists of nodes existing per world */ public static final PowerNetProvider THE_POWER_PROVIDER = new PowerNetProvider();
public static HashMap<World, NodeWorld> worlds = new HashMap<>();
public static Set<PowerNetMK2> activePowerNets = new HashSet<>();
public static PowerNode getNode(World world, int x, int y, int z) { @Deprecated public static PowerNode getNode(World world, int x, int y, int z) {
NodeWorld nodeWorld = worlds.get(world); return (PowerNode) UniNodespace.getNode(world, x, y, z, THE_POWER_PROVIDER);
if(nodeWorld != null) return nodeWorld.nodes.get(new BlockPos(x, y, z));
return null;
} }
public static void createNode(World world, PowerNode node) { @Deprecated public static void createNode(World world, PowerNode node) {
NodeWorld nodeWorld = worlds.get(world); UniNodespace.createNode(world, node);
if(nodeWorld == null) {
nodeWorld = new NodeWorld();
worlds.put(world, nodeWorld);
}
nodeWorld.pushNode(node);
} }
public static void destroyNode(World world, int x, int y, int z) { @Deprecated public static void destroyNode(World world, int x, int y, int z) {
PowerNode node = getNode(world, x, y, z); UniNodespace.destroyNode(world, x, y, z, THE_POWER_PROVIDER);
if(node != null) {
worlds.get(world).popNode(node);
}
}
/** Goes over each node and manages connections */
public static void updateNodespace() {
for(World world : MinecraftServer.getServer().worldServers) {
NodeWorld nodes = worlds.get(world);
if(nodes == null)
continue;
for(Entry<BlockPos, PowerNode> entry : nodes.nodes.entrySet()) {
PowerNode node = entry.getValue();
if(!node.hasValidNet() || node.recentlyChanged) {
checkNodeConnection(world, node);
node.recentlyChanged = false;
}
}
}
updatePowerNets();
}
private static void updatePowerNets() {
for(PowerNetMK2 net : activePowerNets) net.resetEnergyTracker(); //reset has to be done before everything else
for(PowerNetMK2 net : activePowerNets) net.transferPower();
}
/** Goes over each connection point of the given node, tries to find neighbor nodes and to join networks with them */
private static void checkNodeConnection(World world, PowerNode node) {
for(DirPos con : node.connections) {
PowerNode conNode = getNode(world, con.getX(), con.getY(), con.getZ()); // get whatever neighbor node intersects with that connection
if(conNode != null) { // if there is a node at that place
if(conNode.hasValidNet() && conNode.net == node.net) continue; // if the net is valid and both nodes have the same net, skip
if(checkConnection(conNode, con, false)) {
connectToNode(node, conNode);
}
}
}
if(node.net == null || !node.net.isValid()) new PowerNetMK2().joinLink(node);
}
public static boolean checkConnection(PowerNode connectsTo, DirPos connectFrom, boolean skipSideCheck) {
for(DirPos revCon : connectsTo.connections) {
if(revCon.getX() - revCon.getDir().offsetX == connectFrom.getX() && revCon.getY() - revCon.getDir().offsetY == connectFrom.getY() && revCon.getZ() - revCon.getDir().offsetZ == connectFrom.getZ() && (revCon.getDir() == connectFrom.getDir().getOpposite() || skipSideCheck)) {
return true;
}
}
return false;
}
/** Links two nodes with different or potentially no networks */
private static void connectToNode(PowerNode origin, PowerNode connection) {
if(origin.hasValidNet() && connection.hasValidNet()) { // both nodes have nets, but the nets are different (previous assumption), join networks
if(origin.net.links.size() > connection.net.links.size()) {
origin.net.joinNetworks(connection.net);
} else {
connection.net.joinNetworks(origin.net);
}
} else if(!origin.hasValidNet() && connection.hasValidNet()) { // origin has no net, connection does, have origin join connection's net
connection.net.joinLink(origin);
} else if(origin.hasValidNet() && !connection.hasValidNet()) { // ...and vice versa
origin.net.joinLink(connection);
}
}
public static class NodeWorld {
/** Contains a map showing where each node is, a node is every spot that a cable exists at.
* Instead of the old proxy system, things like substation now create multiple nodes at their connection points */
public HashMap<BlockPos, PowerNode> nodes = new HashMap<>();
/** Adds a node at all its positions to the nodespace */
public void pushNode(PowerNode node) {
for(BlockPos pos : node.positions) {
nodes.put(pos, node);
}
}
/** Removes the specified node from all positions from nodespace */
public void popNode(PowerNode node) {
if(node.net != null) node.net.destroy();
for(BlockPos pos : node.positions) {
nodes.remove(pos);
node.expired = true;
}
}
/** Grabs the node at one position, then removes it from all positions it occupies */
public void popNode(BlockPos pos) {
PowerNode node = nodes.get(pos);
if(node != null) popNode(node);
}
} }
@NotableComments @NotableComments
public static class PowerNode { public static class PowerNode extends GenNode<PowerNetMK2> {
public BlockPos[] positions;
public DirPos[] connections;
public PowerNetMK2 net;
public boolean expired = false;
/** /**
* Okay so here's the deal: The code has shit idiot brain fungus. I don't know why. I re-tested every part involved several times. * Okay so here's the deal: The code has shit idiot brain fungus. I don't know why. I re-tested every part involved several times.
* I don't know why. But for some reason, during neighbor checks, on certain arbitrary fucking places, the joining operation just fails. * I don't know why. But for some reason, during neighbor checks, on certain arbitrary fucking places, the joining operation just fails.
@ -167,32 +47,16 @@ public class Nodespace {
* breaking, but it seems to allow those parts to connect back to their neighbor nets as they are supposed to. I am not proud of this solution, * breaking, but it seems to allow those parts to connect back to their neighbor nets as they are supposed to. I am not proud of this solution,
* this issue shouldn't exist to begin with and I am going fucking insane but it is what it is. * this issue shouldn't exist to begin with and I am going fucking insane but it is what it is.
*/ */
public boolean recentlyChanged = true;
public PowerNode(BlockPos... positions) { public PowerNode(BlockPos... positions) {
super(THE_POWER_PROVIDER, positions);
this.positions = positions; this.positions = positions;
} }
@Override
public PowerNode setConnections(DirPos... connections) { public PowerNode setConnections(DirPos... connections) {
this.connections = connections; super.setConnections(connections);
return this; return this;
} }
public PowerNode addConnection(DirPos connection) {
DirPos[] newCons = new DirPos[this.connections.length + 1];
for(int i = 0; i < this.connections.length; i++) newCons[i] = this.connections[i];
newCons[newCons.length - 1] = connection;
this.connections = newCons;
return this;
}
public boolean hasValidNet() {
return this.net != null && this.net.isValid();
}
public void setNet(PowerNetMK2 net) {
this.net = net;
this.recentlyChanged = true;
}
} }
} }

View File

@ -1,125 +1,32 @@
package api.hbm.energymk2; package api.hbm.energymk2;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set;
import com.hbm.uninos.NodeNet;
import com.hbm.util.Tuple.Pair; import com.hbm.util.Tuple.Pair;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Random;
import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority;
import api.hbm.energymk2.Nodespace.PowerNode; import api.hbm.energymk2.Nodespace.PowerNode;
public class PowerNetMK2 { /**
* Technically MK3 since it's now UNINOS compatible, although UNINOS was build out of 95% nodespace code
public static Random rand = new Random(); *
public boolean valid = true; * @author hbm
public Set<PowerNode> links = new HashSet(); */
public class PowerNetMK2 extends NodeNet<IEnergyReceiverMK2, IEnergyProviderMK2, PowerNode> {
/** Maps all active subscribers to a timestamp, handy for handling timeouts. In a good system this shouldn't be necessary, but the previous system taught me to be cautious anyway */
public HashMap<IEnergyReceiverMK2, Long> receiverEntries = new HashMap();
public HashMap<IEnergyProviderMK2, Long> providerEntries = new HashMap();
public long energyTracker = 0L; public long energyTracker = 0L;
public PowerNetMK2() {
Nodespace.activePowerNets.add(this);
}
/// SUBSCRIBER HANDLING ///
public boolean isSubscribed(IEnergyReceiverMK2 receiver) {
return this.receiverEntries.containsKey(receiver);
}
public void addReceiver(IEnergyReceiverMK2 receiver) {
this.receiverEntries.put(receiver, System.currentTimeMillis());
}
public void removeReceiver(IEnergyReceiverMK2 receiver) {
this.receiverEntries.remove(receiver);
}
/// PROVIDER HANDLING ///
public boolean isProvider(IEnergyProviderMK2 provider) {
return this.providerEntries.containsKey(provider);
}
public void addProvider(IEnergyProviderMK2 provider) {
this.providerEntries.put(provider, System.currentTimeMillis());
}
public void removeProvider(IEnergyProviderMK2 provider) {
this.providerEntries.remove(provider);
}
/// LINK JOINING ///
/** Combines two networks into one */
public void joinNetworks(PowerNetMK2 network) {
if(network == this) return; //wtf?!
List<PowerNode> oldNodes = new ArrayList(network.links.size());
oldNodes.addAll(network.links); // might prevent oddities related to joining - nvm it does nothing
for(PowerNode conductor : oldNodes) forceJoinLink(conductor);
network.links.clear();
for(IEnergyReceiverMK2 connector : network.receiverEntries.keySet()) this.addReceiver(connector);
for(IEnergyProviderMK2 connector : network.providerEntries.keySet()) this.addProvider(connector);
network.destroy();
}
/** Adds the power node as part of this network's links */
public PowerNetMK2 joinLink(PowerNode node) {
if(node.net != null) node.net.leaveLink(node);
return forceJoinLink(node);
}
/** Adds the power node as part of this network's links, skips the part about removing it from existing networks */
public PowerNetMK2 forceJoinLink(PowerNode node) {
this.links.add(node);
node.setNet(this);
return this;
}
/** Removes the specified power node */
public void leaveLink(PowerNode node) {
node.setNet(null);
this.links.remove(node);
}
/// GENERAL POWER NET CONTROL ///
public void invalidate() {
this.valid = false;
Nodespace.activePowerNets.remove(this);
}
public boolean isValid() {
return this.valid;
}
public void destroy() {
this.invalidate();
for(PowerNode link : this.links) if(link.net == this) link.setNet(null);
this.links.clear();
this.receiverEntries.clear();
this.providerEntries.clear();
}
public void resetEnergyTracker() {
this.energyTracker = 0;
}
protected static int timeout = 3_000; protected static int timeout = 3_000;
public void transferPower() { @Override public void resetTrackers() { this.energyTracker = 0; }
@Override
public void update() {
if(providerEntries.isEmpty()) return; if(providerEntries.isEmpty()) return;
if(receiverEntries.isEmpty()) return; if(receiverEntries.isEmpty()) return;
@ -129,15 +36,19 @@ public class PowerNetMK2 {
List<Pair<IEnergyProviderMK2, Long>> providers = new ArrayList(); List<Pair<IEnergyProviderMK2, Long>> providers = new ArrayList();
long powerAvailable = 0; long powerAvailable = 0;
// sum up available power
Iterator<Entry<IEnergyProviderMK2, Long>> provIt = providerEntries.entrySet().iterator(); Iterator<Entry<IEnergyProviderMK2, Long>> provIt = providerEntries.entrySet().iterator();
while(provIt.hasNext()) { while(provIt.hasNext()) {
Entry<IEnergyProviderMK2, Long> entry = provIt.next(); Entry<IEnergyProviderMK2, Long> entry = provIt.next();
if(timestamp - entry.getValue() > timeout) { provIt.remove(); continue; } if(timestamp - entry.getValue() > timeout || isBadLink(entry.getKey())) { provIt.remove(); continue; }
long src = Math.min(entry.getKey().getPower(), entry.getKey().getProviderSpeed()); long src = Math.min(entry.getKey().getPower(), entry.getKey().getProviderSpeed());
providers.add(new Pair(entry.getKey(), src)); if(src > 0) {
powerAvailable += src; providers.add(new Pair(entry.getKey(), src));
powerAvailable += src;
}
} }
// sum up total demand, categorized by priority
List<Pair<IEnergyReceiverMK2, Long>>[] receivers = new ArrayList[ConnectionPriority.values().length]; List<Pair<IEnergyReceiverMK2, Long>>[] receivers = new ArrayList[ConnectionPriority.values().length];
for(int i = 0; i < receivers.length; i++) receivers[i] = new ArrayList(); for(int i = 0; i < receivers.length; i++) receivers[i] = new ArrayList();
long[] demand = new long[ConnectionPriority.values().length]; long[] demand = new long[ConnectionPriority.values().length];
@ -147,24 +58,27 @@ public class PowerNetMK2 {
while(recIt.hasNext()) { while(recIt.hasNext()) {
Entry<IEnergyReceiverMK2, Long> entry = recIt.next(); Entry<IEnergyReceiverMK2, Long> entry = recIt.next();
if(timestamp - entry.getValue() > timeout) { recIt.remove(); continue; } if(timestamp - entry.getValue() > timeout || isBadLink(entry.getKey())) { recIt.remove(); continue; }
long rec = Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed()); long rec = Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed());
int p = entry.getKey().getPriority().ordinal(); if(rec > 0) {
receivers[p].add(new Pair(entry.getKey(), rec)); int p = entry.getKey().getPriority().ordinal();
demand[p] += rec; receivers[p].add(new Pair(entry.getKey(), rec));
totalDemand += rec; demand[p] += rec;
totalDemand += rec;
}
} }
long toTransfer = Math.min(powerAvailable, totalDemand); long toTransfer = Math.min(powerAvailable, totalDemand);
long energyUsed = 0; long energyUsed = 0;
// add power to receivers, ordered by priority
for(int i = ConnectionPriority.values().length - 1; i >= 0; i--) { for(int i = ConnectionPriority.values().length - 1; i >= 0; i--) {
List<Pair<IEnergyReceiverMK2, Long>> list = receivers[i]; List<Pair<IEnergyReceiverMK2, Long>> list = receivers[i];
long priorityDemand = demand[i]; long priorityDemand = demand[i];
for(Pair<IEnergyReceiverMK2, Long> entry : list) { for(Pair<IEnergyReceiverMK2, Long> entry : list) {
double weight = (double) entry.getValue() / (double) (priorityDemand); 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 energyUsed += (toSend - entry.getKey().transferPower(toSend)); //leftovers are subtracted from the intended amount to use up
} }
@ -174,6 +88,7 @@ public class PowerNetMK2 {
this.energyTracker += energyUsed; this.energyTracker += energyUsed;
long leftover = energyUsed; long leftover = energyUsed;
// remove power from providers
for(Pair<IEnergyProviderMK2, Long> entry : providers) { for(Pair<IEnergyProviderMK2, Long> entry : providers) {
double weight = (double) entry.getValue() / (double) powerAvailable; double weight = (double) entry.getValue() / (double) powerAvailable;
long toUse = (long) Math.max(energyUsed * weight, 0D); long toUse = (long) Math.max(energyUsed * weight, 0D);
@ -181,7 +96,7 @@ public class PowerNetMK2 {
leftover -= toUse; leftover -= toUse;
} }
//rounding error compensation, detects surplus that hasn't been used and removes it from random providers // rounding error compensation, detects surplus that hasn't been used and removes it from random providers
int iterationsLeft = 100; // whiles without emergency brakes are a bad idea int iterationsLeft = 100; // whiles without emergency brakes are a bad idea
while(iterationsLeft > 0 && leftover > 0 && providers.size() > 0) { while(iterationsLeft > 0 && leftover > 0 && providers.size() > 0) {
iterationsLeft--; iterationsLeft--;
@ -195,118 +110,6 @@ public class PowerNetMK2 {
} }
} }
@Deprecated public void transferPowerOld() {
if(providerEntries.isEmpty()) return;
if(receiverEntries.isEmpty()) return;
long timestamp = System.currentTimeMillis();
long transferCap = 100_000_000_000_000_00L; // that ought to be enough
long supply = 0;
long demand = 0;
long[] priorityDemand = new long[ConnectionPriority.values().length];
Iterator<Entry<IEnergyProviderMK2, Long>> provIt = providerEntries.entrySet().iterator();
while(provIt.hasNext()) {
Entry<IEnergyProviderMK2, Long> entry = provIt.next();
if(timestamp - entry.getValue() > timeout) { provIt.remove(); continue; }
supply += Math.min(entry.getKey().getPower(), entry.getKey().getProviderSpeed());
}
if(supply <= 0) return;
Iterator<Entry<IEnergyReceiverMK2, Long>> recIt = receiverEntries.entrySet().iterator();
while(recIt.hasNext()) {
Entry<IEnergyReceiverMK2, Long> entry = recIt.next();
if(timestamp - entry.getValue() > timeout) { recIt.remove(); continue; }
long rec = Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed());
demand += rec;
for(int i = 0; i <= entry.getKey().getPriority().ordinal(); i++) priorityDemand[i] += rec;
}
if(demand <= 0) return;
long toTransfer = Math.min(supply, demand);
if(toTransfer > transferCap) toTransfer = transferCap;
if(toTransfer <= 0) return;
List<IEnergyProviderMK2> buffers = new ArrayList();
List<IEnergyProviderMK2> providers = new ArrayList();
Set<IEnergyReceiverMK2> receiverSet = receiverEntries.keySet();
for(IEnergyProviderMK2 provider : providerEntries.keySet()) {
if(receiverSet.contains(provider)) {
buffers.add(provider);
} else {
providers.add(provider);
}
}
providers.addAll(buffers); //makes buffers go last
List<IEnergyReceiverMK2> receivers = new ArrayList() {{ addAll(receiverSet); }};
receivers.sort(COMP);
int maxIteration = 1000;
//how much the current sender/receiver have already sent/received
long prevSrc = 0;
long prevDest = 0;
while(!receivers.isEmpty() && !providers.isEmpty() && maxIteration > 0) {
maxIteration--;
IEnergyProviderMK2 src = providers.get(0);
IEnergyReceiverMK2 dest = receivers.get(0);
if(src.getPower() <= 0) { providers.remove(0); prevSrc = 0; continue; }
if(src == dest) { // STALEMATE DETECTED
//if this happens, a buffer will waste both its share of transfer and receiving potential and do effectively nothing, essentially breaking
//try if placing the conflicting provider at the end of the list does anything
//we do this first because providers have no priority, so we may shuffle those around as much as we want
if(providers.size() > 1) {
providers.add(providers.get(0));
providers.remove(0);
prevSrc = 0; //this might cause slight issues due to the tracking being effectively lost while there still might be pending operations
continue;
}
//if that didn't work, try shifting the receiver by one place (to minimize priority breakage)
if(receivers.size() > 1) {
receivers.add(2, receivers.get(0));
receivers.remove(0);
prevDest = 0; //ditto
continue;
}
//if neither option could be performed, the only conclusion is that this buffer mode battery is alone in the power net, in which case: not my provlem
}
long pd = priorityDemand[dest.getPriority().ordinal()];
long receiverShare = Math.min((long) Math.ceil((double) Math.min(dest.getMaxPower() - dest.getPower(), dest.getReceiverSpeed()) * (double) supply / (double) pd), dest.getReceiverSpeed()) - prevDest;
long providerShare = Math.min((long) Math.ceil((double) Math.min(src.getPower(), src.getProviderSpeed()) * (double) demand / (double) supply), src.getProviderSpeed()) - prevSrc;
long toDrain = Math.min((long) (src.getPower()), providerShare);
long toFill = Math.min(dest.getMaxPower() - dest.getPower(), receiverShare);
long finalTransfer = Math.min(toDrain, toFill);
if(toFill <= 0) { receivers.remove(0); prevDest = 0; continue; }
finalTransfer -= dest.transferPower(finalTransfer);
src.usePower(finalTransfer);
prevSrc += finalTransfer;
prevDest += finalTransfer;
if(prevSrc >= src.getProviderSpeed()) { providers.remove(0); prevSrc = 0; continue; }
if(prevDest >= dest.getReceiverSpeed()) { receivers.remove(0); prevDest = 0; continue; }
toTransfer -= finalTransfer;
this.energyTracker += finalTransfer;
}
}
public long sendPowerDiode(long power) { public long sendPowerDiode(long power) {
if(receiverEntries.isEmpty()) return power; if(receiverEntries.isEmpty()) return power;
@ -350,14 +153,4 @@ public class PowerNetMK2 {
return power - energyUsed; return power - energyUsed;
} }
public static final ReceiverComparator COMP = new ReceiverComparator();
public static class ReceiverComparator implements Comparator<IEnergyReceiverMK2> {
@Override
public int compare(IEnergyReceiverMK2 o1, IEnergyReceiverMK2 o2) {
return o2.getPriority().ordinal() - o1.getPriority().ordinal();
}
}
} }

View File

@ -1,19 +0,0 @@
package api.hbm.fluid;
import com.hbm.inventory.fluid.FluidType;
public interface IFluidConductor extends IFluidConnector {
public IPipeNet getPipeNet(FluidType type);
public void setPipeNet(FluidType type, IPipeNet network);
@Override
public default long transferFluid(FluidType type, int pressure, long amount) {
if(this.getPipeNet(type) == null)
return amount;
return this.getPipeNet(type).transferFluid(amount, pressure);
}
}

View File

@ -1,93 +1,6 @@
package api.hbm.fluid; package api.hbm.fluid;
import com.hbm.inventory.fluid.FluidType; import api.hbm.fluidmk2.IFluidConnectorMK2;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.util.Compat;
import api.hbm.tile.ILoadedTile; @Deprecated
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; public interface IFluidConnector extends IFluidConnectorMK2 { }
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public interface IFluidConnector extends ILoadedTile {
/**
* Returns the amount of fluid that remains
* @param power
* @return
*/
public long transferFluid(FluidType type, int pressure, long fluid);
/**
* Whether the given side can be connected to
* @param dir
* @return
*/
public default boolean canConnect(FluidType type, ForgeDirection dir) {
return dir != ForgeDirection.UNKNOWN;
}
/**
* Returns the amount of fluid that this machine is able to receive
* @param type
* @return
*/
public long getDemand(FluidType type, int pressure);
/**
* Basic implementation of subscribing to a nearby power grid
* @param world
* @param x
* @param y
* @param z
*/
public default void trySubscribe(FluidType type, World world, int x, int y, int z, ForgeDirection dir) {
TileEntity te = Compat.getTileStandard(world, x, y, z);
boolean red = false;
if(te instanceof IFluidConductor) {
IFluidConductor con = (IFluidConductor) te;
if(!con.canConnect(type, dir))
return;
if(con.getPipeNet(type) != null && !con.getPipeNet(type).isSubscribed(this))
con.getPipeNet(type).subscribe(this);
if(con.getPipeNet(type) != null)
red = true;
}
if(particleDebug) {
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "network");
data.setString("mode", "fluid");
data.setInteger("color", type.getColor());
double posX = x + 0.5 + dir.offsetX * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
double posY = y + 0.5 + dir.offsetY * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
double posZ = z + 0.5 + dir.offsetZ * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
data.setDouble("mX", -dir.offsetX * (red ? 0.025 : 0.1));
data.setDouble("mY", -dir.offsetY * (red ? 0.025 : 0.1));
data.setDouble("mZ", -dir.offsetZ * (red ? 0.025 : 0.1));
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25));
}
}
public default void tryUnsubscribe(FluidType type, World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
if(te instanceof IFluidConductor) {
IFluidConductor con = (IFluidConductor) te;
if(con.getPipeNet(type) != null && con.getPipeNet(type).isSubscribed(this))
con.getPipeNet(type).unsubscribe(this);
}
}
public static final boolean particleDebug = false;
}

View File

@ -1,12 +1,6 @@
package api.hbm.fluid; package api.hbm.fluid;
import com.hbm.inventory.fluid.FluidType; import api.hbm.fluidmk2.IFluidConnectorBlockMK2;
import net.minecraft.world.IBlockAccess; @Deprecated
import net.minecraftforge.common.util.ForgeDirection; public interface IFluidConnectorBlock extends IFluidConnectorBlockMK2 { }
public interface IFluidConnectorBlock {
/** dir is the face that is connected to, the direction going outwards from the block */
public boolean canConnect(FluidType type, IBlockAccess world, int x, int y, int z, ForgeDirection dir);
}

View File

@ -1,49 +1,35 @@
package api.hbm.fluid; package api.hbm.fluid;
import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.uninos.GenNode;
import com.hbm.uninos.UniNodespace;
/** import api.hbm.fluidmk2.IFluidStandardReceiverMK2;
* Uses default implementation to make the underlying interfaces easier to use for the most common fluid users. import net.minecraft.tileentity.TileEntity;
* Only handles a single input tank of the same type. import net.minecraft.world.World;
* Uses standard FluidTanks which use int32. import net.minecraftforge.common.util.ForgeDirection;
* Don't use this as part of the API!
* @author hbm
*
*/
public interface IFluidStandardReceiver extends IFluidUser {
@Override @Deprecated
public default long transferFluid(FluidType type, int pressure, long amount) { public interface IFluidStandardReceiver extends IFluidStandardReceiverMK2 {
for(FluidTank tank : getReceivingTanks()) { public default void subscribeToAllAround(FluidType type, TileEntity tile) {
if(tank.getTankType() == type && tank.getPressure() == pressure) { subscribeToAllAround(type, tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord);
tank.setFill(tank.getFill() + (int) amount);
if(tank.getFill() > tank.getMaxFill()) {
long overshoot = tank.getFill() - tank.getMaxFill();
tank.setFill(tank.getMaxFill());
return overshoot;
}
return 0;
}
}
return amount;
} }
public FluidTank[] getReceivingTanks(); public default void subscribeToAllAround(FluidType type, World world, int x, int y, int z) {
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
@Override trySubscribe(type, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir);
public default long getDemand(FluidType type, int pressure) {
for(FluidTank tank : getReceivingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
return tank.getMaxFill() - tank.getFill();
}
} }
}
return 0; public default void tryUnsubscribe(FluidType type, World world, int x, int y, int z) {
GenNode node = UniNodespace.getNode(world, x, y, z, type.getNetworkProvider());
if(node != null && node.net != null) node.net.removeReceiver(this);
}
public default void unsubscribeToAllAround(FluidType type, TileEntity tile) {
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
tryUnsubscribe(type, tile.getWorldObj(), tile.xCoord + dir.offsetX, tile.yCoord + dir.offsetY, tile.zCoord + dir.offsetZ);
}
} }
} }

View File

@ -1,50 +1,22 @@
package api.hbm.fluid; package api.hbm.fluid;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.tank.FluidTank;
/** import api.hbm.fluidmk2.IFluidStandardSenderMK2;
* Uses default implementation to make the underlying interfaces easier to use for the most common fluid users. import net.minecraft.tileentity.TileEntity;
* Only handles a single output tank of the same type. import net.minecraft.world.World;
* Uses standard FluidTanks which use int32. import net.minecraftforge.common.util.ForgeDirection;
* Don't use this as part of the API!
* @author hbm
*
*/
public interface IFluidStandardSender extends IFluidUser {
public FluidTank[] getSendingTanks(); @Deprecated
public interface IFluidStandardSender extends IFluidStandardSenderMK2 {
@Override public default void sendFluid(FluidTank tank, World world, int x, int y, int z, ForgeDirection dir) {
public default long getTotalFluidForSend(FluidType type, int pressure) { tryProvide(tank, world, x, y, z, dir);
}
for(FluidTank tank : getSendingTanks()) { public default void sendFluidToAll(FluidTank tank, TileEntity tile) {
if(tank.getTankType() == type && tank.getPressure() == pressure) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
return tank.getFill(); tryProvide(tank, tile.getWorldObj(), tile.xCoord + dir.offsetX, tile.yCoord + dir.offsetY, tile.zCoord + dir.offsetZ, dir);
}
} }
return 0;
}
@Override
public default void removeFluidForTransfer(FluidType type, int pressure, long amount) {
for(FluidTank tank : getSendingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
tank.setFill(tank.getFill() - (int) amount);
return;
}
}
}
@Override
public default long transferFluid(FluidType type, int pressure, long fluid) {
return fluid;
}
@Override
public default long getDemand(FluidType type, int pressure) {
return 0;
} }
} }

View File

@ -1,79 +1,4 @@
package api.hbm.fluid; package api.hbm.fluid;
import com.hbm.inventory.fluid.FluidType; @Deprecated
import com.hbm.inventory.fluid.tank.FluidTank; public interface IFluidStandardTransceiver extends IFluidStandardReceiver, IFluidStandardSender { }
/**
* transceiver [trăn-vər], noun
*
* 1. A transmitter and receiver housed together in a single unit and having some circuits in common, often for portable or mobile use.
* 2. A combined radio transmitter and receiver.
* 3. A device that performs transmitting and receiving functions, especially if using common components.
*
* The American Heritage® Dictionary of the English Language, 5th Edition.
*
* Only supports one tank per type (for in- and output separately)
*
* @author hbm
*
*/
public interface IFluidStandardTransceiver extends IFluidUser {
public FluidTank[] getSendingTanks();
public FluidTank[] getReceivingTanks();
@Override
public default long getTotalFluidForSend(FluidType type, int pressure) {
for(FluidTank tank : getSendingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
return tank.getFill();
}
}
return 0;
}
@Override
public default void removeFluidForTransfer(FluidType type, int pressure, long amount) {
for(FluidTank tank : getSendingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
tank.setFill(tank.getFill() - (int) amount);
return;
}
}
}
@Override
public default long getDemand(FluidType type, int pressure) {
for(FluidTank tank : getReceivingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
return tank.getMaxFill() - tank.getFill();
}
}
return 0;
}
@Override
public default long transferFluid(FluidType type, int pressure, long amount) {
for(FluidTank tank : getReceivingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
tank.setFill(tank.getFill() + (int) amount);
if(tank.getFill() > tank.getMaxFill()) {
long overshoot = tank.getFill() - tank.getMaxFill();
tank.setFill(tank.getMaxFill());
return overshoot;
}
return 0;
}
}
return amount;
}
}

View File

@ -1,130 +0,0 @@
package api.hbm.fluid;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.util.Compat;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public interface IFluidUser extends IFluidConnector {
public default void sendFluid(FluidTank tank, World world, int x, int y, int z, ForgeDirection dir) {
sendFluid(tank.getTankType(), tank.getPressure(), world, x, y, z, dir);
}
public default void sendFluid(FluidType type, int pressure, World world, int x, int y, int z, ForgeDirection dir) {
TileEntity te = world.getTileEntity(x, y, z);
boolean wasSubscribed = false;
boolean red = false;
if(te instanceof IFluidConductor) {
IFluidConductor con = (IFluidConductor) te;
if(con.getPipeNet(type) != null && con.getPipeNet(type).isSubscribed(this)) {
con.getPipeNet(type).unsubscribe(this);
wasSubscribed = true;
}
}
if(te instanceof IFluidConnector) {
IFluidConnector con = (IFluidConnector) te;
if(con.canConnect(type, dir.getOpposite())) {
long toSend = this.getTotalFluidForSend(type, pressure);
if(toSend > 0) {
long transfer = toSend - con.transferFluid(type, pressure, toSend);
this.removeFluidForTransfer(type, pressure, transfer);
}
red = true;
}
}
if(wasSubscribed && te instanceof IFluidConductor) {
IFluidConductor con = (IFluidConductor) te;
if(con.getPipeNet(type) != null && !con.getPipeNet(type).isSubscribed(this)) {
con.getPipeNet(type).subscribe(this);
}
}
if(particleDebug) {
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "network");
data.setString("mode", "fluid");
data.setInteger("color", type.getColor());
double posX = x + 0.5 - dir.offsetX * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
double posY = y + 0.5 - dir.offsetY * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
double posZ = z + 0.5 - dir.offsetZ * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
data.setDouble("mX", dir.offsetX * (red ? 0.025 : 0.1));
data.setDouble("mY", dir.offsetY * (red ? 0.025 : 0.1));
data.setDouble("mZ", dir.offsetZ * (red ? 0.025 : 0.1));
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25));
}
}
public static IPipeNet getPipeNet(World world, int x, int y, int z, FluidType type) {
TileEntity te = Compat.getTileStandard(world, x, y, z);
if(te instanceof IFluidConductor) {
IFluidConductor con = (IFluidConductor) te;
if(con.getPipeNet(type) != null) {
return con.getPipeNet(type);
}
}
return null;
}
/** Use more common conPos method instead */
@Deprecated public default void sendFluidToAll(FluidTank tank, TileEntity te) {
sendFluidToAll(tank.getTankType(), tank.getPressure(), te);
}
/** Use more common conPos method instead */
@Deprecated public default void sendFluidToAll(FluidType type, int pressure, TileEntity te) {
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
sendFluid(type, pressure, te.getWorldObj(), te.xCoord + dir.offsetX, te.yCoord + dir.offsetY, te.zCoord + dir.offsetZ, dir);
}
}
public default long getTotalFluidForSend(FluidType type, int pressure) { return 0; }
public default void removeFluidForTransfer(FluidType type, int pressure, long amount) { }
public default void subscribeToAllAround(FluidType type, TileEntity te) {
subscribeToAllAround(type, te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord);
}
public default void subscribeToAllAround(FluidType type, World world, int x, int y, int z) {
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
this.trySubscribe(type, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir);
}
public default void unsubscribeToAllAround(FluidType type, TileEntity te) {
unsubscribeToAllAround(type, te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord);
}
public default void unsubscribeToAllAround(FluidType type, World world, int x, int y, int z) {
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
this.tryUnsubscribe(type, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
}
/**
* Returns all internal tanks of this tile. Not used by the fluid network, it should only be used for display purposes or edge cases that can't be solved otherwise.
* The array is either composed of the original tank or outright the original tank array, so changes done to this array will extend to the IFluidUser.
* @return
*/
public FluidTank[] getAllTanks();
}

View File

@ -1,30 +0,0 @@
package api.hbm.fluid;
import java.math.BigInteger;
import java.util.HashSet;
import java.util.List;
import com.hbm.inventory.fluid.FluidType;
public interface IPipeNet {
public void joinNetworks(IPipeNet network);
public List<IFluidConductor> getLinks();
public HashSet<IFluidConnector> getSubscribers();
public IPipeNet joinLink(IFluidConductor conductor);
public void leaveLink(IFluidConductor conductor);
public void subscribe(IFluidConnector connector);
public void unsubscribe(IFluidConnector connector);
public boolean isSubscribed(IFluidConnector connector);
public void destroy();
public boolean isValid();
public long transferFluid(long fill, int pressure);
public FluidType getType();
public BigInteger getTotalTransfer();
}

View File

@ -1,205 +0,0 @@
package api.hbm.fluid;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import com.hbm.inventory.fluid.FluidType;
import net.minecraft.tileentity.TileEntity;
public class PipeNet implements IPipeNet {
private boolean valid = true;
private FluidType type;
private List<IFluidConductor> links = new ArrayList();
private HashSet<IFluidConnector> subscribers = new HashSet();
public static List<PipeNet> trackingInstances = null;
protected BigInteger totalTransfer = BigInteger.ZERO;
public List<String> debug = new ArrayList();
public PipeNet(FluidType type) {
this.type = type;
}
@Override
public void joinNetworks(IPipeNet network) {
if(network == this)
return;
for(IFluidConductor conductor : network.getLinks()) {
conductor.setPipeNet(type, this);
this.getLinks().add(conductor);
}
network.getLinks().clear();
for(IFluidConnector connector : network.getSubscribers()) {
this.subscribe(connector);
}
network.destroy();
}
@Override
public List<IFluidConductor> getLinks() {
return links;
}
@Override
public HashSet<IFluidConnector> getSubscribers() {
return subscribers;
}
@Override
public IPipeNet joinLink(IFluidConductor conductor) {
if(conductor.getPipeNet(type) != null)
conductor.getPipeNet(type).leaveLink(conductor);
conductor.setPipeNet(type, this);
this.links.add(conductor);
return this;
}
@Override
public void leaveLink(IFluidConductor conductor) {
conductor.setPipeNet(type, null);
this.links.remove(conductor);
}
@Override
public void subscribe(IFluidConnector connector) {
this.subscribers.add(connector);
}
@Override
public void unsubscribe(IFluidConnector connector) {
this.subscribers.remove(connector);
}
@Override
public boolean isSubscribed(IFluidConnector connector) {
return this.subscribers.contains(connector);
}
@Override
public long transferFluid(long fill, int pressure) {
subscribers.removeIf(x ->
x == null || !(x instanceof TileEntity) || ((TileEntity)x).isInvalid() || !x.isLoaded()
);
if(this.subscribers.isEmpty())
return fill;
trackingInstances = new ArrayList();
trackingInstances.add(this);
List<IFluidConnector> subList = new ArrayList(subscribers);
return fairTransfer(subList, type, pressure, fill);
}
public static long fairTransfer(List<IFluidConnector> subList, FluidType type, int pressure, long fill) {
if(fill <= 0) return 0;
List<Long> weight = new ArrayList();
long totalReq = 0;
for(IFluidConnector con : subList) {
long req = con.getDemand(type, pressure);
weight.add(req);
totalReq += req;
}
if(totalReq == 0)
return fill;
long totalGiven = 0;
for(int i = 0; i < subList.size(); i++) {
IFluidConnector con = subList.get(i);
long req = weight.get(i);
double fraction = (double)req / (double)totalReq;
long given = (long) Math.floor(fraction * fill);
if(given > 0) {
totalGiven += (given - con.transferFluid(type, pressure, given));
if(con instanceof TileEntity) {
TileEntity tile = (TileEntity) con;
tile.getWorldObj().markTileEntityChunkModified(tile.xCoord, tile.yCoord, tile.zCoord, tile);
}
/* debug code
if(trackingInstances != null) {
for(int j = 0; j < trackingInstances.size(); j++) {
PipeNet net = trackingInstances.get(j);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SSS");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
log(net, sdf.format(new Date(System.currentTimeMillis())) + " Sending " + given + "mB to " + conToString(con));
}
}
*/
}
}
if(trackingInstances != null) {
for(int i = 0; i < trackingInstances.size(); i++) {
PipeNet net = trackingInstances.get(i);
net.totalTransfer = net.totalTransfer.add(BigInteger.valueOf(totalGiven));
}
}
return fill - totalGiven;
}
@Override
public FluidType getType() {
return type;
}
@Override
public void destroy() {
this.valid = false;
this.subscribers.clear();
for(IFluidConductor con : this.links)
con.setPipeNet(type, null);
this.links.clear();
}
@Override
public boolean isValid() {
return this.valid;
}
@Override
public BigInteger getTotalTransfer() {
return this.totalTransfer;
}
public static void log(PipeNet net, String msg) {
net.debug.add(msg);
while(net.debug.size() > 50) {
net.debug.remove(0);
}
}
public static String conToString(IFluidConnector con) {
if(con instanceof TileEntity) {
TileEntity tile = (TileEntity) con;
return tile.getClass().getSimpleName() + " @ " + tile.xCoord + "/" + tile.yCoord + "/" + tile.zCoord;
}
return "" + con;
}
}

View File

@ -0,0 +1,152 @@
package api.hbm.fluidmk2;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.uninos.NodeNet;
import com.hbm.util.Tuple.Pair;
import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority;
public class FluidNetMK2 extends NodeNet<IFluidReceiverMK2, IFluidProviderMK2, FluidNode> {
public long fluidTracker = 0L;
protected static int timeout = 3_000;
protected static long currentTime = 0;
protected FluidType type;
public FluidNetMK2(FluidType type) {
this.type = type;
for(int i = 0; i < IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1; i++) providers[i] = new ArrayList();
for(int i = 0; i < IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1; i++) for(int j = 0; j < ConnectionPriority.values().length; j++) receivers[i][j] = new ArrayList();
}
@Override public void resetTrackers() { this.fluidTracker = 0; }
@Override
public void update() {
if(providerEntries.isEmpty()) return;
if(receiverEntries.isEmpty()) return;
currentTime = System.currentTimeMillis();
setupFluidProviders();
setupFluidReceivers();
transferFluid();
cleanUp();
}
//this sucks ass, but it makes the code just a smidge more structured
public long[] fluidAvailable = new long[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1];
public List<Pair<IFluidProviderMK2, Long>>[] providers = new ArrayList[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1];
public long[][] fluidDemand = new long[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1][ConnectionPriority.values().length];
public List<Pair<IFluidReceiverMK2, Long>>[][] receivers = new ArrayList[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1][ConnectionPriority.values().length];
public long[] transfered = new long[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1];
public void setupFluidProviders() {
Iterator<Entry<IFluidProviderMK2, Long>> iterator = providerEntries.entrySet().iterator();
while(iterator.hasNext()) {
Entry<IFluidProviderMK2, Long> entry = iterator.next();
if(currentTime - entry.getValue() > timeout || isBadLink(entry.getKey())) { iterator.remove(); continue; }
IFluidProviderMK2 provider = entry.getKey();
int[] pressureRange = provider.getProvidingPressureRange(type);
for(int p = pressureRange[0]; p <= pressureRange[1]; p++) {
long available = Math.min(provider.getFluidAvailable(type, p), provider.getProviderSpeed(type, p));
providers[p].add(new Pair(provider, available));
fluidAvailable[p] += available;
}
}
}
public void setupFluidReceivers() {
Iterator<Entry<IFluidReceiverMK2, Long>> iterator = receiverEntries.entrySet().iterator();
while(iterator.hasNext()) {
Entry<IFluidReceiverMK2, Long> entry = iterator.next();
if(currentTime - entry.getValue() > timeout || isBadLink(entry.getKey())) { iterator.remove(); continue; }
IFluidReceiverMK2 receiver = entry.getKey();
int[] pressureRange = receiver.getReceivingPressureRange(type);
for(int p = pressureRange[0]; p <= pressureRange[1]; p++) {
long required = Math.min(receiver.getDemand(type, p), receiver.getReceiverSpeed(type, p));
int priority = receiver.getFluidPriority().ordinal();
receivers[p][priority].add(new Pair(receiver, required));
fluidDemand[p][priority] += required;
}
}
}
public void transferFluid() {
long[] received = new long[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1];
long[] notAccountedFor = new long[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1];
for(int p = 0; p <= IFluidUserMK2.HIGHEST_VALID_PRESSURE; p++) { // if the pressure range were ever to increase, we might have to rethink this
long totalAvailable = fluidAvailable[p];
for(int i = ConnectionPriority.values().length - 1; i >= 0; i--) {
long toTransfer = Math.min(fluidDemand[p][i], totalAvailable);
if(toTransfer <= 0) continue;
long priorityDemand = fluidDemand[p][i];
for(Pair<IFluidReceiverMK2, Long> entry : receivers[p][i]) {
double weight = (double) entry.getValue() / (double) (priorityDemand);
long toSend = (long) Math.max(toTransfer * weight, 0D);
toSend -= entry.getKey().transferFluid(type, p, toSend);
received[p] += toSend;
fluidTracker += toSend;
}
totalAvailable -= received[p];
}
notAccountedFor[p] = received[p];
}
for(int p = 0; p <= IFluidUserMK2.HIGHEST_VALID_PRESSURE; p++) {
for(Pair<IFluidProviderMK2, Long> entry : providers[p]) {
double weight = (double) entry.getValue() / (double) fluidAvailable[p];
long toUse = (long) Math.max(received[p] * weight, 0D);
entry.getKey().useUpFluid(type, p, toUse);
notAccountedFor[p] -= toUse;
}
}
for(int p = 0; p <= IFluidUserMK2.HIGHEST_VALID_PRESSURE; p++) {
int iterationsLeft = 100;
while(iterationsLeft > 0 && notAccountedFor[p] > 0 && providers[p].size() > 0) {
iterationsLeft--;
Pair<IFluidProviderMK2, Long> selected = providers[p].get(rand.nextInt(providers[p].size()));
IFluidProviderMK2 scapegoat = selected.getKey();
long toUse = Math.min(notAccountedFor[p], scapegoat.getFluidAvailable(type, p));
scapegoat.useUpFluid(type, p, toUse);
notAccountedFor[p] -= toUse;
}
}
}
public void cleanUp() {
for(int i = 0; i < IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1; i++) {
fluidAvailable[i] = 0;
providers[i].clear();
transfered[i] = 0;
for(int j = 0; j < ConnectionPriority.values().length; j++) {
fluidDemand[i][j] = 0;
receivers[i][j].clear();
}
}
}
}

View File

@ -0,0 +1,19 @@
package api.hbm.fluidmk2;
import com.hbm.uninos.GenNode;
import com.hbm.uninos.INetworkProvider;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.util.fauxpointtwelve.DirPos;
public class FluidNode extends GenNode<FluidNetMK2> {
public FluidNode(INetworkProvider<FluidNetMK2> provider, BlockPos... positions) {
super(provider, positions);
}
@Override
public FluidNode setConnections(DirPos... connections) {
super.setConnections(connections);
return this;
}
}

View File

@ -1,4 +1,4 @@
package api.hbm.fluid; package api.hbm.fluidmk2;
import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.FluidType;

View File

@ -0,0 +1,12 @@
package api.hbm.fluidmk2;
import com.hbm.inventory.fluid.FluidType;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
public interface IFluidConnectorBlockMK2 {
/** dir is the face that is connected to, the direction going outwards from the block */
public boolean canConnect(FluidType type, IBlockAccess world, int x, int y, int z, ForgeDirection dir);
}

View File

@ -0,0 +1,17 @@
package api.hbm.fluidmk2;
import com.hbm.inventory.fluid.FluidType;
import net.minecraftforge.common.util.ForgeDirection;
public interface IFluidConnectorMK2 {
/**
* Whether the given side can be connected to
* @param dir
* @return
*/
public default boolean canConnect(FluidType type, ForgeDirection dir) {
return dir != ForgeDirection.UNKNOWN;
}
}

View File

@ -0,0 +1,27 @@
package api.hbm.fluidmk2;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.lib.Library;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.util.fauxpointtwelve.DirPos;
import net.minecraft.tileentity.TileEntity;
/**
* IFluidConductorMK2 with added node creation method
* @author hbm
*/
public interface IFluidPipeMK2 extends IFluidConnectorMK2 {
public default FluidNode createNode(FluidType type) {
TileEntity tile = (TileEntity) this;
return new FluidNode(type.getNetworkProvider(), 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)
);
}
}

View File

@ -0,0 +1,12 @@
package api.hbm.fluidmk2;
import com.hbm.inventory.fluid.FluidType;
public interface IFluidProviderMK2 extends IFluidUserMK2 {
public void useUpFluid(FluidType type, int pressure, long amount);
public default long getProviderSpeed(FluidType type, int pressure) { return 1_000_000_000; }
public long getFluidAvailable(FluidType type, int pressure);
public default int[] getProvidingPressureRange(FluidType type) { return DEFAULT_PRESSURE_RANGE; }
}

View File

@ -0,0 +1,63 @@
package api.hbm.fluidmk2;
import com.hbm.inventory.fluid.FluidType;
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.fauxpointtwelve.DirPos;
import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public interface IFluidReceiverMK2 extends IFluidUserMK2 {
/** Sends fluid of the desired type and pressure to the receiver, returns the remainder */
public long transferFluid(FluidType type, int pressure, long amount);
public default long getReceiverSpeed(FluidType type, int pressure) { return 1_000_000_000; }
public long getDemand(FluidType type, int pressure);
public default int[] getReceivingPressureRange(FluidType type) { return DEFAULT_PRESSURE_RANGE; }
public default void trySubscribe(FluidType type, World world, DirPos pos) { trySubscribe(type, world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); }
public default void trySubscribe(FluidType type, World world, int x, int y, int z, ForgeDirection dir) {
TileEntity te = TileAccessCache.getTileOrCache(world, x, y, z);
boolean red = false;
if(te instanceof IFluidConnectorMK2) {
IFluidConnectorMK2 con = (IFluidConnectorMK2) te;
if(!con.canConnect(type, dir.getOpposite())) return;
GenNode node = UniNodespace.getNode(world, x, y, z, type.getNetworkProvider());
if(node != null && node.net != null) {
node.net.addReceiver(this);
red = true;
}
}
if(particleDebug) {
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "network");
data.setString("mode", "fluid");
data.setInteger("color", type.getColor());
double posX = x + 0.5 + dir.offsetX * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
double posY = y + 0.5 + dir.offsetY * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
double posZ = z + 0.5 + dir.offsetZ * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
data.setDouble("mX", -dir.offsetX * (red ? 0.025 : 0.1));
data.setDouble("mY", -dir.offsetY * (red ? 0.025 : 0.1));
data.setDouble("mZ", -dir.offsetZ * (red ? 0.025 : 0.1));
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25));
}
}
public default ConnectionPriority getFluidPriority() {
return ConnectionPriority.NORMAL;
}
}

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

@ -0,0 +1,68 @@
package api.hbm.fluidmk2;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.tank.FluidTank;
/**
* IFluidReceiverMK2 with standard implementation for transfer and demand getter.
* @author hbm
*/
public interface IFluidStandardReceiverMK2 extends IFluidReceiverMK2 {
public FluidTank[] getReceivingTanks();
@Override
public default long getDemand(FluidType type, int pressure) {
long amount = 0;
for(FluidTank tank : getReceivingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) amount += (tank.getMaxFill() - tank.getFill());
}
return amount;
}
@Override
public default long transferFluid(FluidType type, int pressure, long amount) {
int tanks = 0;
for(FluidTank tank : getReceivingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) tanks++;
}
if(tanks > 1) {
int firstRound = (int) Math.floor((double) amount / (double) tanks);
for(FluidTank tank : getReceivingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
int toAdd = Math.min(firstRound, tank.getMaxFill() - tank.getFill());
tank.setFill(tank.getFill() + toAdd);
amount -= toAdd;
}
}
}
if(amount > 0) for(FluidTank tank : getReceivingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
int toAdd = (int) Math.min(amount, tank.getMaxFill() - tank.getFill());
tank.setFill(tank.getFill() + toAdd);
amount -= toAdd;
}
}
return amount;
}
@Override
public default int[] getReceivingPressureRange(FluidType type) {
int lowest = HIGHEST_VALID_PRESSURE;
int highest = 0;
for(FluidTank tank : getReceivingTanks()) {
if(tank.getTankType() == type) {
if(tank.getPressure() < lowest) lowest = tank.getPressure();
if(tank.getPressure() > highest) highest = tank.getPressure();
}
}
return lowest <= highest ? new int[] {lowest, highest} : DEFAULT_PRESSURE_RANGE;
}
@Override
public default long getReceiverSpeed(FluidType type, int pressure) {
return 1_000_000_000;
}
}

View File

@ -0,0 +1,129 @@
package api.hbm.fluidmk2;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.inventory.fluid.FluidType;
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.fauxpointtwelve.DirPos;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
/**
* IFluidProviderMK2 with standard implementation for fluid provision and fluid removal.
* @author hbm
*/
public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 {
public default void tryProvide(FluidTank tank, World world, DirPos pos) { tryProvide(tank.getTankType(), tank.getPressure(), world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); }
public default void tryProvide(FluidType type, World world, DirPos pos) { tryProvide(type, 0, world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); }
public default void tryProvide(FluidType type, int pressure, World world, DirPos pos) { tryProvide(type, pressure, world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); }
public default void tryProvide(FluidTank tank, World world, int x, int y, int z, ForgeDirection dir) { tryProvide(tank.getTankType(), tank.getPressure(), world, x, y, z, dir); }
public default void tryProvide(FluidType type, World world, int x, int y, int z, ForgeDirection dir) { tryProvide(type, 0, world, x, y, z, dir); }
public default void tryProvide(FluidType type, int pressure, World world, int x, int y, int z, ForgeDirection dir) {
TileEntity te = TileAccessCache.getTileOrCache(world, x, y, z);
boolean red = false;
if(te instanceof IFluidConnectorMK2) {
IFluidConnectorMK2 con = (IFluidConnectorMK2) te;
if(con.canConnect(type, dir.getOpposite())) {
GenNode<FluidNetMK2> node = UniNodespace.getNode(world, x, y, z, type.getNetworkProvider());
if(node != null && node.net != null) {
node.net.addProvider(this);
red = true;
}
}
}
if(te != this && te instanceof IFluidReceiverMK2) {
IFluidReceiverMK2 rec = (IFluidReceiverMK2) te;
if(rec.canConnect(type, dir.getOpposite())) {
long provides = Math.min(this.getFluidAvailable(type, pressure), this.getProviderSpeed(type, pressure));
long receives = Math.min(rec.getDemand(type, pressure), rec.getReceiverSpeed(type, pressure));
long toTransfer = Math.min(provides, receives);
toTransfer -= rec.transferFluid(type, pressure, toTransfer);
this.useUpFluid(type, pressure, toTransfer);
}
}
if(particleDebug) {
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "network");
data.setString("mode", "fluid");
data.setInteger("color", type.getColor());
double posX = x + 0.5 - dir.offsetX * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
double posY = y + 0.5 - dir.offsetY * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
double posZ = z + 0.5 - dir.offsetZ * 0.5 + world.rand.nextDouble() * 0.5 - 0.25;
data.setDouble("mX", dir.offsetX * (red ? 0.025 : 0.1));
data.setDouble("mY", dir.offsetY * (red ? 0.025 : 0.1));
data.setDouble("mZ", dir.offsetZ * (red ? 0.025 : 0.1));
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25));
}
}
public FluidTank[] getSendingTanks();
@Override
public default long getFluidAvailable(FluidType type, int pressure) {
long amount = 0;
for(FluidTank tank : getSendingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) amount += tank.getFill();
}
return amount;
}
@Override
public default void useUpFluid(FluidType type, int pressure, long amount) {
int tanks = 0;
for(FluidTank tank : getSendingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) tanks++;
}
if(tanks > 1) {
int firstRound = (int) Math.floor((double) amount / (double) tanks);
for(FluidTank tank : getSendingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
int toRem = Math.min(firstRound, tank.getFill());
tank.setFill(tank.getFill() - toRem);
amount -= toRem;
}
}
}
if(amount > 0) for(FluidTank tank : getSendingTanks()) {
if(tank.getTankType() == type && tank.getPressure() == pressure) {
int toRem = (int) Math.min(amount, tank.getFill());
tank.setFill(tank.getFill() - toRem);
amount -= toRem;
}
}
}
@Override
public default int[] getProvidingPressureRange(FluidType type) {
int lowest = HIGHEST_VALID_PRESSURE;
int highest = 0;
for(FluidTank tank : getSendingTanks()) {
if(tank.getTankType() == type) {
if(tank.getPressure() < lowest) lowest = tank.getPressure();
if(tank.getPressure() > highest) highest = tank.getPressure();
}
}
return lowest <= highest ? new int[] {lowest, highest} : DEFAULT_PRESSURE_RANGE;
}
@Override
public default long getProviderSpeed(FluidType type, int pressure) {
return 1_000_000_000;
}
}

View File

@ -0,0 +1,5 @@
package api.hbm.fluidmk2;
public interface IFluidStandardTransceiverMK2 extends IFluidStandardReceiverMK2, IFluidStandardSenderMK2 {
}

View File

@ -0,0 +1,15 @@
package api.hbm.fluidmk2;
import com.hbm.inventory.fluid.tank.FluidTank;
import api.hbm.tile.ILoadedTile;
public interface IFluidUserMK2 extends IFluidConnectorMK2, ILoadedTile {
public static final int HIGHEST_VALID_PRESSURE = 5;
public static final int[] DEFAULT_PRESSURE_RANGE = new int[] {0, 0};
public static final boolean particleDebug = false;
public FluidTank[] getAllTanks();
}

View File

@ -0,0 +1,24 @@
package api.hbm.fluidmk2;
/*
It's rather shrimple: the shiny new energy system using universal nodespace, but hit with a hammer until it works with fluids.
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

@ -0,0 +1,13 @@
package api.hbm.recipe;
public interface IRecipeRegisterListener {
/**
* Called during SerializableRecipe.initialize(), after the defaults are loaded but before the template is written.
* Due to the way the recipes are handled, calling it once is not enough, it has to be called once for every SerializableRecipe
* instance handled, therefore the load operation passes the type name of the recipe, so that the listeners know what type of recipe
* to register at that point. Note that the actual SerializableRecipe instance is irrelevant, since recipes are static anyway,
* and direct tampering with SerializableRecipes is not recommended.
*/
public void onRecipeLoad(String recipeClassName);
}

View File

@ -0,0 +1,17 @@
package api.hbm.recipe;
/*
Quick guide on how to make robust and safe recipe integration:
* Implement IRecipeRegisterListener, the resulting class will handle all recipes, and the onRecipeLoad method is called every time the SerializableRecipe system updates
* Register your IRecipeRegisterListener using CompatExternal.registerRecipeRegisterListener, this has to happen before the SerializableRecipe initializes, doing this during PreInit should be safe
* In your IRecipeRegisterListener, check the supplied recipe type string (which will be the class name of the SerializableRecipe currently being registered) and register your custom recipes accordingly using CompatRecipeRegistry
Explanation:
* Order of operations is important for the recipes to work, if recipes are loaded outside the scope of SerializableRecipe.initialize, they will not work correctly
* If recipes are registered before the init, they are deleted, if they are registered after the init, they will not be part of the config template file, and get deleted when running /ntmreload
* Machines change all the time, so the recipe classes should not be considered API, since the compat would break immediately if a machine is changed or removed
* CompatRecipeRegistry promises to never change its method signatures, and have solid sanity checking when recipes are registered, allowing it to make the bst of whatever data is thrown at it
* Using this dedicated registry class means that even if a machine is changed or removed, the recipes will continue to work to the best of its abilities
*/

View File

@ -7,15 +7,17 @@ public interface IRORInteractive extends IRORInfo {
public static String EX_NULL = "Exception: Null Command"; public static String EX_NULL = "Exception: Null Command";
public static String EX_NAME = "Exception: Multiple Name Separators"; public static String EX_NAME = "Exception: Multiple Name Separators";
public static String EX_FORMAT = "Exception: Parameter in Invalid Format";
/** Runs a function on the ROR component, usually causing the component to change or do something. Returns are optional. */ /** Runs a function on the ROR component, usually causing the component to change or do something. Returns are optional. */
public Object runRORFunction(String name, String[] params); public String runRORFunction(String name, String[] params);
/** Extracts the command name from a full command string */ /** Extracts the command name from a full command string */
public static String getCommand(String input) { public static String getCommand(String input) {
if(input == null || input.isEmpty()) throw new RORFunctionException(EX_NULL); if(input == null || input.isEmpty()) throw new RORFunctionException(EX_NULL);
String[] parts = input.split(NAME_SEPARATOR); String[] parts = input.split(NAME_SEPARATOR);
if(parts.length <= 0 || parts.length > 2) throw new RORFunctionException(EX_NAME); if(parts.length <= 0 || parts.length > 2) throw new RORFunctionException(EX_NAME);
if(parts[0].isEmpty()) throw new RORFunctionException(EX_NULL);
return parts[0]; return parts[0];
} }
@ -29,4 +31,11 @@ public interface IRORInteractive extends IRORInfo {
String[] params = paramList.split(PARAM_SEPARATOR); String[] params = paramList.split(PARAM_SEPARATOR);
return params; return params;
} }
public static int parseInt(String val, int min, int max) {
int result = 0;
try { result = Integer.parseInt(val); } catch(Exception x) { throw new RORFunctionException(EX_FORMAT); };
if(result < min || result > max) throw new RORFunctionException(EX_FORMAT);
return result;
}
} }

View File

@ -3,5 +3,5 @@ package api.hbm.redstoneoverradio;
public interface IRORValueProvider extends IRORInfo { public interface IRORValueProvider extends IRORInfo {
/** Grabs the specified value from this ROR component, operations should not cause any changes with the component itself */ /** Grabs the specified value from this ROR component, operations should not cause any changes with the component itself */
public Object provideRORValue(String name); public String provideRORValue(String name);
} }

View File

@ -43,4 +43,7 @@ ROR programmers can indeed do everything that the readers and controllers can, b
which are more time-consuming to set up and limits the amount of command channels available, hence why readers and controllers exist which are more time-consuming to set up and limits the amount of command channels available, hence why readers and controllers exist
when only a simple solution is required when only a simple solution is required
Addendum: While the RTTY system can support any arbitrary object as a signal, INDEX will strictly use strings, since that simplifies
things regarding serialization and saving signals to NBT. Counters already use a parse to int32 function, so this still checks out.
*/ */

View File

@ -1,6 +1,55 @@
package api.hbm.tile; 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 interface ILoadedTile {
public boolean isLoaded(); 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,12 +5,15 @@ import com.hbm.handler.ThreeInts;
import com.hbm.interfaces.ICopiable; import com.hbm.interfaces.ICopiable;
import com.hbm.main.MainRegistry; import com.hbm.main.MainRegistry;
import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.IPersistentNBT;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityItem;
@ -23,6 +26,8 @@ import net.minecraft.stats.StatList;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MathHelper; import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.client.event.DrawBlockHighlightEvent;
@ -32,7 +37,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable { public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable, INBTBlockTransformable {
public BlockDummyable(Material mat) { public BlockDummyable(Material mat) {
super(mat); super(mat);
@ -72,27 +77,20 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
super.onNeighborBlockChange(world, x, y, z, block); super.onNeighborBlockChange(world, x, y, z, block);
if(world.isRemote || safeRem) if(safeRem)
return; return;
int metadata = world.getBlockMetadata(x, y, z); destroyIfOrphan(world, 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);
}
} }
public void updateTick(World world, int x, int y, int z, Random rand) { public void updateTick(World world, int x, int y, int z, Random rand) {
super.updateTick(world, x, y, z, 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) if(world.isRemote)
return; return;
@ -105,10 +103,32 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite(); ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite();
Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
if(b != this) { // An extra precaution against multiblocks on chunk borders being erroneously deleted.
world.setBlockToAir(x, y, z); // 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) { public int[] findCore(World world, int x, int y, int z) {
@ -116,7 +136,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
return findCoreRec(world, x, y, z); return findCoreRec(world, x, y, z);
} }
List<ThreeInts> positions = new ArrayList(); List<ThreeInts> positions = new ArrayList<>();
public int[] findCoreRec(World world, int x, int y, int z) { public int[] findCoreRec(World world, int x, int y, int z) {
@ -216,11 +236,6 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
super.onBlockPlacedBy(world, x, y, z, player, itemStack); super.onBlockPlacedBy(world, x, y, z, player, itemStack);
} }
/*@Override
public void onBlockAdded(World world, int x, int y, int z) {
lastBlockSet = new BlockPos(x, y, z);
}*/
/** /**
* A bit more advanced than the dir modifier, but it is important that the resulting direction meta is in the core range. * A bit more advanced than the dir modifier, but it is important that the resulting direction meta is in the core range.
* Using the "extra" metas is technically possible but requires a bit of tinkering, e.g. preventing a recursive loop * Using the "extra" metas is technically possible but requires a bit of tinkering, e.g. preventing a recursive loop
@ -267,9 +282,9 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
return; return;
// world.setBlockMetadataWithNotify(x, y, z, meta + extra, 3); // world.setBlockMetadataWithNotify(x, y, z, meta + extra, 3);
this.safeRem = true; safeRem = true;
world.setBlock(x, y, z, this, meta + extra, 3); world.setBlock(x, y, z, this, meta + extra, 3);
this.safeRem = false; safeRem = false;
} }
public void removeExtra(World world, int x, int y, int z) { public void removeExtra(World world, int x, int y, int z) {
@ -283,9 +298,9 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
return; return;
// world.setBlockMetadataWithNotify(x, y, z, meta + extra, 3); // world.setBlockMetadataWithNotify(x, y, z, meta + extra, 3);
this.safeRem = true; safeRem = true;
world.setBlock(x, y, z, this, meta - extra, 3); world.setBlock(x, y, z, this, meta - extra, 3);
this.safeRem = false; safeRem = false;
} }
// checks if the dummy metadata is within the extra range // checks if the dummy metadata is within the extra range
@ -423,8 +438,9 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
return !bounding.isEmpty(); return !bounding.isEmpty();
} }
public List<AxisAlignedBB> bounding = new ArrayList(); public List<AxisAlignedBB> bounding = new ArrayList<>();
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override @Override
public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) {
@ -442,8 +458,10 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
y = pos[1]; y = pos[1];
z = pos[2]; z = pos[2];
for(AxisAlignedBB aabb :this.bounding) { ForgeDirection rot = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - offset).getRotation(ForgeDirection.UP);
AxisAlignedBB boxlet = getAABBRotationOffset(aabb, x + 0.5, y, z + 0.5, ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - this.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)) { if(entityBounding.intersectsWith(boxlet)) {
list.add(boxlet); list.add(boxlet);
@ -468,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); 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 @Override
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {
if(!this.useDetailedHitbox()) { if(!this.useDetailedHitbox()) {
@ -501,10 +545,10 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)interp; double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)interp;
float exp = 0.002F; 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(); ICustomBlockHighlight.setup();
for(AxisAlignedBB aabb : this.bounding) event.context.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(); ICustomBlockHighlight.cleanup();
} }
@ -521,6 +565,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
@Override @Override
public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) {
int[] pos = findCore(world, x, y, z); int[] pos = findCore(world, x, y, z);
if(pos == null) return;
TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]);
if (tile instanceof ICopiable) if (tile instanceof ICopiable)
((ICopiable) tile).pasteSettings(nbt, index, world, player, pos[0], pos[1], pos[2]); ((ICopiable) tile).pasteSettings(nbt, index, world, player, pos[0], pos[1], pos[2]);
@ -534,4 +579,27 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl
return ((ICopiable) tile).infoForDisplay(world, x, y, z); return ((ICopiable) tile).infoForDisplay(world, x, y, z);
return null; return null;
} }
@Override
public int transformMeta(int meta, int coordBaseMode) {
boolean isOffset = meta >= 12; // squishing causes issues
boolean isExtra = !isOffset && meta >= extra;
if(isOffset) {
meta -= offset;
} else if(isExtra) {
meta -= extra;
}
meta = INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode);
if(isOffset) {
meta += offset;
} else if(isExtra) {
meta += extra;
}
return meta;
}
} }

View File

@ -58,6 +58,14 @@ public class BlockEnums {
SMALL SMALL
} }
public static enum LightstoneType {
UNREFINED,
TILE,
BRICKS,
BRICKS_CHISELED,
CHISELED
}
public static enum DecoComputerEnum { public static enum DecoComputerEnum {
IBM_300PL IBM_300PL
} }
@ -72,4 +80,5 @@ public class BlockEnums {
FLUORESCENT, FLUORESCENT,
HALOGEN HALOGEN
} }
} }

View File

@ -11,4 +11,27 @@ public interface IBlockSideRotation {
public static int getRenderType() { public static int getRenderType() {
return renderID; return renderID;
} }
// 0 1 3 2 becomes 0 2 3 1
// I want to smoke that swedish kush because it clearly makes you fucking stupid
public static int topToBottom(int topRotation) {
switch(topRotation) {
case 1: return 2;
case 2: return 1;
default: return topRotation;
}
}
public static boolean isOpposite(int from, int to) {
switch(from) {
case 0: return to == 1;
case 1: return to == 0;
case 2: return to == 3;
case 3: return to == 2;
case 4: return to == 5;
case 5: return to == 4;
default: return false;
}
}
} }

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -1,91 +1,77 @@
package com.hbm.blocks.bomb; package com.hbm.blocks.bomb;
import java.util.Random; import com.hbm.blocks.BlockEnumMulti;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.BombConfig; import com.hbm.config.BombConfig;
import com.hbm.entity.logic.EntityBalefire; import com.hbm.entity.logic.EntityBalefire;
import com.hbm.entity.logic.EntityNukeExplosionMK5;
import com.hbm.explosion.vanillant.ExplosionVNT;
import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard;
import com.hbm.explosion.vanillant.standard.BlockProcessorStandard;
import com.hbm.explosion.vanillant.standard.EntityProcessorCross;
import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard;
import com.hbm.handler.threading.PacketThreading;
import com.hbm.interfaces.IBomb; import com.hbm.interfaces.IBomb;
import com.hbm.items.ModItems; import com.hbm.items.ModItems;
import com.hbm.packet.PacketDispatcher; import com.hbm.main.MainRegistry;
import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.particle.helper.ExplosionCreator;
import com.hbm.tileentity.bomb.TileEntityCrashedBomb; import com.hbm.tileentity.bomb.TileEntityCrashedBomb;
import com.hbm.util.EnumUtil;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import net.minecraft.block.BlockContainer; import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
public class BlockCrashedBomb extends BlockContainer implements IBomb { public class BlockCrashedBomb extends BlockEnumMulti implements ITileEntityProvider, IBomb {
public BlockCrashedBomb(Material p_i45386_1_) { public static enum EnumDudType {
super(p_i45386_1_); BALEFIRE, CONVENTIONAL, NUKE, SALTED
}
public BlockCrashedBomb(Material mat) {
super(mat, EnumDudType.class, false, false);
} }
@Override @Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityCrashedBomb(); return new TileEntityCrashedBomb();
} }
@Override @Override public int getRenderType() { return -1; }
public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { @Override public boolean isOpaqueCube() { return false; }
return Item.getItemFromBlock(ModBlocks.crashed_balefire); @Override public boolean renderAsNormalBlock() { return false; }
}
@Override
public int getRenderType() {
return -1;
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
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, 5, 2);
}
if(i == 1) {
world.setBlockMetadataWithNotify(x, y, z, 3, 2);
}
if(i == 2) {
world.setBlockMetadataWithNotify(x, y, z, 4, 2);
}
if(i == 3) {
world.setBlockMetadataWithNotify(x, y, z, 2, 2);
}
}
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float fx, float fy, float fz) { public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float fx, float fy, float fz) {
if(world.isRemote) return true;
if(world.isRemote)
return true;
if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.defuser) { if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.defuser) {
EnumDudType type = EnumUtil.grabEnumSafely(EnumDudType.class, world.getBlockMetadata(x, y, z));
//TODO: make this less scummy
if(type == type.BALEFIRE) {
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.egg_balefire_shard)));
}
if(type == type.CONVENTIONAL) {
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ball_tnt, 16)));
}
if(type == type.NUKE) {
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ball_tnt, 8)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.billet_plutonium, 4)));
}
if(type == type.SALTED) {
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ball_tnt, 8)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.billet_plutonium, 2)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ingot_cobalt, 12)));
}
world.func_147480_a(x, y, z, false); world.func_147480_a(x, y, z, false);
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.egg_balefire_shard)));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.plate_steel, 10 + world.rand.nextInt(15))));
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.plate_titanium, 2 + world.rand.nextInt(7))));
return true; return true;
} }
@ -97,21 +83,46 @@ public class BlockCrashedBomb extends BlockContainer implements IBomb {
if(!world.isRemote) { if(!world.isRemote) {
EnumDudType type = EnumUtil.grabEnumSafely(EnumDudType.class, world.getBlockMetadata(x, y, z));
world.setBlockToAir(x, y, z); world.setBlockToAir(x, y, z);
EntityBalefire bf = new EntityBalefire(world);
bf.posX = x;
bf.posY = y;
bf.posZ = z;
bf.destructionRange = (int) (BombConfig.fatmanRadius * 1.25);
world.spawnEntityInWorld(bf);
NBTTagCompound data = new NBTTagCompound(); if(type == type.BALEFIRE) {
data.setString("type", "muke"); EntityBalefire bf = new EntityBalefire(world);
data.setBoolean("balefire", true); bf.setPosition(x, y, z);
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + 0.5, y + 0.5, z + 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 0.5, z + 0.5, 250)); bf.destructionRange = (int) (BombConfig.fatmanRadius * 1.25);
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); world.spawnEntityInWorld(bf);
spawnMush(world, x, y, z, true);
}
if(type == type.CONVENTIONAL) {
ExplosionVNT xnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 35F);
xnt.setBlockAllocator(new BlockAllocatorStandard(24));
xnt.setBlockProcessor(new BlockProcessorStandard().setNoDrop());
xnt.setEntityProcessor(new EntityProcessorCross(5D).withRangeMod(1.5F));
xnt.setPlayerProcessor(new PlayerProcessorStandard());
xnt.explode();
ExplosionCreator.composeEffectLarge(world, x + 0.5, y + 0.5, z + 0.5);
}
if(type == type.NUKE) {
world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, 35, x + 0.5, y + 0.5, z + 0.5));
spawnMush(world, x, y, z, MainRegistry.polaroidID == 11 || world.rand.nextInt(100) == 0);
}
if(type == type.SALTED) {
world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, 25, x + 0.5, y + 0.5, z + 0.5).moreFallout(25));
spawnMush(world, x, y, z, MainRegistry.polaroidID == 11 || world.rand.nextInt(100) == 0);
}
} }
return BombReturnCode.DETONATED; return BombReturnCode.DETONATED;
} }
public static void spawnMush(World world, int x, int y, int z, boolean balefire) {
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:weapon.mukeExplosion", 15.0F, 1.0F);
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "muke");
data.setBoolean("balefire", balefire);
PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x + 0.5, y + 0.5, z + 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 0.5, z + 0.5, 250));
}
} }

View File

@ -3,6 +3,7 @@ package com.hbm.blocks.bomb;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.entity.item.EntityTNTPrimedBase; import com.hbm.entity.item.EntityTNTPrimedBase;
import com.hbm.explosion.ExplosionNukeSmall; import com.hbm.explosion.ExplosionNukeSmall;
import com.hbm.world.biome.BiomeGenCraterBase;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
@ -16,6 +17,8 @@ public class BlockFissureBomb extends BlockTNTBase {
int range = 5; 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 i = -range; i <= range; i++) {
for(int j = -range; j <= range; j++) { for(int j = -range; j <= range; j++) {
for(int k = -range; k <= range; k++) { for(int k = -range; k <= range; k++) {
@ -27,7 +30,7 @@ public class BlockFissureBomb extends BlockTNTBase {
Block block = world.getBlock(a, b, c); Block block = world.getBlock(a, b, c);
if(block == ModBlocks.ore_bedrock) { 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) { } else if(block == ModBlocks.ore_bedrock_oil) {
world.setBlock(a, b, c, Blocks.bedrock); world.setBlock(a, b, c, Blocks.bedrock);
} }

View File

@ -4,169 +4,72 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ITooltipProvider;
import com.hbm.entity.mob.EntityTaintCrab; import com.hbm.entity.mob.EntityTaintCrab;
import com.hbm.entity.mob.EntityCreeperTainted; import com.hbm.entity.mob.EntityCreeperTainted;
import com.hbm.entity.mob.EntityTeslaCrab; import com.hbm.entity.mob.EntityTeslaCrab;
import com.hbm.potion.HbmPotion; import com.hbm.potion.HbmPotion;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockFalling;
import net.minecraft.block.material.MapColor; import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityFallingBlock;
import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.monster.EntityCreeper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionEffect;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class BlockTaint extends Block/*Container*/ { public class BlockTaint extends Block implements ITooltipProvider {
@SideOnly(Side.CLIENT) public BlockTaint(Material mat) {
private IIcon[] icons; super(mat);
this.setTickRandomly(true);
public BlockTaint(Material p_i45386_1_) {
super(p_i45386_1_);
this.setTickRandomly(true);
} }
/*@Override @Override public MapColor getMapColor(int meta) { return MapColor.grayColor; }
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { @Override public Item getItemDropped(int i, Random rand, int j) { return null; }
return new TileEntityTaint();
}*/
@SideOnly(Side.CLIENT)
public IIcon getIcon(int p_149691_1_, int meta)
{
return this.icons[meta % this.icons.length];
}
public int damageDropped(int meta)
{
return 0;
}
public static int func_150032_b(int p_150032_0_)
{
return func_150031_c(p_150032_0_);
}
public static int func_150031_c(int p_150031_0_)
{
return p_150031_0_ & 15;
}
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item p_149666_1_, CreativeTabs p_149666_2_, List p_149666_3_)
{
for (int i = 0; i < 16; ++i)
{
p_149666_3_.add(new ItemStack(p_149666_1_, 1, i));
}
}
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister p_149651_1_)
{
this.icons = new IIcon[16];
for (int i = 0; i < this.icons.length; ++i)
{
this.icons[i] = p_149651_1_.registerIcon("hbm:taint_" + i);
}
}
public MapColor getMapColor(int p_149728_1_)
{
return MapColor.purpleColor;
}
public static int renderID = RenderingRegistry.getNextAvailableRenderId();
@Override @Override
public int getRenderType(){ public void updateTick(World world, int x, int y, int z, Random rand) {
return renderID;
}
@Override int meta = world.getBlockMetadata(x, y, z);
public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) if(meta >= 15) return;
{
return null;
}
@Override for(int i = -3; i <= 3; i++) for(int j = -3; j <= 3; j++) for(int k = -3; k <= 3; k++) {
public boolean isOpaqueCube() { if(Math.abs(i) + Math.abs(j) + Math.abs(k) > 4) continue;
return false; if(rand.nextFloat() > 0.25F) continue;
Block b = world.getBlock(x + i, y + j, z + k);
if(b.isAir(world, x + i, y + j, z + k) || b == Blocks.bedrock) continue;
int targetMeta = meta + 1;
boolean hasAir = false;
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
if(world.getBlock(x + i + dir.offsetX, y + j + dir.offsetY, z + k + dir.offsetZ).isAir(world, x + i + dir.offsetX, y + j + dir.offsetY, z + k + dir.offsetZ)) {
hasAir = true;
break;
}
}
if(!hasAir) targetMeta = meta + 3;
if(targetMeta > 15) continue;
if(b == this && world.getBlockMetadata(x + i, y + j, z + k) >= targetMeta) continue;
world.setBlock(x + i, y + j, z + k, this, targetMeta, 3);
if(rand.nextFloat() < 0.25F && BlockFalling.func_149831_e(world, x + i, y + j - 1, z + k)) {
EntityFallingBlock falling = new EntityFallingBlock(world, x + i + 0.5, y + j + 0.5, z + k + 0.5, this, targetMeta);
world.spawnEntityInWorld(falling);
}
}
} }
@Override @Override
public boolean renderAsNormalBlock() { public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
return false; return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.75, z + 1);
}
public void onNeighborBlockChange(World world, int x, int y, int z, Block b)
{
if(!hasPosNeightbour(world, x, y, z) && !world.isRemote)
world.setBlockToAir(x, y, z);
}
public void updateTick(World world, int x, int y, int z, Random rand)
{
int meta = world.getBlockMetadata(x, y, z);
if(!world.isRemote && meta < 15) {
for(int i = 0; i < 15; i++) {
int a = rand.nextInt(11) + x - 5;
int b = rand.nextInt(11) + y - 5;
int c = rand.nextInt(11) + z - 5;
if(world.getBlock(a, b, c).isReplaceable(world, a, b, c) && hasPosNeightbour(world, a, b, c))
world.setBlock(a, b, c, ModBlocks.taint, meta + 1, 2);
}
for(int i = 0; i < 85; i++) {
int a = rand.nextInt(7) + x - 3;
int b = rand.nextInt(7) + y - 3;
int c = rand.nextInt(7) + z - 3;
if(world.getBlock(a, b, c).isReplaceable(world, a, b, c) && hasPosNeightbour(world, a, b, c))
world.setBlock(a, b, c, ModBlocks.taint, meta + 1, 2);
}
}
}
public static boolean hasPosNeightbour(World world, int x, int y, int z) {
Block b0 = world.getBlock(x + 1, y, z);
Block b1 = world.getBlock(x, y + 1, z);
Block b2 = world.getBlock(x, y, z + 1);
Block b3 = world.getBlock(x - 1, y, z);
Block b4 = world.getBlock(x, y - 1, z);
Block b5 = world.getBlock(x, y, z - 1);
boolean b = (b0.renderAsNormalBlock() && b0.getMaterial().isOpaque()) ||
(b1.renderAsNormalBlock() && b1.getMaterial().isOpaque()) ||
(b2.renderAsNormalBlock() && b2.getMaterial().isOpaque()) ||
(b3.renderAsNormalBlock() && b3.getMaterial().isOpaque()) ||
(b4.renderAsNormalBlock() && b4.getMaterial().isOpaque()) ||
(b5.renderAsNormalBlock() && b5.getMaterial().isOpaque());
return b;
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
{
return null;
}
@Override
public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
{
return AxisAlignedBB.getBoundingBox(par2, par3, par4, par2, par3, par4);
} }
@Override @Override
@ -175,35 +78,42 @@ public class BlockTaint extends Block/*Container*/ {
int meta = world.getBlockMetadata(x, y, z); int meta = world.getBlockMetadata(x, y, z);
int level = 15 - meta; int level = 15 - meta;
List<ItemStack> list = new ArrayList<ItemStack>(); entity.motionX *= 0.6;
PotionEffect effect = new PotionEffect(HbmPotion.taint.id, 15 * 20, level); entity.motionZ *= 0.6;
effect.setCurativeItems(list);
if(entity instanceof EntityLivingBase) { List<ItemStack> list = new ArrayList<ItemStack>();
if(world.rand.nextInt(50) == 0) { PotionEffect effect = new PotionEffect(HbmPotion.taint.id, 15 * 20, level);
((EntityLivingBase)entity).addPotionEffect(effect); effect.setCurativeItems(list);
}
}
if(entity != null && entity.getClass().equals(EntityCreeper.class)) { if(entity instanceof EntityLivingBase) {
EntityCreeperTainted creep = new EntityCreeperTainted(world); if(world.rand.nextInt(50) == 0) {
creep.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); ((EntityLivingBase) entity).addPotionEffect(effect);
}
}
if(!world.isRemote) { if(entity != null && entity.getClass().equals(EntityCreeper.class)) {
entity.setDead(); EntityCreeperTainted creep = new EntityCreeperTainted(world);
world.spawnEntityInWorld(creep); creep.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch);
}
}
if(entity instanceof EntityTeslaCrab) { if(!world.isRemote) {
EntityTaintCrab crab = new EntityTaintCrab(world); entity.setDead();
crab.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); world.spawnEntityInWorld(creep);
}
}
if(!world.isRemote) { if(entity instanceof EntityTeslaCrab) {
entity.setDead(); EntityTaintCrab crab = new EntityTaintCrab(world);
world.spawnEntityInWorld(crab); crab.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch);
}
} if(!world.isRemote) {
entity.setDead();
world.spawnEntityInWorld(crab);
}
}
} }
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
list.add("DO NOT TOUCH, BREATHE OR STARE AT.");
}
} }

View File

@ -9,7 +9,7 @@ import com.hbm.blocks.ModBlocks;
import com.hbm.entity.projectile.EntityShrapnel; import com.hbm.entity.projectile.EntityShrapnel;
import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT;
import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.explosion.ExplosionNT.ExAttrib;
import com.hbm.packet.PacketDispatcher; import com.hbm.handler.threading.PacketThreading;
import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.packet.toclient.AuxParticlePacketNT;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
@ -151,7 +151,7 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB
@Override @Override
public void writeToNBT(NBTTagCompound nbt) { public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt); super.writeToNBT(nbt);
nbt.setInteger("tier", this.volcanoTimer); nbt.setInteger("timer", this.volcanoTimer);
} }
private boolean shouldGrow() { private boolean shouldGrow() {
@ -283,7 +283,7 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB
NBTTagCompound dPart = new NBTTagCompound(); NBTTagCompound dPart = new NBTTagCompound();
dPart.setString("type", "vanillaExt"); dPart.setString("type", "vanillaExt");
dPart.setString("mode", "volcano"); dPart.setString("mode", "volcano");
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(dPart, xCoord + 0.5, yCoord + 10, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 10, zCoord + 0.5, 250)); PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(dPart, xCoord + 0.5, yCoord + 10, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 10, zCoord + 0.5, 250));
} }
} }
} }

View File

@ -1,7 +1,13 @@
package com.hbm.blocks.bomb; package com.hbm.blocks.bomb;
import com.hbm.explosion.ExplosionChaos; import com.hbm.explosion.vanillant.ExplosionVNT;
import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard;
import com.hbm.explosion.vanillant.standard.BlockProcessorStandard;
import com.hbm.explosion.vanillant.standard.EntityProcessorCrossSmooth;
import com.hbm.explosion.vanillant.standard.ExplosionEffectTiny;
import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard;
import com.hbm.interfaces.IBomb; import com.hbm.interfaces.IBomb;
import com.hbm.particle.helper.ExplosionCreator;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@ -17,9 +23,7 @@ public class BombFlameWar extends Block implements IBomb {
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
if(world.isBlockIndirectlyGettingPowered(x, y, z)) { if(world.isBlockIndirectlyGettingPowered(x, y, z)) {
ExplosionChaos.explode(world, x, y, z, 15); explode(world, x, y, z);
ExplosionChaos.spawnExplosion(world, x, y, z, 75);
ExplosionChaos.flameDeath(world, x, y, z, 100);
} }
} }
@ -27,9 +31,24 @@ public class BombFlameWar extends Block implements IBomb {
public BombReturnCode explode(World world, int x, int y, int z) { public BombReturnCode explode(World world, int x, int y, int z) {
if(!world.isRemote) { if(!world.isRemote) {
ExplosionChaos.explode(world, x, y, z, 15);
ExplosionChaos.spawnExplosion(world, x, y, z, 75); world.func_147480_a(x, y, z, false);
ExplosionChaos.flameDeath(world, x, y, z, 100);
for(int i = 0; i < 150; i++) {
ExplosionVNT vnt = new ExplosionVNT(world, x + world.rand.nextInt(51) - 25, y + world.rand.nextInt(11) - 5, z + world.rand.nextInt(51) - 25, 4, null);
vnt.setEntityProcessor(new EntityProcessorCrossSmooth(1, 25));
vnt.setPlayerProcessor(new PlayerProcessorStandard());
vnt.setSFX(new ExplosionEffectTiny());
vnt.explode();
}
ExplosionVNT xnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 15F);
xnt.setBlockAllocator(new BlockAllocatorStandard(32));
xnt.setBlockProcessor(new BlockProcessorStandard().setNoDrop());
xnt.setEntityProcessor(new EntityProcessorCrossSmooth(2, 200));
xnt.setPlayerProcessor(new PlayerProcessorStandard());
xnt.explode();
ExplosionCreator.composeEffectSmall(world, x + 0.5, y + 0.5, z + 0.5);
} }
return BombReturnCode.DETONATED; return BombReturnCode.DETONATED;

View File

@ -18,10 +18,12 @@ import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.entity.effect.EntityMist;
import com.hbm.explosion.ExplosionChaos; import com.hbm.explosion.ExplosionChaos;
import com.hbm.explosion.ExplosionLarge; import com.hbm.explosion.ExplosionLarge;
import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.explosion.ExplosionNukeGeneric;
import com.hbm.interfaces.IBomb; import com.hbm.interfaces.IBomb;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.main.MainRegistry; import com.hbm.main.MainRegistry;
import com.hbm.tileentity.bomb.TileEntityBombMulti; import com.hbm.tileentity.bomb.TileEntityBombMulti;
@ -169,7 +171,11 @@ public class BombMulti extends BlockContainer implements IBomb {
} }
if(gasCloud > 0) { if(gasCloud > 0) {
ExplosionChaos.spawnChlorine(world, x, y, z, gasCloud, gasCloud / 50, 0); EntityMist mist = new EntityMist(world);
mist.setType(Fluids.CHLORINE);
mist.setPosition(x + 0.5, y + 0.5, z + 0.5);
mist.setArea(gasCloud * 15F / 50F, gasCloud * 7.5F / 50F);
world.spawnEntityInWorld(mist);
} }
return BombReturnCode.DETONATED; return BombReturnCode.DETONATED;

View File

@ -69,7 +69,7 @@ public class ExplosiveCharge extends BlockDetonatable implements IBomb, IDetConn
} }
if(this == ModBlocks.det_nuke) { if(this == ModBlocks.det_nuke) {
world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.missileRadius, x + 0.5, y + 0.5, z + 0.5)); world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.missileRadius, x + 0.5, y + 0.5, z + 0.5));
EntityNukeTorex.statFac(world, x + 0.5, y + 0.5, z + 0.5, BombConfig.missileRadius); EntityNukeTorex.statFacStandard(world, x + 0.5, y + 0.5, z + 0.5, BombConfig.missileRadius);
} }
} }

View File

@ -3,26 +3,29 @@ package com.hbm.blocks.bomb;
import java.util.Random; import java.util.Random;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.config.ServerConfig;
import com.hbm.explosion.ExplosionLarge; import com.hbm.explosion.ExplosionLarge;
import com.hbm.explosion.ExplosionNukeSmall;
import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.ExplosionVNT;
import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard; import com.hbm.explosion.vanillant.standard.*;
import com.hbm.explosion.vanillant.standard.BlockProcessorStandard;
import com.hbm.explosion.vanillant.standard.EntityProcessorCrossSmooth;
import com.hbm.explosion.vanillant.standard.ExplosionEffectWeapon;
import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard;
import com.hbm.interfaces.IBomb; import com.hbm.interfaces.IBomb;
import com.hbm.items.ModItems; import com.hbm.items.ModItems;
import com.hbm.items.weapon.sedna.factory.XFactoryCatapult;
import com.hbm.main.MainRegistry;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.tileentity.bomb.TileEntityLandmine; import com.hbm.tileentity.bomb.TileEntityLandmine;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockFence; import net.minecraft.block.BlockFence;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
@ -61,8 +64,7 @@ public class Landmine extends BlockContainer implements IBomb {
if(this == ModBlocks.mine_ap) this.setBlockBounds(5 * f, 0.0F, 5 * f, 11 * f, 1 * f, 11 * f); if(this == ModBlocks.mine_ap) this.setBlockBounds(5 * f, 0.0F, 5 * f, 11 * f, 1 * f, 11 * f);
if(this == ModBlocks.mine_he) this.setBlockBounds(4 * f, 0.0F, 4 * f, 12 * f, 2 * f, 12 * f); if(this == ModBlocks.mine_he) this.setBlockBounds(4 * f, 0.0F, 4 * f, 12 * f, 2 * f, 12 * f);
if(this == ModBlocks.mine_shrap) this.setBlockBounds(5 * f, 0.0F, 5 * f, 11 * f, 1 * f, 11 * f); if(this == ModBlocks.mine_shrap) this.setBlockBounds(5 * f, 0.0F, 5 * f, 11 * f, 1 * f, 11 * f);
if(this == ModBlocks.mine_fat) this.setBlockBounds(5 * f, 0.0F, 4 * f, 11 * f, 6 * f, 12 * f); if(this == ModBlocks.mine_fat) this.setBlockBounds(5 * f, 0.0F, 4 * f, 11 * f, 6 * f, 12 * f);}
}
@Override @Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
@ -127,6 +129,18 @@ public class Landmine extends BlockContainer implements IBomb {
return false; return false;
} }
public boolean isWaterAbove(World world, int x, int y, int z) {
for(int xo = -1; xo <= 1; xo++) {
for(int zo = -1; zo <= 1; zo++) {
Block blockAbove = world.getBlock(x + xo, y + 1, z + zo);
if(blockAbove == Blocks.water || blockAbove == Blocks.flowing_water) {
return true;
}
}
}
return false;
}
@Override @Override
public BombReturnCode explode(World world, int x, int y, int z) { public BombReturnCode explode(World world, int x, int y, int z) {
@ -138,7 +152,7 @@ public class Landmine extends BlockContainer implements IBomb {
if(this == ModBlocks.mine_ap) { if(this == ModBlocks.mine_ap) {
ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 3F); ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 3F);
vnt.setEntityProcessor(new EntityProcessorCrossSmooth(0.5, 10F).setupPiercing(5F, 0.2F)); vnt.setEntityProcessor(new EntityProcessorCrossSmooth(0.5, ServerConfig.MINE_AP_DAMAGE.get()).setupPiercing(5F, 0.2F));
vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.setPlayerProcessor(new PlayerProcessorStandard());
vnt.setSFX(new ExplosionEffectWeapon(5, 1F, 0.5F)); vnt.setSFX(new ExplosionEffectWeapon(5, 1F, 0.5F));
vnt.explode(); vnt.explode();
@ -146,21 +160,52 @@ public class Landmine extends BlockContainer implements IBomb {
ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 4F); ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 4F);
vnt.setBlockAllocator(new BlockAllocatorStandard()); vnt.setBlockAllocator(new BlockAllocatorStandard());
vnt.setBlockProcessor(new BlockProcessorStandard()); vnt.setBlockProcessor(new BlockProcessorStandard());
vnt.setEntityProcessor(new EntityProcessorCrossSmooth(1, 35).setupPiercing(15F, 0.2F)); vnt.setEntityProcessor(new EntityProcessorCrossSmooth(1, ServerConfig.MINE_HE_DAMAGE.get()).setupPiercing(15F, 0.2F));
vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.setPlayerProcessor(new PlayerProcessorStandard());
vnt.setSFX(new ExplosionEffectWeapon(15, 3.5F, 1.25F)); vnt.setSFX(new ExplosionEffectWeapon(15, 3.5F, 1.25F));
vnt.explode(); vnt.explode();
} else if(this == ModBlocks.mine_shrap) { } else if(this == ModBlocks.mine_shrap) {
ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 3F); ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 3F);
vnt.setEntityProcessor(new EntityProcessorCrossSmooth(0.5, 7.5F)); vnt.setEntityProcessor(new EntityProcessorCrossSmooth(0.5, ServerConfig.MINE_SHRAP_DAMAGE.get()));
vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.setPlayerProcessor(new PlayerProcessorStandard());
vnt.setSFX(new ExplosionEffectWeapon(5, 1F, 0.5F)); vnt.setSFX(new ExplosionEffectWeapon(5, 1F, 0.5F));
vnt.explode(); vnt.explode();
ExplosionLarge.spawnShrapnelShower(world, x + 0.5, y + 0.5, z + 0.5, 0, 1D, 0, 45, 0.2D); ExplosionLarge.spawnShrapnelShower(world, x + 0.5, y + 0.5, z + 0.5, 0, 1D, 0, 45, 0.2D);
ExplosionLarge.spawnShrapnels(world, x + 0.5, y + 0.5, z + 0.5, 5); ExplosionLarge.spawnShrapnels(world, x + 0.5, y + 0.5, z + 0.5, 5);
} else if(this == ModBlocks.mine_naval) {
ExplosionVNT vnt = new ExplosionVNT(world, x + 5, y + 5, z + 5, 25F);
vnt.setBlockAllocator(new BlockAllocatorWater(32));
vnt.setBlockProcessor(new BlockProcessorStandard());
vnt.setEntityProcessor(new EntityProcessorCrossSmooth(0.5, ServerConfig.MINE_NAVAL_DAMAGE.get()).setupPiercing(5F, 0.2F));
vnt.setPlayerProcessor(new PlayerProcessorStandard());
vnt.setSFX(new ExplosionEffectWeapon(10, 1F, 0.5F));
vnt.explode();
ExplosionLarge.spawnParticlesRadial(world, x + 0.5, y + 2, z + 0.5, 30);
ExplosionLarge.spawnRubble(world,x + 0.5, y + 0.5, z + 0.5, 5 );
// Only spawn water effects if there's water above the mine
if (isWaterAbove(world, x, y, z)) {
ExplosionLarge.spawnFoam(world, x + 0.5, y + 0.5, z + 0.5, 60);
}
} else if(this == ModBlocks.mine_fat) { } else if(this == ModBlocks.mine_fat) {
ExplosionNukeSmall.explode(world, x + 0.5, y + 0.5, z + 0.5, ExplosionNukeSmall.PARAMS_MEDIUM);
ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 10);
vnt.setBlockAllocator(new BlockAllocatorStandard(64));
vnt.setBlockProcessor(new BlockProcessorStandard());
vnt.setEntityProcessor(new EntityProcessorCrossSmooth(2, ServerConfig.MINE_NUKE_DAMAGE.get()).withRangeMod(1.5F));
vnt.setPlayerProcessor(new PlayerProcessorStandard());
vnt.explode();
XFactoryCatapult.incrementRad(world, x, y, z, 1.5F);
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "muke");
data.setBoolean("balefire", MainRegistry.polaroidID == 11 || world.rand.nextInt(100) == 0);
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + 0.5, y + 0.5, z + 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 0.5, z + 0.5, 250));
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:weapon.mukeExplosion", 25.0F, 0.9F); // this has to be the single worst solution ever
} }
} }

View File

@ -3,16 +3,17 @@ package com.hbm.blocks.bomb;
import java.util.Random; import java.util.Random;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.config.BombConfig;
import com.hbm.entity.effect.EntityCloudFleija; import com.hbm.entity.effect.EntityCloudFleija;
import com.hbm.entity.effect.EntityCloudFleijaRainbow;
import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.effect.EntityNukeTorex;
import com.hbm.entity.grenade.EntityGrenadeZOMG;
import com.hbm.entity.logic.EntityBalefire; import com.hbm.entity.logic.EntityBalefire;
import com.hbm.entity.logic.EntityNukeExplosionMK3; import com.hbm.entity.logic.EntityNukeExplosionMK3;
import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.entity.logic.EntityNukeExplosionMK5;
import com.hbm.entity.projectile.EntityFallingNuke; import com.hbm.entity.projectile.EntityFallingNuke;
import com.hbm.explosion.ExplosionChaos;
import com.hbm.explosion.ExplosionLarge; import com.hbm.explosion.ExplosionLarge;
import com.hbm.interfaces.IBomb; import com.hbm.interfaces.IBomb;
import com.hbm.interfaces.NotableComments;
import com.hbm.main.MainRegistry; import com.hbm.main.MainRegistry;
import com.hbm.tileentity.bomb.TileEntityNukeCustom; import com.hbm.tileentity.bomb.TileEntityNukeCustom;
@ -30,10 +31,10 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper; import net.minecraft.util.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
// this entire class sucks ass
@NotableComments
public class NukeCustom extends BlockContainer implements IBomb { public class NukeCustom extends BlockContainer implements IBomb {
public TileEntityNukeCustom tetn = new TileEntityNukeCustom();
private static boolean keepInventory = false; private static boolean keepInventory = false;
private final static Random field_149933_a = new Random(); 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 maxAmat = 350;
public static final int maxSchrab = 250; 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) { 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); dirty = Math.min(dirty, 100);
@ -141,8 +143,23 @@ public class NukeCustom extends BlockContainer implements IBomb {
/// EUPHEMIUM /// /// EUPHEMIUM ///
if(euph > 0) { if(euph > 0) {
EntityGrenadeZOMG zomg = new EntityGrenadeZOMG(worldObj, xCoord, yCoord, zCoord); EntityNukeExplosionMK3 ex = new EntityNukeExplosionMK3(worldObj);
ExplosionChaos.zomgMeSinPi(worldObj, xCoord, yCoord, zCoord, 1000, null, zomg); 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 /// // SCHRABIDIUM ///
} else if(schrab > 0) { } else if(schrab > 0) {
@ -179,7 +196,7 @@ public class NukeCustom extends BlockContainer implements IBomb {
dirty *= 0.25F; dirty *= 0.25F;
worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, (int)hydro, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).moreFallout((int)dirty)); worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, (int)hydro, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).moreFallout((int)dirty));
EntityNukeTorex.statFac(worldObj, xCoord + 0.5, yCoord + 5, zCoord + 0.5, hydro); EntityNukeTorex.statFacStandard(worldObj, xCoord + 0.5, yCoord + 5, zCoord + 0.5, hydro);
/// NUCLEAR /// /// NUCLEAR ///
} else if(nuke > 0) { } else if(nuke > 0) {
@ -188,7 +205,7 @@ public class NukeCustom extends BlockContainer implements IBomb {
nuke = Math.min(nuke, maxNuke); nuke = Math.min(nuke, maxNuke);
worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, (int)nuke, xCoord + 0.5, yCoord + 5, zCoord + 0.5).moreFallout((int)dirty)); worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, (int)nuke, xCoord + 0.5, yCoord + 5, zCoord + 0.5).moreFallout((int)dirty));
EntityNukeTorex.statFac(worldObj, xCoord + 0.5, yCoord + 5, zCoord + 0.5, nuke); EntityNukeTorex.statFacStandard(worldObj, xCoord + 0.5, yCoord + 5, zCoord + 0.5, nuke);
/// NON-NUCLEAR /// /// NON-NUCLEAR ///
} else if(tnt >= 75) { } else if(tnt >= 75) {
@ -196,7 +213,7 @@ public class NukeCustom extends BlockContainer implements IBomb {
tnt = Math.min(tnt, maxTnt); tnt = Math.min(tnt, maxTnt);
worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(worldObj, (int)tnt, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5)); worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(worldObj, (int)tnt, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5));
EntityNukeTorex.statFac(worldObj, xCoord + 0.5, yCoord + 5, zCoord + 0.5, tnt); EntityNukeTorex.statFacStandard(worldObj, xCoord + 0.5, yCoord + 5, zCoord + 0.5, tnt);
} else if(tnt > 0) { } else if(tnt > 0) {
ExplosionLarge.explode(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, tnt, true, true, true); ExplosionLarge.explode(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, tnt, true, true, true);

View File

@ -131,7 +131,7 @@ public class NukeGadget extends BlockContainer implements IBomb {
world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F); world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F);
world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.gadgetRadius, x + 0.5, y + 0.5, z + 0.5)); world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.gadgetRadius, x + 0.5, y + 0.5, z + 0.5));
EntityNukeTorex.statFac(world, x + 0.5, y + 0.5, z + 0.5, BombConfig.gadgetRadius); EntityNukeTorex.statFacStandard(world, x + 0.5, y + 0.5, z + 0.5, BombConfig.gadgetRadius);
} }
return false; return false;

View File

@ -124,7 +124,7 @@ public class NukeMan extends BlockContainer implements IBomb {
world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F); world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F);
world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.manRadius, x + 0.5, y + 0.5, z + 0.5)); world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.manRadius, x + 0.5, y + 0.5, z + 0.5));
EntityNukeTorex.statFac(world, x + 0.5, y + 0.5, z + 0.5, BombConfig.manRadius); EntityNukeTorex.statFacStandard(world, x + 0.5, y + 0.5, z + 0.5, BombConfig.manRadius);
} }
return false; return false;

View File

@ -131,7 +131,7 @@ public class NukeMike extends BlockContainer implements IBomb {
world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F); world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F);
world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.mikeRadius, x + 0.5, y + 0.5, z + 0.5)); world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.mikeRadius, x + 0.5, y + 0.5, z + 0.5));
EntityNukeTorex.statFac(world, x + 0.5, y + 0.5, z + 0.5, BombConfig.mikeRadius); EntityNukeTorex.statFacStandard(world, x + 0.5, y + 0.5, z + 0.5, BombConfig.mikeRadius);
} }
return false; return false;

View File

@ -120,7 +120,7 @@ public class NukeN2 extends BlockContainer implements IBomb {
world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F); world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F);
world.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(world, r, x + 0.5, y + 0.5, z + 0.5)); world.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(world, r, x + 0.5, y + 0.5, z + 0.5));
EntityNukeTorex.statFac(world, x + 0.5, y + 0.5, z + 0.5, r); EntityNukeTorex.statFacStandard(world, x + 0.5, y + 0.5, z + 0.5, r);
} }
return false; return false;

View File

@ -129,7 +129,7 @@ public class NukeTsar extends BlockContainer implements IBomb {
tetn.clearSlots(); tetn.clearSlots();
world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F); world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F);
world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, r, x + 0.5, y + 0.5, z + 0.5)); world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, r, x + 0.5, y + 0.5, z + 0.5));
EntityNukeTorex.statFac(world, x + 0.5, y + 0.5, z + 0.5, r); EntityNukeTorex.statFacStandard(world, x + 0.5, y + 0.5, z + 0.5, r);
} }
return false; return false;

View File

@ -60,7 +60,14 @@ public class CoriumFinite extends GenericFiniteFluid {
@Override @Override
public void updateTick(World world, int x, int y, int z, Random rand) { 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) { 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 java.util.Random;
import com.hbm.blocks.BlockEnumMulti;
import com.hbm.blocks.IBlockMulti;
import com.hbm.handler.radiation.ChunkRadiationManager; 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.block.material.Material;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World; 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) { BASE(2.5F, "absorber"), RED(10F, "absorber_red"), GREEN(100F, "absorber_green"), PINK(10000F, "absorber_pink");
super(mat);
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); this.setTickRandomly(true);
absorb = ab; this.setBlockName("rad_absorber");
}
public EnumAbsorberTier getTier(int meta) {
return EnumAbsorberTier.values()[rectify(meta)];
} }
@Override @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; return 10;
} }
@Override @Override
public void updateTick(World world, int x, int y, int z, Random rand) { public void updateTick(World world, int x, int y, int z, Random rand) {
EnumAbsorberTier tier = getTier(world.getBlockMetadata(x, y, z));
ChunkRadiationManager.proxy.decrementRad(world, x, y, z, absorb); ChunkRadiationManager.proxy.decrementRad(world, x, y, z, tier.absorbAmount);
world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world)); world.scheduleBlockUpdate(x, y, z, this, tickRate(world));
} }
@Override
public void onBlockAdded(World world, int x, int y, int z) { public void onBlockAdded(World world, int x, int y, int z) {
super.onBlockAdded(world, x, y, z); super.onBlockAdded(world, x, y, z);
world.scheduleBlockUpdate(x, y, z, this, tickRate(world));
world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world));
} }
} }

View File

@ -0,0 +1,161 @@
package com.hbm.blocks.generic;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.opengl.GL11;
import com.hbm.lib.Library;
import com.hbm.render.block.ISBRHUniversal;
import com.hbm.render.util.RenderBlocksNT;
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.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockBarrier extends Block implements ISBRHUniversal {
public BlockBarrier(Material mat) {
super(mat);
}
@Override public int getRenderType() { return renderID; }
@Override public boolean isOpaqueCube() { return false; }
@Override public boolean renderAsNormalBlock() { return false; }
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
if(world.getBlockMetadata(x, y, z) != 0) return;
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);
}
@Override
public int onBlockPlaced(World world, int x, int y, int z, int side, float fX, float fY, float fZ, int meta) {
return side >= 2 && side <= 5 ? side : meta;
}
@Override
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {
int meta = world.getBlockMetadata(x, y, z);
setBlockBounds(0, 0, 0, 1, 1, 1);
if(meta == Library.POS_X.ordinal()) setBlockBounds(0, 0, 0, 0.125F, 1, 1);
if(meta == Library.POS_Z.ordinal()) setBlockBounds(0, 0, 0, 1, 1, 0.125F);
if(meta == Library.NEG_X.ordinal()) setBlockBounds(0.875F, 0, 0, 1, 1, 1);
if(meta == Library.NEG_Z.ordinal()) setBlockBounds(0, 0, 0.875F, 1, 1, 1);
}
@Override
public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB aabb, List list, Entity collider) {
int meta = world.getBlockMetadata(x, y, z);
List<AxisAlignedBB> bbs = new ArrayList();
Block nx = world.getBlock(x - 1, y, z);
Block px = world.getBlock(x + 1, y, z);
Block nz = world.getBlock(x, y, z - 1);
Block pz = world.getBlock(x, y, z + 1);
if(nx.isOpaqueCube() || nx.isNormalCube() || meta == Library.POS_X.ordinal()) bbs.add(AxisAlignedBB.getBoundingBox(x, y, z, x + 0.125, y + 1, z + 1));
if(nz.isOpaqueCube() || nz.isNormalCube() || meta == Library.POS_Z.ordinal()) bbs.add(AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 0.125));
if(px.isOpaqueCube() || px.isNormalCube() || meta == Library.NEG_X.ordinal()) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.875, y, z, x + 1, y + 1, z + 1));
if(pz.isOpaqueCube() || pz.isNormalCube() || meta == Library.NEG_Z.ordinal()) bbs.add(AxisAlignedBB.getBoundingBox(x, y, z + 0.875, x + 1, y + 1, z + 1));
for(AxisAlignedBB bb : bbs) {
if(aabb.intersectsWith(bb)) {
list.add(bb);
}
}
}
@Override
@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) {
return true;
}
@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);
renderer.setRenderBounds(0.4375, 0D, 0.4375D, 0.5625D, 1D, 0.5625D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0.5D, 0.0625D, 0D, 0.5625D, 0.4725, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer);
renderer.setRenderBounds(0.5D, 0.5625D, 0D, 0.5625D, 0.9375, 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);
int meta = world.getBlockMetadata(x, y, z);
Block nx = world.getBlock(x - 1, y, z);
Block px = world.getBlock(x + 1, y, z);
Block nz = world.getBlock(x, y, z - 1);
Block pz = world.getBlock(x, y, z + 1);
Block py = world.getBlock(x, y + 1, z);
boolean negX = nx.isOpaqueCube() || nx.isNormalCube() || meta == Library.POS_X.ordinal();
boolean negZ = nz.isOpaqueCube() || nz.isNormalCube() || meta == Library.POS_Z.ordinal();
boolean posX = px.isOpaqueCube() || px.isNormalCube() || meta == Library.NEG_X.ordinal();
boolean posZ = pz.isOpaqueCube() || pz.isNormalCube() || meta == Library.NEG_Z.ordinal();
boolean posY = py.isOpaqueCube() || py.isNormalCube();
if(negX) {
renderer.setRenderBounds(0D, 0D, 0.4375D, 0.125D, 1D, 0.5625D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0D, 0.0625D, negZ ? 0.125D : 0D, 0.0625D, 0.4375D, posZ ? 0.875D : 1D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0D, 0.5625D, negZ ? 0.125D : 0D, 0.0625D, 0.9375D, posZ ? 0.875D : 1D); renderer.renderStandardBlock(block, x, y, z);
}
if(negZ) {
renderer.setRenderBounds(0.4375D, 0D, 0D, 0.5625D, 1D, 0.125D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(negX ? 0.125D : 0D, 0.0625D, 0D, posX ? 0.875D : 1D, 0.4375D, 0.0625D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(negX ? 0.125D : 0D, 0.5625D, 0D, posX ? 0.875D : 1D, 0.9375D, 0.0625D); renderer.renderStandardBlock(block, x, y, z);
}
if(posX) {
renderer.setRenderBounds(0.875D, 0D, 0.4375D, 1D, 1D, 0.5625D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.9375D, 0.0625D, negZ ? 0.125D : 0D, 1D, 0.4375D, posZ ? 0.875D : 1D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.9375D, 0.5625D, negZ ? 0.125D : 0D, 1D, 0.9375D, posZ ? 0.875D : 1D); renderer.renderStandardBlock(block, x, y, z);
}
if(posZ) {
renderer.setRenderBounds(0.4375D, 0D, 0.875D, 0.5625D, 1D, 1D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(negX ? 0.125D : 0D, 0.0625D, 0.9375D, posX ? 0.875D : 1D, 0.4375D, 1D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(negX ? 0.125D : 0D, 0.5625D, 0.9375D, posX ? 0.875D : 1D, 0.9375D, 1D); renderer.renderStandardBlock(block, x, y, z);
}
if(posY) {
renderer.setRenderBounds(0D, 0.875D, 0D, 0.125D, 0.9375D, 1D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.875D, 0.875D, 0D, 1D, 0.9375D, 1D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0D, 0.9375D, 0.0625D, 1D, 1D, 0.4375D); renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0D, 0.9375D, 0.5625D, 1D, 1D, 0.9375D); renderer.renderStandardBlock(block, x, y, z);
}
return true;
}
}

View File

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

View File

@ -4,6 +4,9 @@ import com.hbm.inventory.gui.GUIScreenBobble;
import com.hbm.items.special.ItemPlasticScrap.ScrapType; import com.hbm.items.special.ItemPlasticScrap.ScrapType;
import com.hbm.main.MainRegistry; import com.hbm.main.MainRegistry;
import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IGUIProvider;
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.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
@ -31,7 +34,7 @@ import net.minecraft.world.World;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
public class BlockBobble extends BlockContainer implements IGUIProvider { public class BlockBobble extends BlockContainer implements IGUIProvider, INBTBlockTransformable {
public BlockBobble() { public BlockBobble() {
super(Material.iron); super(Material.iron);
@ -136,12 +139,17 @@ public class BlockBobble extends BlockContainer implements IGUIProvider {
return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); 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 (meta + coordBaseMode * 4) % 16;
}
@Override @Override
public TileEntity createNewTileEntity(World world, int meta) { public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityBobble(); return new TileEntityBobble();
} }
public static class TileEntityBobble extends TileEntity { public static class TileEntityBobble extends TileEntity implements INBTTileEntityTransformable {
public BobbleType type = BobbleType.NONE; public BobbleType type = BobbleType.NONE;
@ -173,6 +181,11 @@ public class BlockBobble extends BlockContainer implements IGUIProvider {
super.writeToNBT(nbt); super.writeToNBT(nbt);
nbt.setByte("type", (byte) type.ordinal()); nbt.setByte("type", (byte) type.ordinal());
} }
@Override
public void transformTE(World world, int coordBaseMode) {
type = BobbleType.values()[world.rand.nextInt(BobbleType.values().length - 1) + 1];
}
} }
public static enum BobbleType { public static enum BobbleType {
@ -185,7 +198,7 @@ public class BlockBobble extends BlockContainer implements IGUIProvider {
INTELLIGENCE( "Intelligence", "Intelligence", null, "It takes the smartest individuals to realize$there's always more to learn.", false, ScrapType.BRIDGE_BUS), 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), 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), 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), 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), 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), VT( "VT-6/24", "VT-6/24", "Balefire warhead model and general texturework", "You cannot unfuck a horse.", true, ScrapType.CPU_EXT),
@ -198,9 +211,10 @@ public class BlockBobble extends BlockContainer implements IGUIProvider {
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), 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), 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), 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), 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", "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 name; //the title of the tooltip
public String label; //the name engraved in the socket 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.lib.RefStrings;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
@ -20,7 +21,7 @@ import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
public class BlockChain extends Block { public class BlockChain extends Block implements INBTBlockTransformable {
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
private IIcon iconEnd; private IIcon iconEnd;
@ -201,4 +202,12 @@ public class BlockChain extends Block {
super.onNeighborBlockChange(world, x, y, z, 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; package com.hbm.blocks.generic;
import java.util.List;
import java.util.Random; import java.util.Random;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.items.ModItems; 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.Block;
import net.minecraft.block.material.Material; 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.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) { public BlockCluster(Material mat) {
super(mat); super(mat);
@ -28,32 +17,7 @@ public class BlockCluster extends Block implements IDrillInteraction, ITooltipPr
@Override @Override
public Item getItemDropped(int i, Random rand, int j) { public Item getItemDropped(int i, Random rand, int j) {
return null; return getDrop();
}
@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);
}
} }
private Item getDrop() { private Item getDrop() {
@ -65,24 +29,4 @@ public class BlockCluster extends Block implements IDrillInteraction, ITooltipPr
return null; 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 java.util.Random;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.interfaces.Spaghetti;
import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret;
import com.hbm.items.ModItems; import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemBatteryPack.EnumBatteryPack;
import net.minecraft.block.BlockFalling; import net.minecraft.block.BlockFalling;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@ -16,6 +18,7 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.World; 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 { public class BlockCrate extends BlockFalling {
List<ItemStack> crateList; List<ItemStack> crateList;
@ -69,22 +72,16 @@ public class BlockCrate extends BlockFalling {
// Lead Crate // Lead Crate
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_uranium, 10); 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_u238, 8);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_plutonium, 7); 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_pu240, 6);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_neptunium, 7); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_neptunium, 7);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_uranium_fuel, 8); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_uranium_fuel, 8);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_plutonium_fuel, 7); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_plutonium_fuel, 7);
BlockCrate.addToListWithWeight(leadList, ModItems.ingot_mox_fuel, 6); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_mox_fuel, 6);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_uranium, 10); 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_u238, 8);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_plutonium, 7); 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_pu240, 6);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_neptunium, 7); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_neptunium, 7);
BlockCrate.addToListWithWeight(leadList, ModItems.nugget_uranium_fuel, 8); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_uranium_fuel, 8);
@ -96,29 +93,25 @@ public class BlockCrate extends BlockFalling {
BlockCrate.addToListWithWeight(leadList, ModItems.cell_puf6, 8); BlockCrate.addToListWithWeight(leadList, ModItems.cell_puf6, 8);
BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg, 6); BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg, 6);
BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg_weak, 7); BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg_weak, 7);
BlockCrate.addToListWithWeight(leadList, ModItems.tritium_deuterium_cake, 5);
BlockCrate.addToListWithWeight(leadList, ModItems.powder_yellowcake, 10); BlockCrate.addToListWithWeight(leadList, ModItems.powder_yellowcake, 10);
// Metal Crate // Metal Crate
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_press), 10); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_press), 10);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_difurnace_off), 9); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_difurnace_off), 9);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_reactor_breeding), 6); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_reactor_breeding), 6);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_nuke_furnace_off), 7);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_wood_burner), 10); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_wood_burner), 10);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_diesel), 8); 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.machine_rtg_grey), 4);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.red_pylon), 9); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.red_pylon), 9);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_battery), 8); BlockCrate.addToListWithWeight(metalList, new ItemStack(ModItems.battery_pack, 1, EnumBatteryPack.BATTERY_LEAD.ordinal()), 10);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_lithium_battery), 5);
BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 8); 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, Item.getItemFromBlock(ModBlocks.machine_fluidtank), 7);
BlockCrate.addToListWithWeight(metalList, ModItems.centrifuge_element, 6); BlockCrate.addToListWithWeight(metalList, ModItems.centrifuge_element, 6);
BlockCrate.addToListWithWeight(metalList, ModItems.motor, 8); BlockCrate.addToListWithWeight(metalList, ModItems.motor, 8);
BlockCrate.addToListWithWeight(metalList, ModItems.coil_tungsten, 7); BlockCrate.addToListWithWeight(metalList, ModItems.coil_tungsten, 7);
BlockCrate.addToListWithWeight(metalList, ModItems.photo_panel, 3); BlockCrate.addToListWithWeight(metalList, ModItems.photo_panel, 3);
BlockCrate.addToListWithWeight(metalList, ModItems.coil_copper, 10); 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.blade_titanium, 3);
BlockCrate.addToListWithWeight(metalList, ModItems.piston_selenium, 6); BlockCrate.addToListWithWeight(metalList, ModItems.piston_selenium, 6);

View File

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

View File

@ -1,17 +1,19 @@
package com.hbm.blocks.generic; package com.hbm.blocks.generic;
import com.hbm.blocks.ModBlocks;
import com.hbm.render.block.ct.CT; import com.hbm.render.block.ct.CT;
import com.hbm.render.block.ct.CTStitchReceiver; import com.hbm.render.block.ct.CTStitchReceiver;
import com.hbm.render.block.ct.IBlockCT; import com.hbm.render.block.ct.IBlockCT;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
public class BlockDecoCT extends BlockOre implements IBlockCT{ public class BlockDecoCT extends BlockOre implements IBlockCT {
public BlockDecoCT(Material mat) { public BlockDecoCT(Material mat) {
super(mat); super(mat);
@ -35,4 +37,12 @@ public class BlockDecoCT extends BlockOre implements IBlockCT{
public IIcon[] getFragments(IBlockAccess world, int x, int y, int z) { public IIcon[] getFragments(IBlockAccess world, int x, int y, int z) {
return rec.fragCache; return rec.fragCache;
} }
@Override
public boolean canConnect(IBlockAccess world, int x, int y, int z, Block block) {
// i don't care
if(this == ModBlocks.deco_steel && block == ModBlocks.deco_rusty_steel) return true;
if(this == ModBlocks.deco_rusty_steel && block == ModBlocks.deco_steel) return true;
return this == block;
}
} }

View File

@ -1,6 +1,7 @@
package com.hbm.blocks.generic; package com.hbm.blocks.generic;
import com.hbm.blocks.BlockEnumMulti; import com.hbm.blocks.BlockEnumMulti;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@ -11,7 +12,7 @@ import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
public class BlockDecoModel extends BlockEnumMulti { public class BlockDecoModel extends BlockEnumMulti implements INBTBlockTransformable {
public BlockDecoModel(Material mat, Class<? extends Enum> theEnum, boolean multiName, boolean multiTexture) { public BlockDecoModel(Material mat, Class<? extends Enum> theEnum, boolean multiName, boolean multiTexture) {
super(mat, theEnum, multiName, multiTexture); super(mat, theEnum, multiName, multiTexture);
@ -104,4 +105,34 @@ public class BlockDecoModel extends BlockEnumMulti {
this.setBlockBoundsBasedOnState(world, x, y, z); 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); 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) {
if(coordBaseMode == 0) return meta;
//N: 0b00, S: 0b01, W: 0b10, E: 0b11
int rot = meta >> 2;
int type = meta & 3;
switch(coordBaseMode) {
default: //South
break;
case 1: //West
if((rot & 3) < 2) //N & S can just have bits toggled
rot = rot ^ 3;
else //W & E can just have first bit set to 0
rot = rot ^ 2;
break;
case 2: //North
rot = rot ^ 1; //N, W, E & S can just have first bit toggled
break;
case 3: //East
if((rot & 3) < 2)//N & S can just have second bit set to 1
rot = rot ^ 2;
else //W & E can just have bits toggled
rot = rot ^ 3;
break;
}
//genuinely like. why did i do that
return (rot << 2) | type; //To accommodate for BlockDecoModel's shift in the rotation bits; otherwise, simply bit-shift right and or any non-rotation meta after
}
} }

View File

@ -2,6 +2,7 @@ package com.hbm.blocks.generic;
import com.hbm.blocks.BlockMulti; import com.hbm.blocks.BlockMulti;
import com.hbm.lib.RefStrings; import com.hbm.lib.RefStrings;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
@ -16,7 +17,7 @@ import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
public class BlockDecoToaster extends BlockMulti { public class BlockDecoToaster extends BlockMulti implements INBTBlockTransformable {
protected String[] variants = new String[] {"toaster_iron", "toaster_steel", "toaster_wood"}; protected String[] variants = new String[] {"toaster_iron", "toaster_steel", "toaster_wood"};
@SideOnly(Side.CLIENT) protected IIcon[] icons; @SideOnly(Side.CLIENT) protected IIcon[] icons;
@ -90,4 +91,10 @@ public class BlockDecoToaster extends BlockMulti {
this.setBlockBoundsBasedOnState(world, x, y, z); 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); 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.transformMetaDecoModel(meta, coordBaseMode);
}
} }

View File

@ -3,7 +3,7 @@ package com.hbm.blocks.generic;
import java.util.List; import java.util.List;
import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ITooltipProvider;
import com.hbm.util.I18nUtil; import com.hbm.util.i18n.I18nUtil;
import api.hbm.item.IDepthRockTool; import api.hbm.item.IDepthRockTool;
import net.minecraft.block.Block; 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.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
@ -92,7 +94,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb {
@Override @Override
public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB entityBox, List collidingBoxes, Entity entityIn) { 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( box = AxisAlignedBB.getBoundingBox(
Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), 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)); 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 @Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { 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; if(aabb.minX == aabb.maxX && aabb.minY == aabb.maxY && aabb.minZ == aabb.maxZ) return null;
return aabb; 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 @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 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 return hasExtra(world.getBlockMetadata(x, y, z)); //if it's open
@ -140,11 +158,11 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb {
@Override @Override
public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { 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); //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); int meta = world.getBlockMetadata(x, y, z);
TileEntity te = world.getTileEntity(x, y, z); TileEntity te = world.getTileEntity(x, y, z);
int[] core = this.findCore(world, 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]); TileEntity te2 = world.getTileEntity(core[0], core[1], core[2]);
ForgeDirection dir = ForgeDirection.getOrientation(te2.getBlockMetadata() - BlockDummyable.offset); 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)); 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){ 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); 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

@ -4,7 +4,7 @@ import java.awt.Color;
import java.util.List; import java.util.List;
import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ITooltipProvider;
import com.hbm.packet.PacketDispatcher; import com.hbm.handler.threading.PacketThreading;
import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.packet.toclient.AuxParticlePacketNT;
import api.hbm.block.IToolable; import api.hbm.block.IToolable;
@ -169,7 +169,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP
data.setFloat("yaw", 90); data.setFloat("yaw", 90);
} }
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z),
new TargetPoint(worldObj.provider.dimensionId, x, y, z, 100)); new TargetPoint(worldObj.provider.dimensionId, x, y, z, 100));
color = prevColor; color = prevColor;

View File

@ -2,21 +2,28 @@ package com.hbm.blocks.generic;
import java.util.Random; import java.util.Random;
import api.hbm.fluid.IFluidStandardSender;
import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.IBlockMultiPass;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.lib.RefStrings; import com.hbm.lib.RefStrings;
import com.hbm.render.block.RenderBlockMultipass; import com.hbm.render.block.RenderBlockMultipass;
import com.hbm.tileentity.TileEntityLoadedBase;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; 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.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class BlockFissure extends Block implements IBlockMultiPass { public class BlockFissure extends BlockContainer implements IBlockMultiPass {
private IIcon overlay; private IIcon overlay;
@ -48,7 +55,8 @@ public class BlockFissure extends Block implements IBlockMultiPass {
@Override @Override
public void updateTick(World world, int x, int y, int z, Random rand) { 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 @Override
@ -65,4 +73,31 @@ public class BlockFissure extends Block implements IBlockMultiPass {
public int getRenderType(){ public int getRenderType(){
return IBlockMultiPass.getRenderType(); return IBlockMultiPass.getRenderType();
} }
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
return new TileEntityFissure();
}
public static class TileEntityFissure extends TileEntityLoadedBase implements IFluidStandardSender {
public FluidTank lava = new FluidTank(Fluids.LAVA, 1_000);
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
lava.setFill(1_000);
this.sendFluid(lava, worldObj, xCoord, yCoord + 1, zCoord, ForgeDirection.UP);
}
}
@Override
public boolean canConnect(FluidType type, ForgeDirection dir) {
return dir == ForgeDirection.DOWN && type == Fluids.LAVA;
}
@Override public FluidTank[] getAllTanks() { return new FluidTank[] {lava}; }
@Override public FluidTank[] getSendingTanks() { return new FluidTank[] {lava}; }
}
} }

View File

@ -18,6 +18,6 @@ public class BlockGenericStairs extends BlockStairs {
recipeGen.add(new Object[] {block, meta, this}); recipeGen.add(new Object[] {block, meta, this});
this.setBlockTextureName(RefStrings.MODID + ":concrete_smooth"); this.setBlockTextureName(RefStrings.MODID + ":concrete");
} }
} }

View File

@ -5,7 +5,7 @@ import java.util.List;
import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ITooltipProvider;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.lib.RefStrings; 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.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;

View File

@ -53,7 +53,7 @@ public class BlockLanternBehemoth extends BlockDummyable implements IToolable, I
if(didRepair) { if(didRepair) {
HbmPlayerProps data = HbmPlayerProps.getData(player); HbmPlayerProps data = HbmPlayerProps.getData(player);
data.reputation++; if(data.reputation < 25) data.reputation++;
} }
return didRepair; return didRepair;

View File

@ -0,0 +1,39 @@
package com.hbm.blocks.generic;
import com.hbm.blocks.BlockEnumMulti;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.util.IIcon;
public class BlockLightstone extends BlockEnumMulti {
public BlockLightstone(Material mat, Class<? extends Enum> theEnum, boolean multiName, boolean multiTexture) {
super(mat, theEnum, multiName, multiTexture);
}
protected IIcon[] topIcons;
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister reg) {
Enum[] enums = theEnum.getEnumConstants();
this.icons = new IIcon[enums.length];
this.topIcons = new IIcon[enums.length];
for(int i = 0; i < icons.length; i++) {
Enum num = enums[i];
this.icons[i] = reg.registerIcon(this.getTextureMultiName(num));
if(i >= 3) this.topIcons[i] = reg.registerIcon(this.getTextureMultiName(num) + ".top");
}
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta) {
return (side == 0 || side == 1) && this.topIcons[meta % this.icons.length] != null ? this.topIcons[meta % this.icons.length] : this.icons[meta % this.icons.length];
}
}

View File

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

View File

@ -35,11 +35,15 @@ public class BlockMultiSlab extends BlockSlab implements IStepTickReceiver {
if(single == null) { if(single == null) {
for(int i = 0; i < slabMaterials.length; i++) { for(int i = 0; i < slabMaterials.length; i++) {
recipeGen.add(new Object[] {slabMaterials[i], this, i}); recipeGen.add(new Object[] {slabMaterials[i], 0, this, i});
} }
} }
this.setBlockTextureName(RefStrings.MODID + ":concrete_smooth"); this.setBlockTextureName(RefStrings.MODID + ":concrete");
}
public BlockMultiSlab(boolean b, Material mat) {
super(b, mat);
} }
@Override @Override
@ -60,7 +64,8 @@ public class BlockMultiSlab extends BlockSlab implements IStepTickReceiver {
return new ItemStack(Item.getItemFromBlock(single != null ? single : this), 2, (meta & 7) % slabMaterials.length); return new ItemStack(Item.getItemFromBlock(single != null ? single : this), 2, (meta & 7) % slabMaterials.length);
} }
@SideOnly(Side.CLIENT) @Override
@SideOnly(Side.CLIENT)
public Item getItem(World world, int x, int y, int z) { public Item getItem(World world, int x, int y, int z) {
return Item.getItemFromBlock(single != null ? single : this); return Item.getItemFromBlock(single != null ? single : this);
} }
@ -77,6 +82,7 @@ public class BlockMultiSlab extends BlockSlab implements IStepTickReceiver {
return (super.getDamageValue(world, x, y, z) & 7) % slabMaterials.length; return (super.getDamageValue(world, x, y, z) & 7) % slabMaterials.length;
} }
@Override
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs tab, List list) { public void getSubBlocks(Item item, CreativeTabs tab, List list) {

View File

@ -0,0 +1,48 @@
package com.hbm.blocks.generic;
import com.hbm.lib.RefStrings;
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.util.IIcon;
public class BlockMultiSlabMeta extends BlockMultiSlab {
public int[] metas;
public BlockMultiSlabMeta(Block single, Material mat, Block[] slabMaterials, int...metas) {
super(single != null, mat);
this.single = single;
this.slabMaterials = slabMaterials;
this.metas = new int[slabMaterials.length]; //initialized to 0s
for(int i = 0; i < metas.length; i++) {
this.metas[i] = metas[i];
}
this.useNeighborBrightness = true;
if(single == null) {
for(int i = 0; i < slabMaterials.length; i++) {
recipeGen.add(new Object[] {slabMaterials[i], metas[i], this, i});
}
}
this.setBlockTextureName(RefStrings.MODID + ":concrete");
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta) {
meta = (meta & 7) % slabMaterials.length;
Block block = slabMaterials[meta];
return block.getIcon(side, metas[meta]);
}
@Override
public String func_150002_b(int meta) {
meta = (meta & 7) % slabMaterials.length;
return super.func_150002_b(meta) + "." + metas[meta];
}
}

View File

@ -9,6 +9,8 @@ import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.generic.BlockDeadPlant.EnumDeadPlantType; import com.hbm.blocks.generic.BlockDeadPlant.EnumDeadPlantType;
import com.hbm.blocks.generic.BlockTallPlant.EnumTallFlower; import com.hbm.blocks.generic.BlockTallPlant.EnumTallFlower;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.IGrowable; import net.minecraft.block.IGrowable;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@ -16,6 +18,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.ColorizerGrass;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.EnumPlantType; import net.minecraftforge.common.EnumPlantType;
@ -199,6 +202,43 @@ public class BlockNTMFlower extends BlockEnumMulti implements IPlantable, IGrowa
this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
} }
@SideOnly(Side.CLIENT)
public int getRenderColor(int meta)
{
if (meta == 1 || meta == 3) {
return ColorizerGrass.getGrassColor(0.5D, 1.0D);
} else return 0xFFFFFF;
}
// if you need to make another tinted plant just throw the metadata value
// into the if statements above and below i really do not want to make this more
// complicated than it needs to be
@SideOnly(Side.CLIENT)
public int colorMultiplier(IBlockAccess world, int x, int y, int z)
{
int l = 0;
int i1 = 0;
int j1 = 0;
for (int k1 = -1; k1 <= 1; ++k1)
{
for (int l1 = -1; l1 <= 1; ++l1)
{
int i2 = world.getBiomeGenForCoords(x + l1, z + k1).getBiomeFoliageColor(x + l1, y, z + k1);
l += (i2 & 16711680) >> 16;
i1 += (i2 & 65280) >> 8;
j1 += i2 & 255;
}
}
int meta = world.getBlockMetadata(x, y, z);
if (meta == 1 || meta == 3) {
return ((l / 9 & 255) << 16 | (i1 / 9 & 255) << 8 | j1 / 9 & 255);
} else return 0xFFFFFF;
}
@Override @Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { } public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { }
} }

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) { if(this == ModBlocks.ore_nether_fire) {
return rand.nextInt(10) == 0 ? ModItems.ingot_phosphorus : ModItems.powder_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) { if(this == ModBlocks.block_meteor_cobble) {
return ModItems.fragment_meteorite; return ModItems.fragment_meteorite;
} }

View File

@ -7,6 +7,7 @@ import java.util.Random;
import com.hbm.blocks.BlockEnumMulti; import com.hbm.blocks.BlockEnumMulti;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.items.ModItems; import com.hbm.items.ModItems;
import com.hbm.util.EnumUtil;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
@ -29,11 +30,18 @@ public class BlockOreBasalt extends BlockEnumMulti {
} }
public static enum EnumBasaltOreType { public static enum EnumBasaltOreType {
SULFUR, SULFUR(ModItems.sulfur),
FLUORITE, FLUORITE(ModItems.fluorite),
ASBESTOS, ASBESTOS(ModItems.ingot_asbestos),
GEM, GEM(ModItems.gem_volcanic),
MOLYSITE MOLYSITE(ModItems.powder_molysite);
public Item drop;
private EnumBasaltOreType(Item drop) {
this.drop = drop;
if(drop == null) throw new IllegalStateException("EnumBasaltOreType initialized before ModItems!");
}
} }
public String getTextureMultiName(Enum num) { public String getTextureMultiName(Enum num) {
@ -46,12 +54,8 @@ public class BlockOreBasalt extends BlockEnumMulti {
@Override @Override
public Item getItemDropped(int meta, Random rand, int fortune) { public Item getItemDropped(int meta, Random rand, int fortune) {
if(meta == EnumBasaltOreType.SULFUR.ordinal()) return ModItems.sulfur; EnumBasaltOreType type = EnumUtil.grabEnumSafely(EnumBasaltOreType.class, meta);
if(meta == EnumBasaltOreType.FLUORITE.ordinal()) return ModItems.fluorite; return type.drop;
if(meta == EnumBasaltOreType.ASBESTOS.ordinal()) return ModItems.ingot_asbestos;
if(meta == EnumBasaltOreType.GEM.ordinal()) return ModItems.gem_volcanic;
if(meta == EnumBasaltOreType.MOLYSITE.ordinal()) return ModItems.powder_molysite;
return super.getItemDropped(meta, rand, fortune);
} }
@Override @Override

View File

@ -50,7 +50,7 @@ public class BlockOutgas extends BlockOre {
if(this == ModBlocks.ancient_scrap) if(this == ModBlocks.ancient_scrap)
return ModBlocks.gas_radon_tomb; 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; return ModBlocks.gas_monoxide;
} }

View File

@ -1,8 +1,12 @@
package com.hbm.blocks.generic; package com.hbm.blocks.generic;
import java.util.List;
import com.hbm.extprop.HbmPlayerProps;
import com.hbm.inventory.recipes.PedestalRecipes; import com.hbm.inventory.recipes.PedestalRecipes;
import com.hbm.inventory.recipes.PedestalRecipes.PedestalRecipe; import com.hbm.inventory.recipes.PedestalRecipes.PedestalRecipe;
import com.hbm.lib.RefStrings; import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.particle.helper.ExplosionSmallCreator; import com.hbm.particle.helper.ExplosionSmallCreator;
import com.hbm.util.Compat; import com.hbm.util.Compat;
@ -21,6 +25,7 @@ import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -54,41 +59,26 @@ public class BlockPedestal extends BlockContainer {
public static int renderID = RenderingRegistry.getNextAvailableRenderId(); public static int renderID = RenderingRegistry.getNextAvailableRenderId();
@Override @Override public int getRenderType() { return renderID; }
public int getRenderType() { @Override public boolean isOpaqueCube() { return false; }
return renderID; @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 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 @Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { 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;
if(player.isSneaking()) return false; if(player.isSneaking()) return false;
TileEntityPedestal pedestal = (TileEntityPedestal) world.getTileEntity(x, y, z); TileEntityPedestal pedestal = (TileEntityPedestal) world.getTileEntity(x, y, z);
if(pedestal.item == null && player.getHeldItem() != null) { if(pedestal.item == null && player.getHeldItem() != null) {
if(world.isRemote) return true;
pedestal.item = player.getHeldItem().copy(); pedestal.item = player.getHeldItem().copy();
player.inventory.mainInventory[player.inventory.currentItem] = null; player.inventory.mainInventory[player.inventory.currentItem] = null;
pedestal.markDirty(); pedestal.markDirty();
world.markBlockForUpdate(x, y, z); world.markBlockForUpdate(x, y, z);
return true; return true;
} else if(pedestal.item != null && player.getHeldItem() == null) { } else if(pedestal.item != null && player.getHeldItem() == null) {
if(world.isRemote) return true;
player.inventory.mainInventory[player.inventory.currentItem] = pedestal.item.copy(); player.inventory.mainInventory[player.inventory.currentItem] = pedestal.item.copy();
pedestal.item = null; pedestal.item = null;
pedestal.markDirty(); pedestal.markDirty();
@ -129,9 +119,11 @@ public class BlockPedestal extends BlockContainer {
TileEntityPedestal se = castOrNull(Compat.getTileStandard(world, x + ForgeDirection.SOUTH.offsetX * 2 + ForgeDirection.EAST.offsetX * 2, y, z + ForgeDirection.SOUTH.offsetZ * 2 + ForgeDirection.EAST.offsetZ * 2)); TileEntityPedestal se = castOrNull(Compat.getTileStandard(world, x + ForgeDirection.SOUTH.offsetX * 2 + ForgeDirection.EAST.offsetX * 2, y, z + ForgeDirection.SOUTH.offsetZ * 2 + ForgeDirection.EAST.offsetZ * 2));
TileEntityPedestal[] tileArray = new TileEntityPedestal[] {nw, n, ne, w, center, e, sw, s, se}; TileEntityPedestal[] tileArray = new TileEntityPedestal[] {nw, n, ne, w, center, e, sw, s, se};
List<EntityPlayer> nearbyPlayers = world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(20, 20, 20));
outer: for(PedestalRecipe recipe : PedestalRecipes.recipes) { outer: for(PedestalRecipe recipe : PedestalRecipes.recipes) {
/// EXTRA CONDITIONS ///
if(recipe.extra == recipe.extra.FULL_MOON) { if(recipe.extra == recipe.extra.FULL_MOON) {
if(world.getCelestialAngle(0) < 0.35 || world.getCelestialAngle(0) > 0.65) continue; if(world.getCelestialAngle(0) < 0.35 || world.getCelestialAngle(0) > 0.65) continue;
if(world.provider.getMoonPhase(world.getWorldInfo().getWorldTime()) != 0) continue; if(world.provider.getMoonPhase(world.getWorldInfo().getWorldTime()) != 0) continue;
@ -146,6 +138,19 @@ public class BlockPedestal extends BlockContainer {
if(world.getCelestialAngle(0) > 0.15 && world.getCelestialAngle(0) < 0.85) continue; if(world.getCelestialAngle(0) > 0.15 && world.getCelestialAngle(0) < 0.85) continue;
} }
if(recipe.extra == recipe.extra.BAD_KARMA) {
boolean matches = false;
for(EntityPlayer player : nearbyPlayers) if(HbmPlayerProps.getData(player).reputation <= -10) { matches = true; break; }
if(!matches) continue;
}
if(recipe.extra == recipe.extra.GOOD_KARMA) {
boolean matches = false;
for(EntityPlayer player : nearbyPlayers) if(HbmPlayerProps.getData(player).reputation >= 10) { matches = true; break; }
if(!matches) continue;
}
/// CHECK ITEMS ///
for(int i = 0; i < 9; i++) { for(int i = 0; i < 9; i++) {
ItemStack pedestal = tileArray[i] != null ? tileArray[i].item : null; ItemStack pedestal = tileArray[i] != null ? tileArray[i].item : null;
if(pedestal == null && recipe.input[i] != null) continue outer; if(pedestal == null && recipe.input[i] != null) continue outer;
@ -155,6 +160,7 @@ public class BlockPedestal extends BlockContainer {
if(!recipe.input[i].matchesRecipe(pedestal, true) || recipe.input[i].stacksize != pedestal.stackSize) continue outer; if(!recipe.input[i].matchesRecipe(pedestal, true) || recipe.input[i].stacksize != pedestal.stackSize) continue outer;
} }
/// REMOVE ITEMS ///
for(int i = 0; i < 9; i++) { for(int i = 0; i < 9; i++) {
if(i == 4) continue; if(i == 4) continue;
ItemStack pedestal = tileArray[i] != null ? tileArray[i].item : null; ItemStack pedestal = tileArray[i] != null ? tileArray[i].item : null;
@ -164,11 +170,15 @@ public class BlockPedestal extends BlockContainer {
world.markBlockForUpdate(tileArray[i].xCoord, tileArray[i].yCoord, tileArray[i].zCoord); world.markBlockForUpdate(tileArray[i].xCoord, tileArray[i].yCoord, tileArray[i].zCoord);
} }
/// PRODUCE RESULT ///
center.item = recipe.output.copy(); center.item = recipe.output.copy();
center.markDirty(); center.markDirty();
world.markBlockForUpdate(x, y, z); world.markBlockForUpdate(x, y, z);
ExplosionSmallCreator.composeEffect(world, x + 0.5, y + 1.5, z + 0.5, 10, 2.5F, 1F); ExplosionSmallCreator.composeEffect(world, x + 0.5, y + 1.5, z + 0.5, 10, 2.5F, 1F);
List<EntityPlayer> players = world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x + 0.5, y, z + 0.5, x + 0.5, y, z + 0.5).expand(50, 50, 50));
for(EntityPlayer player : players) player.addStat(MainRegistry.statLegendary, 1);
return; return;
} }
} }
@ -184,10 +194,7 @@ public class BlockPedestal extends BlockContainer {
public ItemStack item; public ItemStack item;
@Override @Override public boolean canUpdate() { return false; }
public boolean canUpdate() {
return false;
}
@Override @Override
public Packet getDescriptionPacket() { public Packet getDescriptionPacket() {

View File

@ -4,6 +4,7 @@ import java.util.List;
import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ITooltipProvider;
import com.hbm.lib.RefStrings; import com.hbm.lib.RefStrings;
import com.hbm.world.gen.nbt.INBTBlockTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
@ -16,7 +17,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.World; import net.minecraft.world.World;
public class BlockPipe extends Block implements ITooltipProvider { public class BlockPipe extends Block implements ITooltipProvider, INBTBlockTransformable {
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
private IIcon sideIcon; private IIcon sideIcon;
@ -92,4 +93,10 @@ public class BlockPipe extends Block implements ITooltipProvider {
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
list.add("Purely decorative"); list.add("Purely decorative");
} }
@Override
public int transformMeta(int meta, int 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.util.AxisAlignedBB;
import net.minecraft.world.World; import net.minecraft.world.World;
@Deprecated
public class BlockPlasma extends Block { public class BlockPlasma extends Block {
public BlockPlasma(Material p_i45394_1_) { public BlockPlasma(Material p_i45394_1_) {
super(p_i45394_1_); super(p_i45394_1_);
this.setTickRandomly(true); this.setTickRandomly(true);
} }
@Override @Override
public void updateTick(World world, int x, int y, int z, Random rand) public void updateTick(World world, int x, int y, int z, Random rand) {
{ if(world.getGameRules().getGameRuleBooleanValue("doFireTick"))
if (world.getGameRules().getGameRuleBooleanValue("doFireTick")) world.setBlock(x, y, z, Blocks.air);
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 @Override
public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) {
{
return null; return null;
} }
@Override @Override
public boolean renderAsNormalBlock() 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);
return false; 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,6 +5,8 @@ import java.util.Random;
import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.IBlockMulti;
import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ITooltipProvider;
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.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
@ -27,7 +29,7 @@ import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.StatCollector; import net.minecraft.util.StatCollector;
import net.minecraft.world.World; import net.minecraft.world.World;
public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider { public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider, INBTBlockTransformable {
public BlockPlushie() { public BlockPlushie() {
super(Material.cloth); super(Material.cloth);
@ -94,17 +96,26 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti
@Override @Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { 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) { if(world.isRemote) {
TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z);
plushie.squishTimer = 11; plushie.squishTimer = 11;
return true; return true;
} else { } 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; return true;
} }
} }
public static class TileEntityPlushie extends TileEntity { @Override
public int transformMeta(int meta, int coordBaseMode) {
return (meta + coordBaseMode * 4) % 16;
}
public static class TileEntityPlushie extends TileEntity implements INBTTileEntityTransformable {
public PlushieType type = PlushieType.NONE; public PlushieType type = PlushieType.NONE;
public int squishTimer; public int squishTimer;
@ -137,13 +148,19 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti
super.writeToNBT(nbt); super.writeToNBT(nbt);
nbt.setByte("type", (byte) type.ordinal()); nbt.setByte("type", (byte) type.ordinal());
} }
@Override
public void transformTE(World world, int coordBaseMode) {
type = PlushieType.values()[world.rand.nextInt(PlushieType.values().length - 1) + 1];
}
} }
public static enum PlushieType { public static enum PlushieType {
NONE( "NONE", null), NONE( "NONE", null),
YOMI( "Yomi", "Hi! Can I be your rabbit friend?"), YOMI( "Yomi", "Hi! Can I be your rabbit friend?"),
NUMBERNINE( "Number Nine", "None of y'all deserve coal."), 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 label;
public String inscription; 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.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
@ -66,7 +67,7 @@ public class BlockReeds extends Block {
@Override @Override
public Item getItemDropped(int meta, Random rand, int fortune) { public Item getItemDropped(int meta, Random rand, int fortune) {
return null; return Items.stick;
} }
@Override @Override

View File

@ -0,0 +1,84 @@
package com.hbm.blocks.generic;
import org.lwjgl.opengl.GL11;
import com.hbm.render.block.ISBRHUniversal;
import com.hbm.render.util.RenderBlocksNT;
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.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockSandbags extends Block implements ISBRHUniversal {
public BlockSandbags(Material mat) {
super(mat);
}
@Override public int getRenderType() { return renderID; }
@Override public boolean isOpaqueCube() { return false; }
@Override public boolean renderAsNormalBlock() { return false; }
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
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
@SideOnly(Side.CLIENT)
public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) {
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 void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {
float min = 0.25F;
float max = 0.75F;
Block nx = world.getBlock(x - 1, y, z);
Block px = world.getBlock(x + 1, y, z);
Block nz = world.getBlock(x, y, z - 1);
Block pz = world.getBlock(x, y, z + 1);
float minX = (nx.isOpaqueCube() || nx.isNormalCube() || nx == this) ? 0F : min;
float minZ = (nz.isOpaqueCube() || nz.isNormalCube() || nz == this) ? 0F : min;
float maxX = (px.isOpaqueCube() || px.isNormalCube() || px == this) ? 1F : max;
float maxZ = (pz.isOpaqueCube() || pz.isNormalCube() || pz == this) ? 1F : max;
this.setBlockBounds(minX, 0, minZ, maxX, 1, maxZ);
}
@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);
renderer.setRenderBounds(0.125D, 0D, 0.125D, 0.875D, 1D, 0.875D);
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);
renderer.setRenderBoundsFromBlock(block);
Tessellator tessellator = Tessellator.instance;
tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
tessellator.setColorOpaque_F(1, 1, 1);
renderer.renderStandardBlock(block, x, y, z);
return true;
}
}

View File

@ -0,0 +1,115 @@
package com.hbm.blocks.generic;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
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.MathHelper;
import net.minecraft.world.World;
public class BlockSkeletonHolder extends BlockContainer {
public BlockSkeletonHolder() {
super(Material.rock);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntitySkeletonHolder();
}
@Override public int getRenderType() { return -1; }
@Override public boolean isOpaqueCube() { return false; }
@Override public boolean renderAsNormalBlock() { 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, 5, 2);
if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 3, 2);
if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 4, 2);
if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 2, 2);
} //I hope you change this shit to not be hardcoded because im not doing it
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(player.isSneaking()) return false;
TileEntitySkeletonHolder pedestal = (TileEntitySkeletonHolder) world.getTileEntity(x, y, z);
if(pedestal.item == null && player.getHeldItem() != null) {
if(world.isRemote) return true;
pedestal.item = player.getHeldItem().copy();
player.inventory.mainInventory[player.inventory.currentItem] = null;
pedestal.markDirty();
world.markBlockForUpdate(x, y, z);
return true;
} else if(pedestal.item != null && player.getHeldItem() == null) {
if(world.isRemote) return true;
player.inventory.mainInventory[player.inventory.currentItem] = pedestal.item.copy();
pedestal.item = null;
pedestal.markDirty();
world.markBlockForUpdate(x, y, z);
return true;
}
return false;
}
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int meta) {
if(!world.isRemote) {
TileEntitySkeletonHolder entity = (TileEntitySkeletonHolder) world.getTileEntity(x, y, z);
if(entity != null && entity.item != null) {
EntityItem item = new EntityItem(world, x + 0.5, y, z + 0.5, entity.item.copy());
world.spawnEntityInWorld(item);
}
}
super.breakBlock(world, x, y, z, block, meta);
}
public static class TileEntitySkeletonHolder extends TileEntity {
public ItemStack item;
@Override public boolean canUpdate() { return false; }
@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());
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.item = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("item"));
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
if(this.item != null) {
NBTTagCompound stack = new NBTTagCompound();
this.item.writeToNBT(stack);
nbt.setTag("item", stack);
}
}
}
}

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