This commit is contained in:
HuTao今天吃什么
2022-09-04 13:45:36 +08:00
parent 7fae3b041d
commit a29cb16aeb
41 changed files with 490 additions and 205 deletions

View File

@@ -20,7 +20,7 @@ apply plugin: 'maven-publish'
// apply MixinGradle
apply plugin: 'org.spongepowered.mixin'
version = '1.18.2-0.1.3'
version = '1.18.2-0.1.4'
group = 'extrabotany' //'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = 'extrabotany'

View File

@@ -17,8 +17,8 @@ a11e55f651479912f38def68d408d3365bff4e6b assets/extrabotany/blockstates/moonligh
71832b8c18734652952bc3152cacd3f314ca391f assets/extrabotany/blockstates/reikar_orchid.json
5b4b6c301ff57c7d4006e79654cac0e1e68cbe60 assets/extrabotany/blockstates/serenitian.json
31853f21bb80a913ba27e5053a843459b3d7d37d assets/extrabotany/blockstates/sunshine_lily.json
3c7a701a05bc6cc659b112701710149c7a95edc8 assets/extrabotany/lang/en_us.json
96dda78595c3676fb0a1c290fbd067f3467ae907 assets/extrabotany/lang/zh_cn.json
ce0bda39b370e42d434181877ed885d98ac6c0d6 assets/extrabotany/lang/en_us.json
0b304447ba4b0564cb8cee4023cac8b5a03bbb7c assets/extrabotany/lang/zh_cn.json
477b72a89fa3546590428dd7d8d4528c711a98dc assets/extrabotany/models/block/annoying_flower.json
2f2803ccc1532c712c13241790c9ec65fb61a97d assets/extrabotany/models/block/bell_flower.json
2cc688d6536ea214d2c83c83c2cf9be55b342b23 assets/extrabotany/models/block/bloody_enchantress.json
@@ -278,6 +278,7 @@ d6f0804c4c8be25385949cccd6000f742e5084fe data/minecraft/advancements/recipes/ext
44f95cda70a0691d34260eb40725007ea4c853e0 data/minecraft/advancements/recipes/extrabotany/empty_bottle.json
9ee8c6e7f950bf73c01cedbb1acc747ddbdbc7ed data/minecraft/advancements/recipes/extrabotany/excaliber.json
6237df80cb1eeed976d611eb2967d6452e73ab37 data/minecraft/advancements/recipes/extrabotany/failnaught.json
fb55029d1aaf848ff47abb7508d9c76d8727f4ca data/minecraft/advancements/recipes/extrabotany/forest_book.json
97d6c8fb1055c699b44a6df53b5c5a9f31e312d0 data/minecraft/advancements/recipes/extrabotany/foxear.json
f42709a8e30d55855f1ac1800e1d9d14b9a8b54b data/minecraft/advancements/recipes/extrabotany/gildedmashedpotato.json
25353d564eb2e9e0ceca918a88f7b26d31afe709 data/minecraft/advancements/recipes/extrabotany/goblinslayer_boots.json
@@ -343,6 +344,7 @@ c3b9803e99cb4ec90b51ebfc57f24a8a36121c47 data/minecraft/recipes/elementium_shiel
77bd5e9610aed87b193edf2eea2e39ac81a2a790 data/minecraft/recipes/empty_bottle.json
243d7f22ee05b1fef5b5c8c3dff9c252b4ed9514 data/minecraft/recipes/excaliber.json
68fb0c3c58ed0dd43704ef85aaf1b6f16b5594e3 data/minecraft/recipes/failnaught.json
bae55212fb1b66353ab58ddb0ed6891c116682d1 data/minecraft/recipes/forest_book.json
1aa463d9998c957244d7307f601b31a1e2657e9e data/minecraft/recipes/foxear.json
70b857ce94832c5de635619ef14edb1e81d8cdcf data/minecraft/recipes/gildedmashedpotato.json
d0574fb578abc369bfea63edb84fc146e7554797 data/minecraft/recipes/goblinslayer_boots.json

View File

@@ -67,8 +67,10 @@
"block.extrabotany.serenitian.reference": "Torn to oblivion",
"block.extrabotany.sunshine_lily": "Sunshine Lily",
"block.extrabotany.sunshine_lily.reference": "May the light heal and enlighten you",
"effect.extrabotany.balance": "Balance",
"effect.extrabotany.blood_temptation": "Blood Temptation",
"effect.extrabotany.divine_justice": "Divine Justice",
"effect.extrabotany.remember": "Remember",
"effect.extrabotany.time_lock": "Time Lock",
"effect.extrabotany.vegetable": "Green Hat",
"entity.extrabotany.aura_fire": "Aura Fire",
@@ -76,6 +78,9 @@
"entity.extrabotany.ego_landmine": "EGO Landmine",
"entity.extrabotany.ego_minion": "EGO Minion",
"entity.extrabotany.false_lighting": "Simulated Lightning",
"entity.extrabotany.influxwaver": "Influx Waver",
"entity.extrabotany.magic_arrow": "Magic Arrow",
"entity.extrabotany.phantom_sword": "Sword of Zenith",
"entity.extrabotany.splash_grenade": "Splash Grenade",
"entity.extrabotany.trueshadowkatana": "True Shadow Katana",
"entity.extrabotany.trueterrablade": "True Terra Blade",
@@ -120,6 +125,7 @@
"extrabotany.entry.elementstone": "Stones of Four Element",
"extrabotany.entry.excaliber": "Excaliber",
"extrabotany.entry.failnaught": "Failnaught",
"extrabotany.entry.forest_book": "Aranyaka",
"extrabotany.entry.frostring": "Frost Star",
"extrabotany.entry.gemini_orchid": "Gemini Orchid",
"extrabotany.entry.genesis_crystal": "Genesis Crystal",
@@ -202,6 +208,8 @@
"extrabotany.page.excaliber1": "",
"extrabotany.page.failnaught0": "The $(item)Failnaught$(0) uses $(thing)Mana$(0) to shoot magic arrows which pierce through enemies and deal damage to the creatures in the area. The longer you draw the bow, the more damage it will deal.",
"extrabotany.page.failnaught1": "A hundred shots, a hundred bullseyes.",
"extrabotany.page.forest_book0": "With $(item)Golden Apple$(0) and the power of Nature, you can craft (item)Aranyaka$(0). Right click will cost 8 $(thing)HP$(0) to let you gain 5 $(thing)Golden Hearts$(0) and Effect $(thing)Remember$(0) for 5 seconds. After 5 seconds, every $(thing)Golden Heart$(0) will be converted into 1 $(thing)hp$(0), capped at 5.",
"extrabotany.page.forest_book1": "\"Hello,\" \"Thank You,\" and the Final \"Goodbye\".",
"extrabotany.page.frostring0": "The $(item)Frost Star$(0) freezes large areas of water and lava. It also applies slowness creatures looked at by the wearer.",
"extrabotany.page.frostring1": "I am the frozen heart of the Scourge!",
"extrabotany.page.gemini_orchid0": "A $(item)Gemini Orchid$(0) is like a thermoelectric generator. If you place a block of lava in one of eight blocks nearby, and then place a block of water in another position, it will begin to produce mana. The higher the gap between two blocks' temperatures, the quicker mana will be generated. Since it is a passive flower, it will decay after working for 3 days in minecraft..",
@@ -210,6 +218,8 @@
"extrabotany.page.genesis_crystal1": "Craft Primo Gem.",
"extrabotany.page.genesis_crystal2": "Craft Intertwined Fate.",
"extrabotany.page.genesis_crystal3": "Craft Acquaint Fate.",
"extrabotany.page.genesis_crystal4": "Wish Pool",
"extrabotany.page.genesis_crystal5": "Right click the $(item)Dimension Catalyst$(0) with $(item)Intertwined Fate$(0) or $(item)Acquaint Fate$(0) to start wish!",
"extrabotany.page.gildedpotato0": "The Gilded Potato may have other uses. It might be useful in the future.",
"extrabotany.page.gildedpotato1": "There is a miracle, something magical.",
"extrabotany.page.gildedpotato2": "A mashed potato made from gilded potato. It could be delicious.",
@@ -303,6 +313,7 @@
"extrabotany.page.true_swords0": "$(item)Gaia Spirit$(0) and other materials can unleash the true power of some of the weapons you have. These weapons will also be more powerful in Gaia's hands.",
"extrabotany.page.true_terra_blade": "An upgrade to $(item)Terra Blade$(0). Its projectile will pierce through enemies.",
"extrabotany.page.true_thunstar_caller": "An upgrade to $(item)Thunder Caller$(0) and $(item)Star Caller$(0). It summons lightning from sky. However, it is not true lightning. A burning enemy will increase the damage due to Overload.",
"extrabotany.wish.is_active": "Someone is using this!!",
"extrabotanymisc.description": "You can not use it until you complete corresponding advancement <%s>.",
"extrabotanymisc.inventoryUnfeasible": "You have something that isn't allowed in this boss fight. Check your inventory and tips in the lexicon again!",
"extrabotanymisc.unlegalPlayercount": "There are more people than there were when the boss is summoned. That's illegal!",
@@ -313,11 +324,15 @@
"item.extrabotany.black_glasses": "Black Glasses",
"item.extrabotany.cock_tail": "Special-made Cocktail of %s (%s)",
"item.extrabotany.death_ring": "Curse Ring",
"item.extrabotany.dirt_shield": "Magic Dirt Shield",
"item.extrabotany.earth_stone": "Earth Stone",
"item.extrabotany.element_rune": "Rune of Element",
"item.extrabotany.elementium_shield": "Elementium Shield",
"item.extrabotany.empty_bottle": "Empty Mana Glass Bottle",
"item.extrabotany.excaliber": "Excaliber",
"item.extrabotany.failnaught": "Failnaught",
"item.extrabotany.first_fractal": "First Fractal",
"item.extrabotany.forest_book": "Aranyaka",
"item.extrabotany.fox_ear": "Fox Ear",
"item.extrabotany.fox_mask": "Mask with Memory",
"item.extrabotany.fried_chicken": "Fried Chicken",

View File

@@ -67,8 +67,10 @@
"block.extrabotany.serenitian.reference": "\u65E0\u5FF5\uFF0C\u65AD\u7EDD",
"block.extrabotany.sunshine_lily": "\u65E5\u8000\u767E\u5408",
"block.extrabotany.sunshine_lily.reference": "\u613F\u5149\u8292\u80FD\u6CBB\u6108\u5E76\u6307\u5F15\u4F60",
"effect.extrabotany.balance": "\u5E73\u8861",
"effect.extrabotany.blood_temptation": "\u8840\u4E4B\u8BF1\u60D1",
"effect.extrabotany.divine_justice": "\u795E\u5723\u88C1\u51B3",
"effect.extrabotany.remember": "\u94ED\u8BB0",
"effect.extrabotany.time_lock": "\u65F6\u7A7A\u9501\u5B9A",
"effect.extrabotany.vegetable": "\u7EFF\u610F\u76CE\u7136",
"entity.extrabotany.aura_fire": "\u706B\u7130",
@@ -76,6 +78,9 @@
"entity.extrabotany.ego_landmine": "\u672C\u6211\u5730\u96F7",
"entity.extrabotany.ego_minion": "\u672C\u6211\u4EC6\u4ECE",
"entity.extrabotany.false_lighting": "\u4EFF\u771F\u95EA\u7535",
"entity.extrabotany.influxwaver": "\u6CE2\u6D8C\u4E4B\u5203",
"entity.extrabotany.magic_arrow": "\u9B54\u6CD5\u7BAD\u77E2",
"entity.extrabotany.phantom_sword": "\u5929\u9876\u5251",
"entity.extrabotany.splash_grenade": "\u5723\u6C34\u624B\u96F7",
"entity.extrabotany.trueshadowkatana": "\u771F\u00B7\u5F71\u5203",
"entity.extrabotany.trueterrablade": "\u771F\u00B7\u6CF0\u62C9\u4E4B\u5203",
@@ -106,8 +111,6 @@
"extrabotany.brew.revolution": "\u9769\u547D",
"extrabotany.brew.shell": "\u9F9F\u58F3",
"extrabotany.category.extrabotany": "\u989D\u5916\u7684\u77E5\u8BC6",
"extrabotany.chouka.is_active": "\u6709\u73A9\u5BB6\u6B63\u5728\u4F7F\u7528\u8FD9\u4E2A\u62BD\u5361\u6C60\uFF01\uFF01",
"extrabotany.chouka.multiblock_error": "\u4E0D\u5728\u6B63\u786E\u7684\u62BD\u5361\u6C60\u4E0A\uFF01",
"extrabotany.entry.advancedmaterial": "\u9AD8\u7B49\u5F62\u5F0F",
"extrabotany.entry.aerialite": "\u5929\u7A7A\u952D",
"extrabotany.entry.annoying_flower": "\u795E\u70E6\u82B1",
@@ -121,6 +124,7 @@
"extrabotany.entry.elementstone": "\u5143\u7D20\u7B26\u77F3",
"extrabotany.entry.excaliber": "\u738B\u8005\u5723\u5251",
"extrabotany.entry.failnaught": "\u767E\u4E2D\u5F13",
"extrabotany.entry.forest_book": "\u68EE\u6797\u4E66",
"extrabotany.entry.frostring": "\u971C\u51BB\u4E4B\u661F",
"extrabotany.entry.gemini_orchid": "\u53CC\u5B50\u5170",
"extrabotany.entry.genesis_crystal": "\u521B\u4E16\u7ED3\u6676",
@@ -204,6 +208,8 @@
"extrabotany.page.excaliber1": "",
"extrabotany.page.failnaught0": "$(item)\u767E\u4E2D\u5F13$(0)\u53EF\u4EE5\u6D88\u8017\u9B54\u529B\u53D1\u5C04\u51FA\u4E00\u652F\u80FD\u591F\u8D2F\u7A7F\u654C\u4EBA\u7684\u7BAD\u77E2\uFF0C\u8FD9\u652F\u7BAD\u80FD\u5BF9\u5468\u56F4\u8F83\u5927\u8303\u56F4\u654C\u4EBA\u9020\u6210\u4F24\u5BB3\u3002\u84C4\u529B\u65F6\u95F4\u8D8A\u4E45\uFF0C\u7BAD\u77E2\u7684\u4F24\u5BB3\u5C31\u8D8A\u9AD8\uFF0C\u98DE\u884C\u8DDD\u79BB\u4E5F\u8D8A\u957F\u3002",
"extrabotany.page.failnaught1": "\u767E\u53D1\u767E\u4E2D\u3002",
"extrabotany.page.forest_book0": "\u5C06$(item)\u91D1\u82F9\u679C$(0)\u548C\u81EA\u7136\u7684\u529B\u91CF\u704C\u6CE8\u8FDB\u4E66\u672C\u53EF\u4EE5\u5236\u4F5C$(item)\u68EE\u6797\u4E66$(0)\u3002\u53F3\u51FB\u4F1A\u53D7\u52308\u70B9$(thing)\u771F\u5B9E\u4F24\u5BB3$(0)\u5E76\u83B7\u5F9710\u70B9$(thing)\u751F\u547D\u5438\u6536$(0)\u548C5\u79D2\u949F\u7684$(thing)\u94ED\u8BB0$(0)\u6548\u679C\u30025\u79D2\u540E\u6D88\u8017\u6700\u591A5\u9897\u91D1\u5FC3\u56DE\u590D\u6700\u591A5\u751F\u547D\u503C\u3002",
"extrabotany.page.forest_book1": "\u201C\u4F60\u597D\u201D\uFF0C\u201C\u8C22\u8C22\u201D\uFF0C\u6700\u540E\u662F\u201C\u518D\u89C1\u201D\u3002",
"extrabotany.page.frostring0": "$(item)\u971C\u51BB\u4E4B\u661F$(0)\u80FD\u8BA9\u88C5\u5907\u8005\u884C\u8D70\u65F6\u51BB\u7ED3\u811A\u4E0B\u5927\u8303\u56F4\u7684\u6C34\u548C\u5CA9\u6D46\uFF0C\u5E76\u4F1A\u4F7F\u5C0F\u8303\u56F4\u5185\u88C5\u5907\u8005\u6240\u89C6\u7684\u751F\u7269\u5927\u5E45\u51CF\u901F\u3002",
"extrabotany.page.frostring1": "\u6211\u662F\u5929\u707E\u7684\u51B0\u51BB\u4E4B\u5FC3\u3002",
"extrabotany.page.gemini_orchid0": "$(item)\u53CC\u5B50\u5170$(0)\u76F8\u5F53\u4E8E\u4E00\u53F0\u6E29\u5DEE\u53D1\u7535\u673A\u3002\u5047\u5982\u4F60\u5728\u5176\u5468\u56F48\u683C\u5185\u4E00\u683C\u5012\u5165\u5CA9\u6D46\uFF0C\u4E00\u683C\u5012\u5165\u6C34\uFF0C\u5B83\u5C31\u4F1A\u5F00\u59CB\u4EA7\u51FA$(thing)\u9B54\u529B$(0)\u30028\u683C\u5185\u7684\u6700\u5927\u6E29\u5DEE\u8D8A\u5927\uFF0C$(thing)\u9B54\u529B$(0)\u4EA7\u51FA\u4E5F\u5C31\u8D8A\u5FEB\u3002<br>\u6CE8\u610F\uFF0C\u8FD9\u662F\u4E00\u6735\u88AB\u52A8\u4EA7\u80FD\u82B1\uFF0C\u4F1A\u57283\u4E2Aminecraft\u65E5\u540E\u67AF\u840E\u3002",
@@ -212,6 +218,8 @@
"extrabotany.page.genesis_crystal1": "\u4F7F\u7528\u521B\u4E16\u7ED3\u6676\u83B7\u53D6\u539F\u77F3\u3002",
"extrabotany.page.genesis_crystal2": "\u5408\u6210\u7EA0\u7F20\u4E4B\u7F18\u3002",
"extrabotany.page.genesis_crystal3": "\u5408\u6210\u76F8\u9047\u4E4B\u7F18\u3002",
"extrabotany.page.genesis_crystal4": "\u7948\u613F\u6C60",
"extrabotany.page.genesis_crystal5": "\u4F7F\u7528$(item)\u7EA0\u7F20\u4E4B\u7F18\uFFE5(0)\u6216\u8005$(item)\u76F8\u9047\u4E4B\u7F18$(0)\u53F3\u51FB$(item)\u6B21\u5143\u50AC\u5316\u5242$(0)\u5F00\u59CB\u7948\u613F\u3002",
"extrabotany.page.gildedpotato0": "\u9540\u91D1\u4E86\u7684\u571F\u8C46\uFF0C\u53EF\u80FD\u5728\u672A\u6765\u4F1A\u6709\u5927\u7528\u5904\u3002",
"extrabotany.page.gildedpotato1": "\u5947\u8FF9\u548C\u9B54\u6CD5\u90FD\u662F\u5B58\u5728\u7684",
"extrabotany.page.gildedpotato2": "\u9540\u91D1\u571F\u8C46\u505A\u6210\u7684\u571F\u8C46\u6CE5\uFF0C\u98DF\u7528\u540E\u4F1A\u83B7\u5F97\u610F\u60F3\u4E0D\u5230\u7684\u6548\u679C\u3002",
@@ -306,6 +314,7 @@
"extrabotany.page.true_swords0": "\u7ECF\u8FC7\u7814\u7A76\uFF0C$(item)\u76D6\u4E9A\u4E4B\u9B42$(0)\u548C\u5176\u4ED6\u6750\u6599\u80FD\u591F\u89E3\u653E\u4F60\u6240\u62E5\u6709\u7684\u4E00\u4E9B\u6B66\u5668\u7684\u771F\u6B63\u529B\u91CF\u3002\u56E0\u6B64\uFF0C\u8FD9\u4E9B\u6B66\u5668\u5728\u76D6\u4E9A\u7684\u624B\u4E2D\u4E5F\u5C06\u66F4\u52A0\u5F3A\u5927\u3002",
"extrabotany.page.true_terra_blade": "$(item)\u6CF0\u62C9\u4E4B\u5203$(0)\u7684\u5347\u7EA7\u7248\u3002\u6BCF\u6B21\u6325\u52A8\u90FD\u4F1A\u53D1\u5C04\u53EF\u4EE5\u8D2F\u7A7F\u654C\u4EBA\u7684\u5251\u6C14\u3002",
"extrabotany.page.true_thunstar_caller": "$(item)\u53EC\u96F7\u8005\u548C\u53EC\u661F\u8005$(0)\u7684\u5347\u7EA7\u7248\u3002\u6BCF\u6B21\u6325\u52A8\u4F1A\u4ECE\u5929\u4E0A\u5BFC\u5F15\u51FA\u95EA\u7535\u3002\u867D\u7136\u8DDD\u79BB\u771F\u6B63\u7684\u95EA\u7535\u5C1A\u6709\u4E0D\u8DB3\uFF0C\u4F46\u7528\u4E8E\u653B\u51FB\u5DF2\u7ECF\u8DB3\u591F\u3002\u5F53\u51FB\u4E2D\u7740\u706B\u7684\u654C\u4EBA\u65F6\u4F1A\u56E0\u4E3A\u8D85\u8F7D\u7684\u539F\u56E0\u589E\u52A0\u4F24\u5BB3\u3002",
"extrabotany.wish.is_active": "\u6709\u73A9\u5BB6\u6B63\u5728\u4F7F\u7528\u8FD9\u4E2A\u7948\u613F\u6C60\uFF01\uFF01",
"extrabotanymisc.description": "\u4F60\u65E0\u6CD5\u4F7F\u7528\u8BE5\u7269\u54C1\u76F4\u5230\u4F60\u5B8C\u6210\u8FDB\u5EA6 <%s>\u3002",
"extrabotanymisc.inventoryUnfeasible": "\u4F60\u7684\u80CC\u5305\u91CC\u5305\u542B\u8FDD\u7981\u7269\u54C1\uFF0C\u8BF7\u518D\u6B21\u68C0\u67E5\u4F60\u7684\u80CC\u5305\uFF01",
"extrabotanymisc.unlegalPlayercount": "\u5728\u573A\u73A9\u5BB6\u6570\u5927\u4E8E\u53EC\u5524\u65F6\u7684\u73A9\u5BB6\u6570\uFF0C\u8FD9\u662F\u4E0D\u7B26\u5408\u89C4\u5219\u7684\uFF01",
@@ -316,11 +325,15 @@
"item.extrabotany.black_glasses": "\u9ED1\u6846\u773C\u955C",
"item.extrabotany.cock_tail": "\u88C5\u6709%s (%s)\u79D8\u5236\u9E21\u5C3E\u9152",
"item.extrabotany.death_ring": "\u8BC5\u5492\u6307\u73AF",
"item.extrabotany.dirt_shield": "\u9B54\u529B\u6CE5\u571F\u76FE\u724C",
"item.extrabotany.earth_stone": "\u5730\u4E4B\u7B26\u77F3",
"item.extrabotany.element_rune": "\u5143\u7075\u7B26\u6587",
"item.extrabotany.elementium_shield": "\u6E90\u8D28\u94A2\u76FE\u724C",
"item.extrabotany.empty_bottle": "\u9B54\u6CD5\u73BB\u7483\u7A7A\u74F6",
"item.extrabotany.excaliber": "\u738B\u8005\u5723\u5251",
"item.extrabotany.failnaught": "\u767E\u4E2D\u5F13",
"item.extrabotany.first_fractal": "\u6700\u521D\u5206\u578B",
"item.extrabotany.forest_book": "\u68EE\u6797\u4E66",
"item.extrabotany.fox_ear": "\u6A31\u6A31\u8033",
"item.extrabotany.fox_mask": "\u9644\u6709\u8BB0\u5FC6\u7684\u9762\u5177",
"item.extrabotany.fried_chicken": "\u9999\u9999\u9E21",

View File

@@ -0,0 +1,34 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"minecraft:forest_book"
]
},
"criteria": {
"lexicon": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"items": [
"botania:lexicon"
]
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "minecraft:forest_book"
}
}
},
"requirements": [
[
"lexicon",
"has_the_recipe"
]
]
}

View File

@@ -0,0 +1,26 @@
{
"type": "minecraft:crafting_shaped",
"group": "extrabotany",
"pattern": [
"bab",
"b#b",
"bcb"
],
"key": {
"#": {
"item": "botania:lexicon"
},
"c": {
"item": "botania:rune_fire"
},
"a": {
"item": "minecraft:golden_apple"
},
"b": {
"tag": "minecraft:leaves"
}
},
"result": {
"item": "extrabotany:forest_book"
}
}

View File

@@ -19,7 +19,7 @@ public class ExtraBotany
public static final String MODID = "extrabotany";//mod name
public static final String TAB_NAME = "extrabotany";//Name in creative inventury
private static final Logger LOGGER = LogUtils.getLogger();
public static final Logger LOGGER = LogUtils.getLogger();
public static final CreativeModeTab ITEM_GROUP = new CreativeModeTab(TAB_NAME)
{

View File

@@ -1,9 +1,6 @@
package chick.extrabotany.common;
import chick.extrabotany.common.effects.BloodTempation;
import chick.extrabotany.common.effects.DivineJustice;
import chick.extrabotany.common.effects.TimeLock;
import chick.extrabotany.common.effects.Vegetable;
import chick.extrabotany.common.effects.*;
import chick.extrabotany.common.libs.LibEffectNames;
import net.minecraft.world.effect.MobEffect;
import net.minecraftforge.registries.DeferredRegister;
@@ -20,6 +17,8 @@ public class ModEffects
public static final RegistryObject<MobEffect> VEGETABLE = MOB_EFFECTS.register(LibEffectNames.VEGETABLE, Vegetable::new);
public static final RegistryObject<MobEffect> DIVINE_JUSTICE = MOB_EFFECTS.register(LibEffectNames.DIVINE_JUSTICE, DivineJustice::new);
public static final RegistryObject<MobEffect> TIME_LOCK = MOB_EFFECTS.register(LibEffectNames.TIME_LOCK, TimeLock::new);
public static final RegistryObject<MobEffect> BALANCE = MOB_EFFECTS.register(LibEffectNames.BALANCE, Balance::new);
public static final RegistryObject<MobEffect> REMEMBER = MOB_EFFECTS.register(LibEffectNames.REMEMBER, Remember::new);
public static DeferredRegister<MobEffect> getEffects()
{

View File

@@ -7,6 +7,7 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.player.Player;
import org.jetbrains.annotations.Nullable;
import vazkii.botania.common.handler.EquipmentHandler;
import java.util.List;
@@ -16,12 +17,20 @@ public final class DamageHandler
{
public static final DamageHandler INSTANCE = new DamageHandler();
public final int NETURAL = 0;
public final int MAGIC = 1;
public final int NETURAL_PIERCING = 2;
public final int MAGIC_PIERCING = 3;
public final int LIFE_LOSING = 4;
public final int LIFE_LOSINT_ABSORB = 5;
public final int BYPASS_ARMOR = 1,
BYPASS_MAGIC = 1 << 1,
BYPASS_ABSORB = 1 << 2,
BYPASS_INVUL = 1 << 3,
SCALE_WITH_DIFFICULTY = 1 << 4,
FIRE = 1 << 5,
MAGIC = 1 << 6,
PROJECTILE = 1 << 7,
EXPLOSION = 1 << 8,
NO_AGGRO = 1 << 9,
FALL = 1 << 10,
CREATIVE = 1 << 12;
/**
* 判断是否可行,source为player并且佩戴和平友好之证的时候无法对友好生物不extend Mob的造成伤害
@@ -29,7 +38,7 @@ public final class DamageHandler
*/
public boolean checkPassable(Entity target, Entity source)
{
if (target == source)
if (target == source || target.isRemoved())
return false;
if (source instanceof Player sourcePlayer)
{
@@ -67,50 +76,8 @@ public final class DamageHandler
*/
public boolean dmg(Entity target, Entity source, float amount, int type)
{
if (target == null || !checkPassable(target, source))
return false;
switch (type)
{
case NETURAL ->
{
if (source instanceof Player player)
{
return target.hurt(DamageSource.playerAttack(player), amount);
} else if (source instanceof LivingEntity living)
{
return target.hurt(DamageSource.mobAttack(living), amount);
} else
{
return target.hurt(DamageSource.GENERIC, amount);
}
}
case MAGIC ->
{
DamageSource s = source == null ? DamageSource.MAGIC : DamageSource.indirectMagic(source, source);
return target.hurt(s, amount);
}
case NETURAL_PIERCING ->
{
target.setInvulnerable(false);
if (source instanceof Player player)
{
DamageSource s = DamageSource.playerAttack(player).bypassArmor().bypassMagic();
return target.hurt(s, amount);
} else if (source instanceof LivingEntity living)
{
DamageSource s = DamageSource.mobAttack(living).bypassArmor().bypassMagic();
return target.hurt(s, amount);
} else
{
return target.hurt(DamageSource.GENERIC, amount);
}
}
case MAGIC_PIERCING ->
{
target.setInvulnerable(false);
DamageSource s = source == null ? DamageSource.MAGIC.bypassArmor().bypassMagic() : DamageSource.indirectMagic(source, source).bypassMagic().bypassArmor();
return target.hurt(s, amount);
}
case LIFE_LOSING ->
{
if (!(target instanceof LivingEntity living))
@@ -118,7 +85,6 @@ public final class DamageHandler
float trueHealth = Math.max(0F, living.getHealth() - amount);
if (trueHealth <= 0)
{
dmg(target, source, 0.01F, NETURAL);
if (source instanceof Player player)
living.die(DamageSource.playerAttack(player));
else if (source instanceof LivingEntity livingEntity)
@@ -129,37 +95,87 @@ public final class DamageHandler
{
living.setHealth(trueHealth);
}
return dmg(target, source, 0.01F, NETURAL);
}
case LIFE_LOSINT_ABSORB ->
{
if (!(target instanceof LivingEntity living))
return false;
float currentYellowHealth = living.getAbsorptionAmount();
if (currentYellowHealth >= amount)
{
living.setAbsorptionAmount(living.getAbsorptionAmount() - amount);
} else
{
float trueHealth = Math.max(0F, living.getHealth() - amount + living.getAbsorptionAmount());
living.setAbsorptionAmount(0);
if (trueHealth <= 0)
{
dmg(target, source, 0.01F, NETURAL);
if (source instanceof Player player)
living.die(DamageSource.playerAttack(player));
else if (source instanceof LivingEntity livingEntity)
living.die(DamageSource.mobAttack(livingEntity));
if (living.getHealth() > 0)
living.setHealth(-1F);
} else
{
living.setHealth(trueHealth);
}
}
return dmg(target, source, 0.01F, NETURAL);
return true;
}
}
return false;
}
public boolean doDamage(Entity target, DamageSource s, float amount, boolean bypassInvulnerable, int type)
{
if (target == null || target.isRemoved())
return false;
if (s.getEntity() != null && !checkPassable(target, s.getEntity()))
return false;
if (bypassInvulnerable)
{
target.invulnerableTime = 0;
}
return hurt(target, s, amount, type);
}
public boolean doDamage(Entity target, DamageSource s, float amount, int type)
{
if (target == null || target.isRemoved())
return false;
if (s.getEntity() != null && !checkPassable(target, s.getEntity()))
return false;
return hurt(target, s, amount, type);
}
public boolean doDamage(Entity target, @Nullable Entity item, Entity source, float amount, boolean bypassInvulnerable, int type)
{
DamageSource s;
if (source instanceof Player player)
{
s = DamageSource.playerAttack(player);
} else
{
var mob = (LivingEntity) source;
s = (item == null) ? DamageSource.mobAttack(mob) : DamageSource.indirectMobAttack(item, mob);
}
return doDamage(target, s, amount, bypassInvulnerable, type);
}
private boolean hurt(Entity target, DamageSource s, float amount, int type)
{
if ((type & BYPASS_ARMOR) > 0)
s.bypassArmor();
if ((type & BYPASS_MAGIC) > 0)
s.bypassMagic();
float absorbNum = 0;
if ((type & BYPASS_ABSORB) > 0 && target instanceof Player player)
{
absorbNum = player.getAbsorptionAmount();
player.setAbsorptionAmount(0);
}
if ((type & BYPASS_INVUL) > 0)
target.invulnerableTime = 0;
if ((type & SCALE_WITH_DIFFICULTY) > 0)
s.setScalesWithDifficulty();
if ((type & FIRE) > 0)
s.setIsFire();
if ((type & MAGIC) > 0)
s.setMagic();
if ((type & PROJECTILE) > 0)
s.setProjectile();
if ((type & EXPLOSION) > 0)
s.setExplosion();
if ((type & NO_AGGRO) > 0)
s.setNoAggro();
if ((type & FALL) > 0)
s.setIsFall();
//TODO: THIS MAY CAUSE WRONG IN PVP MODE
if ((type & CREATIVE) > 0)
s.bypassInvul();
//do damage here
boolean result = target.hurt(s, amount);
if ((type & BYPASS_ABSORB) > 0 && target instanceof Player player && !target.isRemoved())
{
player.setAbsorptionAmount(absorbNum);
}
return result;
}
}

View File

@@ -11,6 +11,7 @@ import net.minecraft.Util;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
@@ -138,12 +139,8 @@ public class TileDimensionCatalyst extends TileMod
level.playSound(null, player.getX(), player.getY(), player.getZ(), ModSounds.chouka, SoundSource.PLAYERS, 20F, 1F);
} else
{
player.sendMessage(new TextComponent("is active!").withStyle(ChatFormatting.RED), Util.NIL_UUID);
player.sendMessage(new TranslatableComponent("extrabotany.wish.is_active").withStyle(ChatFormatting.RED), Util.NIL_UUID);
}
} else
{
player.sendMessage(new TextComponent("chouka failed!").withStyle(ChatFormatting.RED), Util.NIL_UUID);
}
}
return true;

View File

@@ -0,0 +1,12 @@
package chick.extrabotany.common.effects;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectCategory;
public class Balance extends MobEffect
{
public Balance()
{
super(MobEffectCategory.NEUTRAL, 0xffffff);
}
}

View File

@@ -4,7 +4,6 @@ import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.ItemStack;

View File

@@ -0,0 +1,31 @@
package chick.extrabotany.common.effects;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
public class Remember extends MobEffect
{
public Remember()
{
super(MobEffectCategory.BENEFICIAL, 0x00FF7F);
}
@Override
public boolean isDurationEffectTick(int duration, int amp)
{
return duration == 1;
}
@Override
public void applyEffectTick(LivingEntity living, int amp)
{
if (living instanceof Player player)
{
float amount = Math.min(player.getAbsorptionAmount(), (amp + 1) * 10F);
player.heal(amount / 2F);
player.setAbsorptionAmount(player.getAbsorptionAmount() - amount);
}
}
}

View File

@@ -1,11 +1,7 @@
package chick.extrabotany.common.entities.ego;
import chick.extrabotany.common.ModItems;
import chick.extrabotany.common.entities.ego.EntityEGO;
import chick.extrabotany.common.tools.weapons.InfluxWaver;
import chick.extrabotany.common.tools.weapons.TrueShadowKatana;
import chick.extrabotany.common.tools.weapons.TrueTerraBlade;
import chick.extrabotany.common.tools.weapons.TrueThunStarCaller;
import chick.extrabotany.common.tools.weapons.*;
import chick.extrabotany.forge.client.handler.ConfigHandler;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
@@ -65,11 +61,13 @@ public class EGOGoal extends Goal
if (!entityEGO.level.isClientSide)
{
if (entityEGO.getPlayersAround().isEmpty())
{
entityEGO.discard();
return false;
}
entityEGO.swing(InteractionHand.MAIN_HAND);
Entity target = entityEGO.getPlayersAround().get(0);
var damageTimes = (ConfigHandler.COMMON.gaiaDamageTimes.get()).floatValue();
//TODO weapon type
switch (entityEGO.getWeaponType())
{
case 0 ->
@@ -79,18 +77,16 @@ public class EGOGoal extends Goal
case 2 ->
((TrueThunStarCaller) ModItems.TRUE_THUNSTAR_CALLER.get()).attack(entityEGO, target, 1, 1D, damageTimes);
case 3 -> ((InfluxWaver) ModItems.INFLUX_WAVER.get()).attack(entityEGO, target, 1, 1.1D, damageTimes);
case 4 ->
((TrueTerraBlade) ModItems.TRUE_TERRA_BLADE.get()).attack(entityEGO, target, 4, 1.1D, damageTimes);
case 4 -> ((FirstFractal) ModItems.FIRST_FRACTAL.get()).attack(entityEGO, target, 1, 1D, damageTimes);
}
}
if (entityEGO.getWeaponType() > 0)
changeWeaponAfter();
if (entityEGO.getWeaponType() > 0) changeWeaponAfter();
return true;
}
public void changeWeaponBefore()
{
if (entityEGO.getStage() > 1)
if (entityEGO.getStage() > 1 && entityEGO.getStage() < 3)
{
for (var player : entityEGO.getPlayersAround())
{
@@ -105,10 +101,10 @@ public class EGOGoal extends Goal
public void changeWeaponAfter()
{
if (entityEGO.getStage() > 1)
if (entityEGO.getStage() == 2)
{
Random random = new Random();
entityEGO.setWeaponType(random.nextInt(2));
entityEGO.setWeaponType(random.nextInt(3));
}
}

View File

@@ -404,7 +404,6 @@ public class EntityEGO extends Monster implements IEntityAdditionalSpawnData
private static final Pattern FAKE_PLAYER_PATTERN = Pattern.compile("^(?:\\[.*\\])|(?:ComputerCraft)$");
//--------------------------------------------------------------------------------
public static boolean isTruePlayer(Entity e)
{
if (!(e instanceof Player player))
@@ -835,9 +834,12 @@ public class EntityEGO extends Monster implements IEntityAdditionalSpawnData
} else if (getStage() == 2 && getHealth() < 0.05F * getMaxHealth())
{
setStage(3);
setWeaponType(4);
setInvulTime(460);
tpDelay = 460;
this.setPos(source.getX() + 0.5, source.getY() + 3, source.getZ() + 0.5);
Collections.shuffle(WAVES);
wave = 0;
var beam = new EntityEGOBeam(level);
Vec3 vec = new Vec3(6, 0, 0);

View File

@@ -11,6 +11,7 @@ import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.world.Difficulty;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.item.ItemEntity;
@@ -33,7 +34,6 @@ import static chick.extrabotany.common.blocks.tile.TileDimensionCatalyst.VEC_OFF
public class EntityEGOBeam extends Entity
{
private boolean doAttack;
private List<WeightCategory> stackList = new ArrayList<>();
private Player target;
@@ -47,6 +47,8 @@ public class EntityEGOBeam extends Entity
private static final String TAG_TARGET_COLOR_B = "targetcolorb";
private static final String TAG_SPEED_MODIFIER = "speedmodifier";
private static final String TAG_DAMAGE = "damage";
private static final String TAG_DO_ATTACK = "do_attack";
private static final EntityDataAccessor<Boolean> DO_ATTACK = SynchedEntityData.defineId(EntityEGOBeam.class, EntityDataSerializers.BOOLEAN);
private static final EntityDataAccessor<Float> COLOR_R = SynchedEntityData.defineId(EntityEGOBeam.class, EntityDataSerializers.FLOAT);
private static final EntityDataAccessor<Float> COLOR_G = SynchedEntityData.defineId(EntityEGOBeam.class, EntityDataSerializers.FLOAT);
private static final EntityDataAccessor<Float> COLOR_B = SynchedEntityData.defineId(EntityEGOBeam.class, EntityDataSerializers.FLOAT);
@@ -64,23 +66,24 @@ public class EntityEGOBeam extends Entity
public EntityEGOBeam(Level level)
{
super(ModEntities.EGO_BEAM, level);
doAttack = true;
entityData.set(DO_ATTACK, true);
}
public EntityEGOBeam(Level level, boolean doAttack, List<WeightCategory> stackList, Color targetColor, Player target)
{
super(ModEntities.EGO_BEAM, level);
this.doAttack = doAttack;
this.stackList.addAll(stackList);
this.target = target;
setTargetColorR((float) (targetColor.getRed()) / 255F);
setTargetColorG((float) (targetColor.getGreen()) / 255F);
setTargetColorB((float) (targetColor.getBlue()) / 255F);
entityData.set(DO_ATTACK, doAttack);
}
@Override
protected void defineSynchedData()
{
entityData.define(DO_ATTACK, true);
entityData.define(COLOR_R, 0.0F);
entityData.define(COLOR_G, 0.0F);
entityData.define(COLOR_B, 0.0F);
@@ -100,6 +103,7 @@ public class EntityEGOBeam extends Entity
this.setTargetColorR(cmp.getFloat(TAG_TARGET_COLOR_R));
this.setTargetColorG(cmp.getFloat(TAG_TARGET_COLOR_G));
this.setTargetColorB(cmp.getFloat(TAG_TARGET_COLOR_B));
this.entityData.set(DO_ATTACK, cmp.getBoolean(TAG_DO_ATTACK));
}
@Override
@@ -113,6 +117,7 @@ public class EntityEGOBeam extends Entity
cmp.putFloat(TAG_TARGET_COLOR_B, this.getTargetColorB());
cmp.putFloat(TAG_SPEED_MODIFIER, this.getSpeedModifier());
cmp.putFloat(TAG_DAMAGE, this.getBeamDamage());
cmp.putBoolean(TAG_DO_ATTACK, this.entityData.get(DO_ATTACK));
}
@NotNull
@@ -126,7 +131,7 @@ public class EntityEGOBeam extends Entity
public void tick()
{
super.tick();
if (doAttack)
if (entityData.get(DO_ATTACK))
{
if (this.tickCount >= 460 || level.getDifficulty() == Difficulty.PEACEFUL)
{
@@ -156,10 +161,7 @@ public class EntityEGOBeam extends Entity
for (Player player : players)
{
if (player.invulnerableTime <= 5)
{
DamageHandler.INSTANCE.dmg(player, summoner, this.getBeamDamage(), DamageHandler.INSTANCE.LIFE_LOSINT_ABSORB);
}
DamageHandler.INSTANCE.doDamage(player, DamageSource.indirectMagic(this, summoner), this.getBeamDamage(), DamageHandler.INSTANCE.CREATIVE);
}
} else
{
@@ -183,10 +185,20 @@ public class EntityEGOBeam extends Entity
double d0 = (getX());
double d1 = (getY() + 0.5D + 4D);
double d2 = (getZ());
Collections.shuffle(VEC_OFFSET);
List<Vec3> vecs;
if (stackList.size() > 1)
{
Collections.shuffle(VEC_OFFSET);
vecs = VEC_OFFSET;
} else
{
vecs = List.of(Vec3.ZERO);
}
for (int i = 0; i < stackList.size(); i++)
{
var vec = VEC_OFFSET.get(i);
var vec = vecs.get(i);
var item = stackList.get(i).getCategory().copy();
ItemEntity entity = new ItemEntity(level, d0 + vec.x, d1 + vec.y, d2 + vec.z, item);
entity.setPickUpDelay(30);
@@ -208,9 +220,9 @@ public class EntityEGOBeam extends Entity
{
WispParticleData data = WispParticleData.wisp(0.5F, 0.1F, 0.85F, 0.1F, 1F);
ClientProxy.INSTANCE.addParticleForceNear(level, data, getX() + i, getY() + 4.5F, getZ() + j, 0, 0, 0);
}
}
}
}

View File

@@ -272,7 +272,7 @@ public class EntityEGOLandmine extends Entity
List<Player> players = level.getEntitiesOfClass(Player.class, getBoundingBox().inflate(0, 12, 0));
for (Player player : players)
{
DamageHandler.INSTANCE.dmg(player, summoner, 5F, DamageHandler.INSTANCE.LIFE_LOSINT_ABSORB);
DamageHandler.INSTANCE.doDamage(player, DamageSource.indirectMagic(this, summoner), 5F, 0);
switch (getLandmineType())
{
default ->
@@ -293,7 +293,7 @@ public class EntityEGOLandmine extends Entity
player.setItemInHand(InteractionHand.OFF_HAND, ItemStack.EMPTY);
}
case 2 ->
DamageHandler.INSTANCE.dmg(player, summoner, 15F, DamageHandler.INSTANCE.LIFE_LOSINT_ABSORB);
DamageHandler.INSTANCE.doDamage(player, DamageSource.indirectMagic(this, summoner), 20F, 0);
}
}
}

View File

@@ -4,6 +4,7 @@ import chick.extrabotany.common.ModEntities;
import chick.extrabotany.common.base.DamageHandler;
import chick.extrabotany.common.entities.projectile.relic_projectile.RelicProjectileBase;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
@@ -43,7 +44,8 @@ public class EntityAuraFire extends RelicProjectileBase
if (result.getEntity() != player)
{
float dmg = DamageHandler.calcDamage(5F, player);
DamageHandler.INSTANCE.dmg(result.getEntity(), player, dmg, DamageHandler.INSTANCE.NETURAL_PIERCING);
DamageHandler.INSTANCE.doDamage(result.getEntity(), DamageSource.indirectMagic(this,getOwner()), dmg, DamageHandler.INSTANCE.FIRE);
player.setAbsorptionAmount(Math.min(10, player.getAbsorptionAmount() + 1F));
discard();
}

View File

@@ -2,17 +2,25 @@ package chick.extrabotany.common.entities.projectile;
import chick.extrabotany.common.ModEntities;
import chick.extrabotany.common.base.DamageHandler;
import chick.extrabotany.forge.client.handler.ConfigHandler;
import net.minecraft.core.Vec3i;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.ThrowableProjectile;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BeaconBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.LevelEvent;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.network.NetworkHooks;
import org.jetbrains.annotations.NotNull;
import vazkii.botania.client.core.proxy.ClientProxy;
@@ -39,6 +47,23 @@ public class EntityMagicArrow extends ThrowableProjectile
setOwner(thrower);
}
@Override
protected void onHitBlock(BlockHitResult hitResult)
{
var state = level.getBlockState(hitResult.getBlockPos());
var hardness = state.getDestroySpeed(level, hitResult.getBlockPos());
var vec3 = getDeltaMovement();
setDeltaMovement(Vec3.ZERO);
if (ConfigHandler.COMMON.doProjectileBreakBlock.get() && !(state.getBlock() instanceof BeaconBlock))
{
level.removeBlock(hitResult.getBlockPos(), false);
level.levelEvent(LevelEvent.PARTICLES_DESTROY_BLOCK, hitResult.getBlockPos(), Block.getId(state));
tickCount += 2;
setDeltaMovement(vec3);
}
super.onHitBlock(hitResult);
}
@Override
protected void defineSynchedData()
{
@@ -72,7 +97,7 @@ public class EntityMagicArrow extends ThrowableProjectile
var livings = DamageHandler.INSTANCE.getFilteredEntities(entities, player);
for (LivingEntity living : livings)
{
DamageHandler.INSTANCE.dmg(living, player, getDamage(), DamageHandler.INSTANCE.NETURAL_PIERCING);
DamageHandler.INSTANCE.doDamage(living, DamageSource.indirectMagic(this,getOwner()), getDamage(), DamageHandler.INSTANCE.BYPASS_MAGIC);
}
}

View File

@@ -9,6 +9,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.EntityType;
@@ -17,6 +18,7 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.ThrowableProjectile;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import vazkii.botania.client.core.proxy.ClientProxy;
@@ -58,7 +60,7 @@ public class EntityInfluxWaverProjectile extends RelicProjectileBase
super.tick();
if (this.removeFlag != -1)
if (getDeltaMovement().equals(Vec3.ZERO) || this.removeFlag != -1)
return;
if (level.isClientSide && tickCount % 2 == 0)
@@ -78,17 +80,10 @@ public class EntityInfluxWaverProjectile extends RelicProjectileBase
{
if (!living.isRemoved())
{
//TODO WIP
living.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 1));
if (getOwner() instanceof Player)
{
DamageHandler.INSTANCE.dmg(living, getOwner(), 12F * damageTime, DamageHandler.INSTANCE.NETURAL);
} else
{
if (living.invulnerableTime == 0)
DamageHandler.INSTANCE.dmg(living, getOwner(), 2.5F * damageTime, DamageHandler.INSTANCE.LIFE_LOSING);
DamageHandler.INSTANCE.dmg(living, getOwner(), 7F * damageTime, DamageHandler.INSTANCE.MAGIC);
}
DamageHandler.INSTANCE.doDamage(living, DamageSource.indirectMagic(this, getOwner()), 7F * damageTime, DamageHandler.INSTANCE.SCALE_WITH_DIFFICULTY + DamageHandler.INSTANCE.PROJECTILE);
DamageHandler.INSTANCE.doDamage(living, DamageSource.indirectMagic(this, getOwner()), 3F * damageTime, DamageHandler.INSTANCE.BYPASS_INVUL + DamageHandler.INSTANCE.SCALE_WITH_DIFFICULTY + DamageHandler.INSTANCE.PROJECTILE);
flag = living.isRemoved();
if (getStrikeTimes() > 0 && !flag)
{

View File

@@ -15,6 +15,7 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.ThrowableProjectile;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@@ -72,16 +73,15 @@ public class EntityPhantomSword extends RelicProjectileBase
return;
}
if (getFake())
{
this.setDeltaMovement(0D, 0D, 0D);
return;
}
super.tick();
if (getDeltaMovement().equals(Vec3.ZERO))
return;
if (!level.isClientSide && !getFake() && this.tickCount % 6 == 0)
{
EntityPhantomSword illusion = new EntityPhantomSword(level);
@@ -100,14 +100,16 @@ public class EntityPhantomSword extends RelicProjectileBase
List<LivingEntity> list = DamageHandler.INSTANCE.getFilteredEntities(entities, getOwner());
for (LivingEntity living : list)
{
//TODO:WIP
DamageHandler.INSTANCE.doDamage(living, this, getOwner(), 10F * damageTime, true, DamageHandler.INSTANCE.BYPASS_MAGIC + DamageHandler.INSTANCE.PROJECTILE);
if (getOwner() instanceof Player)
{
DamageHandler.INSTANCE.dmg(living, getOwner(), 10F * damageTime, DamageHandler.INSTANCE.MAGIC_PIERCING);
} else
} else
{
DamageHandler.INSTANCE.dmg(living, getOwner(), 10F * damageTime, DamageHandler.INSTANCE.MAGIC);
// DamageHandler.INSTANCE.dmg(living, getOwner(), 10F * damageTime, DamageHandler.INSTANCE.MAGIC);
}
DamageHandler.INSTANCE.dmg(living, getOwner(), 2.5F * damageTime, DamageHandler.INSTANCE.LIFE_LOSING);
//DamageHandler.INSTANCE.doDamage(living, getOwner(), 2.5F * damageTime, true,DamageHandler.INSTANCE.LIFE_LOSING);
}
}
}

View File

@@ -5,11 +5,13 @@ import chick.extrabotany.forge.client.model.MiscellaneousIcons;
import chick.extrabotany.common.base.DamageHandler;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.ThrowableProjectile;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@@ -43,14 +45,14 @@ public class EntityTrueShadowKatanaProjectile extends RelicProjectileBase
public EntityTrueShadowKatanaProjectile(Level level, LivingEntity thrower, float damageTime)
{
super(ModEntities.TRUE_SHADOW_KATANA, level, thrower,damageTime);
super(ModEntities.TRUE_SHADOW_KATANA, level, thrower, damageTime);
}
@Override
public void tick()
{
super.tick();
if (this.tickCount <= 3)
if (getDeltaMovement().equals(Vec3.ZERO) || this.tickCount <= 3)
return;
if (level.isClientSide && tickCount % 2 == 0)
{
@@ -63,11 +65,10 @@ public class EntityTrueShadowKatanaProjectile extends RelicProjectileBase
List<LivingEntity> list = DamageHandler.INSTANCE.getFilteredEntities(entities, getOwner());
for (LivingEntity living : list)
{
living.setInvulnerable(false);
DamageHandler.INSTANCE.dmg(living, getOwner(), 5.5F * damageTime, DamageHandler.INSTANCE.MAGIC);
DamageHandler.INSTANCE.doDamage(living, this, getOwner(), 6F * damageTime, false, DamageHandler.INSTANCE.PROJECTILE + DamageHandler.INSTANCE.SCALE_WITH_DIFFICULTY);
if (attackedEntities != null && !attackedEntities.contains(living))
{
DamageHandler.INSTANCE.dmg(living, getOwner(), 2F * damageTime, DamageHandler.INSTANCE.LIFE_LOSINT_ABSORB);
DamageHandler.INSTANCE.doDamage(living, this, getOwner(), 2F * damageTime, true, DamageHandler.INSTANCE.PROJECTILE + DamageHandler.INSTANCE.SCALE_WITH_DIFFICULTY);
attackedEntities.add(living);
}
discard();
@@ -75,6 +76,7 @@ public class EntityTrueShadowKatanaProjectile extends RelicProjectileBase
}
}
}
@OnlyIn(Dist.CLIENT)
@Override
public BakedModel getIcon()

View File

@@ -4,11 +4,13 @@ import chick.extrabotany.common.ModEntities;
import chick.extrabotany.forge.client.model.MiscellaneousIcons;
import chick.extrabotany.common.base.DamageHandler;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.ThrowableProjectile;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import vazkii.botania.client.core.proxy.ClientProxy;
@@ -25,13 +27,15 @@ public class EntityTrueTerraBladeProjectile extends RelicProjectileBase
public EntityTrueTerraBladeProjectile(Level level, LivingEntity thrower, float damageTime)
{
super(ModEntities.TRUE_TERRA_BLADE, level, thrower,damageTime);
super(ModEntities.TRUE_TERRA_BLADE, level, thrower, damageTime);
}
@Override
public void tick()
{
super.tick();
if (getDeltaMovement().equals(Vec3.ZERO))
return;
if (level.isClientSide && tickCount % 2 == 0)
{
WispParticleData data = WispParticleData.wisp(0.3F, 0.1F, 0.95F, 0.1F, 1F);
@@ -44,10 +48,11 @@ public class EntityTrueTerraBladeProjectile extends RelicProjectileBase
List<LivingEntity> list = DamageHandler.INSTANCE.getFilteredEntities(entities, getOwner());
for (LivingEntity living : list)
{
DamageHandler.INSTANCE.dmg(living, getOwner(), 7F * damageTime, DamageHandler.INSTANCE.MAGIC);
DamageHandler.INSTANCE.doDamage(living, DamageSource.indirectMagic(this, getOwner()), 7F * damageTime, DamageHandler.INSTANCE.PROJECTILE + DamageHandler.INSTANCE.SCALE_WITH_DIFFICULTY);
if (attackedEntities != null && !attackedEntities.contains(living))
{
DamageHandler.INSTANCE.dmg(living, getOwner(), 2F * damageTime, DamageHandler.INSTANCE.LIFE_LOSING);
DamageHandler.INSTANCE.doDamage(living, DamageSource.indirectMagic(this, getOwner()), 2F * damageTime, DamageHandler.INSTANCE.BYPASS_INVUL + DamageHandler.INSTANCE.PROJECTILE + DamageHandler.INSTANCE.SCALE_WITH_DIFFICULTY)
;
attackedEntities.add(living);
}
tickCount += 20;

View File

@@ -210,8 +210,6 @@ public abstract class RelicProjectileBase extends ThrowableProjectile
float damageTimes = (getOwner() instanceof Player) ? 1.0F : 3.0F;
if (tickCount > getLifeTicks() * damageTimes)
discard();
if (getDeltaMovement().equals(Vec3.ZERO))
return;
}
public abstract int getLifeTicks();

View File

@@ -1,6 +1,7 @@
package chick.extrabotany.common.items.lens;
import chick.extrabotany.common.base.DamageHandler;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
@@ -35,7 +36,7 @@ public class LenSuperConductor extends Lens
{
if (!burst.isFake())
{
DamageHandler.INSTANCE.dmg(living, null, living instanceof Player ? 25F : 8F, DamageHandler.INSTANCE.MAGIC_PIERCING);
DamageHandler.INSTANCE.doDamage(living, DamageSource.MAGIC, living instanceof Player ? 25F : 8F, 0);
}
}
}

View File

@@ -6,4 +6,6 @@ public class LibEffectNames
public static final String TIME_LOCK = "time_lock";
public static final String DIVINE_JUSTICE = "divine_justice";
public static final String VEGETABLE = "vegetable";
public static final String BALANCE = "balance";
public static final String REMEMBER = "remember";
}

View File

@@ -1,10 +1,15 @@
package chick.extrabotany.common.tools.others;
import chick.extrabotany.common.ModEffects;
import chick.extrabotany.common.base.DamageHandler;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
public class ForestBook extends Item
@@ -16,18 +21,19 @@ public class ForestBook extends Item
@NotNull
@Override
public InteractionResult useOn(UseOnContext ctx)
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand)
{
if (ctx.getPlayer() != null && !ctx.getLevel().isClientSide && ctx.getPlayer().getHealth() > 0)
var stack = player.getItemInHand(hand);
if (!level.isClientSide && player.getHealth() > 0)
{
//TODO应该有一个buff标记以免二次使用
if (ctx.getPlayer().getAbsorptionAmount() < 10F)
if (player.getAbsorptionAmount() < 10F && !player.hasEffect(ModEffects.REMEMBER.get()))
{
ctx.getPlayer().hurt(DamageSource.MAGIC.bypassArmor().bypassInvul().bypassMagic(), 10.0F);
ctx.getPlayer().setAbsorptionAmount(ctx.getPlayer().getAbsorptionAmount() + 10.0F);
return InteractionResult.SUCCESS;
DamageHandler.INSTANCE.doDamage(player, DamageSource.MAGIC, 8.0F, DamageHandler.INSTANCE.CREATIVE + DamageHandler.INSTANCE.BYPASS_INVUL + DamageHandler.INSTANCE.BYPASS_MAGIC + DamageHandler.INSTANCE.BYPASS_ABSORB);
player.setAbsorptionAmount(10.0F);
player.addEffect(new MobEffectInstance(ModEffects.REMEMBER.get(), 5 * 20, 0));
return InteractionResultHolder.success(stack);
}
}
return InteractionResult.FAIL;
return InteractionResultHolder.fail(stack);
}
}

View File

@@ -170,7 +170,7 @@ public class Excaliber extends SwordRelicBase implements ILensEffect, ICustomDam
float damage = BotaniaAPI.instance().getTerrasteelItemTier().getAttackDamageBonus() + 3F;
if (!burst.isFake() && !entity.level.isClientSide)
{
DamageHandler.INSTANCE.dmg(living, thrower, damage, DamageHandler.INSTANCE.NETURAL_PIERCING);
DamageHandler.INSTANCE.doDamage(living, burst.entity(), thrower, damage, false, 0);
entity.discard();
break;
}

View File

@@ -60,7 +60,8 @@ public class Failnaught extends ItemLivingwoodBow implements ICustomDamageItem,
var stack = player.getItemInHand(hand);
if (ManaItemHandler.instance().requestManaExactForTool(stack, player, 800, false))
{
return InteractionResultHolder.success(stack);
player.startUsingItem(hand);
return InteractionResultHolder.consume(stack);
} else
{
return InteractionResultHolder.fail(stack);

View File

@@ -15,6 +15,7 @@ import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity;
import net.minecraft.world.item.Tiers;
import net.minecraft.world.phys.AABB;
import org.jetbrains.annotations.NotNull;
import static vazkii.botania.common.item.equipment.bauble.ItemBauble.getBaubleUUID;
@@ -52,7 +53,30 @@ public class FirstFractal extends SwordRelicBase implements IAdvancementRequirem
@Override
public void attack(LivingEntity player, Entity target, int times, double speedTime, float damageTime)
{
BlockPos targetpos = target == null ? raytraceFromEntity(player, 80F, true).getBlockPos().offset(0, 1, 0) : new BlockPos(target.position()).offset(0, 1, 0);
BlockPos targetpos = BlockPos.ZERO;
if (target == null)
{
boolean haveEntity = false;
for (int i = 1; i <= 13; i++)
{
var list = player.level.getEntitiesOfClass(LivingEntity.class,
new AABB(raytraceFromEntity(player, 5 * i, true).getBlockPos().offset(0, 1, 0)).inflate(3));
list.remove(player);
if (!list.isEmpty())
{
targetpos = list.get(0).blockPosition().offset(0, 1, 0);
haveEntity = true;
break;
}
}
if (!haveEntity)
{
targetpos = raytraceFromEntity(player, 64D, true).getBlockPos().offset(0, 1, 0);
}
} else
{
targetpos = new BlockPos(target.position()).offset(0, 1, 0);
}
double range = 5D;
double j = -Math.PI + 2 * Math.PI * Math.random();
double k;
@@ -69,7 +93,7 @@ public class FirstFractal extends SwordRelicBase implements IAdvancementRequirem
sword.setPos(x, y, z);
sword.faceTarget(1.05F);
sword.setDeltaMovement(sword.getDeltaMovement().scale(speedTime).scale(0.5D));
sword.setDeltaMovement(sword.getDeltaMovement().scale(speedTime).scale(0.4D));
player.level.addFreshEntity(sword);

View File

@@ -80,11 +80,9 @@ public class TrueShadowKatana extends SwordRelicBase
Vec3 axis = look.normalize().cross(new Vec3(-1, 0, -1)).normalize();
double rot = mod * Math.PI / 4 - Math.PI / 4;
Vec3 axis1 = axis.scale(div * 2.5 + 2).lerp(look, rot);
//TODO what does rotate change to?
//whats this?
//rotate(rot, look);
//VecHelper.rotate()
//Vec3 axis1 = axis.scale(div * 2.5 + 2).lerp(look, rot);
var axis1 = VecHelper.rotate(axis.scale(div * 2.5 + 2), rot, look);
if (axis1.y < 0)
{
axis1 = axis1.multiply(1, -1, 1);
@@ -100,10 +98,12 @@ public class TrueShadowKatana extends SwordRelicBase
player.level.addFreshEntity(proj);
}
}
public static IRelic makeRelic(ItemStack stack)
{
return new RelicImpl(stack, new ResourceLocation(ExtraBotany.MODID,"challenge/true_shadow_katana"));
return new RelicImpl(stack, new ResourceLocation(ExtraBotany.MODID, "challenge/true_shadow_katana"));
}
@Override
public void attack(LivingEntity player, Entity target)
{

View File

@@ -50,24 +50,28 @@ public class TrueThunStarCaller extends SwordRelicBase
damage = 7F - (float) newList.size() * 0.2F;
else if (newList.size() <= 10)
damage = 11F - (float) newList.size();
DamageHandler.INSTANCE.dmg(livingEntity, player, damage * damageTime, DamageHandler.INSTANCE.LIFE_LOSING);
EntityFalseLightning falseLightning = new EntityFalseLightning(ModEntities.FALSE_LIGHTNING, player.level);
falseLightning.setPos(livingEntity.position());
player.level.addFreshEntity(falseLightning);
int i = DamageHandler.INSTANCE.MAGIC + DamageHandler.INSTANCE.BYPASS_MAGIC + DamageHandler.INSTANCE.BYPASS_ARMOR + DamageHandler.INSTANCE.SCALE_WITH_DIFFICULTY;
DamageHandler.INSTANCE.doDamage(livingEntity, falseLightning, player, damage * damageTime, true, i + DamageHandler.INSTANCE.BYPASS_ABSORB);
livingEntity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 20, 3));
livingEntity.addEffect(new MobEffectInstance(MobEffects.WEAKNESS, 20, 0));
if (livingEntity.isOnFire())
{
DamageHandler.INSTANCE.dmg(livingEntity, player, 5F * damageTime, DamageHandler.INSTANCE.LIFE_LOSING);
DamageHandler.INSTANCE.doDamage(livingEntity, falseLightning, player, 5F * damageTime, true, i);
livingEntity.setRemainingFireTicks(0);
Minecraft.getInstance().level.addParticle(ParticleTypes.EXPLOSION_EMITTER, livingEntity.getX(), livingEntity.getY(), livingEntity.getZ(), 1D, 0D, 0D);
}
}
}
}
public static IRelic makeRelic(ItemStack stack)
{
return new RelicImpl(stack, new ResourceLocation(ExtraBotany.MODID,"challenge/true_thunstar_caller"));
return new RelicImpl(stack, new ResourceLocation(ExtraBotany.MODID, "challenge/true_thunstar_caller"));
}
}

View File

@@ -26,6 +26,8 @@ public class EN_USLanguageProvider extends LanguageProvider
add(ModEffects.DIVINE_JUSTICE.get(), "Divine Justice");
add(ModEffects.VEGETABLE.get(), "Green Hat");
add(ModEffects.TIME_LOCK.get(), "Time Lock");
add(ModEffects.REMEMBER.get(), "Remember");
add(ModEffects.BALANCE.get(), "Balance");
add(ModItems.NIGHTMARE_FUEL.get(), "Nightmare Fuel");
add(ModItems.SPIRIT_FUEL.get(), "Spirit Fuel");
@@ -97,6 +99,8 @@ public class EN_USLanguageProvider extends LanguageProvider
add(ModItems.MANASTEEL_SHIELD.get(), "Mana Steel Shield");
add(ModItems.ELEMENT_SHIELD.get(), "Elementium Shield");
add(ModItems.DIRT_SHIELD.get(), "Magic Dirt Shield");
add(ModItems.FOREST_BOOK.get(), "Aranyaka");
add(ModItems.SHADOW_KATANA.get(), "Shadow Katana");
add(ModItems.LIVINGWOOD_CROSSBOW.get(), "Livingwood Crossbow");
add(ModItems.TRUE_SHADOW_KATANA.get(), "True Shadow Katana");
@@ -104,6 +108,8 @@ public class EN_USLanguageProvider extends LanguageProvider
add(ModItems.TRUE_THUNSTAR_CALLER.get(), "True Thunstar Caller");
add(ModItems.INFLUX_WAVER.get(), "Influx Waver");
add(ModItems.FIRST_FRACTAL.get(), "First Fractal");
add(ModItems.FAILNAUGHT.get(), "Failnaught");
add(ModItems.EXCALIBER.get(), "Excaliber");
add(ModItems.SHADOW_WARRIOR_HELM.get(), "Shadow Warrior Helmet");
add(ModItems.SHADOW_WARRIOR_CHEST.get(), "Shadow Warrior Chestplate");
@@ -136,6 +142,7 @@ public class EN_USLanguageProvider extends LanguageProvider
add("extrabotanymisc.inventoryUnfeasible", "You have something that isn't allowed in this boss fight. Check your inventory and tips in the lexicon again!");
add("extrabotanymisc.unlegalPlayercount", "There are more people than there were when the boss is summoned. That's illegal!");
add("extrabotanymisc.description", "You can not use it until you complete corresponding advancement <%s>.");
otherLangs();
langFlower();
langAdvancement();
langPantchouli();
@@ -147,6 +154,9 @@ public class EN_USLanguageProvider extends LanguageProvider
add(ModEntities.FALSE_LIGHTNING, "Simulated Lightning");
add(ModEntities.TRUE_SHADOW_KATANA, "True Shadow Katana");
add(ModEntities.TRUE_TERRA_BLADE, "True Terra Blade");
add(ModEntities.INFLUX_WAVER, "Influx Waver");
add(ModEntities.MAGIC_ARROW, "Magic Arrow");
add(ModEntities.PHANTOM_SWORD, "Sword of Zenith");
}
private void langFlower()
@@ -212,11 +222,13 @@ public class EN_USLanguageProvider extends LanguageProvider
add("advancement.extrabotany:moonpendantcraft.title", "Crystalline");
add("advancement.extrabotany:moonpendantcraft.desc", "Obtain Heart of Corrupted Moon");
}
private void prefixAdvancement(String name, String title, String text)
{
add("advancement.extrabotany:" + name + ".title", title);
add("advancement.extrabotany:" + name + ".desc", text);
}
private void langPantchouli()
{
add("extrabotany.category.extrabotany", "Extra Knowledge");
@@ -386,6 +398,9 @@ public class EN_USLanguageProvider extends LanguageProvider
add("extrabotany.page.genesis_crystal1", "Craft Primo Gem.");
add("extrabotany.page.genesis_crystal2", "Craft Intertwined Fate.");
add("extrabotany.page.genesis_crystal3", "Craft Acquaint Fate.");
add("extrabotany.page.genesis_crystal4", "Wish Pool");
add("extrabotany.page.genesis_crystal5", "Right click the $(item)Dimension Catalyst$(0) with $(item)Intertwined Fate$(0) or $(item)Acquaint Fate$(0) to start wish!");
add("extrabotany.entry.livingwood_crossbow", "Livingwood Crossbow");
add("extrabotany.page.livingwood_crossbow0", "Similar to how Livingwood Bow was created, $(item)Livingwood$(0), $(item)Mana Steel$(0) and $(item)Mana String$(0) can be used to craft sturdier %(item)Livingwood Crossbow$(0). It will also repair itself using $(thing)Mana$(0).");
add("extrabotany.page.livingwood_crossbow1", "Does it shoot airplanes?");
@@ -395,20 +410,22 @@ public class EN_USLanguageProvider extends LanguageProvider
add("extrabotany.page.true_terra_blade", "An upgrade to $(item)Terra Blade$(0). Its projectile will pierce through enemies.");
add("extrabotany.page.true_shadow_katana", "An upgrade to $(item)Shadow Katana$(0). It could summon two projection that automatically trace enemies.");
add("extrabotany.page.influx_waver", "Its projectile will constantly attack the first entity it contacts..");
add("extrabotany.entry.failnaught","Failnaught");
add("extrabotany.page.failnaught0","The $(item)Failnaught$(0) uses $(thing)Mana$(0) to shoot magic arrows which pierce through enemies and deal damage to the creatures in the area. The longer you draw the bow, the more damage it will deal.");
add("extrabotany.page.failnaught1","A hundred shots, a hundred bullseyes.");
add("extrabotany.entry.buddhistrelics","Origin Creation - Omniscience");
add("extrabotany.page.buddhistrelics0","$(item)Origin Creation - The Omniscience$(0) relic can simulate some of the Relics by pressing ctrl to switch its form. Keeping other forms will cost $(thing)Mana$(0). With insufficient mana it will change to its original form.");
add("extrabotany.entry.excaliber","Excaliber");
add("extrabotany.page.excaliber0","$(item)Excaliber$(0) could shoot golden mana beam that will automatically trace enemies in a large area.");
add("extrabotany.page.excaliber1","");
add("extrabotany.entry.failnaught", "Failnaught");
add("extrabotany.page.failnaught0", "The $(item)Failnaught$(0) uses $(thing)Mana$(0) to shoot magic arrows which pierce through enemies and deal damage to the creatures in the area. The longer you draw the bow, the more damage it will deal.");
add("extrabotany.page.failnaught1", "A hundred shots, a hundred bullseyes.");
add("extrabotany.entry.buddhistrelics", "Origin Creation - Omniscience");
add("extrabotany.page.buddhistrelics0", "$(item)Origin Creation - The Omniscience$(0) relic can simulate some of the Relics by pressing ctrl to switch its form. Keeping other forms will cost $(thing)Mana$(0). With insufficient mana it will change to its original form.");
add("extrabotany.entry.excaliber", "Excaliber");
add("extrabotany.page.excaliber0", "$(item)Excaliber$(0) could shoot golden mana beam that will automatically trace enemies in a large area.");
add("extrabotany.page.excaliber1", "");
add("extrabotany.entry.manasteel_shield", "Mana Shield");
add("extrabotany.page.manasteel_shield0", "Wooden Shield is too easy to damage. Using $(item)Mana Steel$(0) to replace $(item)Iron$(0) may be better.");
add("extrabotany.page.manasteel_shield1", "Circling the square.");
add("extrabotany.page.manasteel_shield2", "Adding $(item)Dirt(0) to the crafting materials will make the shield more compatible with the ground. Right-clicking at the ground will quickly create a wall of $(item)Dirt$(0). However, this makes the shield less durable and lose its original defensive ability.");
add("extrabotany.page.manasteel_shield3", "Is it strong enough?");
add("extrabotany.entry.forest_book", "Aranyaka");
add("extrabotany.page.forest_book0", "With $(item)Golden Apple$(0) and the power of Nature, you can craft $(item)Aranyaka$(0). Right click will cost 8 $(thing)HP$(0) to let you gain 5 $(thing)Golden Hearts$(0) and Effect $(thing)Remember$(0) for 5 seconds. After 5 seconds, every $(thing)Golden Heart$(0) will be converted into 1 $(thing)hp$(0), capped at 5.");
add("extrabotany.page.forest_book1", "\"Hello,\" \"Thank You,\" and the Final \"Goodbye\".");
add("extrabotany.page.title.example", "An Example");
pantchouliFlower();
}
@@ -433,10 +450,10 @@ public class EN_USLanguageProvider extends LanguageProvider
add("extrabotany.entry.reikarorchid", "Reikar Lily");
add("extrabotany.page.reikarorchid0", "The $(item)Reikar Lily$(0) turns the tremendous energy of lightning into $(thing)Mana$(0). When a lightning bolt hits nearby, it will generate a great amount of $(thing)Mana$(0) immediately. $(item)Reikar Lily$(0) itself could attract thunder. To absorb the lightning, the flower must not have any $(thing)Mana$(0) stored in it-- otherwise, it will explode.");
add("extrabotany.page.reikarorchid1", "I Choose You!");
add("extrabotany.entry.bloodyenchantress","Bloody Enchantress");
add("extrabotany.page.bloodyenchantress0","The $(item)Bloody Enchantress$(0) creates $(thing)Mana$(0) by consuming nearby creatures' life. Creatures sacrificed to the Bloody Enchantress will not produce any drops or experience.");
add("extrabotany.page.bloodyenchantress1","Every bite will add a effect called Blood Temptation and overlay with higher amplifier one, the mana production will decrease according to the level of Blood Temptation, and the flower will stop working if the total level of Blood Temptation of all the creatures nearby is over a threshold.");
add("extrabotany.page.bloodyenchantress2","The only cure is death.");
add("extrabotany.entry.bloodyenchantress", "Bloody Enchantress");
add("extrabotany.page.bloodyenchantress0", "The $(item)Bloody Enchantress$(0) creates $(thing)Mana$(0) by consuming nearby creatures' life. Creatures sacrificed to the Bloody Enchantress will not produce any drops or experience.");
add("extrabotany.page.bloodyenchantress1", "Every bite will add a effect called Blood Temptation and overlay with higher amplifier one, the mana production will decrease according to the level of Blood Temptation, and the flower will stop working if the total level of Blood Temptation of all the creatures nearby is over a threshold.");
add("extrabotany.page.bloodyenchantress2", "The only cure is death.");
add("extrabotany.entry.serenitian", "Serenitian");
add("extrabotany.page.serenitian0", "$(item)Serenitian$(0) could prevent passive flowers nearby at the same floor from fading away, and set the fading progress to zero.");
@@ -448,4 +465,9 @@ public class EN_USLanguageProvider extends LanguageProvider
add("extrabotany.page.annoying_flower3", "Neither an angel or a devil.");
}
private void otherLangs()
{
add("extrabotany.wish.is_active", "Someone is using this!!");
}
}

View File

@@ -26,6 +26,8 @@ public class ZH_CNLanguageProvider extends LanguageProvider
add(ModEffects.DIVINE_JUSTICE.get(), "神圣裁决");
add(ModEffects.VEGETABLE.get(), "绿意盎然");
add(ModEffects.TIME_LOCK.get(), "时空锁定");
add(ModEffects.REMEMBER.get(), "铭记");
add(ModEffects.BALANCE.get(), "平衡");
add(ModItems.NIGHTMARE_FUEL.get(), "梦魇燃料");
add(ModItems.SPIRIT_FUEL.get(), "精神燃料");
@@ -99,6 +101,8 @@ public class ZH_CNLanguageProvider extends LanguageProvider
add(ModItems.MANASTEEL_SHIELD.get(), "魔力钢盾牌");
add(ModItems.ELEMENT_SHIELD.get(), "源质钢盾牌");
add(ModItems.DIRT_SHIELD.get(), "魔力泥土盾牌");
add(ModItems.FOREST_BOOK.get(), "森林书");
add(ModItems.SHADOW_KATANA.get(), "影刃");
add(ModItems.LIVINGWOOD_CROSSBOW.get(), "活木弩");
add(ModItems.TRUE_SHADOW_KATANA.get(), "真·影刃");
@@ -106,6 +110,8 @@ public class ZH_CNLanguageProvider extends LanguageProvider
add(ModItems.TRUE_THUNSTAR_CALLER.get(), "真·星雷者");
add(ModItems.INFLUX_WAVER.get(), "波涌之刃");
add(ModItems.FIRST_FRACTAL.get(), "最初分型");
add(ModItems.FAILNAUGHT.get(), "百中弓");
add(ModItems.EXCALIBER.get(), "王者圣剑");
add(ModItems.SHADOW_WARRIOR_HELM.get(), "暗影武士头盔");
@@ -151,6 +157,9 @@ public class ZH_CNLanguageProvider extends LanguageProvider
add(ModEntities.FALSE_LIGHTNING, "仿真闪电");
add(ModEntities.TRUE_SHADOW_KATANA, "真·影刃");
add(ModEntities.TRUE_TERRA_BLADE, "真·泰拉之刃");
add(ModEntities.INFLUX_WAVER, "波涌之刃");
add(ModEntities.MAGIC_ARROW, "魔法箭矢");
add(ModEntities.PHANTOM_SWORD, "天顶剑");
}
private void langFlower()
@@ -392,6 +401,9 @@ public class ZH_CNLanguageProvider extends LanguageProvider
add("extrabotany.page.genesis_crystal1", "使用创世结晶获取原石。");
add("extrabotany.page.genesis_crystal2", "合成纠缠之缘。");
add("extrabotany.page.genesis_crystal3", "合成相遇之缘。");
add("extrabotany.page.genesis_crystal4", "祈愿池");
add("extrabotany.page.genesis_crystal5", "使用$(item)纠缠之缘¥(0)或者$(item)相遇之缘$(0)右击$(item)次元催化剂$(0)开始祈愿。");
add("extrabotany.entry.livingwood_crossbow", "活木弩");
add("extrabotany.page.livingwood_crossbow0", "仿照活木弓的方式,可以用$(item)活木$(0)、$(item)魔力钢锭$(0)和$(item)蕴魔丝线(0)制造更加耐用的活木弩。此外,它也可以用魔力修复。");
add("extrabotany.page.livingwood_crossbow1", "它能把飞机打下来么?");
@@ -417,6 +429,9 @@ public class ZH_CNLanguageProvider extends LanguageProvider
add("extrabotany.page.manasteel_shield1", "化方为圆。");
add("extrabotany.page.manasteel_shield2", "在制作材料中加入$(item)泥土(0)会让盾牌和大地的亲和能力更强,右击地面可以迅速创建一堵土墙。不幸的是,这让盾牌的耐久显著降低了,并且失去了普通的防御能力。");
add("extrabotany.page.manasteel_shield3", "它会掉渣吗。");
add("extrabotany.entry.forest_book", "森林书");
add("extrabotany.page.forest_book0", "将$(item)金苹果$(0)和自然的力量灌注进书本可以制作$(item)森林书$(0)。右击会受到8点$(thing)真实伤害$(0)并获得10点$(thing)生命吸收$(0)和5秒钟的$(thing)铭记$(0)效果。5秒后消耗最多5颗金心回复最多5生命值。");
add("extrabotany.page.forest_book1", "“你好”,“谢谢”,最后是“再见”。");
pantchouliFlower();
}
@@ -457,7 +472,6 @@ public class ZH_CNLanguageProvider extends LanguageProvider
private void otherLangs()
{
add("extrabotany.chouka.multiblock_error", "不在正确的抽卡池上");
add("extrabotany.chouka.is_active", "有玩家正在使用这个抽卡池!!");
add("extrabotany.wish.is_active", "有玩家正在使用这个祈愿池!");
}
}

View File

@@ -7,6 +7,8 @@ import chick.extrabotany.common.libs.LibItemNames;
import net.minecraft.advancements.critereon.InventoryChangeTrigger;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.recipes.*;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Blocks;
import net.minecraftforge.common.Tags;
@@ -489,6 +491,17 @@ public class ModCraftingTableRecipes extends RecipeProvider
.group(MODID)
.unlockedBy("shield", InventoryChangeTrigger.TriggerInstance.hasItems(vazkii.botania.common.item.ModItems.elementium))
.save(consumer, LibItemNames.ELEMENT_SHIELD);
ShapedRecipeBuilder.shaped(ModItems.FOREST_BOOK.get())
.pattern("bab")
.pattern("b#b")
.pattern("bcb")
.define('#', vazkii.botania.common.item.ModItems.lexicon)
.define('c', vazkii.botania.common.item.ModItems.runeFire)
.define('a', Items.GOLDEN_APPLE)
.define('b', ItemTags.LEAVES)
.group(MODID)
.unlockedBy("lexicon", InventoryChangeTrigger.TriggerInstance.hasItems(vazkii.botania.common.item.ModItems.lexicon))
.save(consumer, LibItemNames.FOREST_BOOK);
}
private void armorRecipes(Consumer<FinishedRecipe> consumer)
@@ -500,7 +513,7 @@ public class ModCraftingTableRecipes extends RecipeProvider
.define('x', ModItems.SHADOW_INGOT.get())
.group(MODID)
.unlockedBy("shadowium", InventoryChangeTrigger.TriggerInstance.hasItems(ModItems.SHADOW_INGOT.get()))
.save(consumer, "shadowwarrior_helm");
.save(consumer, LibItemNames.SHADOWWARRIOR_HELM);
ShapedRecipeBuilder.shaped(ModItems.SHADOW_WARRIOR_CHEST.get())
.pattern("x x")
.pattern("xxx")
@@ -508,7 +521,7 @@ public class ModCraftingTableRecipes extends RecipeProvider
.define('x', ModItems.SHADOW_INGOT.get())
.group(MODID)
.unlockedBy("shadowium", InventoryChangeTrigger.TriggerInstance.hasItems(ModItems.SHADOW_INGOT.get()))
.save(consumer, "shadowwarrior_chest");
.save(consumer, LibItemNames.SHADOWWARRIOR_CHEST);
ShapedRecipeBuilder.shaped(ModItems.SHADOW_WARRIOR_LEGS.get())
.pattern("xxx")
.pattern("x x")
@@ -516,7 +529,7 @@ public class ModCraftingTableRecipes extends RecipeProvider
.define('x', ModItems.SHADOW_INGOT.get())
.group(MODID)
.unlockedBy("shadowium", InventoryChangeTrigger.TriggerInstance.hasItems(ModItems.SHADOW_INGOT.get()))
.save(consumer, "shadowwarrior_legs");
.save(consumer, LibItemNames.SHADOWWARRIOR_LEGS);
ShapedRecipeBuilder.shaped(ModItems.SHADOW_WARRIOR_BOOTS.get())
.pattern("x x")
.pattern("x x")
@@ -524,7 +537,7 @@ public class ModCraftingTableRecipes extends RecipeProvider
.define('x', ModItems.SHADOW_INGOT.get())
.group(MODID)
.unlockedBy("shadowium", InventoryChangeTrigger.TriggerInstance.hasItems(ModItems.SHADOW_INGOT.get()))
.save(consumer, "shadowwarrior_boots");
.save(consumer, LibItemNames.SHADOWWARRIOR_BOOTS);
ShapedRecipeBuilder.shaped(ModItems.GOBLINSLAYER_HELM.get())
.pattern("xxx")
.pattern("x x")

View File

@@ -1,5 +1,8 @@
{
"parent": "extrabotany:item/manasteel_shield_base",
"parent": "minecraft:item/generated",
"textures": {
"layer0": "extrabotany:item/manasteel_shield"
},
"display": {
"thirdperson_righthand": {
"rotation": [

View File

@@ -1,6 +0,0 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "extrabotany:item/manasteel_shield"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -12,7 +12,7 @@
{
"type": "botania:runic_altar",
"text": "extrabotany.page.firstfractal1",
"recipe": "extrabotany:runic_altar/firstfractal"
"recipe": "extrabotany:runic_altar/first_fractal"
}
]
}

View File

@@ -84,7 +84,7 @@
},
{
"type": "patchouli:multiblock",
"name": "extrabotany.entry.genesis_crystal",
"name": "extrabotany.page.genesis_crystal4",
"multiblock": {
"pattern": [
[
@@ -136,7 +136,7 @@
},
"symmetrical": true
},
"text": "extrabotany.entry.genesis_crystal"
"text": "extrabotany.page.genesis_crystal5"
}
]
}

View File

@@ -0,0 +1,18 @@
{
"name": "extrabotany.entry.forest_book",
"category": "botania:tools",
"icon": "extrabotany:forest_book",
"entry_color": "4169E1",
"advancement": "botania:main/mana_pool_pickup_lexicon",
"pages": [
{
"type": "text",
"text": "extrabotany.page.forest_book0"
},
{
"type": "crafting",
"text": "extrabotany.page.forest_book1",
"recipe": "minecraft:forest_book"
}
]
}