Compare commits

...

1010 commits

Author SHA1 Message Date
Sollace
a006373619
Merge branch '1.20.1' into 1.20.2 2024-12-10 23:17:41 +01:00
Sollace
43fab8916b
Fix ##520 2024-12-10 23:10:36 +01:00
Sollace
f1ea3cacb6
Bump blockus ref 2024-11-02 16:23:44 +00:00
Sollace
e0255c0e9b
Merge branch '1.20.1' into 1.20.2 2024-10-15 11:27:44 +01:00
Sollace
762c1125a3
Fixed rocks popping off of farmland. Fixes #493 2024-10-15 11:27:28 +01:00
Sollace
36eb042ffa
Fix #490 (again) 2024-10-14 19:20:10 +01:00
Sollace
652802b844
Fix #490 (again) 2024-10-14 19:19:48 +01:00
Sollace
378cb34f83
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/datagen/providers/UAdvancementsProvider.java
#	src/main/java/com/minelittlepony/unicopia/recipe/ZapAppleRecipe.java
2024-10-14 18:49:28 +01:00
Sollace
895a7bff60
Change criterion check to an OR for tribe joins
# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/datagen/providers/UAdvancementsProvider.java
2024-10-14 18:47:02 +01:00
Sollace
a43f5d2022
Fix carver crash #490 2024-10-14 18:46:10 +01:00
Sollace
fd65e7db17
Change early molting season advancements to regular tasks Closes #483 2024-10-14 18:46:06 +01:00
Sollace
93299feae6
Fixed the trick apple recipes
# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/TrickCraftingRecipeJsonBuilder.java
#	src/main/java/com/minelittlepony/unicopia/recipe/ZapAppleRecipe.java
2024-10-14 18:45:49 +01:00
Sollace
f1ddb2381d
Fixed the trick apple recipes
# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/TrickCraftingRecipeJsonBuilder.java
2024-10-10 19:03:48 +01:00
Sollace
7ecf4b1367
Fix sweet apple acres advancement 2024-10-10 18:19:53 +01:00
Sollace
cab9b517c2
Fix sweet apple acres advancement 2024-10-10 18:11:46 +01:00
Sollace
49847d1479
Fix regressions 2024-10-10 17:29:28 +01:00
Sollace
83048f2a6b
Remove debug logging 2024-10-09 00:01:25 +01:00
Sollace
02b62372cf
Remove debug logging 2024-10-09 00:00:58 +01:00
Sollace
adf81b9b51
Fixed snow gathering on clouds / clouds blocking snow from gathering below them 2024-10-08 23:16:30 +01:00
Sollace
7302bd5632
Fixed snow gathering on clouds / clouds blocking snow from gathering below them 2024-10-08 23:15:57 +01:00
Sollace
e317df4bf9
Merge branch '1.20.1' into 1.20.2 2024-10-08 16:40:25 +01:00
Sollace
b61ef575fb
Fix incorrect translation 2024-10-08 16:25:11 +01:00
Sollace
c877016ac7
You can now soak clouds using bottles of water 2024-10-08 16:19:41 +01:00
Sollace
c89f7209e9
Fixed not being able to collect water from soggy cloud stairs 2024-10-08 16:19:41 +01:00
Sollace
add128cbee
Use the bucket tag for filling jars instead of just the vanilla bucket 2024-10-08 16:19:41 +01:00
Sollace
04a0506582
Clean up soggy cloud textures slightly 2024-10-08 16:19:41 +01:00
Sollace
2ad3f48f15
Fixed muffins and rocks appearing invisible when thrown 2024-10-08 16:19:40 +01:00
Sollace
5a900e8601
Remove unneccessary injection 2024-10-08 16:19:40 +01:00
Sollace
68820924bf
Rain no longer appears above clouds (mostly) 2024-10-08 16:19:40 +01:00
Sollace
c0d9200101
Allow making changeling morph using rotten apples 2024-10-08 16:19:40 +01:00
Sollace
62679897b2
Allow making earth pony morph using pebbles 2024-10-08 16:19:40 +01:00
Sollace
2b979d4fe4
Skip applying the saturation shader if it's not required and remove unneccessary GL actions. Maybe Fixes #445 2024-10-08 16:19:40 +01:00
Sollace
4f4ac3f809
Mobs with feather falling 4 boots can now walk and pathfind on clouds 2024-10-08 16:19:40 +01:00
Sollace
4cfb8d835f
Mobs with feather falling 4 boots can now properly walk on clouds 2024-10-08 16:19:40 +01:00
Sollace
c32bf4c099
Tweak the cloud carver to set the top layer to soggy clouds 2024-10-08 16:19:40 +01:00
Sollace
a987e9612a
- Fixed clouds affecting lighting
- Clouds no longer affect the world heightmap (fixes certain structures generating on clouds)
- Added proper cloud gen beyond just structures
- Fixed mobs spawning on clouds when they shouldn't
2024-10-08 16:19:40 +01:00
Sollace
17b014939a
Polearms can no longer accept the sweeping enchant. Closes #408 2024-10-08 16:19:40 +01:00
Sollace
c7c8e0971b
Adjust polearm strengths 2024-10-08 16:19:40 +01:00
Sollace
c7a0c7b527
Reduce chance of mobs reproducing when they have the corrupt influence effect. Fixes #467 2024-10-08 16:19:40 +01:00
Sollace
36a8a9d018
Reduce hunger granted by eating placed hay bales 2024-10-08 16:19:40 +01:00
Sollace
bee81cae74
Make gemstones edible for earth ponies. Fixes #460 2024-10-08 16:19:40 +01:00
Sollace
95da98b8c3
Fix #466 2024-10-08 16:19:39 +01:00
Sollace
797e2101b5
Fix layering on the tribe confirmation screen 2024-10-08 16:19:39 +01:00
Sollace
1ff0e89724
Creative players can now interact with cloud blocks regardless of tribe. Closes #461 2024-10-08 16:19:39 +01:00
Sollace
4cd2809f40
Fixed non-pegasi not able to jump out of cloud blocks 2024-10-08 16:19:39 +01:00
Sollace
f8018cb6fc
Improve changeling hive generation. Fixes #398 2024-10-08 16:19:39 +01:00
Sollace
5b443f118d
Adjust changeling hive size 2024-10-08 16:19:39 +01:00
Sollace
c75b4b36b8
Update iris dependency 2024-10-08 16:19:29 +01:00
Sollace
89124eb146
Fixed disguises applied via commands not remaining when applied to a non-changeling entity 2024-10-08 15:35:35 +01:00
Sollace
e8649aca7d
Remove redundant effect nbt field 2024-10-08 15:35:35 +01:00
Sollace
469aaeecd1
Remove Spell#isDirty and Spell#setDirty 2024-10-08 15:35:35 +01:00
Sollace
92ad502fa7
Set the spell as dead when removing it 2024-10-08 15:35:35 +01:00
Sollace
420f78eaaf
Track which spells are active on which blocks to make tile-by-tile interactions easier. Requireed by #412 2024-10-08 15:35:35 +01:00
Sollace
dc33678062
Fix background rendering in the dismiss spell screen 2024-10-08 15:35:35 +01:00
Sollace
2016b7dd84
Fixed spells not executing their on destroy handlers 2024-10-08 15:35:35 +01:00
Sollace
37a7b08e45
Add support for serene seasons. Closes #386 2024-10-08 15:35:35 +01:00
Sollace
3f9d26f4b4
Why is gradle's compiler so stupid? Can ANYONE tell me why gradle's compiler is so stupid!? 2024-10-08 15:35:35 +01:00
Sollace
72615aac95
Sunglasses can now be broken by a warden's sonic boom, falling blocks, anvils, explosions, and flying into walls. Closes #423 2024-10-08 15:35:35 +01:00
Sollace
68146c4f8c
Set tribe swap damage type to bypass things that normally block damage. May help with #453 2024-10-08 15:35:35 +01:00
Sollace
ac1ac5d903
Fixed heavy enchant making pegasi faster. Fixes #380 2024-10-08 15:35:35 +01:00
Sollace
55a57c3d1b
Fix compatibility with Xaero's minimap. Fixes #437 2024-10-08 15:35:35 +01:00
Sollace
a3d5670f7a
Adjust bat pony visibility. Fixes #425 2024-10-08 15:35:35 +01:00
Sollace
2458471fdd
Fixed rendering wackyness when the timer is displayed for timed spells 2024-10-08 15:35:35 +01:00
Sollace
7b5a7682c4
Fixed bubble spell offset from entity center. Fixes #457 2024-10-08 15:35:34 +01:00
Sollace
8c560e3ff3
Fixed amulet rendering when trinkets is not installed. Closes #455 2024-10-08 15:35:33 +01:00
Sollace
956dbd26b9
Fix the displacement spell. Fixes #456 2024-10-08 15:34:02 +01:00
­Sollace
aa7c4511e9
Update issue templates 2024-10-08 15:34:02 +01:00
Sollace
9424a3f2ba
Fix jar inventory size mismatch. Fixes #441 2024-10-08 15:34:01 +01:00
Sollace
512ae4d126
Fixed bat screech effect position when ponified. Fixes #399 2024-10-08 15:34:00 +01:00
Sollace
1b2f0ebd6b
Fixed crash when disguised as a mob whilst wearing an amulet. Fixes #401 2024-10-08 15:32:36 +01:00
Sollace
fe39258cff
Fixed crash when wearing alicorn amulet. Fixes #400 2024-10-08 15:32:34 +01:00
Sollace
9d03ad7576
Fix command outputs. Fixes #435 2024-10-08 15:30:56 +01:00
Sollace
6ac22e36a1
Fixed mobs getting stuck targetting an invalid entity. Fixes #414 2024-10-08 15:30:56 +01:00
Sollace
1c52237568
Fixed changling clinging and bat pony hanging abilities. Closes #404 2024-10-08 15:30:56 +01:00
Sollace
d6286c7a00
Fixed player position messed up when mounting a boat whilst flying
Players can now fly from boats again.
Fixes #377
2024-10-08 15:30:56 +01:00
Sollace
7c779eb2e3
Fixed feathers dropping on the client. Fixes #383 2024-10-08 15:30:56 +01:00
Sollace
6f9af46060
Fixed sounds not playing when dashing 2024-10-08 15:30:56 +01:00
Sollace
0ba3fd64a7
Fixed earth ponies breaking blocks in adventure mode and protected regions. Fixes #434 2024-10-08 15:30:55 +01:00
Sollace
2046ca3029
Fixed bat ponies unable to sleep at night when there is a thunderstorm. Fixes #436 2024-10-08 15:29:15 +01:00
Sollace
b53a51173c
Updated hud texture and added page indicators. Fixes #415 2024-10-08 15:29:15 +01:00
Sollace
b3068780ae
Fixed server flight state desync. Fixes #430, Fixes #421 (probably, cannot reproduce) 2024-10-08 15:29:15 +01:00
Sollace
fab6e7b3dd
You can no longer place spellbooks in occupied blocks. Fixes #451 2024-10-08 15:29:14 +01:00
Sollace
5b3a8bee95
Limit AOE spell radius to 32 blocks. Fixes #450 2024-10-08 15:25:30 +01:00
Sollace
7fed38331a
Merge branch '1.20.1' into 1.20.2 2024-07-31 14:34:24 +02:00
Sollace
fab4924021
Fix build 2024-07-31 14:32:24 +02:00
Sollace
33b01f4eaa
Merge branch '1.20.1' into 1.20.2 2024-06-30 14:18:06 +01:00
Sollace
8caf619418
Change pearl necklace max damage to 16 2024-06-30 14:16:05 +01:00
Sollace
8bf6d53a48
Implement proper formatting for ranged spell attributes 2024-06-30 14:15:44 +01:00
Sollace
0077b44d8c
Merge branch '1.20.1' into 1.20.2 2024-06-30 00:28:38 +01:00
­Sollace
74fae35865 New translations en_us.json (German) 2024-06-26 22:53:33 +01:00
­Sollace
3e05fbe027 New translations en_us.json (French) 2024-06-26 20:34:14 +01:00
­Sollace
5a087d88e3 New translations en_us.json (French) 2024-06-26 19:32:50 +01:00
­Sollace
7cc1aeb7a5 New translations en_us.json (Chinese Traditional) 2024-06-26 13:56:40 +01:00
­Sollace
1636bf18f8 New translations en_us.json (Chinese Simplified) 2024-06-26 13:56:38 +01:00
­Sollace
c869e0b5e1 New translations en_us.json (German) 2024-06-24 23:05:21 +01:00
­Sollace
7f866a5af8 New translations en_us.json (German) 2024-06-24 22:01:17 +01:00
­Sollace
5756cad2ab New translations en_us.json (English (upside down)) 2024-06-24 16:48:48 +01:00
­Sollace
883332b415 New translations en_us.json (English, United Kingdom) 2024-06-24 16:48:46 +01:00
­Sollace
ff677f17ff New translations en_us.json (Chinese Traditional) 2024-06-24 16:48:45 +01:00
­Sollace
a9d7e15659 New translations en_us.json (Russian) 2024-06-24 16:48:44 +01:00
­Sollace
dc6f39df45 New translations en_us.json (German) 2024-06-24 16:48:42 +01:00
­Sollace
1838118290 New translations en_us.json (French) 2024-06-24 16:48:41 +01:00
­Sollace
ff6b55e4c9 New translations en_us.json (English (upside down)) 2024-06-24 15:32:59 +01:00
­Sollace
5e27ffc7bb New translations en_us.json (English, United Kingdom) 2024-06-24 15:32:57 +01:00
­Sollace
5f26d6cb63 New translations en_us.json (Chinese Traditional) 2024-06-24 15:32:56 +01:00
­Sollace
bedc298bd8 New translations en_us.json (German) 2024-06-24 15:32:53 +01:00
­Sollace
c91c0feb75 New translations en_us.json (French) 2024-06-24 15:32:52 +01:00
­Sollace
7fa2363979 New translations en_us.json (Chinese Simplified) 2024-06-24 15:32:51 +01:00
­Sollace
2a0c28cec5 New translations en_us.json (Russian) 2024-06-24 04:59:21 +01:00
­Sollace
d5fb4d4640 New translations en_us.json (English (upside down)) 2024-06-24 03:02:48 +01:00
­Sollace
05e399ad84 New translations en_us.json (English, United Kingdom) 2024-06-24 03:02:47 +01:00
­Sollace
c740cbd908 New translations en_us.json (Chinese Traditional) 2024-06-24 03:02:46 +01:00
­Sollace
dc894af0c2 New translations en_us.json (Russian) 2024-06-24 03:02:45 +01:00
­Sollace
995fe3645d New translations en_us.json (German) 2024-06-24 03:02:43 +01:00
­Sollace
6e88b51889 New translations en_us.json (French) 2024-06-24 03:02:42 +01:00
­Sollace
c7a2e4bc1e New translations en_us.json (Chinese Simplified) 2024-06-24 03:02:41 +01:00
Sollace
44709daaf1
Merge branch '1.20.1' into 1.20.2 2024-06-24 02:41:33 +01:00
Sollace
636c84db3b
Merge branch 'l10n_1.20.1' into 1.20.1 2024-06-24 02:41:15 +01:00
Sollace
ebbb87a0b8
Fix spell recipes (1.20.2) 2024-06-24 02:01:28 +01:00
Sollace
cc8bc28432
Merge branch '1.20.1' into 1.20.2 2024-06-24 01:34:03 +01:00
Sollace
6eb2464d78
Revert mixinextras usage 2024-06-24 01:25:28 +01:00
Sollace
74a08b4820
Merge branch '1.20.1' into 1.20.2 2024-06-24 01:15:50 +01:00
­Sollace
6d1f703cf1 New translations en_us.json (Chinese Simplified) 2024-06-24 01:04:02 +01:00
­Sollace
b0c721fd7f New translations en_us.json (Chinese Simplified) 2024-06-23 23:30:55 +01:00
­Sollace
85e906c1ae New translations en_us.json (English (upside down)) 2024-06-23 17:27:29 +01:00
­Sollace
0c8f0f2b01 New translations en_us.json (English, United Kingdom) 2024-06-23 17:27:28 +01:00
­Sollace
953124d66f New translations en_us.json (Chinese Traditional) 2024-06-23 17:27:26 +01:00
­Sollace
62f19409a9 New translations en_us.json (Russian) 2024-06-23 17:27:25 +01:00
­Sollace
7e80227305 New translations en_us.json (German) 2024-06-23 17:27:24 +01:00
­Sollace
2914b3d4e6 New translations en_us.json (French) 2024-06-23 17:27:23 +01:00
­Sollace
30994885a7 New translations en_us.json (Chinese Simplified) 2024-06-23 17:27:21 +01:00
Sollace
a6b16ec09f
Remove debug code 2024-06-23 17:01:02 +01:00
Sollace
f6668eff72
Added seapony's grace/seapony's ire status effects. Mining blocks in a monument will cause seaponies to lose their grace. Fixes #390 2024-06-23 16:59:34 +01:00
Sollace
d4e3feacee
Fixed ability cooldown not ticking when there is not ability in the slot. Fixes #366 2024-06-23 16:57:47 +01:00
Sollace
bf5a29e8d5
Reduce saturation from leaves and nerf hay bales again. Fixes #371 2024-06-23 15:46:58 +01:00
Sollace
86b0530f45
Make nuts and seeds less nutricious to other races. Fixes #363 2024-06-23 15:42:13 +01:00
Sollace
302a033710
Don't allow flying whilst in a boat. Fixes #377 2024-06-23 15:37:24 +01:00
Sollace
498ec2bca0
The pearl necklace now has 4 durability 2024-06-23 14:41:44 +01:00
Sollace
e2f2b83003
Make pearl necklaces less common when fishing. This is literally the lowest it will go. #388 2024-06-23 14:41:21 +01:00
­Sollace
626cfcfa3d New translations en_us.json (English (upside down)) 2024-06-22 19:53:42 +01:00
­Sollace
6c1690e222 New translations en_us.json (English, United Kingdom) 2024-06-22 19:53:41 +01:00
­Sollace
81ff753bc0 New translations en_us.json (Chinese Traditional) 2024-06-22 19:53:40 +01:00
­Sollace
701d0707c6 New translations en_us.json (Russian) 2024-06-22 19:53:38 +01:00
­Sollace
6a5d847fce New translations en_us.json (German) 2024-06-22 19:53:37 +01:00
­Sollace
44eef98079 New translations en_us.json (French) 2024-06-22 19:53:36 +01:00
­Sollace
fd85ccd8c8 New translations en_us.json (Chinese Simplified) 2024-06-22 19:53:35 +01:00
Sollace
9ee81c961c
Finish porting spell attributes to the new system 2024-06-22 19:40:49 +01:00
Sollace
b30e9c5f1f
Move entity attribute stuff to a separate class 2024-06-22 18:48:50 +01:00
Sollace
4dd3b2fb26
Fixed error when applying the bubble spell to entities 2024-06-22 18:29:44 +01:00
Sollace
92d2bc229f
Configure spell attributes for all the spell types 2024-06-07 00:15:15 +01:00
­Sollace
53b996c47c New translations en_us.json (Chinese Simplified) 2024-06-06 20:04:01 +01:00
­Sollace
6d0b02989b New translations en_us.json (Chinese Simplified) 2024-06-06 17:53:11 +01:00
­Sollace
f7c167bfc9 New translations en_us.json (Chinese Simplified) 2024-06-04 12:56:30 +01:00
­Sollace
9d4651a14b New translations en_us.json (Chinese Simplified) 2024-06-04 10:18:19 +01:00
­Sollace
80bce449ac New translations en_us.json (Chinese Simplified) 2024-06-04 08:17:23 +01:00
­Sollace
cfe3d2c51e New translations en_us.json (Chinese Simplified) 2024-05-31 14:53:32 +01:00
­Sollace
bb473acd0d New translations en_us.json (Chinese Simplified) 2024-05-29 17:15:37 +01:00
­Sollace
759cf9ae0a New translations en_us.json (Chinese Simplified) 2024-05-29 15:33:58 +01:00
­Sollace
56bcfc143e New translations en_us.json (Russian) 2024-05-29 03:52:44 +01:00
Sollace
aaea2bfbc1
Account for the water's depth when determining the amount of lift pegasi should receive 2024-05-28 23:19:23 +01:00
Sollace
66d0dc8750
Clean up the hud and only show the super bar when it's useful. Also use the xp bar to show level and corruption 2024-05-28 23:18:54 +01:00
­Sollace
baae2630ef New translations en_us.json (English (upside down)) 2024-05-28 18:49:46 +01:00
­Sollace
36f3a6e161 New translations en_us.json (English, United Kingdom) 2024-05-28 18:49:45 +01:00
­Sollace
b1a4820156 New translations en_us.json (Chinese Traditional) 2024-05-28 18:49:44 +01:00
­Sollace
e3fb4856c3 New translations en_us.json (Russian) 2024-05-28 18:49:42 +01:00
­Sollace
99e00b802f New translations en_us.json (German) 2024-05-28 18:49:41 +01:00
­Sollace
24eec6c618 New translations en_us.json (French) 2024-05-28 18:49:40 +01:00
­Sollace
738410a07d New translations en_us.json (Chinese Simplified) 2024-05-28 18:49:39 +01:00
Sollace
1f714b3ed0
Tooltip details version 2 2024-05-28 18:48:06 +01:00
­Sollace
2883b68210 New translations en_us.json (English (upside down)) 2024-05-28 14:51:46 +01:00
­Sollace
d5d187c273 New translations en_us.json (English, United Kingdom) 2024-05-28 14:51:44 +01:00
­Sollace
86481ec90f New translations en_us.json (Chinese Traditional) 2024-05-28 14:51:43 +01:00
­Sollace
4e6e37f8f5 New translations en_us.json (Russian) 2024-05-28 14:51:42 +01:00
­Sollace
214adcc645 New translations en_us.json (German) 2024-05-28 14:51:39 +01:00
­Sollace
49ca7d331d New translations en_us.json (French) 2024-05-28 14:51:38 +01:00
­Sollace
0277c6dee5 New translations en_us.json (Chinese Simplified) 2024-05-28 14:51:36 +01:00
Sollace
5207f7fefb
Tweak catapult to make pushing entities easier and fix falling blocks not updating their velocity when pushed 2024-05-28 14:33:30 +01:00
Sollace
9efe49afbd
Fix error printed when respawning 2024-05-28 14:32:31 +01:00
Sollace
98714556a0
Fixed magic projectiles not affecting falling blocks 2024-05-28 14:32:22 +01:00
Sollace
ce48d86fd6
Reduce casting time for projectiles 2024-05-28 14:31:59 +01:00
Sollace
cf4d98078c
Fixed (regression) spellbook not having a page when first placed 2024-05-28 13:32:40 +01:00
Sollace
c510c727fa
Display full tooltip details in the spellbook for equipped spells 2024-05-28 13:28:49 +01:00
­Sollace
6e5d631f78 New translations en_us.json (Chinese Simplified) 2024-05-27 16:36:19 +01:00
­Sollace
153f95a2de New translations en_us.json (Chinese Simplified) 2024-05-27 14:17:53 +01:00
Sollace
a25d8b7a2c
Remove debug messages 2024-05-27 06:40:47 +01:00
Sollace
2edf2c6989
Implement data trackers for spells 2024-05-27 06:39:01 +01:00
­Sollace
e12fe95be8 New translations en_us.json (Chinese Simplified) 2024-05-26 16:14:17 +01:00
­Sollace
bb4d5b325f New translations en_us.json (Chinese Simplified) 2024-05-26 02:48:38 +01:00
Sollace
d716d2e00b
Move wind trail particles behind the player's view 2024-05-25 21:08:38 +01:00
Sollace
7937604c41
Fixed placed spells not reflecting their correct location in the dismiss spell screen 2024-05-25 21:01:33 +01:00
Sollace
e9114f9e12
Fixed data not being copied when the player changes dimensions 2024-05-25 21:01:01 +01:00
Sollace
6057d8ea3b
Move flight check fixes to onTick() 2024-05-25 18:52:19 +01:00
­Sollace
ab6ac8b143 New translations en_us.json (Chinese Simplified) 2024-05-25 17:42:09 +01:00
Sollace
a6a19a4d4b
Remove broken wings logging 2024-05-25 15:54:45 +01:00
Sollace
8ba83934a3
Fix incorrect default for new players 2024-05-25 15:54:32 +01:00
Sollace
0b3f49e7fe
Ensure registration happens in order 2024-05-25 15:19:53 +01:00
Sollace
81db96d8a2
Compress nbt when sending it over the network 2024-05-25 15:03:26 +01:00
Sollace
1e3560fc04
Send tracked data in smaller packets to avoid large buffer allocation warnings being printed 2024-05-25 14:38:17 +01:00
­Sollace
30ade1417d New translations en_us.json (Chinese Simplified) 2024-05-25 14:29:42 +01:00
­Sollace
8114806a89 New translations en_us.json (Russian) 2024-05-24 18:12:18 +01:00
­Sollace
445e8da053 New translations en_us.json (English (upside down)) 2024-05-24 16:47:39 +01:00
­Sollace
6af136def0 New translations en_us.json (English, United Kingdom) 2024-05-24 16:47:38 +01:00
­Sollace
0b2423c9f3 New translations en_us.json (Chinese Traditional) 2024-05-24 16:47:36 +01:00
­Sollace
83759d9418 New translations en_us.json (Russian) 2024-05-24 16:47:35 +01:00
­Sollace
4cc8bc2cea New translations en_us.json (German) 2024-05-24 16:47:33 +01:00
­Sollace
37080957f0 New translations en_us.json (French) 2024-05-24 16:47:32 +01:00
­Sollace
c61e74141c New translations en_us.json (Chinese Simplified) 2024-05-24 16:47:31 +01:00
Sollace
79d97adf0b
Implement attribute tooltips for all spells 2024-05-24 16:43:11 +01:00
­Sollace
7219baa36d New translations en_us.json (Russian) 2024-05-24 02:27:50 +01:00
­Sollace
ab29c9e6c5 New translations en_us.json (Russian) 2024-05-24 01:17:41 +01:00
­Sollace
aa7984c1bb New translations en_us.json (Chinese Simplified) 2024-05-23 23:11:43 +01:00
Sollace
d1b3e8702a
Fix build 2024-05-23 20:23:44 +01:00
­Sollace
7bffeb0e1a New translations en_us.json (English (upside down)) 2024-05-23 20:12:08 +01:00
­Sollace
1e382c85e2 New translations en_us.json (English, United Kingdom) 2024-05-23 20:12:07 +01:00
­Sollace
b924502d20 New translations en_us.json (Chinese Traditional) 2024-05-23 20:12:06 +01:00
­Sollace
23eb781316 New translations en_us.json (Russian) 2024-05-23 20:12:04 +01:00
­Sollace
1f3bc89dd9 New translations en_us.json (German) 2024-05-23 20:12:03 +01:00
­Sollace
c6e3d04f0f New translations en_us.json (French) 2024-05-23 20:12:02 +01:00
­Sollace
7649868bb3 New translations en_us.json (Chinese Simplified) 2024-05-23 20:12:00 +01:00
Sollace
6175605069
Don't tick disguises if the game is paused 2024-05-23 20:00:17 +01:00
Sollace
e22f181f41
Fixed rendering of multi-segment blocks 2024-05-23 19:59:56 +01:00
Sollace
98f612cd13
Fixed disguise orientation and door disguises. Fixes #259 2024-05-23 18:52:55 +01:00
Sollace
c61f2ce834
Add tooltip for area protection spell and make use of the cached radius from the Ether entry 2024-05-23 17:38:11 +01:00
Sollace
d909ee47f1
Fix dismiss animations on placed spells 2024-05-23 17:37:27 +01:00
Sollace
14084e270b
Fix tooltip details 2024-05-23 17:36:57 +01:00
Sollace
1ecb28e511
Move placed spell logic into the cast spell entity and fix portals mislinking/multilinking 2024-05-23 17:02:29 +01:00
Sollace
8a093a8a8b
Sync all spells onto the ether 2024-05-23 12:53:11 +01:00
Sollace
77de42dd09
Split the placed spell into separate types 2024-05-22 21:21:34 +01:00
Sollace
575c1f7438
Fixed placed spells not playing their death animations and/or getting stuck and impossible to remove 2024-05-22 21:21:08 +01:00
­Sollace
dc0e0ff100 New translations en_us.json (Chinese Simplified) 2024-05-22 17:04:44 +01:00
Sollace
2910b8d29c
Cleanup and sync placed spell owners 2024-05-22 15:25:35 +01:00
­Sollace
6e368f613a New translations en_us.json (English (upside down)) 2024-05-22 14:20:01 +01:00
­Sollace
fde89f7336 New translations en_us.json (English, United Kingdom) 2024-05-22 14:20:00 +01:00
­Sollace
823a29e943 New translations en_us.json (Chinese Traditional) 2024-05-22 14:19:59 +01:00
­Sollace
306e9d285f New translations en_us.json (Russian) 2024-05-22 14:19:57 +01:00
­Sollace
3bfc2637d9 New translations en_us.json (German) 2024-05-22 14:19:56 +01:00
­Sollace
580f06d9e4 New translations en_us.json (French) 2024-05-22 14:19:54 +01:00
­Sollace
6536a470f4 New translations en_us.json (Chinese Simplified) 2024-05-22 14:19:53 +01:00
Sollace
e23cbcdd1c
Fixed placed and projectile spells not syncing their level correctly. Also fixes placed shields not rendering 2024-05-22 13:58:20 +01:00
Sollace
ca361049f5
Surface spell attributes to the user in gemstone tooltips 2024-05-22 13:57:44 +01:00
Sollace
9e2135fde3
Clean up player capabilities networking 2024-05-22 01:04:12 +01:00
Sollace
d824d5d701
Fix warning 2024-05-22 00:17:55 +01:00
Sollace
2f0adac616
Synchronize initial data to the client when an entity starts being tracked 2024-05-22 00:16:12 +01:00
Sollace
88cf90842f
Sync each spell individually 2024-05-21 23:52:02 +01:00
Sollace
771da650c4
Implement a custom data tracker to sync values dynamically. Fixes #14 2024-05-21 23:51:56 +01:00
Sollace
c1bcaaa78e
Properly fix casting 2024-05-21 23:31:36 +01:00
Sollace
4bac633a23
Remove the update argument when interacting with spell slots 2024-05-21 23:10:02 +01:00
Sollace
b9015c9220
Add synchronization to keep it from messing up 2024-05-21 22:53:07 +01:00
Sollace
f8f60a8d3d
Implement custom data tracker 2024-05-21 22:51:42 +01:00
Sollace
9f407dfb76
Revert "Change ether to use type keys"
This reverts commit 2ca337a8b813e2bf4fe3bd4949338aa476c568e4.
2024-05-21 22:51:42 +01:00
Sollace
d38a02dcd4
Fix: Fix reference losing traits when serializing 2024-05-21 22:51:42 +01:00
Sollace
1f2df6daf5
Fix: Fix casting
# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java

# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java
2024-05-21 22:51:42 +01:00
­Sollace
faf5fc3ff7 New translations en_us.json (Russian) 2024-05-21 15:12:14 +01:00
Sollace
7560df438c
Move server-affecting mixins to their own package 2024-05-20 16:02:52 +01:00
­Sollace
87b1063318 New translations en_us.json (English (upside down)) 2024-05-20 01:53:49 +01:00
­Sollace
ad3ee994da New translations en_us.json (English, United Kingdom) 2024-05-20 01:53:48 +01:00
­Sollace
7a08b58c14 New translations en_us.json (Chinese Traditional) 2024-05-20 01:53:47 +01:00
­Sollace
be3e76352c New translations en_us.json (Russian) 2024-05-20 01:53:46 +01:00
­Sollace
3719f3b633 New translations en_us.json (German) 2024-05-20 01:53:45 +01:00
­Sollace
2633b564e9 New translations en_us.json (French) 2024-05-20 01:53:43 +01:00
­Sollace
d28204afc7 New translations en_us.json (Chinese Simplified) 2024-05-20 01:53:42 +01:00
Sollace
80b885514f
Add broken wings status effect 2024-05-20 01:49:02 +01:00
Sollace
e819678307
Fixed fruit dropping more than they're supposed to (should only happen if you have fortune!!!)
Also removed the placeholder plunder vine drops.
2024-05-20 00:45:04 +01:00
Sollace
a1ed8e5319
Specters can now spawn with and carry equipment 2024-05-20 00:42:30 +01:00
Sollace
a42aaeefc0
Only spawn specters in dark areas 2024-05-19 20:23:38 +01:00
Sollace
b4126b839b
Configure skeletons to target flying players over players on the ground, and fire at them with more accuracy 2024-05-19 20:23:21 +01:00
Sollace
5d4c0d0dd0
Set world and position on mimic chests when rendering to make sure they render correctly 2024-05-19 18:27:22 +01:00
Sollace
648f1838e7
Fixed mimics rolling multiple times 2024-05-19 18:03:28 +01:00
­Sollace
aae0fceb27 New translations en_us.json (Chinese Simplified) 2024-05-19 16:50:14 +01:00
Sollace
715519e1f1
Increase energy cost when flying over the void. Fixes #356 2024-05-19 00:17:34 +01:00
Sollace
2cdce6504c
Only regenerate when the pegasus has reached the ground. Fixes #356 2024-05-19 00:17:02 +01:00
Sollace
c09b02d8c8
Fix and add farmer's delight cutting table recipes for all the palm and zap wood blocks 2024-05-18 21:10:10 +01:00
Sollace
0c9c3caae2
Fixed unable to place palm signs on walls 2024-05-18 19:40:59 +01:00
­Sollace
6f486c4550 New translations en_us.json (English (upside down)) 2024-05-18 15:00:27 +01:00
­Sollace
fec05ecb09 New translations en_us.json (English, United Kingdom) 2024-05-18 15:00:26 +01:00
­Sollace
1790f746fd New translations en_us.json (Chinese Traditional) 2024-05-18 15:00:25 +01:00
­Sollace
bc2f96ef56 New translations en_us.json (Russian) 2024-05-18 15:00:24 +01:00
­Sollace
d0bbb9400e New translations en_us.json (German) 2024-05-18 15:00:22 +01:00
­Sollace
ada9ccd557 New translations en_us.json (French) 2024-05-18 15:00:21 +01:00
­Sollace
e78bf19c34 New translations en_us.json (Chinese Simplified) 2024-05-18 15:00:20 +01:00
Sollace
8a3abf5622
Display the amount of corruption you would gain from casting a spell 2024-05-18 14:55:41 +01:00
Sollace
95ffe5b0b5
Serialize spell type and traits together, and make affinity names translatable 2024-05-18 14:29:47 +01:00
Sollace
1d15630566
Properly replace existing spells when casting one with different traits. #353 2024-05-18 13:14:20 +01:00
­Sollace
21f2764d20 New translations en_us.json (Russian) 2024-05-18 04:19:20 +01:00
Sollace
e053539d1b
Fixed earth ponies being able to stomp whilst flying with elytra and using riptide 2024-05-17 19:28:52 +01:00
Sollace
04298eefcf
Cancel stomps when moving upwards 2024-05-17 19:28:08 +01:00
­Sollace
8c4de84b3c New translations en_us.json (English (upside down)) 2024-05-17 19:05:40 +01:00
­Sollace
4ad8dff9a2 New translations en_us.json (English, United Kingdom) 2024-05-17 19:05:39 +01:00
­Sollace
1bf1fd54d1 New translations en_us.json (Chinese Traditional) 2024-05-17 19:05:37 +01:00
­Sollace
3ec7da172a New translations en_us.json (Russian) 2024-05-17 19:05:36 +01:00
­Sollace
55c7bbe64c New translations en_us.json (German) 2024-05-17 19:05:35 +01:00
­Sollace
cb6ba5931f New translations en_us.json (French) 2024-05-17 19:05:34 +01:00
­Sollace
0459efa732 New translations en_us.json (Chinese Simplified) 2024-05-17 19:05:32 +01:00
Sollace
e6ec2083ef
Add a fortification status effect so earth ponies can see when they're fortified 2024-05-17 18:56:20 +01:00
Sollace
6a8c0d82ee
Ground pound now prevents fall damage. Fixes #351 2024-05-17 18:23:38 +01:00
­Sollace
56b25ea98d New translations en_us.json (Russian) 2024-05-17 18:10:19 +01:00
­Sollace
b7368c9773 New translations en_us.json (English (upside down)) 2024-05-16 23:50:42 +01:00
­Sollace
096e988586 New translations en_us.json (English, United Kingdom) 2024-05-16 23:50:41 +01:00
­Sollace
a26c72a481 New translations en_us.json (Chinese Traditional) 2024-05-16 23:50:39 +01:00
­Sollace
54f7ab3277 New translations en_us.json (Russian) 2024-05-16 23:50:38 +01:00
­Sollace
c454932a00 New translations en_us.json (German) 2024-05-16 23:50:37 +01:00
­Sollace
26f55bf556 New translations en_us.json (French) 2024-05-16 23:50:36 +01:00
­Sollace
faf489511d New translations en_us.json (Chinese Simplified) 2024-05-16 23:50:34 +01:00
Sollace
fffbee84e3
Add missing entity translations and set floating artefact to use the name of its item 2024-05-16 22:38:19 +01:00
Sollace
2fdd5b2730
Add fruit to the replaceable_by_trees tag to fix #352 2024-05-16 22:30:27 +01:00
Sollace
151f3604e6
Fixed client/server desync when applying status effects. Fixes #349 2024-05-16 22:21:46 +01:00
Sollace
59bdba6437
Fixed food poisoning probabilities being reversed - cooked had a higher chance of poisoning rather than lower 2024-05-16 22:21:20 +01:00
Sollace
f2a4a5f114
Fix door lighting. Fixes #346 2024-05-16 21:47:41 +01:00
Sollace
09cecef68e
Fix quick moving items in the spellbook. Fixes #348 2024-05-16 21:42:58 +01:00
Sollace
f0b57a2bbf
Fix trait serialization. Fixes #342 2024-05-16 20:32:28 +01:00
Sollace
11d36a3523
Merge branch '1.20.1' into 1.20.2 2024-04-27 12:24:20 +01:00
Sollace
89196c1adc
Fixed bat ponies not able to sleep through the day 2024-04-27 12:21:47 +01:00
Sollace
6812acb5f7
Merge branch '1.20.1' into 1.20.2 2024-04-26 17:26:59 +01:00
Sollace
ec8cf37917
Remove duplicate asset 2024-04-26 17:25:22 +01:00
Sollace
dd4c3f4d75
Datagen vanilla damagetype tags and painting variant tags 2024-04-26 17:19:49 +01:00
Sollace
28e5a49315
Add ad_astra dimensions to the dimension with no atmosphere tags 2024-04-26 17:05:14 +01:00
Sollace
2d28bed961
Merge branch '1.20.1' into 1.20.2 2024-04-26 16:47:32 +01:00
Sollace
68025e4642
Fix respawning on cloud blocks 2024-04-26 16:40:43 +01:00
Sollace
dcaaca149b
Synchronise server configs to the client 2024-04-26 16:09:37 +01:00
Sollace
da38726bc0
Fixed server crash when ticking jar items 2024-04-26 15:14:13 +01:00
Sollace
a67935c634
Merge branch '1.20.1' into 1.20.2 2024-04-25 15:33:11 +01:00
Sollace
cda4e5b0b6
Change ad-astra oxygen check to use the current location instead of the entity 2024-04-24 20:00:44 +01:00
Sollace
f84ef86546
Fix null camera crash 2024-04-24 19:41:14 +01:00
Sollace
498577294e
Redo ad_astra compat 2024-04-24 19:33:22 +01:00
Sollace
e830268253
Merge branch '1.20.1' into 1.20.2 2024-04-24 18:35:01 +01:00
­Sollace
119eafbbc7
New Crowdin updates (#337)
* New translations en_us.json (French)
* New translations en_us.json (Russian)
* New translations en_us.json (Chinese Simplified)
* New translations en_us.json (Chinese Traditional)
* New translations en_us.json (English (upside down))
* New translations en_us.json (English, United Kingdom)
* New translations en_us.json (German)
2024-04-24 12:42:23 +01:00
Sollace
a48dffcf3a
Merge branch '1.20.1' into 1.20.2 2024-04-23 17:58:06 +01:00
Sollace
d83a3b0239
Fix compatibilty with HDSkins 2024-04-23 17:57:50 +01:00
Sollace
80b5c4a5dc
Merge branch '1.20.1' into 1.20.2 2024-04-23 15:29:07 +01:00
Sollace
cda7ec1d9e
Move entity type and status effect tags to datagen 2024-04-23 15:28:49 +01:00
Sollace
0be4aa1b4f
Fix build 2024-04-23 14:55:27 +01:00
Sollace
fb216459b5
Merge branch '1.20.1' into 1.20.2 2024-04-23 14:51:47 +01:00
Sollace
a1d59b48bf
Slight tweaks to the wind particle 2024-04-23 14:51:33 +01:00
Sollace
03f4b4004e
Add spiral particle (wip) 2024-04-23 14:41:21 +01:00
Sollace
1545210efa
Added wind trail particles 2024-04-22 17:21:12 +01:00
Sollace
e51d82f37e
Added a visual effect when flying at high speeds 2024-04-21 23:51:59 +01:00
Sollace
96b14aa1c3
Fixed bumpy pegasus flight patterns (also fixed diving) 2024-04-21 23:07:30 +01:00
Sollace
bdedeeece4
Players can no longer use their abilities in spectator mode 2024-04-21 23:07:10 +01:00
Sollace
19f67c23c6
Incorporate the player's luck and allow it to turn back if left unattended 2024-04-21 18:51:30 +01:00
Sollace
22d6874102
Give them legs and they can breath underwater now 2024-04-20 17:20:18 +01:00
Sollace
2749bab863
Fixed incorrect translation for compacted etched cloud 2024-04-18 21:36:52 +01:00
Sollace
f68be46b0c
Add new chest type 2024-04-18 21:09:15 +01:00
Sollace
afad14682f
Merge branch '1.20.1' into 1.20.2 2024-04-17 14:04:17 +01:00
­Sollace
701c08a1bd
New Crowdin updates (#335) 2024-04-17 14:03:44 +01:00
Sollace
e20c4260f6
Fix crowdin jank 2024-04-17 13:59:09 +01:00
Sollace
22eaf9997c
Merge branch '1.20.1' into 1.20.2 2024-04-17 11:57:23 +01:00
­Sollace
d0cf4cea82
Merge pull request #334 from Sollace/l10n_1.20.1
New Crowdin updates
2024-04-17 11:54:50 +01:00
­Sollace
ff1ec2fc73 New translations en_us.json (German) 2024-04-15 17:11:11 +01:00
­Sollace
f221d0be12 New translations en_us.json (German) 2024-04-15 14:55:57 +01:00
­Sollace
06b009af25 New translations en_us.json (French) 2024-04-14 22:52:12 +01:00
­Sollace
8f7c87f18d New translations en_us.json (German) 2024-04-14 16:50:53 +01:00
­Sollace
4eabfb456f New translations en_us.json (German) 2024-04-14 15:48:56 +01:00
­Sollace
2bd8e26114 New translations en_us.json (German) 2024-04-13 21:12:27 +01:00
­Sollace
d7a57318ee New translations en_us.json (German) 2024-04-13 17:45:26 +01:00
­Sollace
fb909e1009 New translations en_us.json (French) 2024-04-13 17:45:23 +01:00
­Sollace
a563fa0a29 New translations en_us.json (French) 2024-04-13 16:47:01 +01:00
­Sollace
a15114db30 New translations en_us.json (French) 2024-04-13 15:49:42 +01:00
­Sollace
27685aacd7 New translations en_us.json (German) 2024-04-13 03:32:33 +01:00
­Sollace
824377ca03 New translations en_us.json (German) 2024-04-12 19:24:22 +01:00
­Sollace
e99ef2e8d4 New translations en_us.json (Chinese Traditional) 2024-04-12 19:24:21 +01:00
­Sollace
877fc9e113 New translations en_us.json (Chinese Simplified) 2024-04-12 19:24:20 +01:00
­Sollace
04404cb9d8 New translations en_us.json (French) 2024-04-12 19:24:17 +01:00
­Sollace
77a2ed3e42 New translations en_us.json (English, United Kingdom) 2024-04-12 18:19:32 +01:00
­Sollace
05f9429ddf New translations en_us.json (English (upside down)) 2024-04-12 18:19:31 +01:00
­Sollace
e625f68e5e New translations en_us.json (German) 2024-04-12 18:19:30 +01:00
­Sollace
de475de405 New translations en_us.json (Chinese Traditional) 2024-04-12 18:19:28 +01:00
­Sollace
80b812d052 New translations en_us.json (Chinese Simplified) 2024-04-12 18:19:27 +01:00
­Sollace
a891cb0dd1 New translations en_us.json (Russian) 2024-04-12 18:19:26 +01:00
­Sollace
a274f9d72f New translations en_us.json (French) 2024-04-12 18:19:25 +01:00
­Sollace
84383aa052 New translations en_us.json (English, United Kingdom) 2024-04-12 17:11:35 +01:00
­Sollace
65e845b396 New translations en_us.json (Chinese Simplified) 2024-04-12 07:17:42 +01:00
Sollace
fd8a2f3f32
Fix one more warning 2024-04-12 01:27:56 +01:00
Sollace
136267f439
Use the newer api for the polearm renderer 2024-04-12 01:27:12 +01:00
Sollace
0a5ec3da03
Indicate whether an ability can actually do something for a selected activation type 2024-04-12 01:24:15 +01:00
Sollace
86faeeaa43
Clean up warnings 2024-04-12 01:23:43 +01:00
Sollace
3489c47d63
Make the VR keys respect the toggle option and display a visual feedback when they are being used 2024-04-12 00:50:03 +01:00
­Sollace
3bfc656dd0 New translations en_us.json (Russian) 2024-04-11 22:55:58 +01:00
­Sollace
b739978701 New translations en_us.json (Chinese Traditional) 2024-04-11 20:28:44 +01:00
Sollace
408c9d11c0
Crystal doors can now be locked by providing them a signed bangle of comradery.
When locked they will only let the owner or players wearing a signed bangle through.
Also you can't cheat them
2024-04-11 19:37:25 +01:00
­Sollace
76405a8f48 New translations en_us.json (German) 2024-04-11 18:38:26 +01:00
Sollace
b99c6b6c29
Move creative tabs to datagen 2024-04-11 18:15:10 +01:00
­Sollace
6c04d866b5 New translations en_us.json (English (upside down)) 2024-04-11 16:46:14 +01:00
­Sollace
69a55c097e New translations en_us.json (German) 2024-04-11 16:46:13 +01:00
­Sollace
ffbeb78283 New translations en_us.json (Chinese Traditional) 2024-04-11 16:46:12 +01:00
­Sollace
c21e6a271a New translations en_us.json (Chinese Simplified) 2024-04-11 16:46:10 +01:00
­Sollace
6fcaf4dd04 New translations en_us.json (Russian) 2024-04-11 16:46:09 +01:00
­Sollace
5d0c7b23dd New translations en_us.json (French) 2024-04-11 16:46:08 +01:00
Sollace
9c744eb3eb
Added frog's legs 2024-04-11 15:42:35 +01:00
­Sollace
7a67232890 New translations en_us.json (German) 2024-04-11 15:40:13 +01:00
Sollace
59fbd177a2
Fixed diets not loading 2024-04-11 15:28:31 +01:00
Sollace
c78abf58be
Add poison effects to pufferfish 2024-04-11 14:47:36 +01:00
­Sollace
97bfb714e0 New translations en_us.json (German) 2024-04-11 13:59:30 +01:00
­Sollace
6c0eaff6c1 New translations en_us.json (Chinese Simplified) 2024-04-11 13:59:29 +01:00
Sollace
7abe3e4260
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	gradle.properties
2024-04-11 13:26:40 +01:00
­Sollace
58b26c90fe New translations en_us.json (Chinese Simplified) 2024-04-11 12:37:43 +01:00
­Sollace
2216b9d3d5 New translations en_us.json (English (upside down)) 2024-04-10 23:40:32 +01:00
­Sollace
04fa39bd65 New translations en_us.json (German) 2024-04-10 22:26:43 +01:00
­Sollace
3df738c560 New translations en_us.json (Chinese Simplified) 2024-04-10 15:06:04 +01:00
­Sollace
5b41458025 New translations en_us.json (Chinese Simplified) 2024-04-10 14:03:47 +01:00
­Sollace
944f4f1ca6 New translations en_us.json (German) 2024-04-10 11:51:28 +01:00
­Sollace
078e1c9354 New translations en_us.json (German) 2024-04-10 09:20:51 +01:00
­Sollace
e2ae3ab95a New translations en_us.json (Chinese Simplified) 2024-04-09 19:26:32 +01:00
­Sollace
045769c7a8 New translations en_us.json (Chinese Simplified) 2024-04-09 17:25:42 +01:00
­Sollace
9cd1b7055d New translations en_us.json (German) 2024-04-09 15:26:57 +01:00
­Sollace
146eef39ff New translations en_us.json (Chinese Traditional) 2024-04-09 15:26:56 +01:00
­Sollace
1914c90d1b New translations en_us.json (Chinese Simplified) 2024-04-09 15:26:55 +01:00
­Sollace
99f6ae0a13 New translations en_us.json (Russian) 2024-04-09 15:26:54 +01:00
­Sollace
b92db6dd32 New translations en_us.json (French) 2024-04-09 15:26:53 +01:00
Sollace
ce1ac6aed4
Add crowdin link 2024-04-09 15:09:58 +01:00
Sollace
58d435f03d
Add crowdin link 2024-04-09 15:09:28 +01:00
Sollace
b517651dc3
Add crowdin link 2024-04-09 15:09:14 +01:00
Lightingale CI/CD
c089aec00f
Update translations (#316)
Co-authored-by: Sprinkled Frosting <sprinkledfrosting@ltgc.cc>
2024-04-09 15:05:17 +01:00
LingVarr
4418f360c8
Update ru_ru.json (#331) 2024-04-09 14:02:23 +01:00
­Sollace
20cb6349f3 Update Crowdin configuration file 2024-04-09 13:57:16 +01:00
­Sollace
c157d64d61 Update Crowdin configuration file 2024-04-09 13:52:18 +01:00
­Sollace
a17310f41a Update Crowdin configuration file 2024-04-09 13:39:55 +01:00
Sollace
7e680549c7
Adjust starting size and decay rate of the black hole and add particles+item drops when decaying 2024-04-09 12:54:27 +01:00
Sollace
4a94c63e9b
Fixed seapony race appearing in the selection screen 2024-04-09 12:34:30 +01:00
Sollace
ca935ce224
Fixed error when setting race without specifying a namespace 2024-04-09 11:56:20 +01:00
Sollace
59d20f9e0f
Fix error message when trying to set an unknown race 2024-04-09 11:50:50 +01:00
Sollace
b8e2db12f0
Fixed bat ponies having both bat wings and icarus wings when wearing the wings of icarus 2024-04-09 11:48:36 +01:00
Sollace
1cab1bd16a
Fixed bat ponies having both bat and pegasus wings 2024-04-09 11:44:42 +01:00
Sollace
12748f5c6e
Fixed animations not being cancelled correctly when their timer ends. Fixes #325 2024-04-09 11:37:48 +01:00
Sollace
d5e4b69aec
Cancel velocity when changing dimensions. #329 2024-04-09 11:29:14 +01:00
Sollace
51d67d5215
Clean things up a little 2024-04-09 00:50:58 +01:00
Sollace
bd8c2f39fe
Update vortex gem texture 2024-04-09 00:50:37 +01:00
Sollace
04f8827e28
Disable the dust cloud 2024-04-09 00:21:39 +01:00
Sollace
a8f0796ad7
Added sticky keys option. Fixes #322 2024-04-08 22:13:08 +01:00
Sollace
4cb06bcc92
Move ability assignment to the races 2024-04-08 20:46:06 +01:00
Sollace
281e2ba26d
Add unique gem designs for different spells 2024-04-08 19:18:56 +01:00
Sollace
978b5e9854
Fix decay animation and improve rendering a little 2024-04-08 17:49:44 +01:00
Sollace
b84f1f046b
Add damage type for the black hole to bypass armor 2024-04-08 17:48:42 +01:00
Sollace
d6d6984955
Fix some offset issues with the dark vortex spell 2024-04-08 16:55:10 +01:00
Sollace
e465a21839
Minor fixes to Ether and some owned style changes 2024-04-08 16:53:01 +01:00
Sollace
12bc0b6973
Rewrite the dark vortex to cause less lag and adjust/apply a cap to its maximum size 2024-04-07 20:27:15 +01:00
Sollace
835834a468
Update dependencies 2024-04-06 16:08:38 +01:00
横刀天笑(Knife smile)
b81e03a489
update zh_cn.json and HTP_CN (#319) 2024-04-06 15:10:46 +01:00
LingVarr
ea12ca7f24
Update ru_ru.json (#318) 2024-04-06 15:10:21 +01:00
Sollace
ca2be7ae85
Set the max count for fried axolotl to 1 (same as other bucket foods) 2024-04-05 23:41:51 +01:00
Sollace
7140ce6d0e
Return the empty container when eating stacked food with containers 2024-04-05 23:41:32 +01:00
Sollace
34bdd7f135
Set rock stew's max count to 1 2024-04-05 23:32:14 +01:00
Sollace
9219b07aff
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	BlockusAddon
#	build.gradle
#	gradle.properties
#	src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellCraftingRecipe.java
#	src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellEnhancingRecipe.java
#	src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java
#	src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java
#	src/main/java/com/minelittlepony/unicopia/advancement/SendViaDragonBreathScrollCriterion.java
#	src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java
#	src/main/java/com/minelittlepony/unicopia/datagen/providers/URecipeProvider.java
#	src/main/java/com/minelittlepony/unicopia/entity/Living.java
#	src/main/java/com/minelittlepony/unicopia/entity/mob/AirBalloonEntity.java
#	src/main/java/com/minelittlepony/unicopia/recipe/URecipes.java
#	src/main/java/com/minelittlepony/unicopia/recipe/ZapAppleRecipe.java
#	src/main/resources/data/unicopia/loot_tables/blocks/apple_pie.json
2024-04-05 20:19:13 +01:00
Sollace
5529382e71
Move recipes to their own package 2024-04-05 18:33:24 +01:00
Sollace
8c83647004
Add cooked and rotten variants of all the fish 2024-04-05 17:10:39 +01:00
Sollace
926b8088cf
Fix some food group names 2024-04-05 15:15:14 +01:00
Sollace
d6e1a6c3b8
Fixed slime pustule not triggering a redstone update above it 2024-04-05 15:07:21 +01:00
Sollace
56e91629b1
Fix some tag references and fix diets not loading 2024-04-05 15:07:07 +01:00
Sollace
eeded18c36
Move pony diets to datagen. Summary of diets:
Unicorns:
 - have a general even preference of foods
 - Improved benefits from cooking their food before eating it
 - Can still eat raw and rotten but at a reduced yield

Earth Ponies:
 - Are vegans
 - They get the most from foraging
 - Pastries are their passion
 - If they must eat meat, they have to cook it and not let it spoil.
 - They have a sweet tooth and prefer candy, desserts, and rocks
 - Candy and rocks gives them a massive saturation boost. Maybe too much?

Pegasus
 - prefer fish over other food sources
 - Cannot eat love, or raw/rotten meat
 - Can eat raw and rotten fish but still prefers if they are cooked
 - Can safely eat fresh and cooked fish with no ill effects
 - Is less affected when eating rotten fish

Bat Ponies:
 - prefer cooked foods over raw, and meat/insects over fish
 - Doesn't like baked goods but really likes meats, fish, and insects
 - Gets food poisoning from eating rotten and raw meat
 - Can eat cooked meat and insects without negative effects
 - Becomes hyper when eating mangoes

Kirins:
 - Much like Earth Ponies, Kirins must cook their meat before they eat it
 - Cannot eat love, or raw/rotten meats and fish
 - Can eat cooked meat and insect without negative effects
 - Can eat blinding, prickly, strengthening, and glowing foraged foods without negative effects

Changelings:
 - like meat and fish but really prefer feasting on ponies' love directly from the tap
 - Doesn't like baked goods but really likes meats, fish, and insects
 - Can eat fish, meat, insects, and love without negative effects
 - Gets sick when eating foraged plants and vegetables

Hippogriffs:
 - like fish, nuts, and seeds
 - Can eat fish and prickly foods without negative effect
 - Gains more health from pinecones

Seaponies:
 - can eat seaweed, kelp, shells, and other undersea foods
 - Can eat fish without negative effect
 - Gains more health from pinecones
2024-04-05 14:06:29 +01:00
Sollace
171c786dec
Datagen food groups+
- add more variety in the foraging groups
- rebalance the probability of negative effects/food poisoning when eating the foraged things
- add groups for rotten insect
- moved fermented spider eye to the rotten insect category
- removed unused foraging_moderate category
- fixed incorrect tag reference breaking sapling eating
2024-04-04 20:22:10 +01:00
Sollace
734e75f8c8
Add proper item models and textures for the slime pustule and mysterious egg 2024-04-02 16:25:28 +01:00
Sollace
4f613ebb91
Adjust food categorizations and move some more tags to datagen 2024-04-02 11:27:38 +01:00
Sollace
a87257de83
Use the id of the food group as the name rather than the tag 2024-04-02 08:30:54 +01:00
Sollace
3bc1628fd4
Datagen loot tables and partially rewrite food 2024-04-01 23:39:21 +01:00
Sollace
77d1d62494
Fix build 2024-03-31 22:47:27 +01:00
Sollace
7d63797d4d
Jars can now hold fluids 2024-03-31 22:34:31 +01:00
Sollace
a81336ef88
Switch support for farmer's delight to farmer's delight refabricated 2024-03-31 16:47:40 +01:00
Sollace
ec9a12bdf9
Clean up tags and fix some recipe unlock conditions 2024-03-31 14:35:04 +01:00
Sollace
ea9c3bfaf9
Move more tags to datagen 2024-03-31 14:01:52 +01:00
Sollace
1503cb5773
Set butterfly spawn conditions to include more blocks 2024-03-31 02:38:59 +01:00
Sollace
2784627adc
Fix bugs and allow for storing bucketed entities in jars 2024-03-30 21:22:36 +00:00
Sollace
f0b2a8a550
Made jars placeable 2024-03-30 02:19:54 +00:00
Sollace
1fd1782051
Added chocolate oatmeal cookie
Added scone
Added recipe to craft bread from oats
Changed hay fried recipe to be vertical
2024-03-29 20:32:50 +00:00
Sollace
f500956760
- Fix hot air balloons not orienting correctly when placed
- add sandbags that you interact with to steer them
- fix various hitbox jankyness
- exclude spectators from hot air balloon collision checks
2024-03-29 20:31:49 +00:00
Sollace
f8ff162d6c
Properly copy all stack attributes when consuming the bait from a fishing rod 2024-03-29 12:31:33 +00:00
Sollace
e65838b943
Rewrite changeling ability to apply over time. Closes #312 2024-03-28 21:31:06 +00:00
Sollace
3bab3c4f56
Add villagers to the list of entities that benefit from the crystal heart. Closes #184 2024-03-28 17:13:50 +00:00
Sollace
10dc8ce6d7
Check against offline players when trying to see if a spell can modify blocks at a location. Closes #283 2024-03-28 17:05:04 +00:00
Sollace
5109b67de2
Revert seaponies back to normal if we're not able to respawn them underwater 2024-03-28 16:23:42 +00:00
Sollace
11f0bbc4e4
Move advancements back down the tree and add some advancements for seaponies and hippogriffs 2024-03-28 16:23:12 +00:00
Sollace
82b74ecb18
Added feather touch enchantment 2024-03-28 15:32:21 +00:00
Sollace
74a11086d1
Added recipe for getting pegasus feathers from gryphon feathers 2024-03-28 15:32:00 +00:00
Sollace
6b3b5c7c86
Added baited fishing rod 2024-03-28 14:51:55 +00:00
Sollace
101a560a01
Improve hot air balloon animations and fix formatting 2024-03-28 13:48:12 +00:00
Sollace
3ff7466a54
Balloons now require fuel to run 2024-03-28 13:47:54 +00:00
Sollace
fbe444b56c
Fix janky hot air balloon physics 2024-03-28 12:08:06 +00:00
Sollace
93d11531d6
Use newer loom features for datagen 2024-03-27 19:44:12 +00:00
Sollace
ff47703140
Update blockus 2024-03-27 19:43:55 +00:00
Sollace
7cf32cce52
Added bowl of nuts, oatmeal cookie, and pinecone cookie 2024-03-27 19:24:06 +00:00
Sollace
c0a64a80f1
Fixed eating rock stew also consuming the bowl 2024-03-27 19:23:39 +00:00
Sollace
e931be3388
You can now harvest pinecones and acorns from spruce and oak leaves using a hoe 2024-03-27 19:23:16 +00:00
Sollace
e02c6f57a0
Bump blockus 2024-03-27 19:22:11 +00:00
Sollace
f84f45c47c
Run datagen before publish 2024-03-27 19:20:33 +00:00
Sollace
2ae28c72d3
Fix edge sneaking when upside down 2024-03-26 22:00:43 +00:00
Sollace
dd8bf650d5
#168 Add speed boosts when performing stunts and add a stunt for flying at low altitude. 2024-03-26 20:46:19 +00:00
Sollace
4a630dfcf9
Fix slime blocks in the upside down 2024-03-26 20:21:12 +00:00
Sollace
5cfebba12e
Fix quilt crash 2024-03-26 19:05:57 +00:00
Sollace
692db5a070
Fix fall damage, ladders, hitbox calculations, clipping, camera offset, and unicorn's teleportation when in inverted gravity 2024-03-26 17:11:39 +00:00
Sollace
b4a847e4b5
Update loom 2024-03-26 17:10:18 +00:00
Sollace
2dd7fbbb55
Fix a whole bunch of gravity related issues 2024-03-26 00:04:00 +00:00
Sollace
9e329ac2f9
#314 Reduce camera motion and apply the client setting for fov scale to the flight camera 2024-03-25 19:57:21 +00:00
Sollace
54cbf2c238
Add recipe to convert seashells into bonemeal 2024-03-25 19:13:56 +00:00
Sollace
29502e7529
Don't show diet information on blocks unaffected by the diet system 2024-03-25 18:11:50 +00:00
Sollace
0f681b07b3
Rebalance and beef up the insects food group to help changelings and bat ponies 2024-03-25 18:11:31 +00:00
Sollace
380c35fcc6
Allow changelings to eat blocks (should be only humans here since the food rewrite) 2024-03-25 18:10:44 +00:00
Sollace
2ac6970e04
Added block of worms 2024-03-25 18:09:48 +00:00
Sollace
f0c5cdb156
Fix butterflies spawning in the middle of nowhere 2024-03-25 18:09:16 +00:00
Sollace
fd03dabdd6
Added specter 2024-03-25 18:08:40 +00:00
Sollace
c91b5ac985
Smol todo 2024-03-25 18:06:50 +00:00
Sollace
a6b8e6fe93
You can now place cloud pillars horizontally 2024-03-25 00:41:42 +00:00
Sollace
9ef3a946f6
Cache computed shapes (should improve bed performance) 2024-03-25 00:41:18 +00:00
Sollace
ac5aedb488
Fix some advancements and add some new ones 2024-03-24 23:06:26 +00:00
Sollace
c59b9366f6
Fix some advancement names and heirarchy 2024-03-24 22:08:11 +00:00
Sollace
a266253d53
Fix build 2024-03-24 00:49:28 +00:00
Sollace
b3be98f664
#317 Buff changeling food options slightly 2024-03-23 23:40:23 +00:00
Sollace
aa1973181f
#317 +Allow bats and hippos to walk on clouds without having to give them other pegasus abilities
Separate cloud interaction and ability to collect weather jars/use rainboom ability into two flags
2024-03-23 23:40:00 +00:00
Sollace
a4fb5e7ae7
Fix jar and bottle stack sizes to reflect the vanilla counterparts, and make filled jars fireproof same as the rest 2024-03-23 23:17:47 +00:00
Sollace
d0d17a3eed
Move all remaining advancements to datagen and some new ones 2024-03-23 23:16:44 +00:00
Sollace
f67ab25a54
Fix MC-269785 for our own beds 2024-03-22 20:44:43 +00:00
Sollace
01b9e11e2d
Fixed fancy beds deleting their sheets when broken 2024-03-22 19:09:50 +00:00
Sollace
7c48486956
Added texture and name for white bed sheets 2024-03-22 18:52:42 +00:00
Sollace
bc90a96e44
Fixed trait serialization 2024-03-22 18:52:30 +00:00
Sollace
64fb0ecc07
Fixed trick recipe generation 2024-03-22 18:37:22 +00:00
Sollace
e3afab9858
Fix cloud pillar dropping too many blocks 2024-03-22 18:37:10 +00:00
Sollace
07c8170652
Move all remaining recipes to datagen.
Summary of changes:
 - Changed cutting recipe for etched clouds to require normal clouds
 - Added cutting recipe for cloud planks
 - Made the unstable cloud recipe shapeless
 - Unstable cloud recipe now outputs 8 blocks
 - Added recipes for stripped zap wood and waxed stripped zap wood
 - Made chitin<->carapace recipe reversible
 - Made gravel <-> pebbles recipe reversable
 - The sus gravel -> pebbles recipe is among us now
 - Changed chitin spikes recipe to give 8 instead of 1
 - Changed diamond to shard recipe to give 6 instead of 3
 - Added recipe to get 3 shards from amethyst shards
 - Made golden oak seeds obtainable by crafting a golden apple
 - Removed the complex cider recipe
 - The simple cider recipe now requires requires apple to craft
 - Increased experience gained from cooking zap apples
 - Made the zap apple jam jar recipe shapeless
 - Made the jam toast recipe shapeless
 - Added trick recipes for golden apple, mango, pineapple, and horseshoe fries
 - Added white bed sheets, and added a recipe to dye white bed sheets any color and pattern
 - Added recipes to change any bedsheet into any color or pattern using the right wool
2024-03-22 17:55:21 +00:00
Sollace
a3c1248e9f
Move all remaining regular recipes to datagen 2024-03-22 00:07:36 +00:00
Sollace
c608a33aea
Merge branch '1.20.1' into 1.20.2 2024-03-20 21:49:36 +00:00
Sollace
1e8b6ebaab
Set up recipe datagen 2024-03-20 21:38:42 +00:00
Sollace
7d59e1e0bf
Fix enchantment occurances and remove the curse rank from clingy. Fixes #306 2024-03-20 21:35:38 +00:00
Sollace
3b4639d5da
Move seasons data to datagen and add growth speeds for bananas, palm trees, and golden oak trees 2024-03-20 19:40:31 +00:00
Sollace
2dffb92e54
Move additional tags to datagen 2024-03-20 19:39:33 +00:00
Sollace
599dfea711
Remove unused field 2024-03-20 00:25:26 +00:00
Sollace
f7534f9f84
Fixed being able to equip amulets the the chest slot when trinkets is installed. #300 2024-03-20 00:21:50 +00:00
Sollace
cef8ef15ce
Fixed players wearing the alicorn amulet getting the time change ability. #300 2024-03-19 22:57:31 +00:00
Sollace
1f2d6c0411
Fix flight when in inverted gravity. Closes #302 2024-03-19 22:53:43 +00:00
Sollace
095b10802f
Update ad-astra integration 2024-03-19 22:25:42 +00:00
Sollace
1922c02f5b
Fix incorrectly-generated seasons models 2024-03-19 22:25:29 +00:00
Sollace
ffc66293fd
Fix fruit and nuts and seeds tags 2024-03-19 22:25:06 +00:00
Sollace
672dd72d62
Move a whole bunch of item tags to datagen 2024-03-19 20:46:29 +00:00
Sollace
7bad93044d
Move remaining block tags to datagen 2024-03-19 13:57:56 +00:00
Sollace
731de7572f
Add shells to fishing loot tables. Closes #299 2024-03-19 13:22:39 +00:00
Sollace
00b625815c
Move vanilla loot tables to datagen. Changes:
- Fixed coarse dirt not dropping gemstones or wheat worms
- Fixed desert well loot tables
- Adjusted looting amounts in some places
- Gemstone and wheatworm drops are now affected by looting
- All crops are now recognised by bees and will preserve farmland
2024-03-19 13:12:40 +00:00
Sollace
e07377f91e
Fixed unicopia loot replacing vanilla drops for blocks instead of adding to it 2024-03-19 00:35:17 +00:00
Sollace
7d1d2f45da
Set up tags and loot tables generation 2024-03-18 17:11:16 +00:00
Sollace
9d59c89ac2
Move seasons stuff to datagen 2024-03-17 15:14:03 +00:00
Sollace
86cc754a7d
Remove collission from plunder vine buds 2024-03-17 14:42:41 +00:00
Sollace
e859c71e4f
Datagen plundervine blockstates 2024-03-17 14:42:26 +00:00
Sollace
16b68d43ba
Clean up door model generation 2024-03-17 12:58:56 +00:00
Sollace
620e5622f1
Updated cloud and crystal door item textures 2024-03-16 16:17:35 +00:00
Sollace
54db20a623
Give stable doors their internals back 2024-03-16 16:09:09 +00:00
Sollace
956b55dc30
Datagen the rest of the blocks and fix some texturing on soggy cloud blocks 2024-03-16 15:26:45 +00:00
Sollace
9db67f6727
More datagen 2024-03-15 00:57:14 +00:00
Sollace
1bf698cf5d
Move flattened blocks to datagen 2024-03-14 16:29:22 +00:00
Sollace
bdc41c58c4
Move yet more things to datagen 2024-03-13 21:37:19 +00:00
­Sollace
5360274ed3
Merge pull request #304 from LingVarr/1.20.1
Update ru_ru.json
2024-03-13 10:13:00 +00:00
LingVarr
5180c2ca5b Update ru_ru.json 2024-03-13 15:43:43 +11:00
Sollace
0ffedcf688
Set up datagen 2024-03-12 21:57:30 +00:00
Sollace
4d4647a385
Added a nuts food category for hippogriffs 2024-03-12 17:57:09 +00:00
Sollace
1c878be324
Fixed overlay on summoned minions not rendering correctly and make it shift through different colours 2024-03-12 14:53:02 +00:00
Sollace
53f7e34e59
Fix alignment of gemstones in the spell dismissal screen 2024-03-12 14:53:02 +00:00
Sollace
f06dad53fc
Update corruption mechanics.
- Players no longer gain corruption from taking damage, but
 - But spells with the dark alignment now cause more corruption
and gaining corruption has side-effects not unlike the mild
effects of wearing an alicorn amulet.
 - Every time a side-effect manifests, the player's corruption goes
down.
 - Alicorn Amulet and Grogar's bell now cause more corruption

Corrupt influence now clones mobs when they are damaged
rather than just randomly.
2024-03-12 14:53:02 +00:00
Sollace
e5f2f696ba
Unicorns no longer gain corruption when taking damage 2024-03-12 14:53:02 +00:00
Sollace
0e067e2a24
Unicorn casting speed now scales with their level 2024-03-12 14:53:02 +00:00
Sollace
dce29e46a6
Fix teleportation issues which puts the player inside blocks/in the air above leaves/prevents teleporting to snow covered blocks 2024-03-12 14:53:02 +00:00
­Sollace
a36a654a09
Merge pull request #303 from Cryghast/1.20.1
update zh_cn.json
2024-03-12 10:01:30 +00:00
Cryghast
0e45d9379b update zh_cn.json 2024-03-12 17:56:08 +08:00
Sollace
9eb0a0028b
Add enchantment descriptions support 2024-03-09 21:57:44 +00:00
Sollace
7d48821770
Adjust food balancing and create separate categories for fruit and baked goods,
fix desserts and candy showing as fruits and vegetables in tooltips
 fix farmers delight dessert items not being part of the dessert category
#293
2024-03-03 16:06:06 +00:00
Sollace
385c412a9d
Don't harm entities the pegasus is carrying when doing a rainboom 2024-03-03 14:15:45 +00:00
Sollace
5348e12aca
Fix #290 and exclude spectators from being affected by magic 2024-03-03 14:15:20 +00:00
Sollace
308cb721cd
Separate the magic beam into its own entity 2024-03-03 14:07:36 +00:00
Sollace
3165f3cd2a
Fix some rendering issues with filled jars 2024-03-03 12:45:53 +00:00
Sollace
2d2a6e9b32
Fixed fruit tree growth + use bonemeal to grow apples 2024-03-03 12:23:42 +00:00
Sollace
e1df02bdf7
Merge branch '1.20.1' into 1.20.2 2024-03-02 18:11:59 +00:00
Sollace
3a44b9605f
Add submodule file 2024-03-02 18:10:58 +00:00
Sollace
829a57d00d
Merge branch '1.20.1' into 1.20.2 2024-03-02 17:28:33 +00:00
JCM
e03fa2f564
Make the Friendship Bracelet work for the Pegasus Rainboom Ability 2024-03-02 17:26:25 +00:00
­Sollace
53984c3346
Merge pull request #288 from LingVarr/1.20.1
Update ru_ru.json
2024-03-02 17:08:51 +00:00
Sollace
89aeb3903f
Fix #287 2024-03-02 17:08:17 +00:00
LingVarr
713fde35f0 Update ru_ru.json 2024-03-03 03:40:50 +11:00
Sollace
75d41c1468
Bump blockus 2024-03-02 15:40:07 +00:00
Sollace
1e02de30c4
Merge branch '1.20.1' into 1.20.2 2024-03-02 15:12:35 +00:00
Sollace
58b134577f
Update blockus ref 2024-03-02 15:12:15 +00:00
Sollace
f4b607346a
Merge branch '1.20.1' into 1.20.2 2024-03-02 15:01:32 +00:00
Sollace
b6f71400a9
Update blockus addon 2024-03-02 15:01:11 +00:00
Sollace
2f74a90afc
Le fixes 2024-03-02 00:35:23 +00:00
Sollace
06015ee10b
Bump blockus addon 2024-03-01 23:28:25 +00:00
Sollace
df0cc6d225
Allow for placing our saplings in flower pots 2024-03-01 23:28:25 +00:00
­Sollace
d408f82785
Merge pull request #284 from Cryghast/1.20.1
update zh_cn.json
2024-03-01 14:56:20 +00:00
Cryghast
f0f02b478f update zh_cn.json 2024-02-29 23:12:53 +08:00
Sollace
975f49d390
Create blockus addon 2024-02-28 20:56:57 +00:00
Sollace
e21cffcf7d
Butterflies will now follow the player if they're holding a flower 2024-02-27 21:21:08 +00:00
Sollace
aa00b1a9b0
Fixed shields rendering on players in the inventory screen 2024-02-27 21:20:50 +00:00
Sollace
e03fb016d5
Fixed shields not deflecting projectiles 2024-02-27 21:20:33 +00:00
Sollace
9c71272def
Only interact with the datatracker after it's safe to do so 2024-02-27 00:01:22 +00:00
Sollace
ba2e673de7
Each butterly type has its own item and throwing a butterfly in a jar will spawn a butterfly of that type where it lands 2024-02-26 23:05:30 +00:00
Sollace
8a2463d0a8
You can now safely collect slime pustules with shears and silk touch tools 2024-02-26 23:04:38 +00:00
Sollace
5d7227f547
Fixed frozen effect rendering on boats when sodium is installed 2024-02-26 21:22:18 +00:00
Sollace
850aa8a9fd
Fixed chilling breath spell 2024-02-26 20:56:22 +00:00
Sollace
58561a5eea
Reduce the space requirement for the sour apple saplings 2024-02-26 20:47:39 +00:00
Sollace
1c88d47e7b
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	gradle.properties
2024-02-24 16:30:51 +00:00
Sollace
0ba987159f
Prevent delta from becoming infinity or nan when duration is 0 2024-02-24 16:22:41 +00:00
Sollace
f9711b9043
Add error messages when lerping nan values 2024-02-24 16:09:02 +00:00
Sollace
450eee5fe6
Downgrade for quilt compatibility 2024-02-24 14:22:28 +00:00
Sollace
3f475c693b
Update minelp 2024-02-24 13:50:45 +00:00
Sollace
07bf99fcac
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	gradle.properties
2024-02-24 13:32:29 +00:00
Sollace
3606c5b0f2
Fixed mobs not being able to wear the amulets when trinkets is present 2024-02-24 13:06:32 +00:00
Sollace
4b66dd517f
Fixed leaves rendering weird with sodium and fast graphics 2024-02-22 00:49:21 +00:00
Sollace
a11f8d33eb
Fixed clients slinging sneaky superfluous flight control packets. Fixes #267 2024-02-22 00:04:39 +00:00
Sollace
672807e343
Nerf leaves. Fixes #270 2024-02-21 23:22:28 +00:00
Sollace
a5132859ab
Fixed incorrect percentage breakdown for pony diets in tooltips 2024-02-21 23:21:41 +00:00
Sollace
5acebc270c
Fix cloud door recipe. Closes #265 2024-02-21 22:51:28 +00:00
Sollace
00a20fbdc7
Fixed ability spells not cancelling when the player loses access to the granting ability. Fixes #272 2024-02-21 22:46:10 +00:00
Sollace
53497c70d6
Fix incompatibility with mods that add points of interest containing chests 2024-02-20 20:21:16 +00:00
Sollace
703c8e6d39
Fix cabbage lad crash #271 2024-02-20 20:09:57 +00:00
Sollace
cdfc4babb4
Fix leaf flowers rendering on fast graphics 2024-02-20 18:40:04 +00:00
Sollace
de016d30dd
Make stressed and heavy enchantments less common 2024-02-18 14:46:20 +00:00
Sollace
0560ff5556
Remove terrain adaptation from floating islands because it still looks weird 2024-02-18 14:42:42 +00:00
Sollace
d07b7bd5a2
Fix crash when discarding a spell 2024-02-18 14:39:18 +00:00
Sollace
2abeff5767
Disable leaf flowers on fast graphics 2024-02-18 14:37:49 +00:00
Sollace
5c8ee9c0ff
Merge branch '1.20.1' into 1.20.2 2024-02-17 15:29:14 +00:00
­Sollace
c924d81331
Merge pull request #260 from LingVarr/1.20.1
Update ru_ru.json
2024-02-17 15:07:09 +00:00
­Sollace
e9092aaf4e
Merge pull request #261 from Cryghast/1.20.1
update zh_cn.json
2024-02-17 15:06:37 +00:00
Cryghast
4351644ced update zh_cn.json again 2024-02-17 21:57:45 +08:00
Cryghast
a0ace5ea1f update zh_cn.json 2024-02-17 21:43:56 +08:00
Sollace
013a75fccb
Merge branch '1.20.1' into 1.20.2 2024-02-16 16:52:41 +00:00
Sollace
4edde4d479
Added a new feature to hive blocks 2024-02-16 16:42:48 +00:00
Sollace
0e1d7e8a51
Fix z-fighting on the hive block 2024-02-16 12:18:08 +00:00
Sollace
4dcc919d5e
Update zap apple textures 2024-02-16 12:06:32 +00:00
LingVarr
a12c70a67e Update ru_ru.json 2024-02-16 19:28:01 +11:00
Sollace
cef99f4a67
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	README.md
#	src/main/java/com/minelittlepony/unicopia/client/gui/TribeConfirmationScreen.java
#	src/main/java/com/minelittlepony/unicopia/client/minelittlepony/Main.java
2024-02-15 16:24:09 +00:00
Sollace
ae8068ccb4
Fix build 2024-02-15 14:17:02 +00:00
Sollace
c0cff59963
Fix issues disguising as crystal shards and prevent disguises from dropping items 2024-02-14 23:57:01 +00:00
Sollace
1c2560c910
Fixed issues when disguising as a friendly creeper 2024-02-14 23:46:40 +00:00
Sollace
1c32d71d46
Improve disguise arm rendering 2024-02-14 23:46:25 +00:00
Sollace
e69749300d
Disguises now render arms in first person 2024-02-13 23:51:21 +00:00
Sollace
e7e88c4805
Fixed being able to select disabled races 2024-02-13 21:58:37 +00:00
Sollace
9b3cb7944a
Improve the /unicopia racelist command and give better feedback when it is enabled or disabled 2024-02-13 21:58:19 +00:00
Sollace
91b8b827a6
Damage from disguises is now passed through to their hosts 2024-02-13 18:53:50 +00:00
Sollace
e1d4b229ff
Fixed spells not rendering on disguised players 2024-02-13 18:53:50 +00:00
­Sollace
4593648974
Merge pull request #257 from Cryghast/1.20.1
update zh_cn.json
2024-02-13 17:27:27 +00:00
­Sollace
336c1c320a
Merge pull request #256 from LingVarr/1.20.1
Update ru_ru.json and READMEs
2024-02-13 17:27:16 +00:00
Sollace
92fd22668e
Smooth motion due to airflow and wind. Should fix any bumps and sudden changes in direction/altitude when flying and overall make controlling whilst flying more manageable 2024-02-13 17:24:39 +00:00
Sollace
2754d41ee9
Fix dust appearing in the ground and fix clouds appearing black (use per-vertex lighting) 2024-02-13 16:21:14 +00:00
Cryghast
a072317f31 update zh_cn.json 2024-02-13 23:36:24 +08:00
LingVarr
1b424a1445 Update ru_ru.json and READMEs 2024-02-13 14:44:12 +11:00
Sollace
e97adc8841
Add /racelist show and /racelist rest 2024-02-12 19:36:43 +00:00
Sollace
db53f4906e
Fixed tribe selection gui not scrolling to the correct position when opening 2024-02-12 17:45:03 +00:00
Sollace
cdcbfea8dc
Allow alicorns to use time change and move the sun to where you're looking when starting the ability 2024-02-12 17:30:03 +00:00
Sollace
ceb98f6fab
Add missing ability icons 2024-02-12 17:29:11 +00:00
Sollace
bb661da35e
Add a LEVEL option to the mana command 2024-02-12 13:27:50 +00:00
Sollace
6465d99e3e
Adjust shield spell shape 2024-02-12 13:27:37 +00:00
Sollace
ae5464b758
Fixed shapeshifting and fixed disguise entities not playing animations 2024-02-12 13:14:40 +00:00
­Sollace
46dcf0802b
Merge pull request #255 from Cryghast/1.20.1
upadte zh_cn.json
2024-02-12 06:48:40 +00:00
横刀天笑(Knife smile)
f2bc32a90b
Merge branch 'Sollace:1.20.1' into 1.20.1 2024-02-12 11:30:54 +08:00
Sollace
a9db2490f5
Make common enchantments less common 2024-02-11 20:51:12 +00:00
Sollace
80c31b4a1d
Fix items with heartbound not being restored if it had only 1 enchantment level before dying 2024-02-11 20:31:37 +00:00
Sollace
0de1847392
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	gradle.properties
2024-02-11 14:52:56 +00:00
Sollace
623d231f2f
Fix the mimic spell recipe 2024-02-11 14:51:29 +00:00
Sollace
ae0179be8f
Fix compatibility with Synatra Connector / Froge 2024-02-11 14:01:18 +00:00
Cryghast
4644092120 update zh_cn.json 2024-02-11 20:37:18 +08:00
Sollace
18f2865264
Add an option to disable the post-effect shader 2024-02-11 11:01:35 +00:00
Sollace
989d1df294
Add toggles for pehkui and sodium 2024-02-11 00:28:39 +00:00
Sollace
65b468507c
Added flowers to apple tree leaves when they are flowing 2024-02-10 21:56:36 +00:00
Sollace
f8b4238822
Revert the player range check when dropping fruit from trees 2024-02-10 21:09:36 +00:00
Sollace
ded8499e9f
Adjust tree spawn rate and add a sweet apple orchard biome 2024-02-10 18:16:25 +00:00
Sollace
9599d0044b
Update minelp 2024-02-10 18:16:25 +00:00
­Sollace
09abc30c2d
Merge pull request #253 from LingVarr/1.20.1
Update ru_ru.json
2024-02-09 11:53:40 +00:00
LingVarr
6586e7625d Update ru_ru.json 2024-02-09 19:12:09 +11:00
LingVarr
dd804c872e
Merge branch 'Sollace:1.20.1' into 1.20.1 2024-02-09 19:00:43 +11:00
Sollace
34566b560e
Add dev dependencies 2024-02-08 22:59:21 +00:00
Sollace
5e099aeea5
Only load these if the mod is present 2024-02-08 22:17:36 +00:00
Sollace
1b688ac9f4
Only load these if the mod is present 2024-02-08 22:17:16 +00:00
Sollace
5cc612ca3a
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BodyPartGear.java
#	src/main/java/com/minelittlepony/unicopia/client/minelittlepony/Main.java
#	src/main/java/com/minelittlepony/unicopia/compat/emi/Main.java
#	src/main/java/com/minelittlepony/unicopia/item/URecipes.java
#	src/main/java/com/minelittlepony/unicopia/server/world/UnicopiaWorldProperties.java
2024-02-08 20:16:46 +00:00
Sollace
5ed68fca7f
Added zap fence and zap fence gate 2024-02-08 19:56:41 +00:00
Sollace
400bc19d08
Added zap planks, stairs, and slabs 2024-02-08 16:56:32 +00:00
Sollace
c4ab7e1bdf
Zap logs can now be waxed to keep them from zapping you when you mine them 2024-02-08 15:19:41 +00:00
Sollace
17cd097d88
Move recipes 2024-02-08 15:06:51 +00:00
Sollace
a0d6c41088
Fixed zap apple logs not placing correctly 2024-02-08 14:59:04 +00:00
Sollace
4aa088ec1b
Fix invalid traits 2024-02-08 14:53:05 +00:00
Sollace
2d7eca4d5b
Zap leaves now drop zaplings 2024-02-08 14:38:59 +00:00
Sollace
6fd124ed81
Fixed zap blocks destroying item drops 2024-02-08 14:25:40 +00:00
Sollace
adb07cc586
Add spectral_clock, curing_joke, and flowering_zap_leaves to the creative tabs for respective tribes 2024-02-08 14:23:26 +00:00
Sollace
660973371d
Fixed stripped zap logs and wood not dropping 2024-02-08 14:22:52 +00:00
LingVarr
476d779b3d Update ru_ru.json 2024-02-08 00:15:58 +11:00
Sollace
b467aae7b2
Fixed bulb attacking players in creative and spectator mode 2024-02-07 13:02:20 +00:00
Sollace
7b78cbc49c
Magic shields now use the pony's horn colour and change shape when extending 2024-02-07 12:54:23 +00:00
Sollace
36e22f1ead
Improve network syncing of spells and fix some shield radius resets 2024-02-07 12:24:53 +00:00
Sollace
5fb54aa2fd
Fixed changeling wing animations and posing 2024-02-07 10:56:13 +00:00
Sollace
2b2fab2303
Fix changeling climbing on ladders and scaffolding #248 2024-02-07 10:55:58 +00:00
Sollace
8d736befa5
Fixed the king sombra boss fight 2024-02-06 16:39:20 +00:00
Sollace
1fdf88dce7
Strip alicorn amulet effects when doing the mind swap spell 2024-02-06 16:39:20 +00:00
Sollace
2f68d4409a
Add sculk events when the bulb roars and kirin rage 2024-02-06 16:39:20 +00:00
Sollace
afe44d0ca1
Fixed the death message when being killed by a kirin raging 2024-02-06 16:39:20 +00:00
Sollace
c30ef7e9c1
Give spikes their own damage type 2024-02-06 16:39:20 +00:00
Sollace
f3f38aae7b
Fix shields, fix black holes being offset, and remove the maximum cap on black holes sizes 2024-02-06 16:39:20 +00:00
Sollace
4e8f683737
Reduce spawn rates of LITERALLY EVERYTHING 2024-02-06 16:39:20 +00:00
­Sollace
1b5910aab1
Merge pull request #252 from LingVarr/1.20.1
Update ru_ru.json
2024-02-05 19:01:56 +00:00
LingVarr
4e57272470 Update ru_ru.json 2024-02-06 00:33:35 +11:00
­Sollace
2a6d7932c7
Merge pull request #251 from Cryghast/1.20.1
参考zh_tw修正了一些翻译错误
2024-02-05 12:26:38 +00:00
­Sollace
aba0526acd
Merge pull request #249 from ltgc-lilac/1.20.1
Some French and Chinese translations
2024-02-05 12:26:05 +00:00
Sollace
3d5292c7f3
Add structure previews to the emi recipes for earth ponies, add the spectral clock recipe to emi, and ensure items aren't burned when throwing them into the altar's flame 2024-02-05 12:21:10 +00:00
Sprinkled Frosting
a29a4eb05e 削除無用檔案 2024-02-05 07:08:06 +00:00
Sollace
e48b7bd244
Improve structure rendering performance and change lighting 2024-02-05 00:34:49 +00:00
Cryghast
ad484ee74d 修正了一些翻译错误 2024-02-05 01:05:09 +08:00
Sollace
3b0a64326e
Move mana label to a static 2024-02-04 12:18:06 +00:00
­Sollace
1181399977
Merge pull request #250 from Cryghast/1.20.1
update zh cn json
2024-02-04 11:49:12 +00:00
­Sollace
141b67884f
Merge pull request #247 from LingVarr/1.20.1
Update ru_ru.json (Spellbook!) + fix typos in en_us.json
2024-02-04 11:48:40 +00:00
LingVarr
7435eed8a9 Update ru_ru.json 2024-02-04 15:59:59 +11:00
LingVarr
b9b2dac114
Merge branch 'Sollace:1.20.1' into 1.20.1 2024-02-04 15:06:26 +11:00
Sollace
5af0f73f5c
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/container/SpellbookChapterLoader.java
#	src/main/java/com/minelittlepony/unicopia/network/MsgZapAppleStage.java
2024-02-03 23:19:53 +00:00
Sollace
c7a23a19d9
Add pages for the altar and the spectral clock 2024-02-03 23:17:45 +00:00
Sollace
73d4975bf4
Remove extra ice spell page (should be blank) 2024-02-03 23:17:02 +00:00
Sprinkled Frosting
2d00b3ad77 修正 2024-02-03 17:50:07 +00:00
Sprinkled Frosting
4a081f0c9c 基本完成 2024-02-03 17:43:47 +00:00
Sprinkled Frosting
09343e25c7 基本完成了啦雞掰人 2024-02-03 17:28:49 +00:00
Cryghast
ec1fcdb41d 魔咒改成魔法 2024-02-04 01:18:54 +08:00
Lumière Élevé
cfd2d7d42b Gitea 2024-02-03 17:02:55 +00:00
Lumière Élevé
d7dda76ebd What the heck I didn't even pass the first 10% 2024-02-03 16:57:46 +00:00
Sprinkled Frosting
ac9428668a 進度 2024-02-03 16:55:38 +00:00
Sprinkled Frosting
fef9c2bdde 我似乎忘記了一些 2024-02-03 16:26:35 +00:00
Sprinkled Frosting
cd6047ba8e 字幕 2024-02-03 16:22:49 +00:00
Sprinkled Frosting
40975732ce 死亡訊息 2024-02-03 16:04:52 +00:00
Cryghast
1bd3723539 添加了句号 2024-02-03 23:49:28 +08:00
Cryghast
353b0626d9 update zh cn json 2024-02-03 23:27:25 +08:00
Lumière Élevé
1529fa4dd0 Some more stuff. 2024-02-03 15:17:31 +00:00
Lumière Élevé
f97c7b17bd
Merge branch 'Sollace:1.20.1' into 1.20.1 2024-02-03 13:33:29 +00:00
Sprinkled Frosting
408cb8c4a7 種族選擇 2024-02-03 13:16:23 +00:00
Sprinkled Frosting
9209b5dbd3 魔法與食物 2024-02-03 12:47:21 +00:00
Sollace
4230518d08
Make the spectral clock more accurate 2024-02-03 12:42:26 +00:00
Sprinkled Frosting
b9266b047e 熒幕提示 2024-02-03 12:18:36 +00:00
Sprinkled Frosting
da42cadad0 藥水 2024-02-03 12:15:29 +00:00
Sprinkled Frosting
b356d1f888 正體中文實驗 2024-02-03 11:28:00 +00:00
Lumière Élevé
ae730ce8fc Some French translations. 2024-02-03 10:31:05 +00:00
Lumière Élevé
26fc8f9823 Prepare a new file for French translations. 2024-02-03 10:10:02 +00:00
LingVarr
8454ccedd7
Update en_us.json 2024-02-03 13:07:02 +11:00
Sollace
466ba09072
Merge branch '1.20.1' into 1.20.2 2024-02-02 21:17:53 +00:00
Sollace
38892ffde4
Remove unused mixin 2024-02-02 21:17:34 +00:00
Sollace
eb4c70de2f
1.20.1 -> 1.20.2 (merge fixes) 2024-02-02 21:17:16 +00:00
Sollace
ad1784b417
Merge branch '1.20.1' into 1.20.2
# Conflicts:
#	src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/element/Recipe.java
#	src/main/resources/assets/unicopia/lang/zh_cn.json
2024-02-02 21:08:49 +00:00
Sollace
5a5ec8b24c
Implement method to obtain the spectral clock using the altar 2024-02-02 21:04:20 +00:00
LingVarr
38e2a1c035 Update ru_ru.json
Spellbook time
2024-02-02 22:01:54 +11:00
LingVarr
8fd97223ed Fix some typos in en_us.json
I hope those were typos and not some special irish grammar.
2024-02-02 22:01:10 +11:00
Sollace
28e64eebe1
Fix incorrect translation string 2024-02-02 08:26:00 +00:00
Sollace
a0ebfbacce
Move the unintelligle stuff to translation strings for LingVarr 2024-02-02 08:23:22 +00:00
Sollace
82428f77b7
Add more stages to the spectral clock 2024-02-02 08:16:33 +00:00
Sollace
7cb8e9c859
Fixed cloud block placement desync when on multiplayer 2024-02-01 23:17:46 +00:00
Sollace
8804fa0aba
Added the spectral clock for tracking the zap apple tree's season and make the zap apple tree cyce faster 2024-02-01 21:47:05 +00:00
Sollace
e1f4d77580
Adjust tree heights to remove the possibility of trees generating absurdly tall 2024-02-01 13:26:57 +00:00
Sollace
2e938633e9
Clean up and adjust transitions when zap apple trees change stages 2024-02-01 13:26:35 +00:00
Sollace
fbe859dcc7
Fixed zap apple trees not progressing through their stages properly 2024-02-01 13:00:38 +00:00
Sollace
b194f720ef
Fixed spell equip sound playing when opening the spellbook 2024-02-01 12:18:15 +00:00
Sollace
72b5b3d50c
Apply text tint to more parts of the spellbook's contents 2024-02-01 12:12:25 +00:00
Sollace
e85bb4b3a5
Fix formatting being lost when wrapping text
- move page headers outside the scrollable area,
- fix text cut off at the bottom of the scroll region
2024-01-31 17:00:47 +00:00
Sollace
a36aa10085
Add the dust cloud when pegasi take off from sand, gravel, and concrete power
+ fix dust particles flying away too quickly from where a pegasus takes off
2024-01-31 14:05:14 +00:00
Sollace
dc6bc9fe9e
Add a dust cloud when earth ponies stomp sand, gravel, and concrete powder 2024-01-31 14:04:29 +00:00
Sollace
d08de6fae8
Make chapter contents translatable 2024-01-30 15:32:54 +00:00
Sollace
e15d64ff3d
Implement support for displaying chapters with varying content height 2024-01-29 21:19:47 +00:00
Sollace
d4e698fa56
Move earth ponies' transmutations to recipes 2024-01-29 19:05:20 +00:00
Sollace
78dbc800ae
Assign traits to a lot of items that needed it 2024-01-29 16:35:21 +00:00
­Sollace
8af82ade1c
Merge pull request #246 from Cryghast/1.20.1
update zh_cn and en_us
2024-01-28 20:00:28 +00:00
Cryghast
7c1eaf8736 update zh_cn and en_us 2024-01-28 22:44:28 +08:00
­Sollace
4eec169f5a
Merge pull request #243 from LingVarr/1.20.1
Update ru_ru.json
2024-01-28 01:58:30 +00:00
Sollace
fcad058e3a
Add the bulb as a possible generation in the pit 2024-01-27 21:19:01 +00:00
Sollace
31850a0f5c
Add a trap to the changling hive using the new potion 2024-01-27 21:18:42 +00:00
Sollace
e06ae63077
Add time-limited variants of the metamorphosis potions and add make all potions craftable 2024-01-27 21:17:16 +00:00
Sollace
e385eb5640
Add config options for portal rendering 2024-01-27 04:21:31 +00:00
Sollace
80500a74c8
Improve portal rendering 2024-01-27 04:08:56 +00:00
Sollace
da3aec8d83
Don't render debug info for the first person entity 2024-01-27 00:22:27 +00:00
Sollace
cd9597f117
Fix portals placing in the ground 2024-01-27 00:21:27 +00:00
Sollace
8b7a55d764
Combine TexturedSphereModel into SphereModel 2024-01-26 23:30:22 +00:00
Sollace
7c7ea1e555
Fix build 2024-01-26 16:10:59 +00:00
Sollace
0910ad72ca
Fixed dismissing spells from the gui killing them without going through the normal removal process 2024-01-26 15:58:22 +00:00
Sollace
4151b66e99
Fix shields targetting the entity it belongs to 2024-01-26 15:57:36 +00:00
Sollace
bbe9eb0068
Fix shields not rendering in first person and change shields to be a semi-circle (since the rest will just clip into the ground) 2024-01-25 22:58:40 +00:00
Sollace
885bf6d1c4
Only send entities through a portal if they're facing into it 2024-01-25 22:58:02 +00:00
Sollace
4c821a521c
Change cast spells to be easier to reach and change the center to be the center of the entity not its base position 2024-01-25 22:57:44 +00:00
Sollace
1a17ff7dd0
Fix portal rendering issues :D 2024-01-25 22:56:22 +00:00
Sollace
a19637a8e4
Allow spells to animate post-removal 2024-01-25 19:09:57 +00:00
Sollace
5356c5c7ec
Disable fancy portal rendering since they don't work quite right 2024-01-24 22:06:40 +00:00
Sollace
8785a3f5aa
Add portal rendering (wip) 2024-01-24 19:44:57 +00:00
Sollace
fce8623f44
Add svg source for the black hole's texture 2024-01-24 19:44:46 +00:00
Sollace
56e1f5ffeb
Fixed portals breaking when relogging and fixed various portal placements 2024-01-24 19:44:30 +00:00
LingVarr
e1cc467b05 Merge branch '1.20.1' of https://github.com/LingVarr/Unicopia into 1.20.1 2024-01-23 10:33:40 +11:00
Sollace
eb1b767319
Clean up deprecated particle handling 2024-01-22 23:28:03 +00:00
Sollace
edb1e024d6
Fix portals and move them to a spell renderer 2024-01-22 17:23:11 +00:00
Sollace
225c67d558
Tweak dark vortex rendering and fix its behaviour 2024-01-22 15:47:58 +00:00
Sollace
34aa3b8ced
Fixed spells not rendering on non-pony entities 2024-01-22 13:48:24 +00:00
Sollace
39672e5028
Fixed crash when equipping the bangle of comradery 2024-01-22 13:48:03 +00:00
Sollace
dd9bec2a0c
Added a visible icon for active spells in the world (shows timer countdown when applicable) 2024-01-22 13:19:58 +00:00
Sollace
e1d9faa223
Switch to using a spell renderer for bubble spells 2024-01-22 13:19:29 +00:00
Sollace
8cb3ba298d
Fixed dark vortex particles not going to its actual center 2024-01-22 13:19:01 +00:00
Sollace
134db120cd
Fix timed spells' timers not displaying correctly 2024-01-22 13:17:45 +00:00
Sollace
9510b83c72
Implement a renderer for the back hole 2024-01-21 18:06:53 +00:00
Sollace
e09ade57b1
Add a method to render a spell using the dispatcher 2024-01-21 15:19:49 +00:00
Sollace
3827deb235
Set up a proper render layer for shields 2024-01-21 15:17:21 +00:00
Sollace
7fb9543dbe
Move shield effect over to a spell renderer 2024-01-20 22:31:32 +00:00
Sollace
b3a7d338d2
Reimplement placed spell rendering to no longer require a particle 2024-01-20 19:48:43 +00:00
Sollace
81070be4b3
Fixed spells not affecting experience orbs 2024-01-20 16:45:33 +00:00
Sollace
e017fb1b89
Fix lag when both a dark vortex and hydrophobic (as well as other combinations) of spells are active at once 2024-01-20 16:45:22 +00:00
Sollace
7b1f5ce0db
Fix error loading the dead ringer advancement 2024-01-20 16:44:33 +00:00
LingVarr
35536e6e4a Update ru_ru.json 2024-01-21 03:03:41 +11:00
Sollace
69985e50f9
Fixed placed spells breaking when reloading a world 2024-01-20 15:42:26 +00:00
Sollace
ab3ac8cb0d
Improve spell lookup performance by using the Ether 2024-01-20 15:12:23 +00:00
Sollace
d22dd3bdf9
Change how black holes function to instead generate energy 2024-01-19 22:12:22 +00:00
Sollace
5d2478604c
Fixed items being consumed in creative mode 2024-01-19 16:13:54 +00:00
Sollace
08e1702a1a
Fix bales being rebuilt with only wheat and added option to trim bales with a hoe 2024-01-19 16:12:25 +00:00
Sollace
e5236e5802
Fix loot tables 2024-01-19 16:11:48 +00:00
Sollace
f2b817d635
Make places hay bales edible 2024-01-19 15:28:40 +00:00
Sollace
d47a1a52f5
Remove old temporary assets 2024-01-19 15:27:28 +00:00
Sollace
ae6e7a0337
Added golden oak trees 2024-01-18 19:52:59 +00:00
Sollace
c7a161e114
Update goldroot textures 2024-01-18 16:28:45 +00:00
Sollace
dde64153dd
Fixed bulb duplicating arms when reloading a world 2024-01-18 16:24:02 +00:00
Sollace
0c26827790
Add advancement for killing mobs with a horseshoe 2024-01-17 19:48:35 +00:00
Sollace
5ac68a3df9
Fixed race change advancement criterion. Fixes #230 2024-01-17 19:29:00 +00:00
Sollace
54381cf673
Fruit trees now consider the light level instead of time of day when trying to grow. Fixes #237 2024-01-17 19:18:56 +00:00
Sollace
f3ab86ed74
Fix palm log/stripped log and wood recipes 2024-01-17 19:13:17 +00:00
Sollace
5867e987f3
Fix leaves not mining with hoes. Closes #235 2024-01-17 18:50:19 +00:00
Sollace
4e9966055f
Fixed flowering zap leaves not recognisde as leaves 2024-01-17 18:50:19 +00:00
­Sollace
18111ae6e0
Merge pull request #242 from Cryghast/1.20.1
update zh_cn.json
2024-01-17 18:43:24 +00:00
­Sollace
9c9afe798d
Merge pull request #240 from LingVarr/1.20.1
Update ru_ru.json
2024-01-17 18:42:30 +00:00
Cryghast
f568552462 update zh_cn.json 2024-01-16 08:20:59 +08:00
Cryghast
117c68c8c6 update zh.cn.json 2024-01-16 08:18:57 +08:00
Sollace
144f00c207
The Ignominious Bulb now grows from a sprout when first summoned and will no longer lose its arms 2024-01-15 20:25:18 +00:00
LingVarr
0ca19ba07c Update ru_ru.json 2024-01-15 23:38:22 +11:00
­Sollace
fc23e16d43
Merge pull request #234 from xyzzy121/1.20.2
remake pull request after like a month ig
2024-01-14 22:12:32 +01:00
­Sollace
d9bebf0b0f
Merge pull request #239 from PoneyClairDeLune/1.20.1
Add Dehydration compat for 1.20.1
2024-01-14 22:10:08 +01:00
Lumière Élevé
facbbe2d26
Drink, soup and etc. 2024-01-14 20:06:19 +00:00
Lumière Élevé
ddd217c53d
Dehydration compat 2024-01-14 19:51:46 +00:00
Sollace
1c751aca0e
Rename ignominious bulb and vine 2024-01-05 18:41:20 +01:00
横刀天笑(Knife smile)
0e40c10c43
update zhcn json (#232)
* update zhcn json

* ignimeous
2024-01-05 18:36:19 +01:00
Sollace
e572c2c1ea
Added gold root 2024-01-04 22:41:27 +01:00
Sollace
073d411e90
Fixed errors logged relating to the recipe book 2024-01-03 23:19:43 +01:00
Sollace
0372592a79
Fixed errors loading changeling diets 2024-01-03 23:19:29 +01:00
Sollace
d4a3a274e2
Fixed cloud door recipe 2024-01-03 23:19:17 +01:00
Sollace
383cefa915
Fix damage message when dying to a tentacle 2024-01-03 23:11:00 +01:00
Sollace
2d87fd5099
Exclude grass blocks from earth ponies' ability so they aren't always swamped in tall grass every time 2024-01-03 23:01:45 +01:00
Sollace
5196c9bf17
Made curing joke obtainable by earth ponies 2024-01-03 23:01:18 +01:00
Sollace
19831a635f
Added translations and fixed the loot table for some of the doors 2024-01-03 22:59:58 +01:00
Sollace
6eea0944d2
Added curing joke and ignimeous bulbs 2024-01-03 21:51:24 +01:00
Sollace
80225bf1e7
Added the second magical plant 2024-01-02 23:03:41 +01:00
Sollace
99fc4ea904
Merge branch 'Cryghast-1.20.2' into 1.20.1 2023-12-30 23:57:20 +01:00
Cryghast
cdb77e5fa3
time worn修正 2023-12-30 23:55:17 +01:00
Cryghast
9b92155bf0
update更新 2023-12-30 23:55:16 +01:00
Cryghast
5af1557664
loot bug 2023-12-30 23:55:16 +01:00
Cryghast
988d5d8ce1
更新汉化 2023-12-30 23:55:16 +01:00
Cryghast
24868633a5
time worn修正 2023-12-30 23:54:30 +01:00
Cryghast
17b437a060
update更新 2023-12-30 23:54:30 +01:00
Cryghast
ab0b412945
loot bug 2023-12-30 23:54:30 +01:00
Cryghast
cc5e39aebb
更新汉化 2023-12-30 23:54:30 +01:00
LingVarr
bad793aabf
Update ru_ru.json (#224) 2023-12-20 14:29:24 +01:00
Sollace
c1c37881eb
Fix missing mixin target 2023-12-15 20:46:36 +00:00
Sollace
e361e7e83d
Fix missing mixin target 2023-12-15 20:45:29 +00:00
Sollace
0ab31bf3ac
Merge branch '1.20' into 1.20.2 2023-12-15 20:38:34 +00:00
Sollace
ea813c3dcb
Add an advancement: A Falling Wizard 2023-12-13 18:21:06 +00:00
Sollace
f8fc9467be
We don't need this to be a model, just use the part 2023-12-05 23:06:52 +00:00
Sollace
a7ff78e141
Added the stable doors, crystal door, and cloud door 2023-12-04 20:46:45 +00:00
Sollace
d8565f3260
Added etched clouds and cloud chests 2023-12-04 14:49:24 +00:00
Sollace
f769568031
*punches gradle in the gut* 2023-12-03 21:19:36 +00:00
Sollace
ad7a7d84c0
New food system:
- Foods fill for different amounts for different races
- Certain foods can no longer be eaten by certain races
- Added food categories for candy, rocks, desserts
- Moved everything to datapacks
2023-12-03 02:39:55 +00:00
Sollace
16a7b96f81
wip 2023-11-28 15:30:34 +00:00
PARADOX
6cfb00eeac Update HOW_TO_PLAY.md 2023-11-27 13:46:16 -05:00
PARADOX
3c179c2450 Update HOW_TO_PLAY.md
I may have gone slightly off topic in the comments...
2023-11-27 13:41:15 -05:00
PARADOX
3c7df8fd98 Update README.md 2023-11-27 13:27:06 -05:00
PARADOX
48e724a021 Update README.md
fix a singular typo.
2023-11-27 13:23:05 -05:00
Sollace
8a85f0709e
Kirins can now cool themselves off by drinking bottles of water, juice, and eating melon slices 2023-11-27 16:02:38 +00:00
Sollace
2df34bd986
Prevent zap leaves from changing state when placed manually 2023-11-26 18:18:44 +00:00
LingVarr
9809f13fd1
Update ru_ru.json (#217) 2023-11-26 12:24:13 +00:00
LingVarr
fd0919b482
Update README_RU.md (#215) 2023-11-26 12:23:46 +00:00
Sollace
fb7a85c5d8
Guardians no longer attack seaponies 2023-11-25 21:42:58 +00:00
Sollace
ea78257ffd
Force ponies to use the seapony model (if they have one) when they are a seapony in unicopia 2023-11-25 21:27:29 +00:00
Sollace
e44347e8ed
Fix food component not being updated correctly 2023-11-25 21:01:07 +00:00
Sollace
c8dc41a68e
Fixed not being able to equip amulets, bracelets, and necklaces when trinkets is not installed 2023-11-25 20:49:47 +00:00
Sollace
e45ec6e1ff
Add the final necklace texture 2023-11-25 20:28:20 +00:00
Sollace
528f14dbf4
Exclude non-grantable tribes from the lan settings screen 2023-11-25 20:16:32 +00:00
Sollace
cb94d3c841
Add interaction indicators to the tribe selection gui 2023-11-25 20:12:54 +00:00
Sollace
277753b81b
Add missing cloud blocks to the creative tab for pegasi 2023-11-25 19:15:37 +00:00
Sollace
ec136e6045
Only play kirin rage theme to the kirin themselves 2023-11-25 03:58:55 +00:00
Sollace
3f7a9a0a78
Slime pustules now conduct redstone 2023-11-25 03:53:24 +00:00
Sollace
aa595d4284
Reduce slime spawn rate 2023-11-25 03:08:49 +00:00
Sollace
515efb93cb
Render the pattern on beds with nbt 2023-11-25 03:05:45 +00:00
Sollace
3ab4159125
Improve bed rendering performance 2023-11-25 02:51:19 +00:00
Sollace
a7ac895fd1
Trigger an update when a bed's sheets are changed 2023-11-25 02:37:10 +00:00
Sollace
7e25107f7a
Add proper collission shapes for the cloud beds 2023-11-25 02:15:29 +00:00
Sollace
44578ab4ac
Add a proper collision box for the shaping bench 2023-11-25 01:27:18 +00:00
Sollace
9ae1ef13ff
Added recipes for the remaining bed sheet patterns 2023-11-24 16:13:02 +00:00
Sollace
a1568feab4
Added translations for the plunder vine and loot bug 2023-11-24 15:47:48 +00:00
Sollace
d88c0d0755
Start moving pony diet information to data packs 2023-11-24 15:47:48 +00:00
LingVarr
094cf2383d
Update ru_ru.json (#216) 2023-11-22 18:54:27 +00:00
Sollace
c1b5c58eab
Added emi integration for the shaping bench 2023-11-20 22:57:41 +00:00
Sollace
63243e254d
Added the shaping bench 2023-11-20 22:30:21 +00:00
Sollace
b8e88a16ad
Updated shell block models to look more natural 2023-11-18 14:43:01 +00:00
Sollace
b0ebf65a5e
Added translations for the block versions of the shells 2023-11-18 14:20:30 +00:00
Sollace
98ad16e52d
Added different sea shells, and a recipe to craft the necklace 2023-11-18 14:18:58 +00:00
Sollace
7ffa77f12f
Shhhhh 2023-11-12 20:26:12 +00:00
Sollace
2017aefc5a
Add more bed sheet variants and kelp bed sheets 2023-11-11 00:34:15 +00:00
LingVarr
3ce297b8ca
Update ru_ru.json (#214) 2023-11-10 21:25:04 +00:00
Sollace
3f480b6664
Reduce seaponies' visibility on land and fix suppressed races not transferring when respawning 2023-11-10 18:15:09 +00:00
Sollace
2305775a55
Added an ability for seaponies 2023-11-10 18:14:34 +00:00
Sollace
4a1ac9fede
Added a creative tab and more food for seaponies 2023-11-10 18:14:02 +00:00
Sollace
38422bda42
Implement seapony diets 2023-11-10 14:11:53 +00:00
Sollace
e49828fea1
Adjust icon size and positioning in the main ability slot 2023-11-09 23:41:30 +00:00
Sollace
3948bf4a58
Anyone who can use the change form ability can also sign and use the friendship bracelets 2023-11-09 23:41:09 +00:00
Sollace
a2c78c2b35
Added textures and name for the icon ability 2023-11-09 23:40:17 +00:00
Sollace
617a5f3a9f
Implement proper underwater vision for seaponies 2023-11-09 19:19:35 +00:00
Sollace
e0826bf1e3
Make the seapony transformation into an ability granted if you're wearing the necklace 2023-11-09 16:26:26 +00:00
Sollace
5dbff11d7a
Fixed beds generating with water on them 2023-11-09 16:25:24 +00:00
Sollace
d3821f1c7c
Fixed seaponies moving too quickly 2023-11-09 15:08:07 +00:00
Sollace
873297ca44
Added respawn logic to place seaponies in water 2023-11-09 15:07:56 +00:00
Sollace
c656eb2309
Make beds waterlog 2023-11-08 15:19:07 +00:00
Sollace
917af90f37
Revamp the tribe selection screen so it can handle more options 2023-11-08 14:51:54 +00:00
Sollace
0d0ea4558d
Added hippogriffs and seaponies 2023-11-08 12:58:41 +00:00
LingVarr
d91d358552
Update ru_ru.json (#211) 2023-11-07 23:00:38 +00:00
Sollace
6a09b04b8e
The metamorphosis potions no longer kill you in peaceful, easy, and hardcore mode, and spectral arrows are no longer deadly 2023-11-07 19:57:30 +00:00
Sollace
884ced25f1
Move all the logic for hanging and climbing into a separate class and fix bat ponies not automatically cancelling when they move 2023-11-07 18:46:05 +00:00
Sollace
04cefd8961
Fix changeling climbing bugs 2023-11-07 18:21:18 +00:00
Sollace
a5c7a5e3a6
Added some farming bonuses for Earth Ponies 2023-11-07 18:20:47 +00:00
Sollace
ca8cf8371a
Changelings can now untransform by using their ability on something they've already transformed into 2023-11-07 18:20:04 +00:00
Sollace
a2238640dd
Fixed the burn toast advancement name and description 2023-11-07 15:43:16 +00:00
Sollace
53c16416c0
Fixed cloud lump recipe 2023-11-07 15:42:55 +00:00
Sollace
034cc77808
Fixed block ghosting when loading a world 2023-11-07 15:42:20 +00:00
Sollace
16b90e208b
Added more ways of getting cloud lumps 2023-11-05 22:31:50 +00:00
Sollace
3a9978a6b1
Add storm clouds to the spawn list in cloud continents (assuming this works) 2023-11-05 21:41:25 +00:00
Sollace
1cf6beafdc
Fix storm clouds moving too quickly fix logic for when they're above the world limit 2023-11-05 21:40:49 +00:00
横刀天笑(Knife smile)
8b28698650
更新汉化 (#210) 2023-11-05 21:07:17 +00:00
横刀天笑(Knife smile)
87b2a39632
更新汉化 (#210) 2023-11-05 17:56:02 +00:00
LingVarr
e4c76e979d
Update ru_ru.json (not only) (#209)
Update ru_ru.json
2023-11-05 17:54:34 +00:00
Sollace
57783f9c2c
More cloud generation 2023-11-04 00:15:07 +00:00
Sollace
e9897bfb55
Adjust cloud generation and add a little more variety 2023-11-03 19:56:28 +00:00
Sollace
30a6868f63
Implement rotating and mirroring for compacted clouds 2023-11-03 13:28:43 +00:00
Sollace
f9c4234cbe
Add clouds to world generation 2023-11-03 13:13:03 +00:00
Sollace
c4d245c84e
Fixed pick-block on compacted cloud blocks 2023-11-03 12:17:26 +00:00
Sollace
58976b02b5
Make dense cloud compactable 2023-11-03 12:11:31 +00:00
Sollace
26c535a3e2
Tweak carved cloud textures 2023-11-03 12:00:40 +00:00
Sollace
53244df5aa
Make pony-made cloud blocks solid so they block rain and can be used in construction 2023-11-03 10:30:45 +00:00
Sollace
be3cac4a0b
Added textures for all the bed sheets 2023-11-03 10:29:56 +00:00
Sollace
9b38adb816
Added item textures for all of the bed sheets 2023-11-02 21:42:09 +00:00
Sollace
bd05c21f36
Added cloud lumps 2023-11-02 21:41:56 +00:00
Sollace
33375097fe
Added bedsheets for all the remaining colours and added recipes for them 2023-11-02 18:24:35 +00:00
Sollace
ccec0eec81
Fixed cloud blocks not converting into their soaked forms 2023-11-02 17:24:18 +00:00
Sollace
16a282078e
Correct cloud brick blocks' names 2023-11-02 16:18:49 +00:00
Sollace
9e93fb130d
Add some missing loot tables and tag entries for the clouds 2023-11-02 16:18:32 +00:00
Sollace
177eb541a7
Add tag support to the item traits loader 2023-11-02 15:47:45 +00:00
Sollace
0f4360a896
Fix loot table and tag loading errors 2023-11-02 15:47:31 +00:00
Sollace
3e39556af4
Remove redundant trait 2023-11-02 14:44:48 +00:00
Sollace
05a5960380
Added fancy beds and bedsheets 2023-10-31 20:38:28 +00:00
Sollace
ff6d24e25f
Added cloud bricks, carved cloud, and orange cloud bed 2023-10-31 16:45:41 +00:00
Sollace
61c8ae8927
Catch exceptions when tearing down block entities 2023-10-30 22:00:19 +00:00
Sollace
0719b14e2c
Fixed spell crafting 2023-10-28 23:23:32 +01:00
Sollace
7f6b440265
Fixed the recipe for the inferno spell 2023-10-28 23:23:32 +01:00
Sollace
6e96e7a58c
Fix error ticking sprout blocks 2023-10-28 23:23:32 +01:00
Sollace
c0a88dacd2
Fixed the recipe for the inferno spell 2023-10-28 23:20:17 +01:00
Sollace
c619be807d
Fix error ticking sprout blocks 2023-10-28 22:04:50 +01:00
­Sollace
219cd16e5f
Update README.md 2023-10-27 16:10:04 +01:00
­Sollace
e87d18346b
Update README.md 2023-10-25 22:37:24 +01:00
Sollace
a1f91a591a
Fix crash due to attributes not being removed (tryRemove doesn't try hard enough) 2023-10-24 01:02:48 +01:00
横刀天笑(Knife smile)
5f545745be
TOM和另一处修改 (#207) 2023-10-24 00:51:03 +01:00
Sollace
ec151ad092
Fix whitespace 2023-10-24 00:51:03 +01:00
Sollace
012cc2aee3
Update project links for modrinth 2023-10-24 00:51:03 +01:00
Sollace
1a2efb5016
Update emi 2023-10-24 00:51:03 +01:00
Sollace
91b11c84cc
Fix codecs jank 2023-10-24 00:51:03 +01:00
Sollace
f767e6a6ae
Add credits and remove extra tom image 2023-10-24 00:51:03 +01:00
Sollace
ef5e26124e
Fix a bunch of codec-related stuff 2023-10-24 00:51:03 +01:00
Sollace
7c9071a321
EMI is running late 2023-10-24 00:51:02 +01:00
Sollace
44bde9fd16
Fix mixin 2023-10-24 00:51:02 +01:00
Sollace
c3c2ba461a
Cleanup post porting 2023-10-24 00:51:02 +01:00
Sollace
24f1f4bdcd
1.20.1 -> 1.20.2 2023-10-24 00:50:57 +01:00
Sollace
35ac79bf3d
Added horseshoes 2023-10-23 23:11:13 +01:00
Sollace
dc29729419
Adjust butterfly brightness to account for their surroundings. (should prevent them from glowing) 2023-10-23 23:10:54 +01:00
Sollace
95da60c24c
Added recipes and advancements for the new food items 2023-10-23 20:19:05 +01:00
Sollace
0cf33eaadf
Added horse shoe fries, rock candy, salt cubes, toast, and candied apples 2023-10-23 19:02:39 +01:00
Sollace
5011c35e15
Implement proper spell rendering 2023-10-21 23:16:54 +01:00
Sollace
23266d2f3a
Some refinements. Cloud block items now float on other cloud blocks 2023-10-21 20:30:13 +01:00
Sollace
2025d5af09
Added cloud planks, added cloud beds 2023-10-20 20:12:13 +01:00
Sollace
d307290ec0
Remove some internal faces from the cloud blocks 2023-10-20 16:09:11 +01:00
Sollace
9100e52981
Implement proper behaviour for the unstable cloud block 2023-10-19 23:45:20 +01:00
Sollace
84cb3de5e3
Fixed storm clouds not spawning lightning in the correct place 2023-10-19 23:45:14 +01:00
Sollace
c3fee217d1
Added cloud stairs, recipes, and loot tables 2023-10-19 23:13:41 +01:00
Sollace
b27cbf814b
You can now compact clouds with a shovel 2023-10-19 21:37:19 +01:00
Sollace
a72ac2f080
Updated textures v3 2023-10-19 16:13:00 +01:00
Sollace
64515ac808
Added particle effects to cloud blocks and break clouds when falling on them from a tall height 2023-10-19 16:12:48 +01:00
Sollace
9ec8568f49
Alternate clouds 2023-10-19 02:07:57 +01:00
Sollace
c04161eb91
Added unstable clouds 2023-10-19 01:41:22 +01:00
Sollace
ea94092b2c
Added soggy clouds. Clouds will soak up water when it rains and slowly dry out when the weather is clear 2023-10-18 23:15:48 +01:00
Sollace
fa8b1e485c
Added cloud slabs 2023-10-18 19:41:58 +01:00
Sollace
b9318547db
Added cloud blocks and cloud pillars 2023-10-18 18:52:59 +01:00
Sollace
15071ccd72
Change particle effects to use records 2023-10-18 18:52:29 +01:00
Sollace
a9923c71f4
Added a hug ability 2023-10-16 15:18:36 +01:00
Sollace
3e9a0df7a1
Spikes no longer pop off of honey blocks 2023-10-15 23:50:48 +01:00
Sollace
9b94662f9b
Added slime pustules 2023-10-15 20:39:43 +01:00
Sollace
17a5924fca
Add recipes, translations, etc for the mysterious egg and spikes 2023-10-15 16:53:19 +01:00
Sollace
8ab12318f7
Prevent mobs from pathfinding through spikes 2023-10-15 16:52:28 +01:00
Sollace
c23fead5f2
Added hive block 2023-10-15 16:52:11 +01:00
Sollace
0a1429fd60
Add mysterious eggs and finish up hive generation 2023-10-14 22:20:17 +01:00
Sollace
09053bba93
Remove debug code 2023-10-14 02:39:12 +01:00
Sollace
4b85a3d331
Add particle effects and sound for chitin 2023-10-14 02:37:52 +01:00
Sollace
602e9b7059
Added chitin spikes 2023-10-14 01:43:46 +01:00
Sollace
3f27c2e920
Fix for weather vane selection box 2023-10-13 20:37:00 +01:00
Sollace
2f6ef0d9cf
Added changeling hive structures, carapace, and chitin 2023-10-12 23:57:31 +01:00
Sollace
9f2017b724
Fixed flight velocity/control state going out of sync with the server and add some behavioural tweaks
Note to Fauli: SPACE TO FLAP/ASCENT, SHIFT TO DESCEND

Also changed the behaviour for changeling flight (again).

Fixes #205
Fixes #179
Fixes #165
Fixes #176
2023-10-11 15:49:54 +01:00
Sollace
4953e11c54
Fixed floating changelings. Closes #204 2023-10-11 14:17:12 +01:00
Sollace
309e39b583
Added a custom shockwave particle when an earth pony stomps 2023-10-11 13:54:23 +01:00
Sollace
fcab76fd43
Added a second kirin ability 2023-10-10 20:13:45 +01:00
Sollace
577f5c8bb8
Add a moment of invinsibility at the start of a nirik's rage 2023-10-10 19:22:07 +01:00
Sollace
e5fe26cba8
Adjust fov effects when raging 2023-10-10 19:21:45 +01:00
Sollace
d4fe4c549d
Make the sky red when raging 2023-10-10 19:06:38 +01:00
Sollace
8e19ab6a96
Split up the WorldRenderDelegate class a little 2023-10-10 19:06:29 +01:00
Sollace
2b2d792768
Adjust screen shaking when raging 2023-10-10 19:05:04 +01:00
Sollace
5d8f5d485a
Fixed crash without trinkets 2023-10-10 18:28:29 +01:00
Sollace
442186978d
Kirins lose their rage when in the water and mining how has a small chance of increasing rage, with a chance of turning into a nirik when at full rage 2023-10-09 23:45:22 +01:00
Sollace
79d66439a9
Fixed kirin not seeing themselves as themselves when raging 2023-10-09 23:44:23 +01:00
Sollace
8961cc2cff
Add casting abilities for kirins 2023-10-09 23:43:59 +01:00
Sollace
1b0505375a
Implement nirik vision 2023-10-09 22:54:57 +01:00
Sollace
6e3bc75619
Disable their natural sneakyness when raging 2023-10-09 22:10:18 +01:00
Sollace
8b2c498a26
Add kirin diet 2023-10-09 22:10:03 +01:00
Sollace
fc1b461046
Implement kirin ability 2023-10-09 22:05:41 +01:00
Sollace
dda20777f7
Fixed regression from earlier 2023-10-09 15:14:56 +01:00
Sollace
3f0dfff9e9
Fixed crash 2023-10-09 15:14:28 +01:00
Sollace
f25df41fa5
Add handling to update the player's race if we're unable to force a respawn 2023-10-09 12:23:12 +01:00
Sollace
2e7804e9c6
Fixed missing translation for the self variant of the tribe_swap death message 2023-10-09 11:28:15 +01:00
Sollace
d1a65b8985
shhhhhh 2023-10-08 00:02:02 +01:00
2285 changed files with 54046 additions and 22282 deletions

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: bug
assignees: Sollace
---
**Describe the bug**
A clear and concise description of what the bug is.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Steps to reproduce**
Help us figure out what you did to get this issue
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Version Information:**
- Minecraft Version: [e.g. 1.20.5]
- Mine Little Pony Version:
**Mod Loader:**
- [ ] Fabric
- [ ] Quilt
- [ ] Neoforge (with connector)
**Client/Server Logs**
If applicable, add log files by uploading them as attachments or put them below.
<details>
```
**Paste logs here**
```
</details>

View file

@ -0,0 +1,26 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: Sollace
---
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Additional context**
Add any other context or screenshots about the feature request here.
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Version Information:**
- Minecraft Version: [e.g. 1.20.5]
- Mine Little Pony Version:
**Mod Loader:**
- [ ] Fabric
- [ ] Quilt
- [ ] Neoforge (with connector)

View file

@ -17,6 +17,10 @@ jobs:
uses: actions/setup-java@v1 uses: actions/setup-java@v1
with: with:
java-version: 17 java-version: 17
- name: Prepare Datagen
uses: eskatos/gradle-command-action@v1
with:
arguments: rundatagen
- name: Publish Modrinth Jar - name: Publish Modrinth Jar
env: env:
MODRINTH_KEY: ${{ secrets.MODRINTH_KEY }} MODRINTH_KEY: ${{ secrets.MODRINTH_KEY }}

1
.gitignore vendored
View file

@ -3,6 +3,7 @@
bin/ bin/
build/ build/
run/ run/
generated/
.classpath .classpath
.project .project
*.launch *.launch

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "BlockusAddon"]
path = BlockusAddon
url = https://github.com/Sollace/Unicopia-Blockus-Addon

1
BlockusAddon Submodule

@ -0,0 +1 @@
Subproject commit 94ff5babb976911f46d7efcdad2586652fb33047

View file

@ -3,7 +3,7 @@
[![ru](https://img.shields.io/badge/lang-ru-d52b1e.svg)](README_RU.md) [![ru](https://img.shields.io/badge/lang-ru-d52b1e.svg)](README_RU.md)
[![cn](https://img.shields.io/badge/lang-cn-de2910.svg)](README_CN.md) [![cn](https://img.shields.io/badge/lang-cn-de2910.svg)](README_CN.md)
When starting a new world you're given the choice of which tribe to join. One of Unicorn, Pegasus, Earth, Bat, or Changeling. When starting a new world you're given the choice of which tribe to join. You can choose from _Unicorn_, _Pegasus_, _Earth Pony_, _Batpony_, or _Changeling_.
Depending on which race you pick, you're given different abilities, displayed on your HUD in a series of circular elements. Depending on which race you pick, you're given different abilities, displayed on your HUD in a series of circular elements.
To activate an ability, simply press and hold the key corresponding to that ability. Some take longer than others, and certain abilities To activate an ability, simply press and hold the key corresponding to that ability. Some take longer than others, and certain abilities
@ -17,7 +17,7 @@ also respond to quick, short single-taps, or double-taps.
For unicorns, casting spells is done through gems, which you can obtain whilst mining. You first need to craft a spellbook using a gem, and then For unicorns, casting spells is done through gems, which you can obtain whilst mining. You first need to craft a spellbook using a gem, and then
in the spellbook you can discover the magical traits of different items and recipes to combine them to create different spells, as well in the spellbook you can discover the magical traits of different items and recipes to combine them to create different spells, as well
as modify existing one. as modify existing ones.
Once you have a gem with a spell you want to use, you can equip it to your main-hand or off-hand slot by right-clicking with a gem in Once you have a gem with a spell you want to use, you can equip it to your main-hand or off-hand slot by right-clicking with a gem in
one of either hand, then to activate it you us your primary ability. You can also cast spells directly from a gem by using the ability one of either hand, then to activate it you us your primary ability. You can also cast spells directly from a gem by using the ability
@ -34,7 +34,7 @@ also respond to quick, short single-taps, or double-taps.
### Earth Ponies ### Earth Ponies
- Kicking & Stomping - Kicking & Stomping
Earth ponies kick good. *Earth ponies kick good*.
If Mine Little Pony is installed, and you have the appearance of a pony, kicking will target the block behind you, so twirl that rump! If Mine Little Pony is installed, and you have the appearance of a pony, kicking will target the block behind you, so twirl that rump!
Kicking blocks will incrementally mine them, and kicking trees will shake items loose from their branches. Kicking a tree _too much_ might destroy it, Kicking blocks will incrementally mine them, and kicking trees will shake items loose from their branches. Kicking a tree _too much_ might destroy it,
@ -47,7 +47,7 @@ also respond to quick, short single-taps, or double-taps.
- Bracing - Bracing
Earth ponies can brace themselves by sneaking! It, uh, makes you harder to push! yeah! Earth ponies can brace themselves by sneaking! It, uh, makes you harder to push! Yeah!
### Pegasi / Bat Ponies ### Pegasi / Bat Ponies
@ -99,7 +99,7 @@ also respond to quick, short single-taps, or double-taps.
- Hanging of Ceilings - Hanging of Ceilings
Ever just want to hang out? Well bat ponies can, _literally_! All the cool kids are doing. Ever just want to hang out? Well bat ponies can, _literally_! All the cool kids are doing it!
- Mangoes - Mangoes
@ -122,6 +122,12 @@ also respond to quick, short single-taps, or double-taps.
Changelings can turn into damn near anything, even other players! And blocks! And hostile mobs! Changelings can turn into damn near anything, even other players! And blocks! And hostile mobs!
Careful about turning into skeletons, though, because they hate the sun even more than bat ponies. Careful about turning into skeletons, though, because they hate the sun even more than bat ponies.
- Crawling
Changelings can crawl on Ceilings, which is very useful for lining up your shot, when attempting to shoot somepony in a cave,
while disguised as a stone block. Or is that just me? Anyways, they can only crawl along flat surfaces, meaning that if you go off the edge of a block,
you will fall off.
## Special Items, Plants, Tools ## Special Items, Plants, Tools
### Polearms ### Polearms
@ -135,7 +141,7 @@ Fighting too close together with them may cause you some knockback.
Zap Apple Trees occur naturally in the world and are the only way to obtain zap apples in survival. They can appear in one of several different states: Zap Apple Trees occur naturally in the world and are the only way to obtain zap apples in survival. They can appear in one of several different states:
Hybernating, Flowering, Fruiting, or Withering *Hibernating, Flowering, Fruiting, or Withering*
They cycle through these states throughout the lunar cycle, so if you find one, and it's not in the state you want, wait around another few days and it They cycle through these states throughout the lunar cycle, so if you find one, and it's not in the state you want, wait around another few days and it
will eventually bear fruit, but don't try to harvest the apples before they're ripe, because they will zap you! will eventually bear fruit, but don't try to harvest the apples before they're ripe, because they will zap you!
@ -145,3 +151,5 @@ If you're able to obtain the wood and leaves, it also makes the perfect deterant
### Muffins ### Muffins
They're bouncy and delicious, and pigs absolutely love them! They're bouncy and delicious, and pigs absolutely love them!
<!-- https://media.tenor.com/GTYRNMAuLIUAAAAC/muffin-button-muffins.gif -->

View file

@ -13,9 +13,9 @@
- 魔法 - 魔法
独角兽需要魔法宝石来施法,没有魔法的普通宝石可以从挖矿活动中取得。一开始,您需要用一颗宝石和一本书合成魔法书,魔法书将助力您解析各物品中含有的要素并辅助您用这些要素开发各类魔配方,同样可以用于修饰已有配方。 独角兽需要魔法晶石来施法,没有魔法的普通晶石可以从挖矿活动中取得。一开始,您需要用一颗晶石和一本书合成魔法书,魔法书将助力您解析各物品中含有的要素并辅助您用这些要素开发各类魔配方,同样可以用于修饰已有配方。
当您做出了所需的魔法石后,您可以拿着它右键以将其中的魔法导入到主槽位或是副槽位(按下潜行键)中 ,这些魔咒将可以以您的主技能形式激活。您也可以直接拿着魔法宝石释放其中的魔力。 当您做出了所需的魔法石后,您可以拿着它右键以将其中的魔法导入到主槽位或是副槽位(按下潜行键)中 ,这些魔法将可以以您的主技能形式激活。您也可以直接拿着魔法晶石释放其中的魔力。
- 瞬移 - 瞬移
@ -84,7 +84,7 @@
(夜骐会在阴暗的地方重生) (夜骐会在阴暗的地方重生)
- 倒挂于天花板 - 倒
想开挂吗?夜骐是可以 _字面意义上_ 开挂的!大哥都喜欢这么玩。 想开挂吗?夜骐是可以 _字面意义上_ 开挂的!大哥都喜欢这么玩。
@ -124,6 +124,6 @@
这些状态是按周期循环的,如果您发现的果树不是您想要的状态,可以在它旁边等待几天直到结果,但请不要在魔虹苹果成熟前收获它们,否则它们会把您电得酥脆! 这些状态是按周期循环的,如果您发现的果树不是您想要的状态,可以在它旁边等待几天直到结果,但请不要在魔虹苹果成熟前收获它们,否则它们会把您电得酥脆!
如果您设法获取到了魔虹苹果的木头和叶子,那它们也可以充当威慑滋事者的完美屏障。 如果您设法获取到了魔虹苹果的木头和叶子,那它们也可以充当威慑滋事者的完美屏障。
### ###
香软可口,猪猪最爱。 香软可口,猪猪最爱。

View file

@ -72,7 +72,7 @@
- Захват бурь - Захват бурь
Дайте пегасу облако, и у него будет вода на день, дайте пегасу банку, и он поймает облака и устроит дождь на всё лето. Дайте пегасу облако, и у него будет вода на день, дайте пегасу банку, и он поймает облако и устроит дождь на всё лето.
Кажется, так гласит поговорка? Так вот, с помощью банок можно собрать дождь в банку во время грозы. Кажется, так гласит поговорка? Так вот, с помощью банок можно собрать дождь в банку во время грозы.
Это позволит и остановить дождь, и сохранить погоду в банке для последующего использования. Это позволит и остановить дождь, и сохранить погоду в банке для последующего использования.

View file

@ -1,15 +1,18 @@
# Unicopia # ![Unicopia](https://github-production-user-asset-6210df.s3.amazonaws.com/6429283/244022981-71021d60-e698-4ca0-88ae-bfa71be39cc6.png)
[![Build Status](https://github.com/Sollace/Unicopia/actions/workflows/gradle-build.yml/badge.svg)](https://github.com/Sollace/Unicopia/actions/workflows/gradle-build.yml) [![Build Status](https://github.com/Sollace/Unicopia/actions/workflows/gradle-build.yml/badge.svg)](https://github.com/Sollace/Unicopia/actions/workflows/gradle-build.yml)
[![Downloads](https://img.shields.io/github/downloads/Sollace/Unicopia/total.svg?color=yellowgreen)](https://github.com/Sollace/Unicopia/releases/latest) [![Downloads](https://img.shields.io/github/downloads/Sollace/Unicopia/total.svg?color=yellowgreen)](https://github.com/Sollace/Unicopia/releases/latest)
[![Crowdin](https://badges.crowdin.net/unicopia/localized.svg)](https://crowdin.com/project/unicopia)
![](https://img.shields.io/badge/api-fabric-orange.svg) ![](https://img.shields.io/badge/api-fabric-orange.svg)
[![ru](https://img.shields.io/badge/lang-ru-d52b1e.svg)](README_RU.md) [![ru](https://img.shields.io/badge/lang-ru-d52b1e.svg)](README_RU.md)
[![cn](https://img.shields.io/badge/lang-cn-de2910.svg)](README_CN.md) [![cn](https://img.shields.io/badge/lang-cn-de2910.svg)](README_CN.md)
[Wiki](https://github.com/Sollace/Unicopia/wiki)
Bringing the magic of friendship to Minecraft! Bringing the magic of friendship to Minecraft!
What started as a humble utility to make playing as a unicorn a little more emersive has grown into a full-blown pony What started as a humble utility to make playing as a unicorn a little more immersive has grown into a full-blown pony
conversion experience that brings new magic, mechanics and experience to the world of Minecraft to make it truly feel like you've conversion experience that brings new magic, mechanics and experience to the world of Minecraft to make it truly feel like you've
entered the world of Equestria! entered the world of Equestria!
@ -22,13 +25,13 @@ Unicorns, Pegasi, Earth Ponies, and even Changelings get their own special abili
- *Play as a unicorn* and learn to use magic! Craft your first spellbook and experiment, finding the different spells you can - *Play as a unicorn* and learn to use magic! Craft your first spellbook and experiment, finding the different spells you can
make and what they do, or simply delve into the lore to learn more about the past of this mysterious world! make and what they do, or simply delve into the lore to learn more about the past of this mysterious world!
Besides casting spells, such as a shield to protect themselves, of fire a bolt of magic to incinerate your foes, Besides casting spells, such as a shield to protect themselves, or a bolt of magic to incinerate your foes,
Unicorns can also teleport to get around obstacles or simply reach those hard to reach places. Unicorns can also teleport to get around obstacles or simply reach those hard to reach places.
- *Play as a pegasus* and dominate the skies! Besides the ability to fly, pegasi can also perform rainbooms, control the weather by shoving them into jars, - *Play as a pegasus* and dominate the skies! Besides the ability to fly, pegasi can also perform sonic rainbooms, control the weather by shoving them into jars,
and have a greater reach distance and speed than other races. and have a greater reach distance and speed than other races.
- *Play as a humble background pony*! Earth Ponies are tougher and heavier than the other races. They also have the nify ability to - *Play as a humble background pony*! Earth Ponies are tougher and heavier than the other races. They also have the nifty ability to
kick trees to get food and hasten the growth of crops. You'll never go hungry if you're an earth pony. kick trees to get food and hasten the growth of crops. You'll never go hungry if you're an earth pony.
Feeling like going over to the dark side? Feeling like going over to the dark side?
@ -41,7 +44,7 @@ Unicorns, Pegasi, Earth Ponies, and even Changelings get their own special abili
### Manage your diet ### Manage your diet
Playing as a pony isn't all just kicking and zapping, though! As herbivores your food options open up to include Playing as a pony isn't all just kicking and zapping, though! As herbivores, your food options open up to include
a lot of items normal players don't usually get to eat. Feeling peckish? Try for some flowers from the meadow, a lot of items normal players don't usually get to eat. Feeling peckish? Try for some flowers from the meadow,
or some hay! I hear the hay burgers of good, if you can find some oats. or some hay! I hear the hay burgers of good, if you can find some oats.
@ -55,21 +58,24 @@ Unicorns, Pegasi, Earth Ponies, and even Changelings get their own special abili
### Natural Stuff ### Natural Stuff
- Airflow is simulated (badly) - Airflow is simulated (badly)
Pegasi, beware about flying during storms! It can get dangerous out there!
Pegasi, beware of flying during storms! It can get dangerous out there!
If you're playing as a flying species, or just like having nice things, try building a weather vein. If you're playing as a flying species, or just like having nice things, try building a weather vein.
It shows the actual, totally real and not simulated badly, wind direction of your minecraft world. Just beware It shows the actual, totally real and not simulated badly, wind direction of your minecraft world. Just beware
that the direction and strength is situational (and bad), and will be different depending where you are and that the direction and strength are situational (and bad), and will be different depending on where you are and
how high up you are. how high up you are.
- Hot air Rises - Hot air Rises
No, it's not a bad Star Wars movie, it's an actual mechanic. Sand and lava will give flying species extra lift. Water does the opposite. No, it's not a bad Star Wars movie, it's an actual mechanic. Sand and lava will give flying species extra lift. Water does the opposite.
Try it! Actually don't, I don't want you to drown. Try it! Actually don't, I don't want you to drown.
### Magic Items And Artifacts ### Magic Items And Artifacts
- Craft and build s shrine for the Crystal Heart to provide valuable support to your friends - Craft and build a shrine for the Crystal Heart to provide valuable support to your friends
- Or give out bangles of comradery to your non-unicorn buddies so they can share in your powers, - Or give out bangles of comradery to your non-unicorn buddies, so they can share in your powers,
or just so you can laugh when you teleport and they end up coming witht or just so you can laugh when you teleport and they end up coming with
- Send and receive items using the Dragon's Breath Scroll - Send and receive items using the Dragon's Breath Scroll
- Possibly more I'm forgetting about (or am I? OoOoOooOOoo...Spooky surprise mechanics) - Possibly more I'm forgetting about (or am I? OoOoOooOOoo...Spooky surprise mechanics)
@ -86,7 +92,7 @@ View the HOW_TO_PLAY.md file for more details.
### 1.19.3 Only ### 1.19.3 Only
This project uses reach-entity-attributes, which may not be updated at the time of this writing. This project uses reach-entity-attributes, which may not be updated at the time of this writing.
If you building for 1.19.3, you may follow these steps to make sure it's available to git: If you're building for 1.19.3, you may follow these steps to make sure it's available to git:
`git clone https://github.com/Sollace/reach-entity-attributes` `git clone https://github.com/Sollace/reach-entity-attributes`
`cd reach-entity-attributes` `cd reach-entity-attributes`

View file

@ -16,9 +16,9 @@
独角兽,天马,陆马,甚至幻形灵都有其独特的能力 独角兽,天马,陆马,甚至幻形灵都有其独特的能力
- *成为独角兽,* 学习使用魔法!制成您的第一本魔法书并开展实验。既可研究不同魔的配方与功效,亦可潜心研究历史传说,揭开这奇幻世界过往的面纱! - *成为独角兽,* 学习使用魔法!制成您的第一本魔法书并开展实验。既可研究不同魔的配方与功效,亦可潜心研究历史传说,揭开这奇幻世界过往的面纱!
除了施放保护自己的防护罩,用魔法镭射焚烧敌人的魔外,独角兽还可利用瞬移法术免去翻山越岭的苦恼,直接传送到难以到达的地方。 除了施放保护自己的防护罩,用魔法镭射焚烧敌人的魔外,独角兽还可利用瞬移法术免去翻山越岭的苦恼,直接传送到难以到达的地方。
- *成为天马,*统治天空!除了能飞以外,天马还可以制造彩虹音爆、用罐子收容坏天气,相比于其他种族可触距离更远,跑得更快。 - *成为天马,*统治天空!除了能飞以外,天马还可以制造彩虹音爆、用罐子收容坏天气,相比于其他种族可触距离更远,跑得更快。

View file

@ -1,4 +1,4 @@
# Unicopia # ![Unicopia](https://github-production-user-asset-6210df.s3.amazonaws.com/6429283/244022981-71021d60-e698-4ca0-88ae-bfa71be39cc6.png)
[![Build Status](https://github.com/Sollace/Unicopia/actions/workflows/gradle-build.yml/badge.svg)](https://github.com/Sollace/Unicopia/actions/workflows/gradle-build.yml) [![Build Status](https://github.com/Sollace/Unicopia/actions/workflows/gradle-build.yml/badge.svg)](https://github.com/Sollace/Unicopia/actions/workflows/gradle-build.yml)
[![Downloads](https://img.shields.io/github/downloads/Sollace/Unicopia/total.svg?color=yellowgreen)](https://github.com/Sollace/Unicopia/releases/latest) [![Downloads](https://img.shields.io/github/downloads/Sollace/Unicopia/total.svg?color=yellowgreen)](https://github.com/Sollace/Unicopia/releases/latest)
@ -6,6 +6,8 @@
[![en](https://img.shields.io/badge/lang-en-012169.svg)](README.md) [![en](https://img.shields.io/badge/lang-en-012169.svg)](README.md)
[Вики (англ.)](https://github.com/Sollace/Unicopia/wiki)
Привнесите магию дружбы в Minecraft! Привнесите магию дружбы в Minecraft!
То, что начиналось как скромная утилита, позволяющая сделать игру за единорога немного более увлекательной, То, что начиналось как скромная утилита, позволяющая сделать игру за единорога немного более увлекательной,
@ -46,19 +48,22 @@
### Понифицированные картины ### Понифицированные картины
Ведь что это был бы за пони-мод, если бы в нём не было этого? У каждой расы есть хотя бы один рисунок, представляющий её, Ведь что это был бы за пони-мод, если бы в нём е_ было этого? У каждой расы есть хотя бы один рисунок, представляющий её,
так что покажите свою гордость и поднимите флаг! так что покажите свою гордость и поднимите флаг!
Дисклеймер: Радужных флагов нет (пока) Дисклеймер: Радужных флагов (пока) нет
### Природные явления ### Природные явления
- Воздушный поток (плохо) влияет на пегасов, остерегайтесь летать во время грозы! Там может быть опасно! - Воздушный поток
Если вы играете за летающий вид или просто любите приятные вещи, попробуйте построить метеорологическую жилу.
Пегасы, остерегайтесь полётов во время грозы! Это может быть опасно!
Если вы играете за летающий вид или просто любите приятные вещи, попробуйте построить погодную жилу.
Она показывает фактическое, абсолютно реальное, а не плохо смоделированное направление ветра в вашем мире Minecraft. Только учтите, Она показывает фактическое, абсолютно реальное, а не плохо смоделированное направление ветра в вашем мире Minecraft. Только учтите,
что направление и сила ветра ситуативны (и плохи), и будут отличаться в зависимости от того, где вы находитесь и на какой высоте. что направление и сила ветра ситуативны, и будут отличаться в зависимости от того, где вы находитесь и на какой высоте.
- Горячий воздух поднимает - Горячий воздух поднимает
Нет, это не плохой фильм про "Звездные войны", это реальная механика. Песок и лава придают летающим видам дополнительную подъёмную силу. Нет, это не плохой фильм про "Звездные войны", это реальная механика. Песок и лава придают летающим видам дополнительную подъёмную силу.
Вода - наоборот. Попробуйте! А вообще, не стоит, я не хочу чтобы вы утонули. Вода - наоборот. Попробуйте! А вообще, не стоит, я не хочу чтобы вы утонули.

80
assets/accretion_disk.svg Normal file
View file

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="793.70081"
height="1122.5197"
viewBox="0 0 210 297"
version="1.1"
id="svg8"
sodipodi:docname="accretion_disk.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<defs
id="defs2">
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter1006"
x="-0.047823932"
width="1.0956479"
y="-0.048177369"
height="1.0963547">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="11.80918"
id="feGaussianBlur1008" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="0.65297002"
inkscape:cx="638.40178"
inkscape:cy="466.56457"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
objecttolerance="1"
inkscape:window-width="2048"
inkscape:window-height="1076"
inkscape:window-x="-4"
inkscape:window-y="4"
inkscape:window-maximized="1"
inkscape:pagecheckerboard="true"
units="px" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:#d98282;stroke:#000000;stroke-width:5.90000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;filter:url(#filter1006);stroke-miterlimit:4;stroke-dasharray:none"
d="M 273.33203 61.957031 C 218.19856 132.07255 244.67649 272.3247 300.8125 327.65625 C 212.65683 342.56237 117.8187 290.41151 96.970703 214.49609 C 106.48046 303.18347 223.38426 385.06833 302.34375 385.77344 C 250.43451 458.78189 146.3945 488.61281 78.105469 449.44141 C 147.35021 505.66464 287.99747 481.38179 344.34961 426.17578 C 358.39121 514.5561 305.1554 608.79183 229.00586 628.76758 C 317.79645 620.27585 401.01904 504.31983 402.66211 425.35938 C 475.15092 478.02297 503.88024 582.37041 463.99023 650.24219 C 520.94121 581.59474 498.14594 440.69846 443.26758 384.42969 C 531.7397 373.62573 624.38067 429.5873 642.12695 506.28711 C 636.22847 417.28661 522.7479 330.71796 443.91992 326.89844 C 498.97294 256.29628 604.20699 230.99439 670.73828 273.08203 C 603.98948 213.9172 462.42095 232.0939 402.21289 284.1875 C 386.71456 195.15366 439.99868 100.94561 516.1582 81.007812 C 427.36338 89.45531 344.08309 205.36983 342.04102 283.99023 C 267.83445 232.87989 235.23336 130.85029 273.33203 61.957031 z M 371.38086 289.78711 A 64.321476 64.321476 0 0 1 435.70117 354.10742 A 64.321476 64.321476 0 0 1 371.38086 418.42969 A 64.321476 64.321476 0 0 1 307.05859 354.10742 A 64.321476 64.321476 0 0 1 371.38086 289.78711 z "
transform="scale(0.26458333)"
id="path828"
inkscape:export-xdpi="37.806454"
inkscape:export-ydpi="37.806454" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"block_shell","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2.4000000000000004,0,0],"to":[10.399999999999999,0,8],"autouv":0,"color":9,"rotation":[0,45,0],"origin":[12,0,4],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]}

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_2","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[6.4,0,0],"to":[14.399999999999999,0,8],"autouv":0,"color":9,"rotation":[0,45,0],"origin":[12,0,4],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1.2117749006091447,0,6.788225099390861],"to":[9.211774900609145,0,14.78822509939086],"autouv":0,"color":9,"rotation":[0,-22.5,0],"origin":[5.211774900609143,0,10.788225099390859],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[0,0,0,0],"rotation":270,"texture":null}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]}

BIN
assets/models/body.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
assets/models/bulb_idle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_3","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[6.100000000000001,0.4,0.6000000000000014],"to":[14.100000000000005,0.4,8.600000000000001],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[10.100000000000005,0.4,3],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":270,"texture":0},"down":{"uv":[0,0,0,0],"rotation":90,"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0.3640158355865708,0,4.022858234660681],"to":[8.36401583558657,0,12.022858234660681],"autouv":0,"color":9,"rotation":[0,0,22.5],"origin":[4.364015835586571,0,8.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":180,"texture":0},"down":{"uv":[0,0,0,0],"rotation":180,"texture":null}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.755052095676865,0,8.084325693581398],"to":[15.755052095676865,0,16.0843256935814],"autouv":0,"color":9,"rotation":[-22.5,0,0],"origin":[11.755052095676865,0,12.0843256935814],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[16,0,0,16],"rotation":90,"texture":0}},"type":"cube","uuid":"a13cf19e-6339-91b6-4d9b-0d3500abf734"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2","a13cf19e-6339-91b6-4d9b-0d3500abf734"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]}

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_4","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[8,0.5,0.6000000000000014],"to":[16,0.5,8.600000000000001],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[12,0.5,3],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":270,"texture":0},"down":{"uv":[16,0,0,16],"rotation":270,"texture":0}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0.3640158355865708,0,7.022858234660681],"to":[8.36401583558657,0,15.022858234660681],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[4.364015835586571,0,11.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":270,"texture":0},"down":{"uv":[16,0,0,16],"rotation":270,"texture":0}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.755052095676865,0,8.084325693581398],"to":[15.755052095676865,0,16.0843256935814],"autouv":0,"color":9,"rotation":[-22.5,0,0],"origin":[11.755052095676865,0,12.0843256935814],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[0,16,16,0],"rotation":270,"texture":0}},"type":"cube","uuid":"a13cf19e-6339-91b6-4d9b-0d3500abf734"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1.3640158355865708,0,0.022858234660681376],"to":[9.36401583558657,0,8.022858234660681],"autouv":0,"color":9,"rotation":[0,0,22.5],"origin":[5.364015835586571,0,4.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":180,"texture":0},"down":{"uv":[0,16,16,0],"rotation":180,"texture":0}},"type":"cube","uuid":"60843fa4-6abd-3b89-20f7-67fc05e29ba3"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2","60843fa4-6abd-3b89-20f7-67fc05e29ba3","a13cf19e-6339-91b6-4d9b-0d3500abf734"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
assets/models/cork.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 B

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,33 @@
// Made with Blockbench 4.9.4
// Exported for Minecraft version 1.17+ for Yarn
// Paste this class into your mod and generate all required imports
public class hanging_sandbag extends EntityModel<Entity> {
private final ModelPart root;
private final ModelPart bag;
private final ModelPart cube_r1;
private final ModelPart cube_r2;
public hanging_sandbag(ModelPart root) {
this.root = root.getChild("root");
}
public static TexturedModelData getTexturedModelData() {
ModelData modelData = new ModelData();
ModelPartData modelPartData = modelData.getRoot();
ModelPartData root = modelPartData.addChild("root", ModelPartBuilder.create().uv(16, 19).cuboid(-0.5F, 0.0F, -0.5F, 1.0F, 9.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 24.0F, 0.0F));
ModelPartData bag = root.addChild("bag", ModelPartBuilder.create().uv(0, 0).cuboid(-3.0F, 1.0F, -3.0F, 6.0F, 7.0F, 6.0F, new Dilation(0.0F))
.uv(12, 14).cuboid(-2.0F, 0.0F, -2.0F, 4.0F, 1.0F, 4.0F, new Dilation(0.0F))
.uv(0, 13).cuboid(-2.0F, 8.0F, -2.0F, 4.0F, 1.0F, 4.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 9.0F, 0.0F));
ModelPartData cube_r1 = bag.addChild("cube_r1", ModelPartBuilder.create().uv(0, 14).cuboid(0.0F, 8.0F, -2.0F, 0.0F, 4.0F, 4.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 1.0F, 0.0F, 0.0F, -0.7854F, 0.0F));
ModelPartData cube_r2 = bag.addChild("cube_r2", ModelPartBuilder.create().uv(0, 14).cuboid(0.0F, 8.0F, -2.0F, 0.0F, 4.0F, 4.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 1.0F, 0.0F, 0.0F, 0.7854F, 0.0F));
return TexturedModelData.of(modelData, 32, 32);
}
@Override
public void setAngles(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {
}
@Override
public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) {
root.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"hive_core","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"core","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1,1,1],"to":[15,15,15],"autouv":0,"color":6,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,16,16],"texture":0},"east":{"uv":[0,0,16,16],"texture":0},"south":{"uv":[0,0,16,16],"texture":0},"west":{"uv":[0,0,16,16],"texture":0},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,16,16],"texture":0}},"type":"cube","uuid":"494e4b71-f1df-46c1-f373-aa720b94be5e"},{"name":"activity","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0,0,0],"to":[16,16,2],"autouv":0,"color":1,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,16,16],"texture":1},"east":{"uv":[14,0,16,16],"texture":1},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[0,0,2,16],"texture":1},"up":{"uv":[16,2,0,0],"texture":1},"down":{"uv":[16,14,0,16],"texture":1}},"type":"cube","uuid":"13733a81-bd87-34dc-d9b6-05392c74222a"}],"outliner":["494e4b71-f1df-46c1-f373-aa720b94be5e","13733a81-bd87-34dc-d9b6-05392c74222a"],"textures":[{"path":"/home/sollace/Desktop/hive_core.png","name":"hive_core.png","folder":"","namespace":"unicopia","id":"0","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"b6416600-de7b-5a1b-2752-6724918266ab","relative_path":"../../../../../../../Desktop/hive_core.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAqBJREFUOE9tk0tvHEUURs+t6qqenkfs8Qy2I4GwRCQiFJIYzCKxQLDgB8Ce/w0SYgFexMFtu3um3111UTtIySLLKtWt+u6tc+TLp89UVQlBERFmswznPGdnX3B9fcVdnuO8w1rPbl8ynbVWHs4aY5EXLy80RmUYBo6Ojui7jmpXcvLJKUNVIQJVWXBy9oSq3XOT5yTOYYww1cn3P/ysef4W72fUZYFXxUkkljsSa8nmc/q6YjAJQ5Iw3x5Tdw3rzTFVtUcuvrvU6ZUwDoRyD/lb5qkjiiUMA6vlgr7tGIaewTr84SF+fUgThaZtkGdfX6j3jiq/YVbeYw3MjMEnnr7vcM4Sgz70romjt0IggaMNbj5Hzr95rfX+HtO2LMJIliZoWYEBExVjLWMYkcQRxNBqwPoZ7vgxu65Ffvn1N/33zRXXf/1BFkcWUZAYiUaYOw+q9BqQEBliRMQQ5gvG1YqTz58gry5/0qEoGIs7tCqxEQQlS1OcTgkMVgzNOEKakqYZTddgtqfoYoV89fS5ZmFE6x02RrquBYVHzpGa6SolBhhFHuZjjHkYZphl9MsVcv78W+2LO2Yu5dFyw+0/vxNUWfgUh+CNPKw1BrxNGKISZ3NClnEXAnJ+/koPFkvyv//EVnv6EPDGYjXibMJEkhEhhJE0y1AS6jjgjrasHn+GvL78Udu6ocuvkWFAx5FsijsGkqlwShAFf3BAW9xiXIKs1iTrNWVTvwPJGiFRpb0vcDIidUdT7Zj24xR/Yt7P0YmA5RJ1KaQz2r57j3KWZgxNQyqGsSmJdYM1hnHoiYnF+Ix+amu5IghstqfvUP5Qpu1mwziMNLuC7eaYIr+hbvY0Xcfxp2fTf1BMvvj0vUwf09n/r/Ob6ytuP9B5/xGd/wPFiXTP8ca0JAAAAABJRU5ErkJggg=="},{"path":"/home/sollace/Desktop/hive_activity.png","name":"hive_activity.png","folder":"","namespace":"unicopia","id":"1","particle":false,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"8c57b642-7139-0ef2-7e98-d580239ce477","relative_path":"../../../../../../../Desktop/hive_activity.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAkhJREFUOE+tk0tv00AUhb9x4vgV23k1LW1FKlV9SLSlhbIoFQgW/ADY87ORULsh0JamwUkcxxk7TjIog+APlJFmNXfOPefcc8XB4ZFSSrFYKIQQ2LaDaVbY2dnlvnfDIIqoVExKpQqTyZhVbakkdK1hlBDPT8/VcqkoioJms8l8viBNJ2xv75AkY9J0dVM6nV2kTIiiCNM0MQzB6p948/aDiqIHLMtByqnuXq1WyWczAr/GaNRHKUG5bJKmCY7jkueSZrOtG4nzV5dqhWYYBnlekCQJ29tbOG4VEBhigefVub7+Cigsy2S5XOruMpOIo+Nz5Xku0+kUKTM6nQ7z+ZzZLKdUKmuwm5tbFos5lYpFuVym2+3iODau6yLOXrxWRZHh+wGWZeF6LvFoRdUijke0Wm2iqE8QhEiZE9Z8pumUPM+1R+Ljp89KypSH/j3r60/43u2yXBaEtYB6rYHvhyRJzHA0IB6NMQyTp50Ovd5P2msbiIvL98oQJW2e47r07m+xbZtGo649mC/nlI2y1j8YDMmyjPWNLeR0SlHMEAeHJ2qlRwjY3NzSUuJ4jO/7jCcxf09QXTFJCMNAU7+7u0UpEMcnL9UK1fOq7O8/YzCMaDXr2g8p5T8Ax3G07l/RkEa9ydXVlz9jPD27UK3WGsNhpBE9zyEIaxRFThj4TCaSatUhHieYpsU4HpGmUjOu15uI15fvVJbNSNOYRqOtR2PZFbrffmDbFfb29uhHI2ZZqlM6GDzgeaF+i8fxfwjSo6P86GV67Dr/BkQRecNu1A/UAAAAAElFTkSuQmCC"}]}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.9","model_format":"java_block","box_uv":false},"name":"jar","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[4,0,4],"to":[12,12,12],"autouv":0,"color":3,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,8,12],"texture":0},"east":{"uv":[0,0,8,12],"texture":0},"south":{"uv":[0,0,8,12],"texture":0},"west":{"uv":[0,0,8,12],"texture":0},"up":{"uv":[8,0,16,8],"texture":0},"down":{"uv":[8,0,16,8],"texture":0}},"type":"cube","uuid":"c02d32c0-74ac-27ba-627e-83de2a9500f7"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[6,13,6],"to":[10,16,10],"autouv":0,"color":3,"origin":[0,0,0],"faces":{"north":{"uv":[0,4,4,7],"texture":1},"east":{"uv":[0,4,4,7],"texture":1},"south":{"uv":[0,4,4,7],"texture":1},"west":{"uv":[0,4,4,7],"texture":1},"up":{"uv":[0,0,4,4],"texture":1},"down":{"uv":[4,0,8,4],"texture":1}},"type":"cube","uuid":"147c96d5-ae15-7e40-dcb7-c635e6e80eed"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[5,13,5],"to":[11,14,11],"autouv":0,"color":3,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,8,1],"texture":0},"east":{"uv":[0,0,8,1],"texture":0},"south":{"uv":[0,0,8,1],"texture":0},"west":{"uv":[0,0,8,1],"texture":0},"up":{"uv":[8,0,16,8],"texture":0},"down":{"uv":[8,0,16,8],"texture":0}},"type":"cube","uuid":"7642fef8-ce7e-d79f-f450-01de2526fca5"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[6,12,6],"to":[10,13,10],"autouv":0,"color":3,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,8,1],"texture":0},"east":{"uv":[0,0,8,1],"texture":0},"south":{"uv":[0,0,8,1],"texture":0},"west":{"uv":[0,0,8,1],"texture":0},"up":{"uv":[8,0,16,8],"texture":0},"down":{"uv":[8,0,16,8],"texture":0}},"type":"cube","uuid":"e1e878a3-7fdb-79f6-e2c8-b591a94cec41"}],"outliner":["c02d32c0-74ac-27ba-627e-83de2a9500f7","7642fef8-ce7e-d79f-f450-01de2526fca5","e1e878a3-7fdb-79f6-e2c8-b591a94cec41","147c96d5-ae15-7e40-dcb7-c635e6e80eed"],"textures":[{"path":"","name":"body","folder":"block","namespace":"","id":"0","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":true,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"c3fc3ff5-2bb6-a5d1-88ff-7d0d48a4200c","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAKxJREFUOE/Nk70NxCAMhe0qiCKCCRiA/UdhAFgARIGg8sknJbpI/CS6K47Sz/54fggkIoLJCSHAvu+glLp0pZQg5wwYYyStNfYYrHGdhxHx0sMXM+QEHIVPGAN6w8dlPHMCek4eAUYrLB1478kYM8zga8AyxJkD1hgwfcYVYLTekRk658ha281gpv0WUEqBWiu01t7gbdtACAFSShi5Ox3M/sEdrbv7ncH/cfACoGWX3cV5e7AAAAAASUVORK5CYII="},{"path":"","name":"cork","folder":"block","namespace":"","id":"1","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"1faf1369-230e-ed4a-f210-037c1820f194","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAFJJREFUOE9jXDwj8z8DHhCbMZ0RnzwjyABRYW6wmtdvv4JpZD59DKDICztWl6CEgUdoD14/o1sGDgNkQUJ+pr4B+PxPjBxJ/sVm4KgBDAzDIAwAlBIoEQohE0IAAAAASUVORK5CYII="}]}

BIN
assets/models/jar_body.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

File diff suppressed because one or more lines are too long

BIN
assets/models/jar_cork.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 B

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.9","model_format":"java_block","box_uv":false},"name":"jar","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":true,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[6,1,7.5],"to":[11,11,7.5],"autouv":0,"color":5,"rotation":[0,-45,0],"origin":[8,5,7],"faces":{"north":{"uv":[3,0,13,16],"texture":0},"east":{"uv":[0,0,0,8],"texture":0},"south":{"uv":[3,0,13,16],"texture":0},"west":{"uv":[0,0,0,8],"texture":0},"up":{"uv":[0,0,6,0],"texture":0},"down":{"uv":[0,0,6,0],"texture":0}},"type":"cube","uuid":"52fdb109-7055-1f3c-d1a1-788daf976643"},{"name":"cube","box_uv":false,"rescale":true,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[5,1,7.5],"to":[10,11,7.5],"autouv":0,"color":5,"rotation":[0,45,0],"origin":[8,5,7],"faces":{"north":{"uv":[3,0,13,16],"texture":0},"east":{"uv":[0,0,0,8],"texture":0},"south":{"uv":[3,0,13,16],"texture":0},"west":{"uv":[0,0,0,8],"texture":0},"up":{"uv":[0,0,6,0],"rotation":180,"texture":0},"down":{"uv":[0,0,6,0],"rotation":180,"texture":0}},"type":"cube","uuid":"67ba2407-52e4-4b13-579c-0e7675265bb9"}],"outliner":["52fdb109-7055-1f3c-d1a1-788daf976643","67ba2407-52e4-4b13-579c-0e7675265bb9"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/block/lightning_jar_filling.png","name":"lightning_jar_filling.png","folder":"block","namespace":"unicopia","id":"2","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"2c8fdd18-9bd4-2276-cdc1-d86d0605d22d","relative_path":"../../../src/main/resources/assets/unicopia/textures/block/lightning_jar_filling.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAN9JREFUOE9jZCASOH7T/L+f6zojunIMAWzmObxR/c/IxcJAlgE+3/X+f/j7l4GV6R/pBnh/0vv/59d/hl9cf7BqBrkWrxdABnxj+Y1TM14DQJq//vrOwMfLz7CJ/QxOi7BKgEKc5wcLw3u2fwxHeK6C1YDEuP6wMqC7CKcB2GIDZMBWvksoejAMANmErBnkEhD4zP6bgZGRESM88BoA1/zvBzi8D4jcwp+QkG0HJRrfd7pg14DCgqh0ADMApBnEZvsGcT5Z6QBXqBOVF9C9gi+/4Y1GbJmHoAuQw4GYnA4AMBBxEZobGUEAAAAASUVORK5CYII="}]}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.9","model_format":"java_block","box_uv":false},"name":"jar","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[4,0,4],"to":[12,10,12],"autouv":0,"color":4,"inflate":-0.09999999999999964,"origin":[0,0,0],"faces":{"north":{"uv":[0,2,8,12],"texture":2},"east":{"uv":[0,6,8,16],"texture":2},"south":{"uv":[8,6,16,16],"texture":2},"west":{"uv":[8,0,16,10],"texture":2},"up":{"uv":[4,3,12,11],"texture":2},"down":{"uv":[8,4,16,12],"texture":2}},"type":"cube","uuid":"e15b3907-6195-1f3b-0c48-23c6b4642fc6"}],"outliner":["e15b3907-6195-1f3b-0c48-23c6b4642fc6"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/assets/models/body.png","name":"body.png","folder":"","namespace":"","id":"0","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":true,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"c3fc3ff5-2bb6-a5d1-88ff-7d0d48a4200c","relative_path":"../body.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAKxJREFUOE/Nk70NxCAMhe0qiCKCCRiA/UdhAFgARIGg8sknJbpI/CS6K47Sz/54fggkIoLJCSHAvu+glLp0pZQg5wwYYyStNfYYrHGdhxHx0sMXM+QEHIVPGAN6w8dlPHMCek4eAUYrLB1478kYM8zga8AyxJkD1hgwfcYVYLTekRk658ha281gpv0WUEqBWiu01t7gbdtACAFSShi5Ox3M/sEdrbv7ncH/cfACoGWX3cV5e7AAAAAASUVORK5CYII="},{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/assets/models/cork.png","name":"cork.png","folder":"","namespace":"","id":"1","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"1faf1369-230e-ed4a-f210-037c1820f194","relative_path":"../cork.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAFJJREFUOE9jXDwj8z8DHhCbMZ0RnzwjyABRYW6wmtdvv4JpZD59DKDICztWl6CEgUdoD14/o1sGDgNkQUJ+pr4B+PxPjBxJ/sVm4KgBDAzDIAwAlBIoEQohE0IAAAAASUVORK5CYII="},{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/jar_filling_zap.png","name":"jar_filling_zap.png","folder":"item","namespace":"unicopia","id":"2","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"62c06d20-77c5-befb-bb95-8e5da5394d9c","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAudJREFUOE8dkUlrXWUYgJ/3G849J7dJSxZuG2s6aMDaUsWWNjVpBS2luHDtyp1UcOhfEKTZ1LYIURQXjQYkEkwduhVd6S8oxUXAJpCBeO/NGb7hlfgPnkHOmvfUiMepBwJ3ph0ej3YRPew5+9UnSN9CY4gnL0FpcBo5vzjCeEHOmA9UJaBJuTftKHAUGeoqc/7BPTgUyPsgJ+boTEEkU6rj3OJTysIiZ/37moPly5mSnjEgBYN2n5d/+RSXgAQ5QDw5R2GFQWOZ/WIL6Ql2lJFz9iNdfM4zsg3jFAy6louP7kMRyZ2AgfqZWXAlRlsuLw7wpdDEQH10Ffnj+C31PY+2LT4Lp79fgBIkQZICfeEyQSsYNlxZ3mX4b83EkYqm6Rge/wn569SHqjZRq+fC6gK66Vgff5ep9A3MzLLTBY5UgVcXa1KKRBImQH5xDVGH/Pn8LTUkXvr5M1I0uKbj73yTZ48/IfmEsZFXvt6jGAniDYOwTz72A9rvQzbI76c+1gs/3icMa/wERAE3dYOailwPmFvbxu5kJBz0F0ZnVkl1S9Xr0wWD6GOUCCogCvnYWxjfgkZeX27Y3tzDO0cMGTPzkNh3tHVNUULvtbtIfoKKeNLUVYwYJEW6kePGbyM2Hm9RVI5oDGlqhewMgsWKoXd1gUiH1GFeSyvQjJGrhjeWO/55uoVTh+9bjGTs9K80YmhDTRk69PodnPW0MSIarimu4NrKiO31baJP9IqCHJV4Yol8gC8lsR5Qjo1Tzt2mIRNjwHhF3vzuinaaECvs7uxgjaE6+pCNPGRsYpxcJ9QbNAYmr37Org7pmTFaavyB8vzSrDpbsbe5RVNF3NEVovXQtPjeIVpa3t7cYO2dbzHqyKYhqSekfUpXIReXLqlJke3JB7geqHdIryDWSmkjxlYcnr/NXmhIVrCq/H/NZBwVcvrRunYSKLGkImOi4LynDcrk9bsMm33koIFrKUIP1Y7sWqz0ydLyH7DGczPZHbGfAAAAAElFTkSuQmCC","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/jar_filling_zap.png"}]}

File diff suppressed because one or more lines are too long

66
assets/models/mimic.java Normal file
View file

@ -0,0 +1,66 @@
// Made with Blockbench 4.9.4
// Exported for Minecraft version 1.17+ for Yarn
// Paste this class into your mod and generate all required imports
package com.example.mod;
public class mimic extends EntityModel<Entity> {
private final ModelPart lid;
private final ModelPart tongue_r1;
private final ModelPart upper_teeth;
private final ModelPart cube_r1;
private final ModelPart lower_teeth;
private final ModelPart cube_r2;
private final ModelPart right_leg;
private final ModelPart left_leg;
public mimic(ModelPart root) {
this.lid = root.getChild("lid");
this.lower_teeth = root.getChild("lower_teeth");
this.right_leg = root.getChild("right_leg");
this.left_leg = root.getChild("left_leg");
}
public static TexturedModelData getTexturedModelData() {
ModelData modelData = new ModelData();
ModelPartData modelPartData = modelData.getRoot();
ModelPartData lid = modelPartData.addChild("lid", ModelPartBuilder.create(), ModelTransform.of(0.0F, 17.0F, -7.0F, -0.829F, 0.0F, -3.1416F));
ModelPartData tongue_r1 = lid.addChild("tongue_r1", ModelPartBuilder.create().uv(11, 34).cuboid(-3.0F, -10.0F, 1.0F, 6.0F, 1.0F, 8.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 7.0F, 7.0F, 0.5236F, 0.0F, 0.0F));
ModelPartData upper_teeth = lid.addChild("upper_teeth", ModelPartBuilder.create().uv(0, 0).cuboid(-1.0F, -8.0F, 5.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-4.0F, -8.0F, 5.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(2.0F, -8.0F, 5.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 7.0F, 7.0F));
ModelPartData cube_r1 = upper_teeth.addChild("cube_r1", ModelPartBuilder.create().uv(0, 0).cuboid(-6.0F, -1.0F, -6.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-9.0F, -1.0F, -6.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-12.0F, -1.0F, -6.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-6.0F, -1.0F, 5.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-9.0F, -1.0F, 5.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-12.0F, -1.0F, 5.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, -7.0F, -7.0F, 0.0F, 1.5708F, 0.0F));
ModelPartData lower_teeth = modelPartData.addChild("lower_teeth", ModelPartBuilder.create().uv(0, 0).cuboid(-1.0F, -1.0F, 12.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-4.0F, -1.0F, 12.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(2.0F, -1.0F, 12.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 16.0F, -7.0F));
ModelPartData cube_r2 = lower_teeth.addChild("cube_r2", ModelPartBuilder.create().uv(0, 0).cuboid(-6.0F, -1.0F, -6.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-9.0F, -1.0F, -6.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-12.0F, -1.0F, -6.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-6.0F, -1.0F, 5.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-9.0F, -1.0F, 5.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F))
.uv(0, 0).cuboid(-12.0F, -1.0F, 5.0F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 0.0F, 1.5708F, 0.0F));
ModelPartData right_leg = modelPartData.addChild("right_leg", ModelPartBuilder.create().uv(7, 30).cuboid(-2.5F, -1.5F, -3.0F, 5.0F, 7.0F, 6.0F, new Dilation(0.0F)), ModelTransform.pivot(3.5F, 25.5F, 1.0F));
ModelPartData left_leg = modelPartData.addChild("left_leg", ModelPartBuilder.create().uv(7, 30).mirrored().cuboid(-9.5F, -1.5F, -3.0F, 5.0F, 7.0F, 6.0F, new Dilation(0.0F)).mirrored(false), ModelTransform.pivot(3.5F, 25.5F, 1.0F));
return TexturedModelData.of(modelData, 64, 64);
}
@Override
public void setAngles(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {
}
@Override
public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) {
lid.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);
lower_teeth.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);
right_leg.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);
left_leg.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);
}
}

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"mysterious_egg_1","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[3,0,3],"to":[13,13,13],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[0,6,6,14],"texture":0},"east":{"uv":[0,6,6,14],"texture":0},"south":{"uv":[0,6,6,14],"texture":0},"west":{"uv":[0,6,6,14],"texture":0},"up":{"uv":[0,0,6,6],"texture":0},"down":{"uv":[0,0,6,6],"texture":0}},"type":"cube","uuid":"e2063530-1c9c-f04c-325f-a445aee2da9a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[4,1,4],"to":[12,12,12],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[7,7,11,13],"texture":0},"east":{"uv":[7,7,11,13],"texture":0},"south":{"uv":[7,7,11,13],"texture":0},"west":{"uv":[7,7,11,13],"texture":0},"up":{"uv":[7,1,11,5],"texture":0},"down":{"uv":[7,1,11,5],"texture":0}},"type":"cube","uuid":"01e262af-a32c-e3fe-108b-0c32faa1afeb"}],"outliner":[{"name":"egg","origin":[0,0,0],"color":0,"uuid":"2320983f-93fb-6c71-9582-32758f0eb13e","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["01e262af-a32c-e3fe-108b-0c32faa1afeb","e2063530-1c9c-f04c-325f-a445aee2da9a"]}],"textures":[{"path":"/home/sollace/Desktop/slime_block.png","name":"mysterious_egg.png","folder":"block","namespace":"unicopia","id":"all","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"78bfb99c-a3a0-820b-f324-1f223fd4fa95","relative_path":"../../../../../../../Desktop/slime_block.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAjZJREFUOE+Vk99LU2EYx7/v2dnO2apFwqAfiCCJZXXRVQkLjbWgOGDJhBJXW2JG5H+ktbZKsjFZvDdd9MMyNQvqou5qoXM6zpgbc50fOz/e2LprK+Z788DD+3z4vt/n+5KbsauUd/OoKAV07O2AbTPoKhCPzEto45Cx6SF66nIvRLcATdUbI99efEc8mpICtwYY5+RgG3aj//L+AvmbSe6lR2hP4BgIdJTlGgrFDWx/ruHx7edS8M55RmDD0Bl0TcPS7Goz4FoiQINjF7BdKGFzM4OKrGAnp2Iu+lq6NBVkNbUGXdFgaBY+pD41A27EhumJi0exkctAKSlw8ATaTx7x8XTjCaqqwtJtEA5YSbYATDwdoQQmiCCiUpVhGRbsmo3k5Nv2TByfDVGvT4ChE8iFLbjhBcMuthBJDNPjg0eQza7jUGc38vks1lc2kZ5akgLRc0xVNYhuN7R/mRh5FKIHDgooVmV0dXVD3slB/lrG/N1FyR86ywzThOgRUTN1LM99bDaxruBwnw+mp4SOfZ3QFQM/3q8hHk1LA6N+ZvMGXA4Bls3w5uG7ZkBoepD29Z9EOVeBiiK8og/FtSpi4aQ0EPYz85cFCwZ43onFueUWOYgHaM/pXjg4E+BcqDuY/ZLHzOgfQKNR3yEDFhItFEw8GaKcxw2n0wFxvwdeH4fMagGxcErqv3KGEY6Aczrg8hC8erDYrGDyWYhWWakRcWGP0Kik4sHM9WR7OWjjw/33SpOk3QJ/A8St+xERhrBvAAAAAElFTkSuQmCC"}]}

View file

@ -0,0 +1 @@
{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"mysterious_egg_2","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1,0,4],"to":[9,13,12],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[0,6,6,14],"texture":0},"east":{"uv":[0,6,6,14],"texture":0},"south":{"uv":[0,6,6,14],"texture":0},"west":{"uv":[0,6,6,14],"texture":0},"up":{"uv":[0,0,6,6],"texture":0},"down":{"uv":[0,0,6,6],"texture":0}},"type":"cube","uuid":"e2063530-1c9c-f04c-325f-a445aee2da9a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,1,5],"to":[8,12,11],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[7,7,11,13],"texture":0},"east":{"uv":[7,7,11,13],"texture":0},"south":{"uv":[7,7,11,13],"texture":0},"west":{"uv":[7,7,11,13],"texture":0},"up":{"uv":[7,1,11,5],"texture":0},"down":{"uv":[7,1,11,5],"texture":0}},"type":"cube","uuid":"01e262af-a32c-e3fe-108b-0c32faa1afeb"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[9,1,9],"to":[13,7,13],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[7,7,11,13],"texture":0},"east":{"uv":[7,7,11,13],"texture":0},"south":{"uv":[7,7,11,13],"texture":0},"west":{"uv":[7,7,11,13],"texture":0},"up":{"uv":[7,1,11,5],"texture":0},"down":{"uv":[7,1,11,5],"texture":0}},"type":"cube","uuid":"6ef3137e-56f6-4fc0-b117-69e19f38ad95"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[8,0,8],"to":[14,8,14],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[0,6,6,14],"texture":0},"east":{"uv":[0,6,6,14],"texture":0},"south":{"uv":[0,6,6,14],"texture":0},"west":{"uv":[0,6,6,14],"texture":0},"up":{"uv":[0,0,6,6],"texture":0},"down":{"uv":[0,0,6,6],"texture":0}},"type":"cube","uuid":"05ec172d-6ef9-8c8f-5c5e-b276711d0e40"}],"outliner":[{"name":"egg","origin":[0,0,0],"color":0,"uuid":"2320983f-93fb-6c71-9582-32758f0eb13e","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["01e262af-a32c-e3fe-108b-0c32faa1afeb","e2063530-1c9c-f04c-325f-a445aee2da9a"]},{"name":"egg","origin":[0,0,0],"color":0,"uuid":"ffce6c26-55c9-4834-d6c4-96a58e04c177","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["6ef3137e-56f6-4fc0-b117-69e19f38ad95","05ec172d-6ef9-8c8f-5c5e-b276711d0e40"]}],"textures":[{"path":"/home/sollace/Desktop/slime_block.png","name":"mysterious_egg.png","folder":"block","namespace":"unicopia","id":"all","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"78bfb99c-a3a0-820b-f324-1f223fd4fa95","relative_path":"../../../../../../../Desktop/slime_block.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAjZJREFUOE+Vk99LU2EYx7/v2dnO2apFwqAfiCCJZXXRVQkLjbWgOGDJhBJXW2JG5H+ktbZKsjFZvDdd9MMyNQvqou5qoXM6zpgbc50fOz/e2LprK+Z788DD+3z4vt/n+5KbsauUd/OoKAV07O2AbTPoKhCPzEto45Cx6SF66nIvRLcATdUbI99efEc8mpICtwYY5+RgG3aj//L+AvmbSe6lR2hP4BgIdJTlGgrFDWx/ruHx7edS8M55RmDD0Bl0TcPS7Goz4FoiQINjF7BdKGFzM4OKrGAnp2Iu+lq6NBVkNbUGXdFgaBY+pD41A27EhumJi0exkctAKSlw8ATaTx7x8XTjCaqqwtJtEA5YSbYATDwdoQQmiCCiUpVhGRbsmo3k5Nv2TByfDVGvT4ChE8iFLbjhBcMuthBJDNPjg0eQza7jUGc38vks1lc2kZ5akgLRc0xVNYhuN7R/mRh5FKIHDgooVmV0dXVD3slB/lrG/N1FyR86ywzThOgRUTN1LM99bDaxruBwnw+mp4SOfZ3QFQM/3q8hHk1LA6N+ZvMGXA4Bls3w5uG7ZkBoepD29Z9EOVeBiiK8og/FtSpi4aQ0EPYz85cFCwZ43onFueUWOYgHaM/pXjg4E+BcqDuY/ZLHzOgfQKNR3yEDFhItFEw8GaKcxw2n0wFxvwdeH4fMagGxcErqv3KGEY6Aczrg8hC8erDYrGDyWYhWWakRcWGP0Kik4sHM9WR7OWjjw/33SpOk3QJ/A8St+xERhrBvAAAAAElFTkSuQmCC"}]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

File diff suppressed because one or more lines are too long

BIN
assets/models/tentacle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
assets/spectral_clock_0.xcf Normal file

Binary file not shown.

BIN
assets/zap_planks.xcf Normal file

Binary file not shown.

View file

@ -1,15 +1,14 @@
buildscript { buildscript {
dependencies { dependencies {
classpath 'com.github.dexman545:Outlet:1.3.10' classpath 'com.github.dexman545:Outlet:1.6.1'
} }
} }
plugins { plugins {
id 'java-library' id 'fabric-loom' version '1.5-SNAPSHOT'
id 'fabric-loom' version '0.12-SNAPSHOT'
id 'com.modrinth.minotaur' version '2.+' id 'com.modrinth.minotaur' version '2.+'
id 'org.ajoberstar.reckon' version '0.13.0' id 'org.ajoberstar.reckon' version '0.13.1'
} }
apply plugin: 'dex.plugins.outlet' apply plugin: 'io.github.dexman545.outlet'
java { java {
toolchain { toolchain {
@ -30,6 +29,12 @@ loom {
accessWidenerPath = file('src/main/resources/unicopia.aw') accessWidenerPath = file('src/main/resources/unicopia.aw')
} }
fabricApi {
configureDataGeneration {
modId = 'unicopia'
}
}
reckon { reckon {
scopeFromProp() scopeFromProp()
stageFromProp 'beta', 'rc', 'final' stageFromProp 'beta', 'rc', 'final'
@ -38,12 +43,17 @@ reckon {
repositories { repositories {
mavenLocal() mavenLocal()
flatDir { dirs 'lib' } flatDir { dirs 'lib' }
maven { name 'entity-reach-attributes'; url 'https://maven.jamieswhiteshirt.com/libs-release' } maven { name 'entity-reach-attributes'; url 'https://maven.jamieswhiteshirt.com/libs-release'; content { includeGroup "com.jamieswhiteshirt" } }
maven { name 'trinkets'; url 'https://maven.ladysnake.org/releases' } maven { name 'trinkets'; url 'https://maven.ladysnake.org/releases' }
maven { name 'mod-menu'; url 'https://maven.terraformersmc.com/' } maven { name 'mod-menu'; url 'https://maven.terraformersmc.com/' }
maven { name 'minelp-snapshot'; url 'https://repo.minelittlepony-mod.com/maven/snapshot' } maven { name 'minelp-snapshot'; url 'https://repo.minelittlepony-mod.com/maven/snapshot' }
maven { name 'minelp-releases'; url 'https://repo.minelittlepony-mod.com/maven/release' } maven { name 'minelp-releases'; url 'https://repo.minelittlepony-mod.com/maven/release' }
maven { name 'TerraformersMC'; url 'https://maven.terraformersmc.com/' } maven { name 'TerraformersMC'; url 'https://maven.terraformersmc.com/' }
maven { name 'Nodium'; url 'https://maven.cafeteria.dev/releases/' }
maven { name 'Greenhouse Maven For Farmers delight'; url 'https://maven.greenhouseteam.dev/releases/' }
maven { name 'Porting Lib For Farmers delight'; url = 'https://mvn.devos.one/releases/' }
maven { name 'Modrinth'; url 'https://api.modrinth.com/maven' }
maven { name 'JitPack'; url 'https://jitpack.io'; content { includeGroup "com.github.Virtuoel" } }
} }
dependencies { dependencies {
@ -67,22 +77,49 @@ dependencies {
include "com.sollace:Romanizer:Romanizer:1.0.2" include "com.sollace:Romanizer:Romanizer:1.0.2"
modCompileOnly "com.terraformersmc:modmenu:${project.modmenu_version}" modCompileOnly "com.terraformersmc:modmenu:${project.modmenu_version}"
if (project.use_trinkets == '1') {
modCompileOnly "dev.emi:trinkets:${project.trinkets_version}" modCompileOnly "dev.emi:trinkets:${project.trinkets_version}"
modCompileOnly "dev.onyxstudios.cardinal-components-api:cardinal-components-base:5.3.0"
modCompileOnly "dev.onyxstudios.cardinal-components-api:cardinal-components-entity:5.3.0"
} else {
modCompileOnly "dev.emi:trinkets-dummy:${project.trinkets_version}"
}
modImplementation "com.terraformersmc.terraform-api:terraform-wood-api-v1:${project.terraformer_api_version}" modImplementation "com.terraformersmc.terraform-api:terraform-wood-api-v1:${project.terraformer_api_version}"
include "com.terraformersmc.terraform-api:terraform-wood-api-v1:${project.terraformer_api_version}" include "com.terraformersmc.terraform-api:terraform-wood-api-v1:${project.terraformer_api_version}"
modImplementation "me.luligabi:NoIndium:${project.nodium_version}"
include "me.luligabi:NoIndium:${project.nodium_version}"
//modImplementation "vectorwing:FarmersDelight-Refabricated:${project.farmers_delight_version}", {
// exclude group: "net.fabricmc"
//}
if (project.use_pehkui == '1') {
modCompileOnly "maven.modrinth:pehkui:${project.pehkui_version}", { exclude group: "net.fabricmc.fabric-api" }
modCompileOnly "com.github.Virtuoel:KanosConfig:0.4.1", { exclude group: "net.fabricmc.fabric-api" }
}
if (project.use_sodium == '1') {
modCompileOnly "maven.modrinth:indium:${project.indium_version}", { exclude group: "net.fabricmc.fabric-api" }
modCompileOnly "maven.modrinth:sodium:${project.sodium_version}", { exclude group: "net.fabricmc.fabric-api" }
if (project.use_iris == '1') {
modCompileOnly "maven.modrinth:iris:${project.iris_version}", { exclude group: "net.fabricmc.fabric-api" }
modImplementation "org.anarres:jcpp:1.4.14"
modImplementation "org.antlr:antlr4-runtime:4.13.1"
modImplementation "io.github.douira:glsl-transformer:2.0.1"
}
}
if (project.tmi_type == 'emi') { if (project.tmi_type == 'emi') {
modCompileOnly "dev.emi:emi-fabric:${project.emi_version}" modCompileOnly "dev.emi:emi-fabric:${project.emi_version}"
} else { } else {
modCompileOnly "dev.emi:emi-fabric-dummy:${project.emi_version}" modCompileOnly "dev.emi:emi-fabric-dummy:${project.emi_version}"
} }
}
if (project.tmi_type == 'rei') { remapJar {
// TODO: addNestedDependencies = true
} else {
// TODO:
}
} }
processResources { processResources {
@ -121,6 +158,9 @@ modrinth {
gameVersions.add ver gameVersions.add ver
} }
dependencies { dependencies {
required.project '9K7RJlvM' required.project 'P7dR8mSH'
optional.project '5aaWibi9'
optional.project 'JBjInUXM'
optional.project 'fRiHVvU7'
} }
} }

3
crowdin.yml Normal file
View file

@ -0,0 +1,3 @@
files:
- source: src/main/resources/assets/unicopia/lang/en_us.json
translation: /%original_path%/%locale_with_underscore%.%file_extension%

View file

@ -3,10 +3,10 @@ org.gradle.daemon=false
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/develop # check these on https://fabricmc.net/develop
minecraft_version=1.20.1 minecraft_version=1.20.2
yarn_mappings=1.20.1+build.9 yarn_mappings=1.20.2+build.4
loader_version=0.14.21 loader_version=0.15.7
fabric_version=0.85.0+1.20.1 fabric_version=0.91.6+1.20.2
# Mod Properties # Mod Properties
group=com.minelittlepony group=com.minelittlepony
@ -15,19 +15,32 @@ org.gradle.daemon=false
description=Magical Abilities for Mine Little Pony! description=Magical Abilities for Mine Little Pony!
# Publishing # Publishing
minecraft_version_range=>=1.20.1 minecraft_version_range=1.20.2
modrinth_loader_type=fabric modrinth_loader_type=fabric
modrinth_project_id=9K7RJlvM modrinth_project_id=9K7RJlvM
# Dependencies # Dependencies
fabwork_version=1.2.0 fabwork_version=1.3.0+1.20.2
modmenu_version=7.0.0-beta.2 modmenu_version=8.0.0-beta.1
minelp_version=4.10.1+1.20 minelp_version=4.11.6+1.20.2
kirin_version=1.15.4+1.20 kirin_version=1.16.1+1.20.2
reach_attributes_version=2.3.3 reach_attributes_version=2.3.4
trinkets_version=3.7.1 trinkets_version=3.8.0
terraformer_api_version=7.0.0-beta.1 terraformer_api_version=8.0.0-beta.1
nodium_version=1.1.0+1.20
# Testing
use_trinkets=1
use_pehkui=0
use_sodium=0
use_iris=1
farmers_delight_version=1.20.1-2.0.9
pehkui_version=3.7.8+1.14.4-1.20.2
iris_version=1.6.17+1.20.2
sodium_version=mc1.20.2-0.5.5
indium_version=1.0.30+mc1.20.4
# TMI Testing # TMI Testing
tmi_type=emi tmi_type=emi
emi_version=1.0.19+1.20.1 emi_version=1.0.21+1.20.2

View file

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,12 +1,20 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import net.minecraft.util.Formatting; import java.util.Locale;
public enum Affinity { import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.StringIdentifiable;
import net.minecraft.util.Util;
public enum Affinity implements StringIdentifiable {
GOOD(Formatting.BLUE, -1, 0), GOOD(Formatting.BLUE, -1, 0),
NEUTRAL(Formatting.LIGHT_PURPLE, 0, 0.5F), NEUTRAL(Formatting.LIGHT_PURPLE, 0, 0.5F),
BAD(Formatting.RED, 1, 1); BAD(Formatting.RED, 1, 1);
@SuppressWarnings("deprecation")
public static final EnumCodec<Affinity> CODEC = StringIdentifiable.createCodec(Affinity::values);
private final Formatting color; private final Formatting color;
private final int corruption; private final int corruption;
@ -14,10 +22,18 @@ public enum Affinity {
public static final Affinity[] VALUES = values(); public static final Affinity[] VALUES = values();
private final String translationKey;
Affinity(Formatting color, int corruption, float alignment) { Affinity(Formatting color, int corruption, float alignment) {
this.color = color; this.color = color;
this.corruption = corruption; this.corruption = corruption;
this.alignment = alignment; this.alignment = alignment;
this.translationKey = Util.createTranslationKey("affinity", Unicopia.id(name().toLowerCase(Locale.ROOT)));
}
@Override
public String asString() {
return name().toLowerCase(Locale.ROOT);
} }
public Formatting getColor() { public Formatting getColor() {
@ -25,7 +41,11 @@ public enum Affinity {
} }
public String getTranslationKey() { public String getTranslationKey() {
return this == BAD ? "curse" : "spell"; return translationKey;
}
public Text getDisplayName() {
return Text.translatable(getTranslationKey()).formatted(getColor());
} }
public int getCorruption() { public int getCorruption() {

View file

@ -0,0 +1,57 @@
package com.minelittlepony.unicopia;
import java.util.Set;
public class AllowList {
public static final AllowList INSTANCE = new AllowList();
public AllowList() {
}
public boolean disable() {
if (!isEnabled()) {
return false;
}
Unicopia.getConfig().speciesWhiteList.get().clear();
Unicopia.getConfig().save();
return true;
}
public boolean isEnabled() {
return !Unicopia.getConfig().speciesWhiteList.get().isEmpty();
}
public boolean add(Race race) {
if (race.isUnset() || race.isHuman()) {
return false;
}
Set<String> values = Unicopia.getConfig().speciesWhiteList.get();
boolean added = values.add(race.getId().toString());
Unicopia.getConfig().save();
return added;
}
public boolean remove(Race race) {
Set<String> values = Unicopia.getConfig().speciesWhiteList.get();
if (values.isEmpty()) {
for (Race r : Race.REGISTRY) {
if (!r.isUnset() && r != race) {
values.add(r.getId().toString());
}
}
Unicopia.getConfig().save();
return true;
}
boolean removed = values.remove(race.getId().toString());
Unicopia.getConfig().save();
return removed;
}
public boolean permits(Race race) {
return race.isUnset()
|| race.isHuman()
|| !isEnabled()
|| Unicopia.getConfig().speciesWhiteList.get().contains(race.getId().toString());
}
}

View file

@ -0,0 +1,29 @@
package com.minelittlepony.unicopia;
import java.util.Locale;
import net.minecraft.util.StringIdentifiable;
public enum Availability implements StringIdentifiable {
DEFAULT,
COMMANDS,
NONE;
@SuppressWarnings("deprecation")
public static final EnumCodec<Availability> CODEC = StringIdentifiable.createCodec(Availability::values);
private final String name = name().toLowerCase(Locale.ROOT);
@Override
public String asString() {
return name;
}
public boolean isSelectable() {
return this == DEFAULT;
}
public boolean isGrantable() {
return this != NONE;
}
}

View file

@ -15,9 +15,11 @@ public class Config extends com.minelittlepony.common.util.settings.Config {
.addComment("whilst any ones left off are not permitted") .addComment("whilst any ones left off are not permitted")
.addComment("An empty list disables whitelisting entirely."); .addComment("An empty list disables whitelisting entirely.");
@Deprecated
public final Setting<Set<String>> wantItNeedItEntityExcludelist = value("server", "wantItNeedItEntityExcludelist", (Set<String>)new HashSet<>(Set.of("minecraft:creeper"))) public final Setting<Set<String>> wantItNeedItEntityExcludelist = value("server", "wantItNeedItEntityExcludelist", (Set<String>)new HashSet<>(Set.of("minecraft:creeper")))
.addComment("A list of entity types that are immune to the want it need it spell's effects"); .addComment("A list of entity types that are immune to the want it need it spell's effects");
@Deprecated
public final Setting<Set<String>> dimensionsWithoutAtmosphere = value("server", "dimensionsWithoutAtmosphere", (Set<String>)new HashSet<String>()) public final Setting<Set<String>> dimensionsWithoutAtmosphere = value("server", "dimensionsWithoutAtmosphere", (Set<String>)new HashSet<String>())
.addComment("A list of dimensions ids that do not have an atmosphere, and thus shouldn't allow pegasi to fly."); .addComment("A list of dimensions ids that do not have an atmosphere, and thus shouldn't allow pegasi to fly.");
@ -34,6 +36,9 @@ public class Config extends com.minelittlepony.common.util.settings.Config {
.addComment("If true Mine Little Pony will not be considered when determining the race to use") .addComment("If true Mine Little Pony will not be considered when determining the race to use")
.addComment("The result will always be what is set by this config file."); .addComment("The result will always be what is set by this config file.");
public final Setting<Boolean> toggleAbilityKeys = value("client", "toggleAbilityKeys", false)
.addComment("If true the ability keybinds will function as toggle keys rather than hold keys");
public final Setting<Integer> hudPage = value("client", "hudActivePage", 0) public final Setting<Integer> hudPage = value("client", "hudActivePage", 0)
.addComment("The page of abilities currently visible in the HUD. You can change this in-game using the PG_UP and PG_DWN keys (configurable)"); .addComment("The page of abilities currently visible in the HUD. You can change this in-game using the PG_UP and PG_DWN keys (configurable)");
@ -45,9 +50,26 @@ public class Config extends com.minelittlepony.common.util.settings.Config {
.addComment("Removes butterflies from spawning in your world") .addComment("Removes butterflies from spawning in your world")
.addComment("Turn this ON if you have another mod that adds butterflies."); .addComment("Turn this ON if you have another mod that adds butterflies.");
public final Setting<Boolean> simplifiedPortals = value("compatibility", "simplifiedPortals", false)
.addComment("Disables dynamic portal rendering");
public final Setting<Boolean> disableShaders = value("compatibility", "disableShaders", false)
.addComment("Disables post-effect shaders used by the corruption mechanic");
public final Setting<Long> fancyPortalRefreshRate = value("client", "fancyPortalRefreshRate", -1L)
.addComment("Sets the refresh rate of portals when using fancy portal rendering")
.addComment("Set to -1 (default) for unlimited");
public final Setting<Integer> maxPortalRecursion = value("client", "maxPortalRecursion", 2)
.addComment("Sets the maximum depth to reach when rendering portals through portals");
public Config() { public Config() {
super(new HeirarchicalJsonConfigAdapter(new GsonBuilder() super(new HeirarchicalJsonConfigAdapter(new GsonBuilder()
.registerTypeAdapter(Race.class, RegistryTypeAdapter.of(Race.REGISTRY)) .registerTypeAdapter(Race.class, RegistryTypeAdapter.of(Race.REGISTRY))
), GamePaths.getConfigDirectory().resolve("unicopia.json")); ), GamePaths.getConfigDirectory().resolve("unicopia.json"));
} }
public SyncedConfig toSynced() {
return new SyncedConfig(wantItNeedItEntityExcludelist.get(), dimensionsWithoutAtmosphere.get());
}
} }

View file

@ -1,22 +1,36 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import com.google.common.collect.Sets;
import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
import com.minelittlepony.unicopia.entity.mob.AirBalloonEntity; import com.minelittlepony.unicopia.entity.mob.AirBalloonEntity;
import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.entity.mob.UEntities;
import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.entity.vehicle.BoatEntity;
import net.minecraft.registry.Registries;
import net.minecraft.registry.tag.TagKey;
import net.minecraft.util.Identifier;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.dimension.DimensionTypes;
public interface Debug { public interface Debug {
boolean SPELLBOOK_CHAPTERS = Boolean.getBoolean("unicopia.debug.spellbookChapters"); boolean SPELLBOOK_CHAPTERS = Boolean.getBoolean("unicopia.debug.spellbookChapters");
boolean CHECK_GAME_VALUES = Boolean.getBoolean("unicopia.debug.checkGameValues"); boolean CHECK_GAME_VALUES = Boolean.getBoolean("unicopia.debug.checkGameValues");
boolean CHECK_TRAIT_COVERAGE = Boolean.getBoolean("unicopia.debug.checkTraitCoverage");
boolean[] TESTS_COMPLETE = {false}; AtomicReference<World> LAST_TESTED_WORLD = new AtomicReference<>(null);
static void runTests(World world) { static void runTests(World world) {
if (!CHECK_GAME_VALUES || TESTS_COMPLETE[0]) { if (!CHECK_GAME_VALUES || !world.getDimensionKey().getValue().equals(DimensionTypes.OVERWORLD_ID) || (LAST_TESTED_WORLD.getAndSet(world) == world)) {
return; return;
} }
TESTS_COMPLETE[0] = true;
if (CHECK_TRAIT_COVERAGE) {
testTraitCoverage();
}
try { try {
for (var type : BoatEntity.Type.values()) { for (var type : BoatEntity.Type.values()) {
@ -28,4 +42,30 @@ public interface Debug {
throw new IllegalStateException("Tests failed", t); throw new IllegalStateException("Tests failed", t);
} }
} }
private static void testTraitCoverage() {
Registries.ITEM.getEntrySet().stream().collect(Collectors.toMap(
entry -> entry.getKey().getValue().getNamespace(),
Set::of,
Sets::union
)).forEach((namespace, entries) -> {
@SuppressWarnings("deprecation")
var unregistered = entries.stream()
.filter(entry -> !entry.getValue().getRegistryEntry().isIn(UTags.Items.HAS_NO_TRAITS) && SpellTraits.of(entry.getValue()).isEmpty())
.map(entry -> {
String id = entry.getKey().getValue().toString();
return id + "(" + Registries.ITEM.streamTags()
.filter(entry.getValue().getRegistryEntry()::isIn)
.map(TagKey::id)
.map(Identifier::toString)
.collect(Collectors.joining(", ")) + ")";
})
.toList();
if (!unregistered.isEmpty()) {
Unicopia.LOGGER.warn("No traits registered for {} items in namepsace {} {}", unregistered.size(), namespace, String.join(",\r\n", unregistered));
}
});
}
} }

View file

@ -25,7 +25,7 @@ public interface EntityConvertable<E extends Entity> extends WorldConvertable {
* Gets the center position where this caster is located. * Gets the center position where this caster is located.
*/ */
default Vec3d getOriginVector() { default Vec3d getOriginVector() {
return asEntity().getPos(); return asEntity().getPos().add(0, asEntity().getHeight() * 0.5F, 0);
} }
@Override @Override

View file

@ -0,0 +1,54 @@
package com.minelittlepony.unicopia;
import com.google.common.base.MoreObjects;
import com.minelittlepony.unicopia.entity.Equine;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.block.ShapeContext;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemUsageContext;
public interface EquineContext {
EquineContext ABSENT = () -> Race.UNSET;
Race getSpecies();
default Race.Composite getCompositeRace() {
return getSpecies().composite();
}
default float getCloudWalkingStrength() {
return 0;
}
default boolean collidesWithClouds() {
return getCompositeRace().canInteractWithClouds() || getCloudWalkingStrength() >= 1;
}
default boolean hasFeatherTouch() {
return false;
}
static EquineContext of(ShapeContext context) {
if (context == ShapeContext.absent()) {
return InteractionManager.getInstance().getEquineContext();
}
EquineContext result = context instanceof Container c ? c.get() : ABSENT;
return result == null ? ABSENT : result;
}
static EquineContext of(ItemUsageContext context) {
return MoreObjects.firstNonNull(Pony.of(context.getPlayer()), ABSENT);
}
static EquineContext of(Entity entity) {
if (entity instanceof EquineContext c) {
return c;
}
return MoreObjects.firstNonNull(Equine.of(entity).orElse(null), ABSENT);
}
interface Container {
EquineContext get();
}
}

View file

@ -3,6 +3,7 @@ package com.minelittlepony.unicopia;
import java.util.function.Predicate; import java.util.function.Predicate;
import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.entity.Equine; import com.minelittlepony.unicopia.entity.Equine;
import com.minelittlepony.unicopia.entity.MagicImmune; import com.minelittlepony.unicopia.entity.MagicImmune;
import com.minelittlepony.unicopia.item.enchantment.WantItNeedItEnchantment; import com.minelittlepony.unicopia.item.enchantment.WantItNeedItEnchantment;
@ -10,6 +11,8 @@ import com.minelittlepony.unicopia.item.enchantment.WantItNeedItEnchantment;
import net.minecraft.entity.*; import net.minecraft.entity.*;
import net.minecraft.entity.decoration.AbstractDecorationEntity; import net.minecraft.entity.decoration.AbstractDecorationEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.projectile.ProjectileEntity;
import net.minecraft.entity.vehicle.BoatEntity;
import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.predicate.entity.EntityPredicates;
public interface EquinePredicates { public interface EquinePredicates {
@ -17,19 +20,27 @@ public interface EquinePredicates {
Predicate<Entity> BAT = physicalRaceMatches(Race.BAT::equals); Predicate<Entity> BAT = physicalRaceMatches(Race.BAT::equals);
Predicate<Entity> CHANGELING = physicalRaceMatches(Race.CHANGELING::equals); Predicate<Entity> CHANGELING = physicalRaceMatches(Race.CHANGELING::equals);
Predicate<Entity> RACE_INTERACT_WITH_CLOUDS = raceMatches(Race::canInteractWithClouds); Predicate<Entity> RACE_CAN_INFLUENCE_WEATHER = raceMatches(Race::canInfluenceWeather);
Predicate<Entity> RAGING = IS_PLAYER.and(SpellType.RAGE::isOn);
Predicate<Entity> PLAYER_EARTH = IS_PLAYER.and(ofRace(Race.EARTH)); Predicate<Entity> PLAYER_EARTH = IS_PLAYER.and(ofRace(Race.EARTH));
Predicate<Entity> PLAYER_BAT = IS_PLAYER.and(BAT); Predicate<Entity> PLAYER_BAT = IS_PLAYER.and(BAT);
Predicate<Entity> PLAYER_UNICORN = IS_PLAYER.and(raceMatches(Race::canCast)); Predicate<Entity> PLAYER_UNICORN = IS_PLAYER.and(raceMatches(Race::canCast));
Predicate<Entity> PLAYER_CHANGELING = IS_PLAYER.and(ofRace(Race.CHANGELING)); Predicate<Entity> PLAYER_CHANGELING = IS_PLAYER.and(ofRace(Race.CHANGELING));
Predicate<Entity> PLAYER_PEGASUS = IS_PLAYER.and(e -> ((PlayerEntity)e).getAbilities().creativeMode || RACE_INTERACT_WITH_CLOUDS.test(e)); Predicate<Entity> PLAYER_KIRIN = IS_PLAYER.and(ofRace(Race.KIRIN));
Predicate<Entity> PLAYER_SEAPONY = IS_PLAYER.and(raceMatches(Race::isFish));
Predicate<Entity> PLAYER_CAN_USE_EARTH = IS_PLAYER.and(raceMatches(Race::canUseEarth)); Predicate<Entity> PLAYER_CAN_USE_EARTH = IS_PLAYER.and(raceMatches(Race::canUseEarth));
Predicate<Entity> IS_CASTER = e -> !e.isRemoved() && (e instanceof Caster || IS_PLAYER.test(e)); Predicate<Entity> IS_CASTER = e -> !e.isRemoved() && (e instanceof Caster || IS_PLAYER.test(e));
Predicate<Entity> IS_PLACED_SPELL = e -> e instanceof Caster && !e.isRemoved(); Predicate<Entity> IS_PLACED_SPELL = e -> e instanceof Caster && !e.isRemoved();
Predicate<Entity> IS_MAGIC_IMMUNE = e -> (e instanceof MagicImmune || !(e instanceof LivingEntity)) && !(e instanceof ItemEntity); Predicate<Entity> IS_MAGIC_IMMUNE = EntityPredicates.VALID_ENTITY.negate()
.or(EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR.negate()
.or(e -> (e instanceof MagicImmune || !(e instanceof LivingEntity))
&& !(e instanceof ItemEntity)
&& !(e instanceof ExperienceOrbEntity)
&& !(e instanceof BoatEntity)
&& !(e instanceof ProjectileEntity)));
Predicate<Entity> EXCEPT_MAGIC_IMMUNE = IS_MAGIC_IMMUNE.negate(); Predicate<Entity> EXCEPT_MAGIC_IMMUNE = IS_MAGIC_IMMUNE.negate();
Predicate<Entity> VALID_LIVING_AND_NOT_MAGIC_IMMUNE = EntityPredicates.VALID_LIVING_ENTITY.and(EXCEPT_MAGIC_IMMUNE); Predicate<Entity> VALID_LIVING_AND_NOT_MAGIC_IMMUNE = EntityPredicates.VALID_LIVING_ENTITY.and(EXCEPT_MAGIC_IMMUNE);

View file

@ -1,15 +1,28 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import java.util.Locale;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.util.StringIdentifiable;
public enum FlightType { public enum FlightType implements StringIdentifiable {
UNSET, UNSET,
NONE, NONE,
AVIAN, AVIAN,
INSECTOID, INSECTOID,
ARTIFICIAL; ARTIFICIAL;
@SuppressWarnings("deprecation")
public static final EnumCodec<FlightType> CODEC = StringIdentifiable.createCodec(FlightType::values);
private final String name = name().toLowerCase(Locale.ROOT);
@Override
public String asString() {
return name;
}
public boolean isGrounded() { public boolean isGrounded() {
return this == NONE; return this == NONE;
} }

View file

@ -2,21 +2,23 @@ package com.minelittlepony.unicopia;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Stack;
import java.util.UUID;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.ability.magic.CasterView; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.entity.player.dummy.DummyPlayerEntity; import com.minelittlepony.unicopia.entity.player.dummy.DummyPlayerEntity;
import com.minelittlepony.unicopia.server.world.Ether; import com.minelittlepony.unicopia.particle.ParticleSpawner;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.world.BlockView; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
public class InteractionManager { public class InteractionManager {
@ -27,20 +29,27 @@ public class InteractionManager {
public static final int SOUND_GLIDING = 4; public static final int SOUND_GLIDING = 4;
public static final int SOUND_MAGIC_BEAM = 5; public static final int SOUND_MAGIC_BEAM = 5;
public static final int SOUND_HEART_BEAT = 6; public static final int SOUND_HEART_BEAT = 6;
public static final int SOUND_KIRIN_RAGE = 7;
public static final int SCREEN_DISPELL_ABILITY = 0; public static final int SCREEN_DISPELL_ABILITY = 0;
public static InteractionManager INSTANCE = new InteractionManager(); private static InteractionManager INSTANCE = new InteractionManager();
public static InteractionManager instance() { @Nullable
private SyncedConfig config;
private final Stack<EquineContext> equineContext = new Stack<>();
public static InteractionManager getInstance() {
return INSTANCE; return INSTANCE;
} }
public Optional<CasterView> getCasterView(BlockView view) { public InteractionManager() {
if (view instanceof ServerWorld world) { INSTANCE = this;
return Optional.of(Ether.get(world));
} }
return Optional.empty();
public ParticleSpawner createBoundParticle(UUID id) {
return ParticleSpawner.EMPTY;
} }
public Map<Identifier, ?> readChapters(PacketByteBuf buf) { public Map<Identifier, ?> readChapters(PacketByteBuf buf) {
@ -91,4 +100,49 @@ public class InteractionManager {
public PlayerEntity createPlayer(World world, GameProfile profile) { public PlayerEntity createPlayer(World world, GameProfile profile) {
return new DummyPlayerEntity(world, profile); return new DummyPlayerEntity(world, profile);
} }
public void sendPlayerLookAngles(PlayerEntity player) {
}
public void addBlockBreakingParticles(BlockPos pos, Direction direction) {
}
public void setEquineContext(EquineContext context) {
equineContext.push(context);
}
public void clearEquineContext() {
if (!equineContext.isEmpty()) {
equineContext.pop();
}
}
public EquineContext getEquineContext() {
return getClientPony().map(EquineContext.class::cast).orElseGet(this::getPathingEquineContext);
}
public EquineContext getPathingEquineContext() {
return equineContext.isEmpty() ? EquineContext.ABSENT : equineContext.peek();
}
public Optional<Pony> getClientPony() {
return Optional.empty();
}
public final Race getClientSpecies() {
return getClientPony().map(Pony::getSpecies).orElse(Race.HUMAN);
}
public void setSyncedConfig(SyncedConfig config) {
this.config = config;
}
public SyncedConfig getSyncedConfig() {
if (config == null) {
config = Unicopia.getConfig().toSynced();
}
return config;
}
} }

View file

@ -5,6 +5,8 @@ import java.util.UUID;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.item.FriendshipBraceletItem;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
/** /**
@ -27,18 +29,31 @@ public interface Owned<E extends Entity> {
* Since {@link Owned#getMaster()} will only return if the owner is loaded, use this to perform checks * Since {@link Owned#getMaster()} will only return if the owner is loaded, use this to perform checks
* in the owner's absence. * in the owner's absence.
*/ */
default Optional<UUID> getMasterId() { Optional<UUID> getMasterId();
return Optional.of(getMaster()).map(Entity::getUuid);
default boolean isOwnerOrFriend(Entity target) {
return isFriend(target) || isOwnerOrVehicle(target);
}
default boolean isFriend(Entity target) {
return FriendshipBraceletItem.isComrade(this, target);
}
default boolean isOwnerOrVehicle(@Nullable Entity target) {
if (isOwnedBy(target)) {
return true;
}
Entity owner = getMaster();
return target != null && owner != null && owner.isConnectedThroughVehicle(target);
} }
default boolean isOwnedBy(@Nullable Object owner) { default boolean isOwnedBy(@Nullable Object owner) {
return owner instanceof Entity e return owner instanceof Entity e && e.getUuid().equals(getMasterId().orElse(null));
&& getMasterId().isPresent()
&& e.getUuid().equals(getMasterId().get());
} }
default boolean hasCommonOwner(Owned<?> sibling) { default boolean hasCommonOwner(Owned<?> sibling) {
return getMasterId().isPresent() && getMasterId().equals(sibling.getMasterId()); return getMasterId().equals(sibling.getMasterId());
} }
interface Mutable<E extends Entity> { interface Mutable<E extends Entity> {

View file

@ -1,77 +1,122 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.spongepowered.include.com.google.common.base.Objects;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.base.Suppliers; import com.minelittlepony.unicopia.ability.Abilities;
import com.minelittlepony.unicopia.ability.Ability;
import com.minelittlepony.unicopia.ability.magic.Affine; import com.minelittlepony.unicopia.ability.magic.Affine;
import com.minelittlepony.unicopia.network.track.TrackableDataType;
import com.minelittlepony.unicopia.util.RegistryUtils; import com.minelittlepony.unicopia.util.RegistryUtils;
import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.command.argument.RegistryKeyArgumentType; import net.minecraft.command.argument.RegistryKeyArgumentType;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
import net.minecraft.registry.Registry; import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKey;
public record Race (Supplier<Composite> compositeSupplier, boolean canCast, FlightType flightType, boolean canUseEarth, boolean isNocturnal, boolean canHang) implements Affine { public record Race (
List<Ability<?>> abilities,
Affinity affinity,
Availability availability,
FlightType flightType,
boolean canCast,
boolean hasIronGut,
boolean canUseEarth,
boolean isNocturnal,
boolean canHang,
boolean isFish,
boolean canInfluenceWeather,
boolean canInteractWithClouds
) implements Affine {
public static final String DEFAULT_ID = "unicopia:unset"; public static final String DEFAULT_ID = "unicopia:unset";
public static final Registry<Race> REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race"), DEFAULT_ID); public static final Registry<Race> REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race"), DEFAULT_ID);
public static final Registry<Race> COMMAND_REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race/grantable"), DEFAULT_ID);
public static final TrackableDataType<Race> TRACKABLE_TYPE = TrackableDataType.RACE;
public static final RegistryKey<? extends Registry<Race>> REGISTRY_KEY = REGISTRY.getKey(); public static final RegistryKey<? extends Registry<Race>> REGISTRY_KEY = REGISTRY.getKey();
private static final DynamicCommandExceptionType UNKNOWN_RACE_EXCEPTION = new DynamicCommandExceptionType(id -> Text.translatable("race.unknown", id)); private static final DynamicCommandExceptionType UNKNOWN_RACE_EXCEPTION = new DynamicCommandExceptionType(id -> Text.translatable("commands.race.fail", id));
private static final Function<Race, Composite> COMPOSITES = Util.memoize(race -> new Composite(race, null, null));
public static Race register(String name, boolean magic, FlightType flight, boolean earth, boolean nocturnal, boolean canHang) { public static final Codec<Race> CODEC = RecordCodecBuilder.create(i -> i.group(
return register(Unicopia.id(name), magic, flight, earth, nocturnal, canHang); Abilities.REGISTRY.getCodec().listOf().fieldOf("abilities").forGetter(Race::abilities),
} Affinity.CODEC.fieldOf("affinity").forGetter(Race::affinity),
Availability.CODEC.fieldOf("availability").forGetter(Race::availability),
public static Race register(Identifier id, boolean magic, FlightType flight, boolean earth, boolean nocturnal, boolean canHang) { FlightType.CODEC.fieldOf("flight").forGetter(Race::flightType),
return Registry.register(REGISTRY, id, new Race(Suppliers.memoize(() -> new Composite(REGISTRY.get(id), null)), magic, flight, earth, nocturnal, canHang)); Codec.BOOL.fieldOf("magic").forGetter(Race::canCast),
} Codec.BOOL.fieldOf("can_forage").forGetter(Race::hasIronGut),
Codec.BOOL.fieldOf("earth_pony_strength").forGetter(Race::canUseEarth),
public static RegistryKeyArgumentType<Race> argument() { Codec.BOOL.fieldOf("nocturnal").forGetter(Race::isNocturnal),
return RegistryKeyArgumentType.registryKey(REGISTRY_KEY); Codec.BOOL.fieldOf("hanging").forGetter(Race::canHang),
} Codec.BOOL.fieldOf("aquatic").forGetter(Race::isFish),
Codec.BOOL.fieldOf("weather_magic").forGetter(Race::canInfluenceWeather),
Codec.BOOL.fieldOf("cloud_magic").forGetter(Race::canInteractWithClouds)
).apply(i, Race::new));
/** /**
* The default, unset race. * The default, unset race.
* This is used if there are no other races. * This is used if there are no other races.
*/ */
public static final Race UNSET = register("unset", false, FlightType.NONE, false, false, false); public static final Race UNSET = register("unset", new Builder().availability(Availability.COMMANDS));
public static final Race HUMAN = register("human", false, FlightType.NONE, false, false, false); public static final Race HUMAN = register("human", new Builder());
public static final Race EARTH = register("earth", false, FlightType.NONE, true, false, false); public static final Race EARTH = register("earth", new Builder().foraging().earth()
public static final Race UNICORN = register("unicorn", true, FlightType.NONE, false, false, false); .abilities(Abilities.HUG, Abilities.STOMP, Abilities.KICK, Abilities.GROW)
public static final Race PEGASUS = register("pegasus", false, FlightType.AVIAN, false, false, false); );
public static final Race BAT = register("bat", false, FlightType.AVIAN, false, true, true); public static final Race UNICORN = register("unicorn", new Builder().foraging().magic()
public static final Race ALICORN = register("alicorn", true, FlightType.AVIAN, true, false, false); .abilities(Abilities.TELEPORT, Abilities.CAST, Abilities.GROUP_TELEPORT, Abilities.SHOOT, Abilities.DISPELL)
public static final Race CHANGELING = register("changeling", false, FlightType.INSECTOID, false, false, true); );
public static final Race PEGASUS = register("pegasus", new Builder().foraging().flight(FlightType.AVIAN).weatherMagic().cloudMagic()
.abilities(Abilities.TOGGLE_FLIGHT, Abilities.RAINBOOM, Abilities.CAPTURE_CLOUD, Abilities.CARRY)
);
public static final Race BAT = register("bat", new Builder().foraging().flight(FlightType.AVIAN).canHang().cloudMagic().nocturnal()
.abilities(Abilities.TOGGLE_FLIGHT, Abilities.CARRY, Abilities.HANG, Abilities.EEEE)
);
public static final Race ALICORN = register("alicorn", new Builder().foraging().availability(Availability.COMMANDS).flight(FlightType.AVIAN).earth().magic().weatherMagic().cloudMagic()
.abilities(
Abilities.TELEPORT, Abilities.GROUP_TELEPORT, Abilities.CAST, Abilities.SHOOT, Abilities.DISPELL,
Abilities.TOGGLE_FLIGHT, Abilities.RAINBOOM, Abilities.CAPTURE_CLOUD, Abilities.CARRY,
Abilities.HUG, Abilities.STOMP, Abilities.KICK, Abilities.GROW,
Abilities.TIME
)
);
public static final Race CHANGELING = register("changeling", new Builder().foraging().affinity(Affinity.BAD).flight(FlightType.INSECTOID).canHang()
.abilities(Abilities.DISPELL, Abilities.TOGGLE_FLIGHT, Abilities.FEED, Abilities.DISGUISE, Abilities.CARRY)
);
public static final Race KIRIN = register("kirin", new Builder().foraging().magic()
.abilities(Abilities.DISPELL, Abilities.RAGE, Abilities.NIRIK_BLAST, Abilities.KIRIN_CAST)
);
public static final Race HIPPOGRIFF = register("hippogriff", new Builder().foraging().flight(FlightType.AVIAN).cloudMagic()
.abilities(Abilities.TOGGLE_FLIGHT, Abilities.SCREECH, Abilities.PECK, Abilities.DASH, Abilities.CARRY)
);
public static final Race SEAPONY = register("seapony", new Builder().availability(Availability.COMMANDS).foraging().fish()
.abilities(Abilities.SONAR_PULSE)
);
public static void bootstrap() {} public static void bootstrap() {}
public Composite composite() { public Composite composite() {
return compositeSupplier.get(); return COMPOSITES.apply(this);
} }
public Composite composite(@Nullable Race pseudo) { public Composite composite(@Nullable Race pseudo, @Nullable Race potential) {
return pseudo == null ? composite() : new Composite(this, pseudo); return pseudo == null && potential == null ? composite() : new Composite(this, pseudo, potential);
} }
@Override @Override
public Affinity getAffinity() { public Affinity getAffinity() {
return this == CHANGELING ? Affinity.BAD : Affinity.NEUTRAL; return affinity;
}
public boolean hasIronGut() {
return !isHuman() && this != CHANGELING;
} }
public boolean isUnset() { public boolean isUnset() {
@ -83,23 +128,23 @@ public record Race (Supplier<Composite> compositeSupplier, boolean canCast, Flig
} }
public boolean isHuman() { public boolean isHuman() {
return this == UNSET || this == HUMAN; return isUnset() || this == HUMAN;
} }
public boolean isDayurnal() { public boolean isDayurnal() {
return !isNocturnal(); return !isNocturnal();
} }
public boolean isOp() {
return this == ALICORN;
}
public boolean canFly() { public boolean canFly() {
return !flightType().isGrounded(); return !flightType().isGrounded();
} }
public boolean canInteractWithClouds() { public boolean hasPersistentWeatherMagic() {
return canFly() && this != CHANGELING && this != BAT; return canInfluenceWeather();
}
public boolean canUse(Ability<?> ability) {
return abilities.contains(ability);
} }
public Identifier getId() { public Identifier getId() {
@ -115,43 +160,31 @@ public record Race (Supplier<Composite> compositeSupplier, boolean canCast, Flig
} }
public String getTranslationKey() { public String getTranslationKey() {
Identifier id = getId(); return Util.createTranslationKey("race", getId());
return String.format("%s.race.%s", id.getNamespace(), id.getPath().toLowerCase());
} }
public Identifier getIcon() { public Identifier getIcon() {
Identifier id = getId(); return getId().withPath(p -> "textures/gui/race/" + p + ".png");
return new Identifier(id.getNamespace(), "textures/gui/race/" + id.getPath() + ".png");
} }
public boolean isPermitted(@Nullable PlayerEntity sender) { public boolean isPermitted(@Nullable PlayerEntity sender) {
Set<String> whitelist = Unicopia.getConfig().speciesWhiteList.get(); return AllowList.INSTANCE.permits(this);
return isUnset()
|| whitelist.isEmpty()
|| whitelist.contains(getId().toString());
} }
public Race validate(PlayerEntity sender) { public Race validate(PlayerEntity sender) {
if (!isPermitted(sender)) { if (!isPermitted(sender)) {
if (this == EARTH) { Race alternative = this == EARTH ? HUMAN : EARTH.validate(sender);
return HUMAN; if (alternative != this && sender instanceof ServerPlayerEntity spe) {
spe.sendMessageToClient(Text.translatable("respawn.reason.illegal_race", getDisplayName()), false);
} }
return alternative;
return EARTH.validate(sender);
} }
return this; return this;
} }
@Override public Race or(Race other) {
public int hashCode() { return isEquine() ? this : other;
return getId().hashCode();
}
@Override
public boolean equals(Object o) {
return o instanceof Race race && Objects.equal(race.getId(), getId());
} }
@Override @Override
@ -178,20 +211,36 @@ public record Race (Supplier<Composite> compositeSupplier, boolean canCast, Flig
return def; return def;
} }
public static Race fromName(String name) { public static Race register(String name, Builder builder) {
return fromName(name, EARTH); return register(Unicopia.id(name), builder);
}
public static Race register(Identifier id, Builder builder) {
Race race = Registry.register(REGISTRY, id, builder.build());
if (race.availability().isGrantable()) {
Registry.register(COMMAND_REGISTRY, id, race);
}
return race;
}
public static RegistryKeyArgumentType<Race> argument() {
return RegistryKeyArgumentType.registryKey(COMMAND_REGISTRY.getKey());
} }
public static Race fromArgument(CommandContext<ServerCommandSource> context, String name) throws CommandSyntaxException { public static Race fromArgument(CommandContext<ServerCommandSource> context, String name) throws CommandSyntaxException {
Identifier id = context.getArgument(name, RegistryKey.class).getValue(); Identifier id = context.getArgument(name, RegistryKey.class).getValue();
return REGISTRY.getOrEmpty(id).orElseThrow(() -> UNKNOWN_RACE_EXCEPTION.create(id)); final Identifier idf = id;
if (id.getNamespace() == Identifier.DEFAULT_NAMESPACE && !REGISTRY.containsId(id)) {
id = new Identifier(REGISTRY_KEY.getValue().getNamespace(), id.getPath());
}
return REGISTRY.getOrEmpty(id).orElseThrow(() -> UNKNOWN_RACE_EXCEPTION.create(idf));
} }
public static Set<Race> allPermitted(PlayerEntity player) { public static Set<Race> allPermitted(PlayerEntity player) {
return REGISTRY.stream().filter(r -> r.isPermitted(player)).collect(Collectors.toSet()); return REGISTRY.stream().filter(r -> r.isPermitted(player)).collect(Collectors.toSet());
} }
public record Composite (Race physical, @Nullable Race pseudo) { public record Composite (Race physical, @Nullable Race pseudo, @Nullable Race potential) {
public Race collapsed() { public Race collapsed() {
return pseudo == null ? physical : pseudo; return pseudo == null ? physical : pseudo;
} }
@ -216,10 +265,108 @@ public record Race (Supplier<Composite> compositeSupplier, boolean canCast, Flig
return any(Race::canCast); return any(Race::canCast);
} }
public boolean canUse(Ability<?> ability) {
return any(r -> r.canUse(ability));
}
public boolean canInteractWithClouds() {
return any(Race::canInteractWithClouds);
}
public boolean canInfluenceWeather() {
return any(Race::canInfluenceWeather);
}
public boolean hasPersistentWeatherMagic() {
return any(Race::hasPersistentWeatherMagic);
}
public FlightType flightType() { public FlightType flightType() {
if (pseudo() == null) {
return physical().flightType();
}
return physical().flightType().or(pseudo().flightType()); return physical().flightType().or(pseudo().flightType());
} }
} }
public static final class Builder {
private final List<Ability<?>> abilities = new ArrayList<>();
private Affinity affinity = Affinity.NEUTRAL;
private Availability availability = Availability.DEFAULT;
private boolean canCast;
private boolean hasIronGut;
private FlightType flightType = FlightType.NONE;
private boolean canUseEarth;
private boolean isNocturnal;
private boolean canHang;
private boolean isFish;
private boolean canInfluenceWeather;
private boolean canInteractWithClouds;
public Builder abilities(Ability<?>...abilities) {
this.abilities.addAll(List.of(abilities));
return this;
}
public Builder foraging() {
hasIronGut = true;
return this;
}
public Builder affinity(Affinity affinity) {
this.affinity = affinity;
return this;
}
public Builder availability(Availability availability) {
this.availability = availability;
return this;
}
public Builder flight(FlightType flight) {
flightType = flight;
return this;
}
public Builder magic() {
canCast = true;
return this;
}
public Builder earth() {
canUseEarth = true;
return this;
}
public Builder nocturnal() {
isNocturnal = true;
return this;
}
public Builder canHang() {
canHang = true;
return this;
}
public Builder fish() {
isFish = true;
return this;
}
public Builder weatherMagic() {
canInfluenceWeather = true;
return this;
}
public Builder cloudMagic() {
canInteractWithClouds = true;
return this;
}
public Race build() {
return new Race(List.copyOf(abilities), affinity, availability, flightType, canCast, hasIronGut, canUseEarth, isNocturnal, canHang, isFish, canInfluenceWeather, canInteractWithClouds);
}
}
} }

View file

@ -0,0 +1,8 @@
package com.minelittlepony.unicopia;
import java.util.Set;
public record SyncedConfig (
Set<String> wantItNeedItExcludeList,
Set<String> dimensionsWithoutAtmosphere) {
}

View file

@ -0,0 +1,71 @@
package com.minelittlepony.unicopia;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.tag.TagKey;
import net.minecraft.util.Identifier;
public interface UConventionalTags {
interface Blocks {
TagKey<Block> CONCRETE_POWDERS = block("concrete_powders");
TagKey<Block> CONCRETES = block("concretes");
TagKey<Block> GLAZED_TERRACOTTAS = block("glazed_terracottas");
TagKey<Block> CORAL_BLOCKS = block("coral_blocks");
TagKey<Block> CORAL_FANS = block("coral_fans");
TagKey<Block> CORALS = block("corals");
private static TagKey<Block> block(String name) {
return TagKey.of(RegistryKeys.BLOCK, new Identifier("c", name));
}
}
interface Items {
TagKey<Item> CONCRETE_POWDERS = item("concrete_powders");
TagKey<Item> CONCRETES = item("concretes");
TagKey<Item> GLAZED_TERRACOTTAS = item("glazed_terracottas");
TagKey<Item> CORAL_BLOCKS = item("coral_blocks");
TagKey<Item> CORAL_FANS = item("coral_fans");
TagKey<Item> CORALS = item("corals");
TagKey<Item> APPLES = item("apples");
TagKey<Item> ACORNS = item("acorns");
TagKey<Item> PINECONES = item("pinecones");
TagKey<Item> PINEAPPLES = item("pineapples");
TagKey<Item> BANANAS = item("bananas");
TagKey<Item> STICKS = item("sticks");
TagKey<Item> SEEDS = item("seeds");
TagKey<Item> GRAIN = item("grain");
TagKey<Item> NUTS = item("nuts");
TagKey<Item> MUSHROOMS = item("mushrooms");
TagKey<Item> MUFFINS = item("muffins");
TagKey<Item> MANGOES = item("mangoes");
TagKey<Item> OATMEALS = item("oatmeals");
TagKey<Item> COOKIES = item("cookies");
TagKey<Item> FRUITS = item("fruits");
TagKey<Item> WORMS = item("worms");
TagKey<Item> ROCKS = item("rocks");
TagKey<Item> GEMS = item("gems");
TagKey<Item> RAW_INSECT = item("raw_insect");
TagKey<Item> COOKED_INSECT = item("cooked_insect");
TagKey<Item> ROTTEN_INSECT = item("rotten_insect");
TagKey<Item> RAW_FISH = item("raw_fish");
TagKey<Item> COOKED_FISH = item("cooked_fish");
TagKey<Item> ROTTEN_FISH = item("rotten_fish");
TagKey<Item> RAW_MEAT = item("raw_meat");
TagKey<Item> COOKED_MEAT = item("cooked_meat");
TagKey<Item> ROTTEN_MEAT = item("rotten_meat");
TagKey<Item> DESSERTS = item("desserts");
TagKey<Item> CANDY = item("candy");
TagKey<Item> CROPS_PEANUTS = item("crops/peanuts");
TagKey<Item> TOOL_KNIVES = item("tools/knives");
private static TagKey<Item> item(String name) {
return TagKey.of(RegistryKeys.ITEM, new Identifier("c", name));
}
}
}

View file

@ -11,7 +11,7 @@ public interface UGameEvents {
static GameEvent register(String name, int range) { static GameEvent register(String name, int range) {
Identifier id = Unicopia.id(name); Identifier id = Unicopia.id(name);
return Registry.register(Registries.GAME_EVENT, id, new GameEvent(id.toString(), range)); return Registry.register(Registries.GAME_EVENT, id, new GameEvent(range));
} }
static void bootstrap() { static void bootstrap() {

View file

@ -0,0 +1,78 @@
package com.minelittlepony.unicopia;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.minelittlepony.unicopia.mixin.MixinPointOfInterestType;
import com.minelittlepony.unicopia.mixin.PointOfInterestTypesAccessor;
import net.fabricmc.fabric.api.event.registry.DynamicRegistrySetupCallback;
import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback;
import net.fabricmc.fabric.api.object.builder.v1.world.poi.PointOfInterestHelper;
import net.minecraft.block.AbstractChestBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.ChestBlock;
import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryKey;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.util.Identifier;
import net.minecraft.world.poi.PointOfInterestType;
import net.minecraft.world.poi.PointOfInterestTypes;
public interface UPOIs {
Set<RegistryKey<PointOfInterestType>> CHEST_POINTS_OF_INTEREST = new HashSet<>();
RegistryKey<PointOfInterestType> CHESTS = register(Unicopia.id("chests"), 1, 64, () -> {
return Registries.BLOCK.getEntrySet().stream()
.map(entry -> entry.getValue())
.filter(b -> b instanceof AbstractChestBlock)
.flatMap(block -> {
List<BlockState> states = block.getStateManager().getStates();
List<RegistryKey<PointOfInterestType>> existingTypes = states.stream()
.flatMap(state -> PointOfInterestTypes.getTypeForState(state).stream())
.flatMap(entry -> entry.getKey().stream())
.toList();
if (!existingTypes.isEmpty()) {
CHEST_POINTS_OF_INTEREST.addAll(existingTypes);
return Stream.empty();
}
return states.stream();
})
.distinct();
});
static RegistryKey<PointOfInterestType> register(Identifier id, int ticketCount, int searchDistance, Supplier<Stream<BlockState>> states) {
PointOfInterestType type = PointOfInterestHelper.register(id, ticketCount, searchDistance, List.of());
((MixinPointOfInterestType)(Object)type).setStates(new HashSet<>());
DynamicRegistrySetupCallback.EVENT.register(registries -> {
if (type.blockStates().isEmpty()) {
type.blockStates().addAll(states.get().collect(Collectors.toSet()));
PointOfInterestTypesAccessor.registerStates(Registries.POINT_OF_INTEREST_TYPE.entryOf(CHESTS), type.blockStates());
}
});
return RegistryKey.of(RegistryKeys.POINT_OF_INTEREST_TYPE, id);
}
static boolean isChest(RegistryEntry<PointOfInterestType> type) {
return type.getKey().filter(CHEST_POINTS_OF_INTEREST::contains).isPresent();
}
static void bootstrap() {
CHEST_POINTS_OF_INTEREST.add(CHESTS);
Registries.POINT_OF_INTEREST_TYPE.getEntrySet().forEach(poi -> {
if (poi.getValue().blockStates().stream().anyMatch(state -> state.getBlock() instanceof ChestBlock)) {
CHEST_POINTS_OF_INTEREST.add(poi.getKey());
}
});
RegistryEntryAddedCallback.event(Registries.POINT_OF_INTEREST_TYPE).register((raw, key, value) -> {
if (value.blockStates().stream().anyMatch(state -> state.getBlock() instanceof ChestBlock)) {
CHEST_POINTS_OF_INTEREST.add(RegistryKey.of(RegistryKeys.POINT_OF_INTEREST_TYPE, key));
}
});
}
}

View file

@ -12,8 +12,10 @@ import static net.minecraft.sound.SoundEvents.*;
public interface USounds { public interface USounds {
SoundEvent ENTITY_GENERIC_BUTTER_FINGERS = BLOCK_HONEY_BLOCK_SLIDE; SoundEvent ENTITY_GENERIC_BUTTER_FINGERS = BLOCK_HONEY_BLOCK_SLIDE;
SoundEvent ENTITY_PLAYER_CORRUPTION = PARTICLE_SOUL_ESCAPE; SoundEvent ENTITY_PLAYER_CORRUPTION = register("entity.player.corrupt");
SoundEvent ENTITY_PLAYER_BATPONY_SCREECH = register("entity.player.batpony.screech"); SoundEvent ENTITY_PLAYER_BATPONY_SCREECH = register("entity.player.batpony.screech");
SoundEvent ENTITY_PLAYER_HIPPOGRIFF_SCREECH = register("entity.player.hippogriff.screech");
SoundEvent ENTITY_PLAYER_HIPPOGRIFF_PECK = ENTITY_CHICKEN_STEP;
SoundEvent ENTITY_PLAYER_REBOUND = register("entity.player.rebound"); SoundEvent ENTITY_PLAYER_REBOUND = register("entity.player.rebound");
SoundEvent ENTITY_PLAYER_PEGASUS_WINGSFLAP = register("entity.player.pegasus.wingsflap"); SoundEvent ENTITY_PLAYER_PEGASUS_WINGSFLAP = register("entity.player.pegasus.wingsflap");
SoundEvent ENTITY_PLAYER_PEGASUS_FLYING = register("entity.player.pegasus.flying"); SoundEvent ENTITY_PLAYER_PEGASUS_FLYING = register("entity.player.pegasus.flying");
@ -25,9 +27,13 @@ public interface USounds {
SoundEvent ENTITY_PLAYER_CHANGELING_FEED = ENTITY_GENERIC_DRINK; SoundEvent ENTITY_PLAYER_CHANGELING_FEED = ENTITY_GENERIC_DRINK;
SoundEvent ENTITY_PLAYER_CHANGELING_CLIMB = ENTITY_CHICKEN_STEP; SoundEvent ENTITY_PLAYER_CHANGELING_CLIMB = ENTITY_CHICKEN_STEP;
SoundEvent ENTITY_PLAYER_UNICORN_TELEPORT = register("entity.player.unicorn.teleport"); SoundEvent ENTITY_PLAYER_UNICORN_TELEPORT = register("entity.player.unicorn.teleport");
SoundEvent ENTITY_PLAYER_KIRIN_RAGE = ENTITY_POLAR_BEAR_WARNING;
SoundEvent ENTITY_PLAYER_KIRIN_RAGE_LOOP = register("entity.player.kirin.rage.loop");
SoundEvent ENTITY_PLAYER_SEAPONY_SONAR = register("entity.player.seapony.sonar", 64);
SoundEvent ENTITY_PLAYER_EARS_RINGING = register("entity.player.ears_ring"); SoundEvent ENTITY_PLAYER_EARS_RINGING = register("entity.player.ears_ring");
SoundEvent ENTITY_PLAYER_HEARTBEAT = register("entity.player.heartbeat"); SoundEvent ENTITY_PLAYER_HEARTBEAT = register("entity.player.heartbeat");
SoundEvent ENTITY_PLAYER_HEARTBEAT_LOOP = register("entity.player.heartbeat_loop");
SoundEvent ENTITY_PLAYER_WOLOLO = register("entity.player.wololo"); SoundEvent ENTITY_PLAYER_WOLOLO = register("entity.player.wololo");
SoundEvent ENTITY_PLAYER_WHISTLE = register("entity.player.whistle"); SoundEvent ENTITY_PLAYER_WHISTLE = register("entity.player.whistle");
@ -56,11 +62,18 @@ public interface USounds {
SoundEvent ENTITY_SOMBRA_AMBIENT = register("entity.sombra.ambient"); SoundEvent ENTITY_SOMBRA_AMBIENT = register("entity.sombra.ambient");
SoundEvent ENTITY_SOMBRA_LAUGH = register("entity.sombra.laugh"); SoundEvent ENTITY_SOMBRA_LAUGH = register("entity.sombra.laugh");
SoundEvent ENTITY_SOMBRA_SNICKER = register("entity.sombra.snicker"); SoundEvent ENTITY_SOMBRA_SNICKER = register("entity.sombra.snicker");
SoundEvent ENTITY_SOMBRA_SCARY = USounds.Vanilla.ENTITY_GHAST_AMBIENT; SoundEvent ENTITY_SOMBRA_SCARY = ENTITY_GHAST_AMBIENT;
SoundEvent ENTITY_CRYSTAL_SHARDS_AMBIENT = BLOCK_AMETHYST_BLOCK_HIT; SoundEvent ENTITY_CRYSTAL_SHARDS_AMBIENT = BLOCK_AMETHYST_BLOCK_HIT;
SoundEvent ENTITY_CRYSTAL_SHARDS_JOSTLE = BLOCK_AMETHYST_BLOCK_BREAK; SoundEvent ENTITY_CRYSTAL_SHARDS_JOSTLE = BLOCK_AMETHYST_BLOCK_BREAK;
SoundEvent ENTITY_IGNIMEOUS_BULB_HURT = ENTITY_WARDEN_HURT;
SoundEvent ENTITY_IGNIMEOUS_BULB_DEATH = ENTITY_WARDEN_DEATH;
SoundEvent ENTITY_TENTACLE_ROAR = ENTITY_RAVAGER_ROAR;
SoundEvent ENTITY_TENTACLE_AMBIENT = BLOCK_CONDUIT_AMBIENT_SHORT;
SoundEvent ENTITY_TENTACLE_DIG = ENTITY_WARDEN_DIG;
SoundEvent ITEM_AMULET_CHARGING = register("item.amulet.charging"); SoundEvent ITEM_AMULET_CHARGING = register("item.amulet.charging");
SoundEvent ITEM_AMULET_RECHARGE = register("item.amulet.recharge"); SoundEvent ITEM_AMULET_RECHARGE = register("item.amulet.recharge");
@ -84,6 +97,8 @@ public interface USounds {
SoundEvent ITEM_STAFF_STRIKE = ENTITY_PLAYER_ATTACK_CRIT; SoundEvent ITEM_STAFF_STRIKE = ENTITY_PLAYER_ATTACK_CRIT;
SoundEvent ITEM_MAGIC_STAFF_CHARGE = ENTITY_GUARDIAN_ATTACK; SoundEvent ITEM_MAGIC_STAFF_CHARGE = ENTITY_GUARDIAN_ATTACK;
SoundEvent ITEM_CURING_JOKE_CURE = BLOCK_AMETHYST_BLOCK_BREAK;
SoundEvent ITEM_ROCK_LAND = BLOCK_STONE_HIT; SoundEvent ITEM_ROCK_LAND = BLOCK_STONE_HIT;
RegistryEntry.Reference<SoundEvent> ITEM_MUFFIN_BOUNCE = BLOCK_NOTE_BLOCK_BANJO; RegistryEntry.Reference<SoundEvent> ITEM_MUFFIN_BOUNCE = BLOCK_NOTE_BLOCK_BANJO;
@ -93,6 +108,9 @@ public interface USounds {
SoundEvent ITEM_BRACELET_SIGN = register("item.bracelet.sign"); SoundEvent ITEM_BRACELET_SIGN = register("item.bracelet.sign");
SoundEvent ITEM_MAGIC_AURA = register("item.magic.aura"); SoundEvent ITEM_MAGIC_AURA = register("item.magic.aura");
SoundEvent BLOCK_CHITIN_AMBIENCE = register("block.chitin.ambience");
SoundEvent BLOCK_SLIME_PUSTULE_POP = register("block.slime_pustule.pop");
SoundEvent BLOCK_WEATHER_VANE_ROTATE = BLOCK_LANTERN_STEP; SoundEvent BLOCK_WEATHER_VANE_ROTATE = BLOCK_LANTERN_STEP;
SoundEvent BLOCK_PIE_SLICE = BLOCK_BEEHIVE_SHEAR; SoundEvent BLOCK_PIE_SLICE = BLOCK_BEEHIVE_SHEAR;
SoundEvent BLOCK_PIE_SLICE_POP = ENTITY_ITEM_PICKUP; SoundEvent BLOCK_PIE_SLICE_POP = ENTITY_ITEM_PICKUP;
@ -140,6 +158,11 @@ public interface USounds {
return Registry.register(Registries.SOUND_EVENT, id, SoundEvent.of(id)); return Registry.register(Registries.SOUND_EVENT, id, SoundEvent.of(id));
} }
static SoundEvent register(String name, float range) {
Identifier id = Unicopia.id(name);
return Registry.register(Registries.SOUND_EVENT, id, SoundEvent.of(id, range));
}
static void bootstrap() {} static void bootstrap() {}
static final class Vanilla extends SoundEvents {} static final class Vanilla extends SoundEvents {}

View file

@ -1,7 +1,5 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import com.minelittlepony.unicopia.item.toxin.Toxics;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.damage.DamageType; import net.minecraft.entity.damage.DamageType;
@ -13,7 +11,16 @@ import net.minecraft.util.Identifier;
import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.dimension.DimensionType;
public interface UTags { public interface UTags {
TagKey<Item> APPLES = item("apples"); interface Items {
TagKey<Item> ZAP_LOGS = item("zap_logs");
TagKey<Item> WAXED_ZAP_LOGS = item("waxed_zap_logs");
TagKey<Item> PALM_LOGS = item("palm_logs");
TagKey<Item> CLOUD_BEDS = item("cloud_beds");
TagKey<Item> CLOUD_SLABS = item("cloud_slabs");
TagKey<Item> CLOUD_STAIRS = item("cloud_stairs");
TagKey<Item> CLOUD_BLOCKS = item("cloud_blocks");
TagKey<Item> CHITIN_BLOCKS = item("chitin_blocks");
TagKey<Item> FRESH_APPLES = item("fresh_apples"); TagKey<Item> FRESH_APPLES = item("fresh_apples");
TagKey<Item> FALLS_SLOWLY = item("falls_slowly"); TagKey<Item> FALLS_SLOWLY = item("falls_slowly");
@ -23,61 +30,122 @@ public interface UTags {
TagKey<Item> MAGIC_FEATHERS = item("magic_feathers"); TagKey<Item> MAGIC_FEATHERS = item("magic_feathers");
TagKey<Item> SHADES = item("shades"); TagKey<Item> SHADES = item("shades");
TagKey<Item> CHANGELING_EDIBLE = item("food_types/changeling_edible");
TagKey<Item> SPOOKED_MOB_DROPS = item("spooked_mob_drops"); TagKey<Item> SPOOKED_MOB_DROPS = item("spooked_mob_drops");
TagKey<Item> HAS_NO_TRAITS = item("has_no_traits");
TagKey<Item> IS_DELIVERED_AGGRESSIVELY = item("is_delivered_aggressively"); TagKey<Item> IS_DELIVERED_AGGRESSIVELY = item("is_delivered_aggressively");
TagKey<Item> CONTAINER_WITH_LOVE = item("container_with_love");
TagKey<Item> FLOATS_ON_CLOUDS = item("floats_on_clouds");
TagKey<Item> COOLS_OFF_KIRINS = item("cools_off_kirins");
TagKey<Item> LOOT_BUG_COMMON_DROPS = item("loot_bug_common_drops");
TagKey<Item> LOOT_BUG_RARE_DROPS = item("loot_bug_rare_drops");
TagKey<Item> LOOT_BUG_EPIC_DROPS = item("loot_bug_epic_drops");
TagKey<Item> SHELLS = item("shells");
TagKey<Item> SPECIAL_SHELLS = item("special_shells");
TagKey<Item> ROCK_STEWS = item("rock_stews");
TagKey<Item> BAKED_GOODS = item("baked_goods");
TagKey<Item> HIGH_QUALITY_SEA_VEGETABLES = item("food_types/high_quality_sea_vegetables");
TagKey<Item> LOW_QUALITY_SEA_VEGETABLES = item("food_types/low_quality_sea_vegetables");
TagKey<Item> POLEARMS = item("polearms"); TagKey<Item> POLEARMS = item("polearms");
TagKey<Item> HORSE_SHOES = item("horse_shoes");
TagKey<Item> APPLE_SEEDS = item("apple_seeds"); TagKey<Item> APPLE_SEEDS = item("apple_seeds");
TagKey<Item> ACORNS = item("acorns");
TagKey<Item> BASKETS = item("baskets"); TagKey<Item> BASKETS = item("baskets");
TagKey<Item> BADGES = item("badges");
TagKey<Item> WOOL_BED_SHEETS = item("wool_bed_sheets");
TagKey<Item> BED_SHEETS = item("bed_sheets");
TagKey<Item> CLOUD_JARS = item("cloud_jars");
TagKey<Item> GROUP_FORAGING = item("groups/foraging");
TagKey<Item> GROUP_EARTH_PONY = item("groups/earth_pony");
TagKey<Item> GROUP_UNICORN = item("groups/unicorn");
TagKey<Item> GROUP_PEGASUS = item("groups/pegasus");
TagKey<Item> GROUP_BAT_PONY = item("groups/bat_pony");
TagKey<Item> GROUP_SEA_PONY = item("groups/sea_pony");
TagKey<Item> GROUP_CHANGELING = item("groups/changeling");
TagKey<Item> FORAGE_BLINDING = item("forage/blinding");
TagKey<Item> FORAGE_DANGEROUS = item("forage/dangerous");
TagKey<Item> FORAGE_FILLING = item("forage/filling");
TagKey<Item> FORAGE_SAFE = item("forage/safe");
TagKey<Item> FORAGE_NAUSEATING = item("forage/nauseating");
TagKey<Item> FORAGE_PRICKLY = item("forage/prickly");
TagKey<Item> FORAGE_GLOWING = item("forage/glowing");
TagKey<Item> FORAGE_RISKY = item("forage/risky");
TagKey<Item> FORAGE_STRENGHENING = item("forage/strenghtening");
TagKey<Item> FORAGE_SEVERE_NAUSEATING = item("forage/severe/nauseating");
TagKey<Item> FORAGE_SEVERE_PRICKLY = item("forage/severe/prickly");
private static TagKey<Item> item(String name) {
return TagKey.of(RegistryKeys.ITEM, Unicopia.id(name));
}
}
interface Blocks {
TagKey<Block> ZAP_LOGS = block("zap_logs");
TagKey<Block> WAXED_ZAP_LOGS = block("waxed_zap_logs");
TagKey<Block> PALM_LOGS = block("palm_logs");
TagKey<Block> CLOUD_BEDS = block("cloud_beds");
TagKey<Block> CLOUD_SLABS = block("cloud_slabs");
TagKey<Block> CLOUD_STAIRS = block("cloud_stairs");
TagKey<Block> CLOUD_BLOCKS = block("cloud_blocks");
TagKey<Block> CHITIN_BLOCKS = block("chitin_blocks");
TagKey<Block> GLASS_PANES = block("glass_panes");
TagKey<Block> GLASS_BLOCKS = block("glass_blocks");
TagKey<Block> FRAGILE = block("fragile"); TagKey<Block> FRAGILE = block("fragile");
TagKey<Block> INTERESTING = block("interesting"); TagKey<Block> INTERESTING = block("interesting");
TagKey<Block> CATAPULT_IMMUNE = block("catapult_immune"); TagKey<Block> CATAPULT_IMMUNE = block("catapult_immune");
TagKey<Block> JARS = block("jars");
TagKey<Block> CRYSTAL_HEART_BASE = block("crystal_heart_base"); TagKey<Block> CRYSTAL_HEART_BASE = block("crystal_heart_base");
TagKey<Block> CRYSTAL_HEART_ORNAMENT = block("crystal_heart_ornament"); TagKey<Block> CRYSTAL_HEART_ORNAMENT = block("crystal_heart_ornament");
TagKey<Block> UNAFFECTED_BY_GROW_ABILITY = block("unaffected_by_grow_ability");
TagKey<Block> KICKS_UP_DUST = block("kicks_up_dust");
TagKey<Block> POLEARM_MINEABLE = block("mineable/polearm"); TagKey<Block> POLEARM_MINEABLE = block("mineable/polearm");
TagKey<Block> MIMIC_CHESTS = block("mimic_chests");
TagKey<EntityType<?>> TRANSFORMABLE_ENTITIES = entity("transformable"); TagKey<Block> BUTTERFLIES_SPAWNABLE_ON = block("butterflies_spawn_on");
TagKey<Block> ANGERS_GUARDIANS = block("angers_guardians");
TagKey<StatusEffect> PINEAPPLE_EFFECTS = effect("pineapple_effects"); private static TagKey<Block> block(String name) {
TagKey<DamageType> BREAKS_SUNGLASSES = damage("breaks_sunglasses");
TagKey<DamageType> SPELLBOOK_IMMUNE_TO = damage("spellbook_immune_to");
TagKey<DimensionType> HAS_NO_ATMOSPHERE = dimension("has_no_atmosphere");
static TagKey<Item> item(String name) {
return TagKey.of(RegistryKeys.ITEM, Unicopia.id(name));
}
static TagKey<Block> block(String name) {
return TagKey.of(RegistryKeys.BLOCK, Unicopia.id(name)); return TagKey.of(RegistryKeys.BLOCK, Unicopia.id(name));
} }
}
static TagKey<EntityType<?>> entity(String name) { interface Entities {
TagKey<EntityType<?>> TRANSFORMABLE = entity("transformable");
private static TagKey<EntityType<?>> entity(String name) {
return TagKey.of(RegistryKeys.ENTITY_TYPE, Unicopia.id(name)); return TagKey.of(RegistryKeys.ENTITY_TYPE, Unicopia.id(name));
} }
static TagKey<StatusEffect> effect(String name) {
return TagKey.of(RegistryKeys.STATUS_EFFECT, Unicopia.id(name));
} }
static TagKey<DamageType> damage(String name) { interface DamageTypes {
TagKey<DamageType> BREAKS_SUNGLASSES = damage("breaks_sunglasses");
TagKey<DamageType> SPELLBOOK_IMMUNE_TO = damage("spellbook_immune_to");
TagKey<DamageType> FROM_ROCKS = damage("from_rocks");
TagKey<DamageType> FROM_HORSESHOES = damage("from_horseshoes");
private static TagKey<DamageType> damage(String name) {
return TagKey.of(RegistryKeys.DAMAGE_TYPE, Unicopia.id(name)); return TagKey.of(RegistryKeys.DAMAGE_TYPE, Unicopia.id(name));
} }
}
static TagKey<DimensionType> dimension(String name) { interface DimensionTypes {
TagKey<DimensionType> HAS_NO_ATMOSPHERE = dimension("has_no_atmosphere");
private static TagKey<DimensionType> dimension(String name) {
return TagKey.of(RegistryKeys.DIMENSION_TYPE, new Identifier("c", name)); return TagKey.of(RegistryKeys.DIMENSION_TYPE, new Identifier("c", name));
} }
}
static void bootstrap() { interface StatusEffects {
Toxics.bootstrap(); TagKey<StatusEffect> PINEAPPLE_EFFECTS = effect("pineapple_effects");
private static TagKey<StatusEffect> effect(String name) {
return TagKey.of(RegistryKeys.STATUS_EFFECT, Unicopia.id(name));
}
} }
} }

View file

@ -2,15 +2,13 @@ package com.minelittlepony.unicopia;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents;
import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
import net.minecraft.resource.ResourceType; import net.minecraft.resource.ResourceType;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import java.util.Optional;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.ability.Abilities;
import com.minelittlepony.unicopia.ability.data.tree.TreeTypeLoader; import com.minelittlepony.unicopia.ability.data.tree.TreeTypeLoader;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
@ -22,15 +20,18 @@ import com.minelittlepony.unicopia.command.Commands;
import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate;
import com.minelittlepony.unicopia.container.SpellbookChapterLoader; import com.minelittlepony.unicopia.container.SpellbookChapterLoader;
import com.minelittlepony.unicopia.container.UScreenHandlers; import com.minelittlepony.unicopia.container.UScreenHandlers;
import com.minelittlepony.unicopia.diet.DietsLoader;
import com.minelittlepony.unicopia.diet.affliction.AfflictionType;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import com.minelittlepony.unicopia.entity.effect.SeaponyGraceStatusEffect;
import com.minelittlepony.unicopia.entity.effect.UPotions; import com.minelittlepony.unicopia.entity.effect.UPotions;
import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.entity.mob.UEntities;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.UItems;
import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
import com.minelittlepony.unicopia.network.Channel; import com.minelittlepony.unicopia.network.Channel;
import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.particle.UParticles;
import com.minelittlepony.unicopia.server.world.BlockDestructionManager; import com.minelittlepony.unicopia.server.world.BlockDestructionManager;
import com.minelittlepony.unicopia.server.world.Ether;
import com.minelittlepony.unicopia.server.world.NocturnalSleepManager; import com.minelittlepony.unicopia.server.world.NocturnalSleepManager;
import com.minelittlepony.unicopia.server.world.UGameRules; import com.minelittlepony.unicopia.server.world.UGameRules;
import com.minelittlepony.unicopia.server.world.UWorldGen; import com.minelittlepony.unicopia.server.world.UWorldGen;
@ -41,8 +42,6 @@ public class Unicopia implements ModInitializer {
public static final String DEFAULT_NAMESPACE = "unicopia"; public static final String DEFAULT_NAMESPACE = "unicopia";
public static final Logger LOGGER = LogManager.getLogger(); public static final Logger LOGGER = LogManager.getLogger();
public static SidedAccess SIDE = Optional::empty;
private static Config CONFIG; private static Config CONFIG;
public static Config getConfig() { public static Config getConfig() {
@ -64,16 +63,16 @@ public class Unicopia implements ModInitializer {
@Override @Override
public void onInitialize() { public void onInitialize() {
Channel.bootstrap(); Channel.bootstrap();
UTags.bootstrap();
UCriteria.bootstrap(); UCriteria.bootstrap();
UEntities.bootstrap(); UEntities.bootstrap();
Commands.bootstrap(); Commands.bootstrap();
TrinketsDelegate.getInstance().bootstrap(); TrinketsDelegate.getInstance(null).bootstrap();
ServerTickEvents.END_WORLD_TICK.register(w -> { ServerTickEvents.END_WORLD_TICK.register(w -> {
((BlockDestructionManager.Source)w).getDestructionManager().tick(); ((BlockDestructionManager.Source)w).getDestructionManager().tick();
ZapAppleStageStore.get(w).tick(); ZapAppleStageStore.get(w).tick();
WeatherConditions.get(w).tick(); WeatherConditions.get(w).tick();
Ether.get(w).tick();
if (Debug.SPELLBOOK_CHAPTERS) { if (Debug.SPELLBOOK_CHAPTERS) {
SpellbookChapterLoader.INSTANCE.sendUpdate(w.getServer()); SpellbookChapterLoader.INSTANCE.sendUpdate(w.getServer());
} }
@ -81,22 +80,21 @@ public class Unicopia implements ModInitializer {
Debug.runTests(w); Debug.runTests(w);
} }
}); });
PlayerBlockBreakEvents.AFTER.register(SeaponyGraceStatusEffect::processBlockChange);
NocturnalSleepManager.bootstrap(); NocturnalSleepManager.bootstrap();
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(TreeTypeLoader.INSTANCE); registerServerDataReloaders(ResourceManagerHelper.get(ResourceType.SERVER_DATA));
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(UEnchantments.POISONED_JOKE);
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(new TraitLoader());
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(StateMapLoader.INSTANCE);
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(SpellbookChapterLoader.INSTANCE);
UGameEvents.bootstrap(); UGameEvents.bootstrap();
UBlocks.bootstrap(); UBlocks.bootstrap();
UPOIs.bootstrap();
UItems.bootstrap(); UItems.bootstrap();
UPotions.bootstrap(); UPotions.bootstrap();
UParticles.bootstrap(); UParticles.bootstrap();
USounds.bootstrap(); USounds.bootstrap();
Race.bootstrap(); Race.bootstrap();
SpellType.bootstrap(); SpellType.bootstrap();
AfflictionType.bootstrap();
Abilities.bootstrap(); Abilities.bootstrap();
UScreenHandlers.bootstrap(); UScreenHandlers.bootstrap();
UWorldGen.bootstrap(); UWorldGen.bootstrap();
@ -104,11 +102,12 @@ public class Unicopia implements ModInitializer {
UDamageTypes.bootstrap(); UDamageTypes.bootstrap();
} }
public interface SidedAccess { private void registerServerDataReloaders(ResourceManagerHelper registry) {
Optional<Pony> getPony(); registry.registerReloadListener(TreeTypeLoader.INSTANCE);
registry.registerReloadListener(UEnchantments.POISONED_JOKE);
default Race.Composite getPlayerSpecies() { registry.registerReloadListener(new TraitLoader());
return getPony().map(Pony::getCompositeRace).orElse(Race.HUMAN.composite()); registry.registerReloadListener(StateMapLoader.INSTANCE);
} registry.registerReloadListener(SpellbookChapterLoader.INSTANCE);
registry.registerReloadListener(new DietsLoader());
} }
} }

View file

@ -35,6 +35,12 @@ public class UnicopiaMixinPlugin implements IMixinConfigPlugin {
if (mixinClassName.indexOf("ad_astra") != -1) { if (mixinClassName.indexOf("ad_astra") != -1) {
return FabricLoader.getInstance().isModLoaded("ad_astra"); return FabricLoader.getInstance().isModLoaded("ad_astra");
} }
if (mixinClassName.indexOf("minelp") != -1) {
return FabricLoader.getInstance().isModLoaded("minelp");
}
if (mixinClassName.indexOf("forgified") != -1) {
return FabricLoader.getInstance().isModLoaded("connectormod");
}
} }
return true; return true;
} }

View file

@ -42,8 +42,8 @@ public interface WeaklyOwned<E extends Entity> extends Owned<E>, WorldConvertabl
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
default void setMaster(Owned<? extends E> sibling) { default void setMaster(Owned<? extends E> sibling) {
if (sibling instanceof WeaklyOwned) { if (sibling instanceof WeaklyOwned w) {
getMasterReference().copyFrom(((WeaklyOwned<E>)sibling).getMasterReference()); getMasterReference().copyFrom(w.getMasterReference());
} else { } else {
setMaster(sibling.getMaster()); setMaster(sibling.getMaster());
} }

View file

@ -24,6 +24,9 @@ public interface Abilities {
.toList(); .toList();
}); });
// all races
Ability<?> CHANGE_FORM = register(new ChangeFormAbility(), "change_form", AbilitySlot.PRIMARY);
// unicorn / alicorn // unicorn / alicorn
Ability<?> CAST = register(new UnicornCastingAbility(), "cast", AbilitySlot.PRIMARY); Ability<?> CAST = register(new UnicornCastingAbility(), "cast", AbilitySlot.PRIMARY);
Ability<?> SHOOT = register(new UnicornProjectileAbility(), "shoot", AbilitySlot.PRIMARY); Ability<?> SHOOT = register(new UnicornProjectileAbility(), "shoot", AbilitySlot.PRIMARY);
@ -36,14 +39,20 @@ public interface Abilities {
Ability<?> KICK = register(new EarthPonyKickAbility(), "kick", AbilitySlot.PRIMARY); Ability<?> KICK = register(new EarthPonyKickAbility(), "kick", AbilitySlot.PRIMARY);
Ability<?> GROW = register(new EarthPonyGrowAbility(), "grow", AbilitySlot.SECONDARY); Ability<?> GROW = register(new EarthPonyGrowAbility(), "grow", AbilitySlot.SECONDARY);
Ability<?> STOMP = register(new EarthPonyStompAbility(), "stomp", AbilitySlot.TERTIARY); Ability<?> STOMP = register(new EarthPonyStompAbility(), "stomp", AbilitySlot.TERTIARY);
Ability<?> HUG = register(new HugAbility(), "hug", AbilitySlot.TERTIARY);
// pegasus // pegasus
Ability<?> RAINBOOM = register(new PegasusRainboomAbility(), "rainboom", AbilitySlot.PRIMARY); Ability<?> RAINBOOM = register(new PegasusRainboomAbility(), "rainboom", AbilitySlot.PRIMARY);
Ability<?> CAPTURE_CLOUD = register(new PegasusCaptureStormAbility(), "capture_cloud", AbilitySlot.SECONDARY); Ability<?> CAPTURE_CLOUD = register(new PegasusCaptureStormAbility(), "capture_cloud", AbilitySlot.SECONDARY);
// pegasus / bat / alicorn / changeling // hippogriff
Ability<?> DASH = register(new FlyingDashAbility(), "dash", AbilitySlot.PRIMARY);
Ability<?> SCREECH = register(new ScreechAbility(), "screech", AbilitySlot.SECONDARY);
Ability<?> PECK = register(new PeckAbility(), "peck", AbilitySlot.SECONDARY);
// pegasus / bat / alicorn / changeling / hippogriff
Ability<?> CARRY = register(new CarryAbility(), "carry", AbilitySlot.PRIMARY); Ability<?> CARRY = register(new CarryAbility(), "carry", AbilitySlot.PRIMARY);
Ability<?> TOGGLE_FLIGHT = register(new PegasusFlightToggleAbility(), "toggle_flight", AbilitySlot.TERTIARY); Ability<?> TOGGLE_FLIGHT = register(new ToggleFlightAbility(), "toggle_flight", AbilitySlot.TERTIARY);
// changeling // changeling
Ability<?> DISGUISE = register(new ChangelingDisguiseAbility(), "disguise", AbilitySlot.SECONDARY); Ability<?> DISGUISE = register(new ChangelingDisguiseAbility(), "disguise", AbilitySlot.SECONDARY);
@ -53,6 +62,14 @@ public interface Abilities {
Ability<?> HANG = register(new BatPonyHangAbility(), "hang", AbilitySlot.TERTIARY); Ability<?> HANG = register(new BatPonyHangAbility(), "hang", AbilitySlot.TERTIARY);
Ability<?> EEEE = register(new BatEeeeAbility(), "eee", AbilitySlot.SECONDARY); Ability<?> EEEE = register(new BatEeeeAbility(), "eee", AbilitySlot.SECONDARY);
// kirin
Ability<?> RAGE = register(new KirinRageAbility(), "rage", AbilitySlot.PRIMARY);
Ability<?> NIRIK_BLAST = register(new NirikBlastAbility(), "nirik_blast", AbilitySlot.SECONDARY);
Ability<?> KIRIN_CAST = register(new KirinCastingAbility(), "kirin_cast", AbilitySlot.SECONDARY);
// seapony
Ability<?> SONAR_PULSE = register(new SeaponySonarPulseAbility(), "sonar_pulse", AbilitySlot.SECONDARY);
static <T extends Ability<?>> T register(T power, String name, AbilitySlot slot) { static <T extends Ability<?>> T register(T power, String name, AbilitySlot slot) {
Identifier id = Unicopia.id(name); Identifier id = Unicopia.id(name);
BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>()).add(power); BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>()).add(power);

View file

@ -68,7 +68,9 @@ public interface Ability<T extends Hit> {
* Checks if the given race is permitted to use this ability * Checks if the given race is permitted to use this ability
* @param playerSpecies The player's species * @param playerSpecies The player's species
*/ */
boolean canUse(Race playerSpecies); default boolean canUse(Race race) {
return race.canUse(this);
}
/** /**
* Called when an ability is about to be triggered. This event occurs on both the client and server so check {@code Pony#isClient} if you need to know which one you're on. * Called when an ability is about to be triggered. This event occurs on both the client and server so check {@code Pony#isClient} if you need to know which one you're on.
@ -81,6 +83,15 @@ public interface Ability<T extends Hit> {
return false; return false;
} }
/**
* Checks whether this ability has any special actions for the given activation type.
* <p>
* The default is to only respond to press-and-hold actions.
*/
default boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE;
}
/** /**
* Called on the client to get any data required for the quick action. * Called on the client to get any data required for the quick action.
* *

View file

@ -172,6 +172,16 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable {
} }
public void tick() { public void tick() {
Optional<Ability<?>> activeAbility = getActiveAbility();
if (activeAbility.isEmpty()) {
if (warmup > 0) {
warmup--;
}
if (cooldown > 0) {
cooldown--;
}
}
getActiveAbility().ifPresent(ability -> { getActiveAbility().ifPresent(ability -> {
if (warmup > 0) { if (warmup > 0) {
warmup--; warmup--;
@ -179,6 +189,10 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable {
return; return;
} }
if (cooldown > 100 && player.asEntity().isCreative()) {
cooldown = Math.max(10, cooldown - 100);
}
if (cooldown > 0 && cooldown-- > 0) { if (cooldown > 0 && cooldown-- > 0) {
ability.coolDown(player, slot); ability.coolDown(player, slot);
@ -205,6 +219,7 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable {
warmup = 0; warmup = 0;
if (data.isPresent()) { if (data.isPresent()) {
InteractionManager.getInstance().sendPlayerLookAngles(player.asEntity());
Channel.CLIENT_PLAYER_ABILITY.sendToServer(new MsgPlayerAbility<>(ability, data, ActivationType.NONE)); Channel.CLIENT_PLAYER_ABILITY.sendToServer(new MsgPlayerAbility<>(ability, data, ActivationType.NONE));
} else { } else {
player.asEntity().playSound(USounds.GUI_ABILITY_FAIL, 1, 1); player.asEntity().playSound(USounds.GUI_ABILITY_FAIL, 1, 1);

View file

@ -1,6 +1,5 @@
package com.minelittlepony.unicopia.ability; package com.minelittlepony.unicopia.ability;
import com.minelittlepony.unicopia.*;
import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.ability.magic.spell.effect.CustomisedSpellType; import com.minelittlepony.unicopia.ability.magic.spell.effect.CustomisedSpellType;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
@ -11,17 +10,11 @@ import net.minecraft.util.ActionResult;
import net.minecraft.util.TypedActionResult; import net.minecraft.util.TypedActionResult;
abstract class AbstractSpellCastingAbility implements Ability<Hit> { abstract class AbstractSpellCastingAbility implements Ability<Hit> {
@Override @Override
public int getCooldownTime(Pony player) { public int getCooldownTime(Pony player) {
return 0; return 0;
} }
@Override
public boolean canUse(Race race) {
return race.canCast();
}
@Override @Override
public Text getName(Pony player) { public Text getName(Pony player) {
CustomisedSpellType<?> spell = player.getCharms().getEquippedSpell(player.getCharms().getHand()); CustomisedSpellType<?> spell = player.getCharms().getEquippedSpell(player.getCharms().getHand());

View file

@ -18,6 +18,10 @@ public enum ActivationType {
return ordinal(); return ordinal();
} }
public boolean isResult() {
return this != NONE;
}
public static ActivationType of(int id) { public static ActivationType of(int id) {
return VALUES[MathHelper.clamp(id, 0, VALUES.length)]; return VALUES[MathHelper.clamp(id, 0, VALUES.length)];
} }

View file

@ -1,78 +1,22 @@
package com.minelittlepony.unicopia.ability; package com.minelittlepony.unicopia.ability;
import java.util.Optional;
import com.minelittlepony.unicopia.AwaitTickQueue; import com.minelittlepony.unicopia.AwaitTickQueue;
import com.minelittlepony.unicopia.EquinePredicates;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.ability.data.Numeric;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.advancement.UCriteria; import com.minelittlepony.unicopia.advancement.UCriteria;
import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation;
import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.util.RegistryUtils;
import com.minelittlepony.unicopia.util.VecHelper;
import net.minecraft.entity.LivingEntity;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.random.Random; import net.minecraft.util.math.random.Random;
import net.minecraft.world.event.GameEvent;
/** /**
* A magic casting ability for unicorns. * An ability to screeeeeeeeEeEeEeeee!
* (only shields for now)
*/ */
public class BatEeeeAbility implements Ability<Numeric> { public class BatEeeeAbility extends ScreechAbility {
public static final int SELF_SPOOK_PROBABILITY = 20000; public static final int SELF_SPOOK_PROBABILITY = 20000;
public static final int MOB_SPOOK_PROBABILITY = 1000;
@Override @Override
public int getWarmupTime(Pony player) { protected void playSounds(Pony player, Random rng, float strength) {
return 30;
}
@Override
public int getCooldownTime(Pony player) {
return 5;
}
@Override
public double getCostEstimate(Pony player) {
return 0;
}
@Override
public boolean activateOnEarlyRelease() {
return true;
}
@Override
public boolean canUse(Race race) {
return race == Race.BAT;
}
@Override
public Optional<Numeric> prepare(Pony player) {
return player.getAbilities().getActiveStat()
.map(stat -> (int)(stat.getWarmup() * getWarmupTime(player)))
.filter(i -> i >= 0)
.map(Numeric::new);
}
@Override
public Numeric.Serializer<Numeric> getSerializer() {
return Numeric.SERIALIZER;
}
@Override
public boolean apply(Pony player, Numeric data) {
float strength = 1 - MathHelper.clamp(data.type() / (float)getWarmupTime(player), 0, 1);
Random rng = player.asWorld().random;
int count = 1 + rng.nextInt(10) + (int)(strength * 10); int count = 1 + rng.nextInt(10) + (int)(strength * 10);
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
@ -81,6 +25,7 @@ public class BatEeeeAbility implements Ability<Numeric> {
1.6F + (rng.nextFloat() - 0.5F) 1.6F + (rng.nextFloat() - 0.5F)
); );
} }
player.asWorld().emitGameEvent(player.asEntity(), GameEvent.ENTITY_ACTION, player.asEntity().getEyePos());
for (int j = 0; j < (int)(strength * 2); j++) { for (int j = 0; j < (int)(strength * 2); j++) {
for (int k = 0; k < count; k++) { for (int k = 0; k < count; k++) {
AwaitTickQueue.scheduleTask(player.asWorld(), w -> { AwaitTickQueue.scheduleTask(player.asWorld(), w -> {
@ -88,59 +33,14 @@ public class BatEeeeAbility implements Ability<Numeric> {
(0.9F + (rng.nextFloat() - 0.5F) / 2F) * strength, (0.9F + (rng.nextFloat() - 0.5F) / 2F) * strength,
1.6F + (rng.nextFloat() - 0.5F) 1.6F + (rng.nextFloat() - 0.5F)
); );
player.asWorld().emitGameEvent(player.asEntity(), GameEvent.ENTITY_ACTION, player.asEntity().getEyePos());
}, rng.nextInt(3)); }, rng.nextInt(3));
} }
} }
if (!player.getPhysics().isFlying()) {
player.setAnimation(Animation.SPREAD_WINGS, Animation.Recipient.ANYONE);
}
Vec3d origin = player.getOriginVector();
if (strength > 0.5F && rng.nextInt(SELF_SPOOK_PROBABILITY) == 0) { if (strength > 0.5F && rng.nextInt(SELF_SPOOK_PROBABILITY) == 0) {
player.asEntity().damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), 0.1F); player.asEntity().damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), 0.1F);
UCriteria.SCREECH_SELF.trigger(player.asEntity()); UCriteria.SCREECH_SELF.trigger(player.asEntity());
} }
int total = player.findAllEntitiesInRange((int)Math.max(1, 8 * strength)).mapToInt(e -> {
if (e instanceof LivingEntity living && !SpellType.SHIELD.isOn(e)) {
boolean isEarthPony = EquinePredicates.PLAYER_EARTH.test(e);
e.damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F);
if (e.getWorld().random.nextInt(MOB_SPOOK_PROBABILITY) == 0) {
RegistryUtils.pickRandom(e.getWorld(), UTags.SPOOKED_MOB_DROPS).ifPresent(drop -> {
e.dropStack(drop.getDefaultStack());
e.playSound(USounds.Vanilla.ENTITY_ITEM_PICKUP, 1, 0.1F);
UCriteria.SPOOK_MOB.trigger(player.asEntity());
});
}
Vec3d knockVec = origin.subtract(e.getPos()).multiply(strength);
living.takeKnockback((isEarthPony ? 0.3F : 0.5F) * strength, knockVec.getX(), knockVec.getZ());
if (!isEarthPony) {
e.addVelocity(0, 0.1 * strength, 0);
}
Living.updateVelocity(e);
return 1;
}
return 0;
}).sum();
if (total >= 20) {
UCriteria.SCREECH_TWENTY_MOBS.trigger(player.asEntity());
}
return true;
}
@Override
public void warmUp(Pony player, AbilitySlot slot) {
}
@Override
public void coolDown(Pony player, AbilitySlot slot) {
for (int i = 0; i < 20; i++) {
player.addParticle(ParticleTypes.BUBBLE_POP, player.getPhysics().getHeadPosition().toCenterPos(), VecHelper.supply(() -> player.asWorld().getRandom().nextGaussian() - 0.5));
}
} }
} }

View file

@ -2,7 +2,6 @@ package com.minelittlepony.unicopia.ability;
import java.util.Optional; import java.util.Optional;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.data.Multi; import com.minelittlepony.unicopia.ability.data.Multi;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.util.TraceHelper; import com.minelittlepony.unicopia.util.TraceHelper;
@ -30,21 +29,16 @@ public class BatPonyHangAbility implements Ability<Multi> {
return 0; return 0;
} }
@Override
public boolean canUse(Race race) {
return race == Race.BAT;
}
@Override @Override
public Optional<Multi> prepare(Pony player) { public Optional<Multi> prepare(Pony player) {
if (player.isHanging()) { if (player.getAcrobatics().isHanging()) {
return Optional.of(new Multi(BlockPos.ZERO, 0)); return Optional.of(new Multi(BlockPos.ZERO, 0));
} }
return TraceHelper.findBlock(player.asEntity(), 5, 1) return TraceHelper.findBlock(player.asEntity(), 5, 1)
.map(BlockPos::down) .map(pos -> pos.down(player.getPhysics().getGravitySignum()))
.filter(player::canHangAt) .filter(player.getAcrobatics()::canHangAt)
.map(pos -> new Multi(pos, 1)); .map(pos -> new Multi(pos, 1));
} }
@ -55,13 +49,13 @@ public class BatPonyHangAbility implements Ability<Multi> {
@Override @Override
public boolean apply(Pony player, Multi data) { public boolean apply(Pony player, Multi data) {
if (data.hitType() == 0 && player.isHanging()) { if (data.hitType() == 0 && player.getAcrobatics().isHanging()) {
player.stopHanging(); player.getAcrobatics().stopHanging();
return true; return true;
} }
if (data.hitType() == 1 && player.canHangAt(data.pos().pos())) { if (data.hitType() == 1 && player.getAcrobatics().canHangAt(data.pos().pos())) {
player.startHanging(data.pos().pos()); player.getAcrobatics().startHanging(data.pos().pos());
} }
return true; return true;

View file

@ -6,7 +6,6 @@ import java.util.UUID;
import java.util.stream.StreamSupport; import java.util.stream.StreamSupport;
import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.EquinePredicates;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
@ -37,11 +36,6 @@ public class CarryAbility implements Ability<Hit> {
return 0; return 0;
} }
@Override
public boolean canUse(Race race) {
return race.canFly();
}
@Override @Override
public Optional<Hit> prepare(Pony player) { public Optional<Hit> prepare(Pony player) {
return Hit.INSTANCE; return Hit.INSTANCE;
@ -69,11 +63,28 @@ public class CarryAbility implements Ability<Hit> {
return false; return false;
} }
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP;
}
@Override @Override
public boolean apply(Pony iplayer, Hit data) { public boolean apply(Pony iplayer, Hit data) {
PlayerEntity player = iplayer.asEntity(); PlayerEntity player = iplayer.asEntity();
LivingEntity rider = findRider(player, iplayer.asWorld()); LivingEntity rider = findRider(player, iplayer.asWorld());
dropAllPassengers(player);
if (rider != null) {
rider.startRiding(player, true);
Living.getOrEmpty(rider).ifPresent(living -> living.setCarrier(player));
}
Living.transmitPassengers(player);
return true;
}
protected void dropAllPassengers(PlayerEntity player) {
if (player.hasPassengers()) { if (player.hasPassengers()) {
List<Entity> passengers = StreamSupport.stream(player.getPassengersDeep().spliterator(), false).toList(); List<Entity> passengers = StreamSupport.stream(player.getPassengersDeep().spliterator(), false).toList();
player.removeAllPassengers(); player.removeAllPassengers();
@ -85,14 +96,6 @@ public class CarryAbility implements Ability<Hit> {
} }
} }
} }
if (rider != null) {
rider.startRiding(player, true);
Living.getOrEmpty(rider).ifPresent(living -> living.setCarrier(player));
}
Living.transmitPassengers(player);
return true;
} }
@Override @Override

View file

@ -0,0 +1,121 @@
package com.minelittlepony.unicopia.ability;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.advancement.UCriteria;
import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.item.FriendshipBraceletItem;
import com.minelittlepony.unicopia.item.UItems;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.Identifier;
public class ChangeFormAbility implements Ability<Hit> {
@Override
public int getWarmupTime(Pony player) {
return 10;
}
@Override
public int getCooldownTime(Pony player) {
return 1000;
}
@Override
public boolean canUse(Race.Composite race) {
return race.potential() != null && race.potential() != race.physical();
}
@Override
public boolean canUse(Race race) {
return true;
}
@Override
public Identifier getIcon(Pony player) {
Race potential = player.getCompositeRace().potential();
if (potential == null) {
return Ability.super.getIcon(player);
}
return getId().withPath(p -> "textures/gui/ability/" + p + "_" + potential.getId().getPath() + ".png");
}
@Nullable
@Override
public Optional<Hit> prepare(Pony player) {
return Hit.of(canUse(player.getCompositeRace()));
}
@Override
public Hit.Serializer<Hit> getSerializer() {
return Hit.SERIALIZER;
}
@Override
public double getCostEstimate(Pony player) {
return 5;
}
@Override
public boolean apply(Pony player, Hit data) {
if (prepare(player).isEmpty()) {
return false;
}
List<Pony> targets = getTargets(player).toList();
player.subtractEnergyCost(5 * targets.size());
TrinketsDelegate.EquippedStack amulet = UItems.PEARL_NECKLACE.getForEntity(player.asEntity());
if (!amulet.stack().isEmpty()) {
amulet.stack().damage(1, player.asEntity(), amulet.breakStatusSender());
}
boolean isTransforming = player.getSuppressedRace().isUnset();
targets.forEach(target -> {
Race supressed = target.getSuppressedRace();
if (target == player || supressed.isUnset() == isTransforming) {
Race actualRace = isTransforming ? target.getSpecies() : Race.UNSET;
target.setSpecies(supressed.or(player.getCompositeRace().potential()));
target.setSuppressedRace(actualRace);
UCriteria.SEAPONY_TRANSITION.trigger(target.asEntity());
}
});
return true;
}
@Override
public void warmUp(Pony player, AbilitySlot slot) {
player.getMagicalReserves().getExertion().addPercent(6);
getTargets(player).forEach(target -> {
if (player.getAbilities().getStat(slot).getWarmup() % 5 == 0) {
player.asWorld().playSound(target.asEntity(), target.getOrigin(), SoundEvents.BLOCK_BUBBLE_COLUMN_WHIRLPOOL_INSIDE, SoundCategory.PLAYERS);
}
if (player.asWorld().random.nextInt(5) == 0) {
player.asWorld().playSound(target.asEntity(), target.getOrigin(), USounds.Vanilla.BLOCK_BUBBLE_COLUMN_BUBBLE_POP, SoundCategory.PLAYERS);
}
target.spawnParticles(ParticleTypes.BUBBLE_COLUMN_UP, 15);
target.spawnParticles(ParticleTypes.BUBBLE_POP, 15);
});
}
@Override
public void coolDown(Pony player, AbilitySlot slot) {
}
private Stream<Pony> getTargets(Pony player) {
return Stream.concat(Stream.of(player), FriendshipBraceletItem.getPartyMembers(player, 3));
}
}

View file

@ -11,6 +11,7 @@ import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell;
import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod; import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.entity.behaviour.Disguise;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.mixin.MixinFallingBlockEntity; import com.minelittlepony.unicopia.mixin.MixinFallingBlockEntity;
import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.particle.UParticles;
@ -50,22 +51,25 @@ public class ChangelingDisguiseAbility extends ChangelingFeedAbility {
player.getEntityWorld().playSound(null, player.getBlockPos(), USounds.ENTITY_PLAYER_CHANGELING_TRANSFORM, SoundCategory.PLAYERS, 1.4F, 0.4F); player.getEntityWorld().playSound(null, player.getBlockPos(), USounds.ENTITY_PLAYER_CHANGELING_TRANSFORM, SoundCategory.PLAYERS, 1.4F, 0.4F);
iplayer.getSpellSlot().get(SpellType.CHANGELING_DISGUISE, true) Disguise currentDisguise = iplayer.getSpellSlot().get(SpellType.CHANGELING_DISGUISE)
.orElseGet(() -> SpellType.CHANGELING_DISGUISE.withTraits().apply(iplayer, CastingMethod.INNATE)) .orElseGet(() -> SpellType.CHANGELING_DISGUISE.withTraits().apply(iplayer, CastingMethod.INNATE));
.setDisguise(looked);
if (currentDisguise.isOf(looked)) {
looked = null;
}
currentDisguise.setDisguise(looked);
if (!player.isCreative()) { if (!player.isCreative()) {
iplayer.getMagicalReserves().getMana().multiply(0.1F); iplayer.getMagicalReserves().getMana().multiply(0.1F);
} }
player.calculateDimensions(); player.calculateDimensions();
iplayer.setDirty();
return true; return true;
} }
@Override @Override
public void warmUp(Pony player, AbilitySlot slot) { public void warmUp(Pony player, AbilitySlot slot) {
player.getMagicalReserves().getEnergy().add(20); player.getMagicalReserves().getEnergy().add(2F);
player.spawnParticles(UParticles.CHANGELING_MAGIC, 5); player.spawnParticles(UParticles.CHANGELING_MAGIC, 5);
} }

View file

@ -2,26 +2,21 @@ package com.minelittlepony.unicopia.ability;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.function.Predicate;
import java.util.stream.Stream;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.ability.magic.spell.ChangelingFeedingSpell;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.FollowingParticleEffect;
import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.particle.UParticles;
import com.minelittlepony.unicopia.util.TraceHelper; import com.minelittlepony.unicopia.util.TraceHelper;
import com.minelittlepony.unicopia.util.VecHelper; import com.minelittlepony.unicopia.util.VecHelper;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.entity.mob.HostileEntity; import net.minecraft.entity.mob.HostileEntity;
import net.minecraft.entity.passive.CowEntity; import net.minecraft.entity.passive.CowEntity;
import net.minecraft.entity.passive.MerchantEntity; import net.minecraft.entity.passive.MerchantEntity;
@ -34,6 +29,13 @@ import net.minecraft.particle.ParticleTypes;
* Changeling ability to restore health from mobs * Changeling ability to restore health from mobs
*/ */
public class ChangelingFeedAbility implements Ability<Hit> { public class ChangelingFeedAbility implements Ability<Hit> {
private static final Predicate<Entity> TARGET_PREDICATE = e -> (e instanceof LivingEntity)
&& (e instanceof CowEntity
|| e instanceof MerchantEntity
|| e instanceof PlayerEntity
|| e instanceof SheepEntity
|| e instanceof PigEntity
|| e instanceof HostileEntity);
@Override @Override
public int getWarmupTime(Pony player) { public int getWarmupTime(Pony player) {
@ -42,33 +44,13 @@ public class ChangelingFeedAbility implements Ability<Hit> {
@Override @Override
public int getCooldownTime(Pony player) { public int getCooldownTime(Pony player) {
return canFeed(player) ? 15 : 80; return !SpellType.FEED.isOn(player) && ChangelingFeedingSpell.canFeed(player) ? 15 : 80;
}
@Override
public boolean canUse(Race race) {
return race == Race.CHANGELING;
} }
@Nullable @Nullable
@Override @Override
public Optional<Hit> prepare(Pony player) { public Optional<Hit> prepare(Pony player) {
return Hit.of(canFeed(player) && !getTargets(player).isEmpty()); return Hit.of(ChangelingFeedingSpell.canFeed(player) && !getTargets(player).findAny().isEmpty());
}
private boolean canFeed(Pony player) {
return player.asEntity().getHealth() < player.asEntity().getMaxHealth()
|| player.asEntity().canConsume(false);
}
private boolean canDrain(Entity e) {
return (e instanceof LivingEntity)
&& (e instanceof CowEntity
|| e instanceof MerchantEntity
|| e instanceof PlayerEntity
|| e instanceof SheepEntity
|| e instanceof PigEntity
|| e instanceof HostileEntity);
} }
@Override @Override
@ -76,16 +58,6 @@ public class ChangelingFeedAbility implements Ability<Hit> {
return Hit.SERIALIZER; return Hit.SERIALIZER;
} }
protected List<LivingEntity> getTargets(Pony player) {
List<Entity> list = VecHelper.findInRange(player.asEntity(), player.asWorld(), player.getOriginVector(), 3, this::canDrain);
TraceHelper.<LivingEntity>findEntity(player.asEntity(), 17, 1,
looked -> looked instanceof LivingEntity && !list.contains(looked) && canDrain(looked))
.ifPresent(list::add);
return list.stream().map(i -> (LivingEntity)i).collect(Collectors.toList());
}
@Override @Override
public double getCostEstimate(Pony player) { public double getCostEstimate(Pony player) {
return 0; return 0;
@ -93,7 +65,7 @@ public class ChangelingFeedAbility implements Ability<Hit> {
@Override @Override
public boolean apply(Pony iplayer, Hit data) { public boolean apply(Pony iplayer, Hit data) {
if (!canFeed(iplayer)) { if (!ChangelingFeedingSpell.canFeed(iplayer)) {
return false; return false;
} }
@ -103,64 +75,25 @@ public class ChangelingFeedAbility implements Ability<Hit> {
int maximumFoodGain = player.canConsume(false) ? (20 - player.getHungerManager().getFoodLevel()) : 0; int maximumFoodGain = player.canConsume(false) ? (20 - player.getHungerManager().getFoodLevel()) : 0;
if (maximumHealthGain > 0 || maximumFoodGain > 0) { if (maximumHealthGain > 0 || maximumFoodGain > 0) {
List<LivingEntity> targets = getTargets(iplayer).map(LivingEntity.class::cast).toList();
float healAmount = 0; if (targets.size() > 0) {
new ChangelingFeedingSpell(targets, maximumHealthGain, maximumFoodGain).apply(iplayer);
for (LivingEntity i : getTargets(iplayer)) {
healAmount += drainFrom(iplayer, i);
}
int foodAmount = (int)Math.floor(Math.min(healAmount / 3, maximumFoodGain));
if (foodAmount > 0) {
healAmount -= foodAmount;
}
player.getHungerManager().add(Math.max(1, foodAmount), 0.125f);
player.heal(Math.max(1, Math.min(healAmount, maximumHealthGain)));
}
if (!canFeed(iplayer)) {
iplayer.playSound(USounds.Vanilla.ENTITY_PLAYER_BURP, 1, (float)player.getWorld().random.nextTriangular(1F, 0.2F));
} else {
iplayer.playSound(USounds.ENTITY_PLAYER_CHANGELING_FEED, 0.1F, iplayer.getRandomPitch()); iplayer.playSound(USounds.ENTITY_PLAYER_CHANGELING_FEED, 0.1F, iplayer.getRandomPitch());
return true;
}
} }
iplayer.playSound(USounds.Vanilla.ENTITY_PLAYER_BURP, 1, (float)player.getWorld().random.nextTriangular(1F, 0.2F));
return true; return true;
} }
public float drainFrom(Pony changeling, LivingEntity living) { protected Stream<Entity> getTargets(Pony player) {
return Stream.concat(
DamageSource d = changeling.damageOf(UDamageTypes.LOVE_DRAINING, changeling); VecHelper.findInRange(player.asEntity(), player.asWorld(), player.getOriginVector(), 3, TARGET_PREDICATE).stream(),
TraceHelper.findEntity(player.asEntity(), 17, 1, TARGET_PREDICATE).stream()
float damage = living.getHealth()/2; ).distinct();
if (damage > 0) {
living.damage(d, damage);
}
ParticleUtils.spawnParticles(UParticles.CHANGELING_MAGIC, living, 7);
ParticleUtils.spawnParticles(new FollowingParticleEffect(UParticles.HEALTH_DRAIN, changeling.asEntity(), 0.2F), living, 1);
if (changeling.asEntity().hasStatusEffect(StatusEffects.NAUSEA)) {
StatusEffectInstance effect = changeling.asEntity().getStatusEffect(StatusEffects.NAUSEA);
changeling.asEntity().removeStatusEffect(StatusEffects.NAUSEA);
living.addStatusEffect(effect);
} else if (changeling.asWorld().random.nextInt(2300) == 0) {
living.addStatusEffect(new StatusEffectInstance(StatusEffects.WITHER, 20, 1));
}
if (living instanceof PlayerEntity) {
damage ++;
damage *= 1.6F;
if (!changeling.asEntity().hasStatusEffect(StatusEffects.HEALTH_BOOST)) {
changeling.asEntity().addStatusEffect(new StatusEffectInstance(StatusEffects.HEALTH_BOOST, 13000, 1));
}
}
return damage;
} }
@Override @Override

View file

@ -1,20 +1,37 @@
package com.minelittlepony.unicopia.ability; package com.minelittlepony.unicopia.ability;
import java.util.Optional; import java.util.Optional;
import java.util.function.DoubleSupplier;
import com.minelittlepony.unicopia.Race; import java.util.function.Supplier;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.ability.data.Pos; import com.minelittlepony.unicopia.ability.data.Pos;
import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.MagicParticleEffect; import com.minelittlepony.unicopia.particle.MagicParticleEffect;
import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.recipe.TransformCropsRecipe;
import com.minelittlepony.unicopia.recipe.URecipes;
import com.minelittlepony.unicopia.server.world.BlockDestructionManager;
import com.minelittlepony.unicopia.server.world.ModificationType;
import com.minelittlepony.unicopia.util.TraceHelper; import com.minelittlepony.unicopia.util.TraceHelper;
import com.minelittlepony.unicopia.util.VecHelper;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.CarrotsBlock;
import net.minecraft.block.FarmlandBlock;
import net.minecraft.item.BoneMealItem; import net.minecraft.item.BoneMealItem;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.Items; import net.minecraft.item.Items;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldEvents;
/** /**
* Earth Pony ability to grow crops * Earth Pony ability to grow crops
@ -31,11 +48,6 @@ public class EarthPonyGrowAbility implements Ability<Pos> {
return 50; return 50;
} }
@Override
public boolean canUse(Race race) {
return race.canUseEarth();
}
@Override @Override
public Optional<Pos> prepare(Pony player) { public Optional<Pos> prepare(Pony player) {
return TraceHelper.findBlock(player.asEntity(), 3, 1).map(Pos::new); return TraceHelper.findBlock(player.asEntity(), 3, 1).map(Pos::new);
@ -55,10 +67,16 @@ public class EarthPonyGrowAbility implements Ability<Pos> {
public boolean apply(Pony player, Pos data) { public boolean apply(Pony player, Pos data) {
int count = 0; int count = 0;
if (!applyDirectly(player, data.pos())) {
for (BlockPos pos : BlockPos.iterate( for (BlockPos pos : BlockPos.iterate(
data.pos().add(-2, -2, -2), data.pos().add(-2, -2, -2),
data.pos().add( 2, 2, 2))) { data.pos().add( 2, 2, 2))) {
count += applySingle(player.asWorld(), player.asWorld().getBlockState(pos), pos); if (player.canModifyAt(pos, ModificationType.PHYSICAL)) {
count += applySingle(player, player.asWorld(), player.asWorld().getBlockState(pos), pos);
}
}
} else {
count = 1;
} }
if (count > 0) { if (count > 0) {
@ -67,18 +85,102 @@ public class EarthPonyGrowAbility implements Ability<Pos> {
return true; return true;
} }
protected int applySingle(World w, BlockState state, BlockPos pos) { protected int applySingle(Pony player, World w, BlockState state, BlockPos pos) {
ItemStack stack = new ItemStack(Items.BONE_MEAL); ItemStack stack = new ItemStack(Items.BONE_MEAL);
if (BoneMealItem.useOnFertilizable(stack, w, pos) if (state.getBlock() instanceof Growable growable) {
|| BoneMealItem.useOnGround(stack, w, pos, Direction.UP)) { return growable.grow(w, state, pos) ? 1 : 0;
}
if (state.isOf(Blocks.CARROTS)) {
if (state.get(CarrotsBlock.AGE) == CarrotsBlock.MAX_AGE) {
boolean transform = w.random.nextInt(3) == 0;
spawnConversionParticles(w, pos, transform);
if (transform) {
w.setBlockState(pos, UBlocks.GOLD_ROOT.getDefaultState().with(CarrotsBlock.AGE, CarrotsBlock.MAX_AGE));
}
return 5;
}
}
if (w.getBlockState(pos).isIn(UTags.Blocks.UNAFFECTED_BY_GROW_ABILITY)) {
return 0;
}
if (BoneMealItem.useOnFertilizable(stack, w, pos)) {
if (w.random.nextInt(350) == 0) {
if (w.getBlockState(pos.down()).isOf(Blocks.FARMLAND)) {
FarmlandBlock.setToDirt(null, state, w, pos.down());
}
w.setBlockState(pos, UBlocks.PLUNDER_VINE_BUD.getDefaultState());
} else if (w.random.nextInt(5000) == 0) {
if (w.getBlockState(pos.down()).isOf(Blocks.FARMLAND)) {
FarmlandBlock.setToDirt(null, state, w, pos.down());
}
UBlocks.CURING_JOKE.grow(w, state, pos);
}
return 1;
}
if (BoneMealItem.useOnGround(stack, w, pos, Direction.UP)) {
return 1; return 1;
} }
return 0; return 0;
} }
private boolean applyDirectly(Pony player, BlockPos pos) {
return player.asWorld().getRecipeManager()
.getAllMatches(URecipes.GROWING, new TransformCropsRecipe.PlacementArea(player, pos), player.asWorld())
.stream()
.map(recipe -> recipe.value().checkPattern(player.asWorld(), pos))
.filter(result -> result.matchedLocations().size() + 1 >= TransformCropsRecipe.MINIMUM_INPUT)
.filter(result -> {
boolean transform = result.shoudTransform(player.asWorld().random);
player.playSound(USounds.ENTITY_CRYSTAL_SHARDS_AMBIENT, 1);
result.matchedLocations().forEach(cell -> {
spawnConversionParticles(player.asWorld(), cell.up(), false);
BlockDestructionManager manager = BlockDestructionManager.of(player.asWorld());
if (transform) {
if (manager.damageBlock(cell, 8) >= BlockDestructionManager.MAX_DAMAGE || player.asWorld().random.nextInt(20) == 0) {
player.asWorld().setBlockState(cell, Blocks.DIRT.getDefaultState());
player.asWorld().syncWorldEvent(WorldEvents.BLOCK_BROKEN, cell, Block.getRawIdFromState(player.asWorld().getBlockState(cell)));
}
} else {
if (manager.damageBlock(cell, 4) >= BlockDestructionManager.MAX_DAMAGE || player.asWorld().random.nextInt(20) == 0) {
player.asWorld().setBlockState(cell, Blocks.DIRT.getDefaultState());
player.asWorld().syncWorldEvent(WorldEvents.BLOCK_BROKEN, cell, Block.getRawIdFromState(player.asWorld().getBlockState(cell)));
}
}
});
spawnConversionParticles(player.asWorld(), pos, transform);
if (transform) {
player.asWorld().setBlockState(pos, result.recipe().getResult(player.asWorld(), pos));
}
return true;
})
.findFirst()
.isPresent();
}
private static void spawnConversionParticles(World w, BlockPos pos, boolean success) {
DoubleSupplier vecComponentFactory = () -> w.random.nextTriangular(0, 0.5);
Supplier<Vec3d> posSupplier = () -> pos.toCenterPos().add(VecHelper.supply(vecComponentFactory));
for (int i = 0; i < 25; i++) {
ParticleUtils.spawnParticle(w, new MagicParticleEffect(0xFFFF00), posSupplier.get(), Vec3d.ZERO);
if (success) {
ParticleUtils.spawnParticle(w, ParticleTypes.CLOUD, posSupplier.get(), Vec3d.ZERO);
}
}
}
@Override @Override
public void warmUp(Pony player, AbilitySlot slot) { public void warmUp(Pony player, AbilitySlot slot) {
player.getMagicalReserves().getExertion().addPercent(30); player.getMagicalReserves().getExertion().addPercent(30);
@ -92,4 +194,8 @@ public class EarthPonyGrowAbility implements Ability<Pos> {
public void coolDown(Pony player, AbilitySlot slot) { public void coolDown(Pony player, AbilitySlot slot) {
} }
public interface Growable {
boolean grow(World world, BlockState state, BlockPos pos);
}
} }

View file

@ -17,6 +17,7 @@ import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.particle.UParticles;
import com.minelittlepony.unicopia.server.world.BlockDestructionManager; import com.minelittlepony.unicopia.server.world.BlockDestructionManager;
import com.minelittlepony.unicopia.server.world.ModificationType;
import com.minelittlepony.unicopia.util.*; import com.minelittlepony.unicopia.util.*;
import net.minecraft.block.BeehiveBlock; import net.minecraft.block.BeehiveBlock;
@ -53,16 +54,10 @@ public class EarthPonyKickAbility implements Ability<Pos> {
return 50; return 50;
} }
@Override
public boolean canUse(Race race) {
return race.canUseEarth();
}
@Override @Override
public Identifier getIcon(Pony player) { public Identifier getIcon(Pony player) {
Identifier id = Abilities.REGISTRY.getId(this); return getId().withPath(p -> "textures/gui/ability/" + p
return new Identifier(id.getNamespace(), "textures/gui/ability/" + id.getPath() + "_" + (player.getObservedSpecies().isHuman() ? Race.EARTH : player.getObservedSpecies()).getId().getPath()
+ "_" + player.getObservedSpecies().getId().getPath()
+ "_" + (getKickDirection(player) > 0 ? "forward" : "backward") + "_" + (getKickDirection(player) > 0 ? "forward" : "backward")
+ ".png"); + ".png");
} }
@ -104,7 +99,7 @@ public class EarthPonyKickAbility implements Ability<Pos> {
} }
BlockPos pos = kickLocation.pos(); BlockPos pos = kickLocation.pos();
EarthPonyStompAbility.stompBlock(w, pos, 10 * (1 + player.getLevel().getScaled(5)) * w.getBlockState(pos).calcBlockBreakingDelta(player.asEntity(), w, pos)); EarthPonyStompAbility.stompBlock(player, w, pos, 10 * (1 + player.getLevel().getScaled(5)) * w.getBlockState(pos).calcBlockBreakingDelta(player.asEntity(), w, pos));
player.setAnimation(Animation.KICK, Animation.Recipient.ANYONE); player.setAnimation(Animation.KICK, Animation.Recipient.ANYONE);
}); });
} }
@ -122,6 +117,11 @@ public class EarthPonyKickAbility implements Ability<Pos> {
return false; return false;
} }
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP || type == ActivationType.DOUBLE_TAP;
}
@Nullable @Nullable
@Override @Override
public Optional<Pos> prepare(Pony player) { public Optional<Pos> prepare(Pony player) {
@ -166,10 +166,16 @@ public class EarthPonyKickAbility implements Ability<Pos> {
if (BlockDestructionManager.of(player.getWorld()).getBlockDestruction(pos) + 4 >= BlockDestructionManager.MAX_DAMAGE) { if (BlockDestructionManager.of(player.getWorld()).getBlockDestruction(pos) + 4 >= BlockDestructionManager.MAX_DAMAGE) {
if (player.getWorld().random.nextInt(30) == 0) { if (player.getWorld().random.nextInt(30) == 0) {
tree.logs().forEach(player.getWorld(), (w, state, p) -> w.breakBlock(p, true)); tree.logs().forEach(player.getWorld(), (w, state, p) -> {
if (iplayer.canModifyAt(p, ModificationType.PHYSICAL)) {
w.breakBlock(p, true);
}
});
tree.leaves().forEach(player.getWorld(), (w, state, p) -> { tree.leaves().forEach(player.getWorld(), (w, state, p) -> {
if (iplayer.canModifyAt(p, ModificationType.PHYSICAL)) {
Block.dropStacks(w.getBlockState(p), w, p); Block.dropStacks(w.getBlockState(p), w, p);
w.setBlockState(p, Blocks.AIR.getDefaultState(), Block.NOTIFY_ALL); w.setBlockState(p, Blocks.AIR.getDefaultState(), Block.NOTIFY_ALL);
}
}); });
} }

View file

@ -6,8 +6,11 @@ import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.AwaitTickQueue; import com.minelittlepony.unicopia.AwaitTickQueue;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation;
import com.minelittlepony.unicopia.entity.LandingEventHandler;
import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
@ -16,7 +19,9 @@ import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.particle.UParticles;
import com.minelittlepony.unicopia.server.world.BlockDestructionManager; import com.minelittlepony.unicopia.server.world.BlockDestructionManager;
import com.minelittlepony.unicopia.server.world.ModificationType;
import com.minelittlepony.unicopia.util.PosHelper; import com.minelittlepony.unicopia.util.PosHelper;
import com.minelittlepony.unicopia.util.VecHelper;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -26,6 +31,7 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.particle.BlockStateParticleEffect;
import net.minecraft.registry.tag.BlockTags; import net.minecraft.registry.tag.BlockTags;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@ -33,6 +39,7 @@ import net.minecraft.util.math.BlockBox;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box; import net.minecraft.util.math.Box;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldEvents; import net.minecraft.world.WorldEvents;
@ -58,16 +65,12 @@ public class EarthPonyStompAbility implements Ability<Hit> {
return 50; return 50;
} }
@Override
public boolean canUse(Race race) {
return race.canUseEarth();
}
@Override @Override
public Identifier getIcon(Pony player) { public Identifier getIcon(Pony player) {
Identifier id = Abilities.REGISTRY.getId(this); Identifier id = Abilities.REGISTRY.getId(this);
Race race = player.getObservedSpecies();
return new Identifier(id.getNamespace(), "textures/gui/ability/" + id.getPath() return new Identifier(id.getNamespace(), "textures/gui/ability/" + id.getPath()
+ "_" + player.getObservedSpecies().getId().getPath() + "_" + (race.isHuman() ? Race.EARTH : race).getId().getPath()
+ ".png"); + ".png");
} }
@ -80,7 +83,9 @@ public class EarthPonyStompAbility implements Ability<Hit> {
@Override @Override
public Optional<Hit> prepare(Pony player) { public Optional<Hit> prepare(Pony player) {
if (player.asEntity().getVelocity().y * player.getPhysics().getGravitySignum() < 0 if (player.asEntity().getVelocity().y * player.getPhysics().getGravitySignum() < 0
&& !player.asEntity().getAbilities().flying) { && !player.asEntity().getAbilities().flying
&& !player.asEntity().isFallFlying()
&& !player.asEntity().isUsingRiptide()) {
thrustDownwards(player); thrustDownwards(player);
return Hit.INSTANCE; return Hit.INSTANCE;
} }
@ -104,9 +109,18 @@ public class EarthPonyStompAbility implements Ability<Hit> {
@Override @Override
public boolean apply(Pony iplayer, Hit data) { public boolean apply(Pony iplayer, Hit data) {
PlayerEntity player = iplayer.asEntity(); final PlayerEntity player = iplayer.asEntity();
final double initialY = player.getY() + 5;
Runnable r = () -> { var r = new LandingEventHandler.Callback() {
@Override
public float dispatch(float fallDistance) {
// fail if landing above the starting position
if (player.getY() > initialY) {
return fallDistance;
}
player.fallDistance = 0;
BlockPos center = PosHelper.findSolidGroundAt(player.getEntityWorld(), player.getBlockPos(), iplayer.getPhysics().getGravitySignum()); BlockPos center = PosHelper.findSolidGroundAt(player.getEntityWorld(), player.getBlockPos(), iplayer.getPhysics().getGravitySignum());
float heavyness = 1 + EnchantmentHelper.getEquipmentLevel(UEnchantments.HEAVY, player); float heavyness = 1 + EnchantmentHelper.getEquipmentLevel(UEnchantments.HEAVY, player);
@ -153,19 +167,30 @@ public class EarthPonyStompAbility implements Ability<Hit> {
double radius = rad + heavyness * 0.3; double radius = rad + heavyness * 0.3;
spawnEffectAround(player, center, radius, rad); spawnEffectAround(iplayer, player, center, radius, rad);
ParticleUtils.spawnParticle(player.getWorld(), UParticles.GROUND_POUND, player.getX(), player.getY() - 1, player.getZ(), 0, 0, 0); ParticleUtils.spawnParticle(player.getWorld(), UParticles.GROUND_POUND, player.getX(), player.getY() - 1, player.getZ(), 0, 0, 0);
BlockState steppingState = player.getSteppingBlockState();
if (steppingState.isIn(UTags.Blocks.KICKS_UP_DUST)) {
ParticleUtils.spawnParticle(player.getWorld(), new BlockStateParticleEffect(UParticles.DUST_CLOUD, steppingState), player.getBlockPos().down().toCenterPos(), Vec3d.ZERO);
}
iplayer.subtractEnergyCost(rad); iplayer.subtractEnergyCost(rad);
iplayer.asEntity().addExhaustion(3); iplayer.asEntity().addExhaustion(3);
return 0F;
}
@Override
public void onCancelled() {
iplayer.playSound(USounds.GUI_ABILITY_FAIL, 1F);
}
}; };
if (iplayer.asEntity().isOnGround()) { if (iplayer.asEntity().isOnGround()) {
iplayer.setAnimation(Animation.STOMP, Animation.Recipient.ANYONE, 10); iplayer.setAnimation(Animation.STOMP, Animation.Recipient.ANYONE, 10);
iplayer.asEntity().jump(); iplayer.asEntity().jump();
iplayer.updateVelocity(); iplayer.updateVelocity();
AwaitTickQueue.scheduleTask(iplayer.asWorld(), w -> r.run(), 5); AwaitTickQueue.scheduleTask(iplayer.asWorld(), w -> r.dispatch(0F), 5);
} else { } else {
thrustDownwards(iplayer); thrustDownwards(iplayer);
iplayer.waitForFall(r); iplayer.waitForFall(r);
@ -174,17 +199,17 @@ public class EarthPonyStompAbility implements Ability<Hit> {
return true; return true;
} }
public static void spawnEffectAround(Entity source, BlockPos center, double radius, double range) { public static void spawnEffectAround(Pony pony, Entity source, BlockPos center, double radius, double range) {
BlockPos.stream(new BlockBox(center).expand(MathHelper.ceil(radius))).forEach(i -> { BlockPos.stream(new BlockBox(center).expand(MathHelper.ceil(radius))).forEach(i -> {
double dist = Math.sqrt(i.getSquaredDistance(source.getX(), source.getY(), source.getZ())); double dist = Math.sqrt(i.getSquaredDistance(source.getX(), source.getY(), source.getZ()));
if (dist <= radius) { if (dist <= radius) {
spawnEffect(source.getWorld(), i, dist, range); spawnEffect(pony, source.getWorld(), i, dist, range);
} }
}); });
} }
public static void spawnEffect(World w, BlockPos pos, double dist, double rad) { public static void spawnEffect(Pony pony, World w, BlockPos pos, double dist, double rad) {
if (w.getBlockState(pos.up()).isAir()) { if (w.getBlockState(pos.up()).isAir()) {
BlockState state = w.getBlockState(pos); BlockState state = w.getBlockState(pos);
@ -192,18 +217,18 @@ public class EarthPonyStompAbility implements Ability<Hit> {
float scaledHardness = (1 - hardness / 70); float scaledHardness = (1 - hardness / 70);
float damage = hardness < 0 ? 0 : MathHelper.clamp((int)((1 - dist / rad) * 9 * scaledHardness), 0, BlockDestructionManager.MAX_DAMAGE - 1); float damage = hardness < 0 ? 0 : MathHelper.clamp((int)((1 - dist / rad) * 9 * scaledHardness), 0, BlockDestructionManager.MAX_DAMAGE - 1);
stompBlock(w, pos, damage); stompBlock(pony, w, pos, damage);
} }
} }
public static void stompBlock(World w, BlockPos pos, float damage) { public static void stompBlock(Pony pony, World w, BlockPos pos, float damage) {
BlockState state = w.getBlockState(pos); BlockState state = w.getBlockState(pos);
if (state.isAir() || damage <= 0) { if (state.isAir() || damage <= 0) {
return; return;
} }
if (BlockDestructionManager.of(w).damageBlock(pos, damage) >= BlockDestructionManager.MAX_DAMAGE) { if (BlockDestructionManager.of(w).damageBlock(pos, damage) >= BlockDestructionManager.MAX_DAMAGE && pony.canModifyAt(pos, ModificationType.PHYSICAL)) {
w.breakBlock(pos, true); w.breakBlock(pos, true);
if (w instanceof ServerWorld) { if (w instanceof ServerWorld) {
@ -217,6 +242,12 @@ public class EarthPonyStompAbility implements Ability<Hit> {
} else { } else {
w.syncWorldEvent(WorldEvents.BLOCK_BROKEN, pos, Block.getRawIdFromState(state)); w.syncWorldEvent(WorldEvents.BLOCK_BROKEN, pos, Block.getRawIdFromState(state));
} }
if (state.isIn(UTags.Blocks.KICKS_UP_DUST)) {
if (w.random.nextInt(4) == 0 && w.isAir(pos.up()) && w.getFluidState(pos.up()).isEmpty()) {
ParticleUtils.spawnParticle(w, new BlockStateParticleEffect(UParticles.DUST_CLOUD, state), pos.up().toCenterPos(), VecHelper.supply(() -> w.random.nextTriangular(0, 0.1F)));
}
}
} }
@Override @Override

View file

@ -0,0 +1,75 @@
package com.minelittlepony.unicopia.ability;
import java.util.Optional;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.entity.player.Pony;
/**
* Dashing ability for flying creatures.
*/
public class FlyingDashAbility implements Ability<Hit> {
@Override
public int getWarmupTime(Pony player) {
return 19;
}
@Override
public int getCooldownTime(Pony player) {
return 30;
}
@Nullable
@Override
public Optional<Hit> prepare(Pony player) {
return Hit.of(player.getPhysics().isFlying());
}
@Override
public Hit.Serializer<Hit> getSerializer() {
return Hit.SERIALIZER;
}
@Override
public double getCostEstimate(Pony player) {
return 0;
}
@Override
public boolean onQuickAction(Pony player, ActivationType type, Optional<Hit> data) {
if (type == ActivationType.TAP && !player.getMotion().isRainbooming() && player.getPhysics().isFlying() && player.getMagicalReserves().getMana().get() > 40) {
player.getPhysics().dashForward((float)player.asWorld().random.nextTriangular(2.5F, 0.3F));
return true;
}
return false;
}
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP;
}
@Override
public boolean apply(Pony player, Hit data) {
player.getPhysics().dashForward((float)player.asWorld().random.nextTriangular(2.5F, 0.3F));
player.subtractEnergyCost(2);
return true;
}
@Override
public void warmUp(Pony player, AbilitySlot slot) {
player.getMagicalReserves().getExertion().addPercent(6);
}
@Override
public void coolDown(Pony player, AbilitySlot slot) {
float velocityScale = player.getAbilities().getStat(slot).getCooldown();
float multiplier = 1 + (0.02F * velocityScale);
player.asEntity().getVelocity().multiply(multiplier, 1, multiplier);
}
}

View file

@ -0,0 +1,48 @@
package com.minelittlepony.unicopia.ability;
import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation;
import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.mob.FriendlyCreeperEntity;
import com.minelittlepony.unicopia.entity.mob.UEntities;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.mob.CreeperEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.particle.ParticleTypes;
/**
* Ability to hug mobs. Not all of them are receptive to your advances though, so be careful!
*/
public class HugAbility extends CarryAbility {
@Override
public boolean apply(Pony pony, Hit data) {
PlayerEntity player = pony.asEntity();
LivingEntity rider = findRider(player, pony.asWorld());
dropAllPassengers(player);
pony.setAnimation(Animation.ARMS_FORWARD, Animation.Recipient.ANYONE);
if (rider instanceof CreeperEntity creeper) {
FriendlyCreeperEntity friendlyCreeper = creeper.convertTo(UEntities.FRIENDLY_CREEPER, true);
player.getWorld().spawnEntity(friendlyCreeper);
friendlyCreeper.startRiding(player, true);
Living.getOrEmpty(friendlyCreeper).ifPresent(living -> living.setCarrier(player));
} else if (rider instanceof FriendlyCreeperEntity creeper) {
creeper.startRiding(player, true);
Living.getOrEmpty(creeper).ifPresent(living -> living.setCarrier(player));
} else if (rider != null) {
rider.teleport(player.getX(), player.getY() + 0.5, player.getZ());
rider.setYaw(player.getYaw() + 180);
if (rider instanceof FriendlyCreeperEntity) {
pony.spawnParticles(ParticleTypes.HEART, 10);
}
}
Living.transmitPassengers(player);
return true;
}
}

View file

@ -0,0 +1,17 @@
package com.minelittlepony.unicopia.ability;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.particle.ParticleTypes;
public class KirinCastingAbility extends UnicornCastingAbility {
@Override
public void coolDown(Pony player, AbilitySlot slot) {
player.spawnParticles(ParticleTypes.FLAME, 5);
}
@Override
protected boolean canCast(SpellType<?> type) {
return type == SpellType.FIRE_BOLT || type == SpellType.FLAME || type == SpellType.INFERNAL;
}
}

View file

@ -0,0 +1,82 @@
package com.minelittlepony.unicopia.ability;
import java.util.Optional;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.block.state.StateMaps;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.sound.SoundCategory;
import net.minecraft.text.Text;
/**
* Kirin ability to transform into a nirik
*/
public class KirinRageAbility implements Ability<Hit> {
@Override
public int getWarmupTime(Pony player) {
return 30;
}
@Override
public int getCooldownTime(Pony player) {
return 60;
}
@Nullable
@Override
public Optional<Hit> prepare(Pony player) {
return Hit.INSTANCE;
}
@Override
public Hit.Serializer<Hit> getSerializer() {
return Hit.SERIALIZER;
}
@Override
public double getCostEstimate(Pony player) {
return 0;
}
@Override
public boolean apply(Pony player, Hit data) {
if (player.consumeSuperMove()) {
player.getMagicalReserves().getCharge().set(0);
SpellType.RAGE.withTraits().apply(player, CastingMethod.INNATE);
} else {
int type = 1 + player.asWorld().random.nextInt(4);
player.asEntity().sendMessage(Text.translatable("ability.unicopia.too_calm." + type), true);
if (type == 4) {
player.getMagicalReserves().getCharge().addPercent(1);
}
player.asEntity().addExhaustion(1.5F);
if (StateMaps.BURNABLE.convert(player.asWorld(), player.getOrigin().down())) {
player.playSound(USounds.SPELL_FIRE_CRACKLE, 1);
}
}
return true;
}
@Override
public void warmUp(Pony player, AbilitySlot slot) {
player.spawnParticles(ParticleTypes.LAVA, 4);
player.getMagicalReserves().getEnergy().addPercent(1.03F);
if (player.asEntity().age % 15 == 0) {
player.asWorld().playSound(player.asEntity(), player.getOrigin(), USounds.ENTITY_PLAYER_KIRIN_RAGE, SoundCategory.PLAYERS, 1F, 0.0125F);
}
}
@Override
public void coolDown(Pony player, AbilitySlot slot) {
}
}

View file

@ -0,0 +1,90 @@
package com.minelittlepony.unicopia.ability;
import java.util.Optional;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.EquinePredicates;
import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation;
import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation.Recipient;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.util.ExplosionUtil;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageTypes;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.predicate.entity.EntityPredicates;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.World.ExplosionSourceType;
/**
* Kirin ability to transform into a nirik
*/
public class NirikBlastAbility implements Ability<Hit> {
@Override
public int getWarmupTime(Pony player) {
return 10;
}
@Override
public int getCooldownTime(Pony player) {
return 3;
}
@Nullable
@Override
public Optional<Hit> prepare(Pony player) {
return Hit.of(EquinePredicates.RAGING.test(player.asEntity()));
}
@Override
public Hit.Serializer<Hit> getSerializer() {
return Hit.SERIALIZER;
}
@Override
public double getCostEstimate(Pony player) {
return 0;
}
@Override
public boolean apply(Pony player, Hit data) {
player.asWorld().createExplosion(player.asEntity(), player.damageOf(DamageTypes.FIREBALL), ExplosionUtil.NON_DESTRUCTIVE, player.getOriginVector(), 5, true, ExplosionSourceType.MOB);
player.setInvulnerabilityTicks(5);
player.setAnimation(Animation.ARMS_UP, Recipient.ANYONE, 12);
player.playSound(SoundEvents.ENTITY_POLAR_BEAR_WARNING, 2F, 0.1F);
player.subtractEnergyCost(25);
coolDown(player, AbilitySlot.NONE);
for (Entity e : player.findAllEntitiesInRange(5, EntityPredicates.VALID_LIVING_ENTITY.and(EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR)).toList()) {
Vec3d offset = player.getOriginVector().subtract(e.getPos());
((LivingEntity)e).takeKnockback(1, offset.x, offset.z);
}
return true;
}
@Override
public void warmUp(Pony player, AbilitySlot slot) {
}
@Override
public void coolDown(Pony player, AbilitySlot slot) {
Random rng = player.asWorld().random;
for (int i = 0; i < 26; i++) {
Vec3d pos = player.getOriginVector().add(rng.nextGaussian(), 0, rng.nextGaussian());
player.addParticle(ParticleTypes.CAMPFIRE_SIGNAL_SMOKE, pos, new Vec3d(rng.nextGaussian(), 0.3, rng.nextGaussian()));
player.addParticle(ParticleTypes.FLAME, pos, new Vec3d(rng.nextGaussian(), 0.8, rng.nextGaussian()));
player.addParticle(ParticleTypes.LAVA, pos, new Vec3d(rng.nextGaussian(), 0.8, rng.nextGaussian()));
}
}
}

View file

@ -0,0 +1,146 @@
package com.minelittlepony.unicopia.ability;
import java.util.Optional;
import com.minelittlepony.unicopia.EquinePredicates;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.ability.data.Numeric;
import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.util.TraceHelper;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.predicate.entity.EntityPredicates;
import net.minecraft.registry.tag.BlockTags;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.Text;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.World;
import net.minecraft.world.WorldEvents;
import net.minecraft.world.event.GameEvent;
/**
* Hippogriff ability to use their beak as a weapon
*/
public class PeckAbility implements Ability<Hit> {
@Override
public int getWarmupTime(Pony player) {
return 1;
}
@Override
public int getCooldownTime(Pony player) {
return 10;
}
@Override
public double getCostEstimate(Pony player) {
return 0;
}
@Override
public boolean activateOnEarlyRelease() {
return true;
}
@Override
public Optional<Hit> prepare(Pony player) {
return Hit.INSTANCE;
}
@Override
public Numeric.Serializer<Hit> getSerializer() {
return Hit.SERIALIZER;
}
protected LivingEntity findTarget(PlayerEntity player, World w) {
return TraceHelper.<LivingEntity>findEntity(player, 5, 1, hit -> {
return EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR.test(hit) && !player.isConnectedThroughVehicle(hit);
}).orElse(null);
}
@Override
public boolean apply(Pony player, Hit hit) {
LivingEntity target = findTarget(player.asEntity(), player.asWorld());
playSounds(player, player.asWorld().getRandom(), 1);
if (target != null) {
spookMob(player, target, 1);
} else {
BlockPos pos = TraceHelper.findBlock(player.asEntity(), 5, 1).orElse(BlockPos.ORIGIN);
if (pos != BlockPos.ORIGIN) {
BlockState state = player.asWorld().getBlockState(pos);
if (state.isReplaceable()) {
player.asWorld().breakBlock(pos, true);
} else if (state.isIn(BlockTags.DIRT) || player.asWorld().random.nextInt(40000) == 0) {
player.asWorld().syncWorldEvent(WorldEvents.BLOCK_BROKEN, pos, Block.getRawIdFromState(state));
pos = pos.up();
World world = player.asWorld();
if (world instanceof ServerWorld sw) {
for (ItemStack stack : Block.getDroppedStacks(state, sw, pos, null)) {
if (Block.getBlockFromItem(stack.getItem()) == Blocks.AIR) {
Block.dropStack(world, pos, stack);
}
}
state.onStacksDropped(sw, pos, ItemStack.EMPTY, true);
if (world.random.nextInt(20) == 0) {
world.breakBlock(pos.down(), false);
player.asEntity().sendMessage(Text.translatable("ability.unicopia.peck.block.fled"), true);
}
}
} else {
player.asEntity().sendMessage(Text.translatable("ability.unicopia.peck.block.unfased"), true);
}
}
}
return true;
}
protected void playSounds(Pony player, Random rng, float strength) {
player.getMagicalReserves().getExertion().addPercent(100);
player.getMagicalReserves().getEnergy().addPercent(10);
player.playSound(USounds.Vanilla.ENTITY_CHICKEN_HURT,
1,
0.9F + (rng.nextFloat() - 0.5F)
);
player.asWorld().emitGameEvent(player.asEntity(), GameEvent.STEP, player.asEntity().getEyePos());
}
protected void spookMob(Pony player, LivingEntity living, float strength) {
boolean isEarthPony = EquinePredicates.PLAYER_EARTH.test(living);
boolean isBracing = isEarthPony && player.asEntity().isSneaking();
if (!isBracing) {
living.damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F);
}
Vec3d knockVec = player.getOriginVector().subtract(living.getPos()).multiply(strength);
living.takeKnockback((isBracing ? 0.2F : isEarthPony ? 0.3F : 0.5F) * strength, knockVec.getX(), knockVec.getZ());
if (!isEarthPony) {
living.addVelocity(0, 0.1 * strength, 0);
}
Living.updateVelocity(living);
}
@Override
public void warmUp(Pony player, AbilitySlot slot) {
}
@Override
public void coolDown(Pony player, AbilitySlot slot) {
}
}

View file

@ -4,7 +4,6 @@ import java.util.Optional;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.UItems;
@ -33,11 +32,6 @@ public class PegasusCaptureStormAbility implements Ability<Hit> {
return 6; return 6;
} }
@Override
public boolean canUse(Race race) {
return race.canInteractWithClouds();
}
@Nullable @Nullable
@Override @Override
public Optional<Hit> prepare(Pony player) { public Optional<Hit> prepare(Pony player) {

View file

@ -4,16 +4,11 @@ import java.util.Optional;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod; import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.MagicParticleEffect; import com.minelittlepony.unicopia.particle.MagicParticleEffect;
import com.minelittlepony.unicopia.particle.OrientedBillboardParticleEffect;
import com.minelittlepony.unicopia.particle.UParticles;
import net.minecraft.util.math.Vec3d;
/** /**
* Pegasus ability to perform rainbooms * Pegasus ability to perform rainbooms
@ -30,11 +25,6 @@ public class PegasusRainboomAbility implements Ability<Hit> {
return 60; return 60;
} }
@Override
public boolean canUse(Race race) {
return race.canInteractWithClouds();
}
@Nullable @Nullable
@Override @Override
public Optional<Hit> prepare(Pony player) { public Optional<Hit> prepare(Pony player) {
@ -64,6 +54,11 @@ public class PegasusRainboomAbility implements Ability<Hit> {
return false; return false;
} }
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP;
}
@Override @Override
public boolean apply(Pony player, Hit data) { public boolean apply(Pony player, Hit data) {
@ -72,7 +67,6 @@ public class PegasusRainboomAbility implements Ability<Hit> {
} }
if (player.consumeSuperMove()) { if (player.consumeSuperMove()) {
player.addParticle(new OrientedBillboardParticleEffect(UParticles.RAINBOOM_RING, player.getPhysics().getMotionAngle()), player.getOriginVector(), Vec3d.ZERO);
SpellType.RAINBOOM.withTraits().apply(player, CastingMethod.INNATE); SpellType.RAINBOOM.withTraits().apply(player, CastingMethod.INNATE);
} }
return true; return true;

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