starting 1.0!
This commit is contained in:
1 parent
e265d68526
commit
6ce167decb
571 files changed
+15337
-325
No files matched your search
@@ -53,6 +53,8 @@ public final class AntarchySettings {
|
||||
private static double bigBerthaAttackDamage = 55.0D;
|
||||
private static double bigBerthaReachBonus = 3.0D;
|
||||
private static double bigBerthaAttackSpeed = -3.0D;
|
||||
private static double attitudeAdjusterBaseDamage = 40.0D;
|
||||
private static boolean attitudeAdjusterBreaksBlocks = true;
|
||||
private static double krakensGraspAttackDamage = 16.0D;
|
||||
private static double krakensGraspAttackSpeed = -2.9D;
|
||||
private static double krakensGraspThrownDamage = 32.0D;
|
||||
@@ -251,8 +253,8 @@ public final class AntarchySettings {
|
||||
private static double reverieWarningThreatVerticalRange = 5.0D;
|
||||
private static int reverieDuplicationCooldownTicks = 6000;
|
||||
private static final boolean reverieOnlyPlayerDamage = true;
|
||||
private static final double reveriePreferredFollowMinDistance = 3.0D;
|
||||
private static final double reveriePreferredFollowMaxDistance = 6.0D;
|
||||
private static final double reveriePreferredFollowMinDistance = 2.5D;
|
||||
private static final double reveriePreferredFollowMaxDistance = 2.5D;
|
||||
private static final double reverieCatchUpDistance = 12.0D;
|
||||
private static final double reveriePurpleProtectRadius = 2.7D;
|
||||
private static final int reverieWarningApproachTicks = 8;
|
||||
@@ -690,6 +692,14 @@ public final class AntarchySettings {
|
||||
return bigBerthaAttackSpeed;
|
||||
}
|
||||
|
||||
public static double attitudeAdjusterBaseDamage() {
|
||||
return attitudeAdjusterBaseDamage;
|
||||
}
|
||||
|
||||
public static boolean attitudeAdjusterBreaksBlocks() {
|
||||
return attitudeAdjusterBreaksBlocks;
|
||||
}
|
||||
|
||||
public static double bigBerthaBasiliskCooldownSeconds() {
|
||||
return bigBerthaBasiliskCooldownSeconds;
|
||||
}
|
||||
@@ -1232,6 +1242,14 @@ public final class AntarchySettings {
|
||||
bigBerthaAttackSpeed = value;
|
||||
}
|
||||
|
||||
public static void setAttitudeAdjusterBaseDamage(double value) {
|
||||
attitudeAdjusterBaseDamage = value;
|
||||
}
|
||||
|
||||
public static void setAttitudeAdjusterBreaksBlocks(boolean value) {
|
||||
attitudeAdjusterBreaksBlocks = value;
|
||||
}
|
||||
|
||||
public static void setBigBerthaBasiliskCooldownSeconds(double value) {
|
||||
bigBerthaBasiliskCooldownSeconds = value;
|
||||
}
|
||||
|
||||
@@ -132,6 +132,9 @@ public final class AntarchySoundEvents {
|
||||
public static Supplier<SoundEvent> TORETERROR_JUMP_UP = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> TORETERROR_JUMP_LAND = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> STINKY_FLY = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> STINK_BUG_FART = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> STINK_BUG_IDLE = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> ROLLY_POLLY_IDLE = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> CREEPING_HORROR_GROWL = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> CREEPING_HORROR_HURT = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> CREEPING_HORROR_BITE = (Supplier<SoundEvent>) UNBOUND;
|
||||
@@ -140,6 +143,19 @@ public final class AntarchySoundEvents {
|
||||
public static Supplier<SoundEvent> LURKING_TERROR_BITE = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> LURKING_TERROR_FLY_LOOP = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> DUCT_TAPE_USE = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> HERCULES_BEETLE_IDLE = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> HERCULES_BEETLE_HURT = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> HERCULES_BEETLE_ATTACK = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> HERCULES_BEETLE_CRY = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> HERCULES_BEETLE_CHARGE_START = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> HERCULES_BEETLE_KNOCKED_DOWN = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> JUMPY_BUG_IDLE = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> SPIT_BUG_IDLE = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> JUMPY_BUG_HURT = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> JUMPY_BUG_JUMP = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> SPIT_BUG_HURT = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> SPIT_BUG_SPIT = (Supplier<SoundEvent>) UNBOUND;
|
||||
public static Supplier<SoundEvent> BRUTALFLY_SPIT = (Supplier<SoundEvent>) UNBOUND;
|
||||
|
||||
private AntarchySoundEvents() {
|
||||
}
|
||||
@@ -268,6 +284,9 @@ public final class AntarchySoundEvents {
|
||||
Supplier<SoundEvent> toreterrorJumpUp,
|
||||
Supplier<SoundEvent> toreterrorJumpLand,
|
||||
Supplier<SoundEvent> stinkyFly,
|
||||
Supplier<SoundEvent> stinkBugFart,
|
||||
Supplier<SoundEvent> stinkBugIdle,
|
||||
Supplier<SoundEvent> rollyPollyIdle,
|
||||
Supplier<SoundEvent> creepingHorrorGrowl,
|
||||
Supplier<SoundEvent> creepingHorrorHurt,
|
||||
Supplier<SoundEvent> creepingHorrorBite,
|
||||
@@ -275,7 +294,20 @@ public final class AntarchySoundEvents {
|
||||
Supplier<SoundEvent> lurkingTerrorHurt,
|
||||
Supplier<SoundEvent> lurkingTerrorBite,
|
||||
Supplier<SoundEvent> lurkingTerrorFlyLoop,
|
||||
Supplier<SoundEvent> ductTapeUse
|
||||
Supplier<SoundEvent> ductTapeUse,
|
||||
Supplier<SoundEvent> herculesBeetleIdle,
|
||||
Supplier<SoundEvent> herculesBeetleHurt,
|
||||
Supplier<SoundEvent> herculesBeetleAttack,
|
||||
Supplier<SoundEvent> herculesBeetleCry,
|
||||
Supplier<SoundEvent> herculesBeetleChargeStart,
|
||||
Supplier<SoundEvent> herculesBeetleKnockedDown,
|
||||
Supplier<SoundEvent> jumpyBugIdle,
|
||||
Supplier<SoundEvent> spitBugIdle,
|
||||
Supplier<SoundEvent> jumpyBugHurt,
|
||||
Supplier<SoundEvent> jumpyBugJump,
|
||||
Supplier<SoundEvent> spitBugHurt,
|
||||
Supplier<SoundEvent> spitBugSpit,
|
||||
Supplier<SoundEvent> brutalflySpit
|
||||
) {
|
||||
SQUIDZOOKA_FIRE = squidzookaFire;
|
||||
SHRINK_RAY_SOUND = shrinkRaySound;
|
||||
@@ -400,6 +432,9 @@ public final class AntarchySoundEvents {
|
||||
TORETERROR_JUMP_UP = toreterrorJumpUp;
|
||||
TORETERROR_JUMP_LAND = toreterrorJumpLand;
|
||||
STINKY_FLY = stinkyFly;
|
||||
STINK_BUG_FART = stinkBugFart;
|
||||
STINK_BUG_IDLE = stinkBugIdle;
|
||||
ROLLY_POLLY_IDLE = rollyPollyIdle;
|
||||
CREEPING_HORROR_GROWL = creepingHorrorGrowl;
|
||||
CREEPING_HORROR_HURT = creepingHorrorHurt;
|
||||
CREEPING_HORROR_BITE = creepingHorrorBite;
|
||||
@@ -408,5 +443,18 @@ public final class AntarchySoundEvents {
|
||||
LURKING_TERROR_BITE = lurkingTerrorBite;
|
||||
LURKING_TERROR_FLY_LOOP = lurkingTerrorFlyLoop;
|
||||
DUCT_TAPE_USE = ductTapeUse;
|
||||
HERCULES_BEETLE_IDLE = herculesBeetleIdle;
|
||||
HERCULES_BEETLE_HURT = herculesBeetleHurt;
|
||||
HERCULES_BEETLE_ATTACK = herculesBeetleAttack;
|
||||
HERCULES_BEETLE_CRY = herculesBeetleCry;
|
||||
HERCULES_BEETLE_CHARGE_START = herculesBeetleChargeStart;
|
||||
HERCULES_BEETLE_KNOCKED_DOWN = herculesBeetleKnockedDown;
|
||||
JUMPY_BUG_IDLE = jumpyBugIdle;
|
||||
SPIT_BUG_IDLE = spitBugIdle;
|
||||
JUMPY_BUG_HURT = jumpyBugHurt;
|
||||
JUMPY_BUG_JUMP = jumpyBugJump;
|
||||
SPIT_BUG_HURT = spitBugHurt;
|
||||
SPIT_BUG_SPIT = spitBugSpit;
|
||||
BRUTALFLY_SPIT = brutalflySpit;
|
||||
}
|
||||
}
|
||||
@@ -36,6 +36,7 @@ public final class AntarchyTags {
|
||||
public static final TagKey<Block> ELYTHIA_PORTAL_FRAMES = TagKey.create(Registries.BLOCK, id("elythia_portal_frames"));
|
||||
public static final TagKey<Block> THORAXIS_PORTAL_FRAMES = TagKey.create(Registries.BLOCK, id("thoraxis_portal_frames"));
|
||||
public static final TagKey<Block> CAVARYN_PORTAL_FRAMES = TagKey.create(Registries.BLOCK, id("cavaryn_portal_frames"));
|
||||
public static final TagKey<Block> ROLLY_CAVERN_CARVEABLE = TagKey.create(Registries.BLOCK, id("rolly_cavern_carveable"));
|
||||
public static final TagKey<Block> MINERS_DREAM_CARVABLE = TagKey.create(Registries.BLOCK, id("miners_dream_carvable"));
|
||||
|
||||
private Blocks() {
|
||||
|
||||
@@ -45,7 +45,8 @@ public final class CreativeTabOrder {
|
||||
"cut_dream_sandstone_slab" -> 4;
|
||||
case "umbral_moss_block", "umbral_moss_carpet",
|
||||
"blush_moss_block", "blush_moss_carpet" -> 4;
|
||||
case "uranium_ore", "deepslate_uranium_ore", "titanium_ore", "deepslate_titanium_ore",
|
||||
case "uranium_ore", "deepslate_uranium_ore", "broodstone_uranium_ore",
|
||||
"titanium_ore", "deepslate_titanium_ore", "broodstone_titanium_ore",
|
||||
"uranium_block", "titanium_block",
|
||||
"cut_uranium", "cut_titanium", "cut_uranium_slab", "cut_titanium_slab",
|
||||
"cut_uranium_stairs", "cut_titanium_stairs",
|
||||
@@ -56,10 +57,15 @@ public final class CreativeTabOrder {
|
||||
"raw_uranium_block", "raw_titanium_block" -> 7;
|
||||
case "blood_crystal_block", "small_blood_crystal_bud", "medium_blood_crystal_bud",
|
||||
"large_blood_crystal_bud", "budding_blood_crystal", "blood_crystal_cluster",
|
||||
"myrmite", "broodstone", "chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet" -> 8;
|
||||
"myrmite", "broodstone", "polished_broodstone", "chiseled_broodstone", "broodstone_bricks",
|
||||
"broodstone_stairs", "broodstone_slab", "broodstone_wall",
|
||||
"polished_broodstone_stairs", "polished_broodstone_slab", "polished_broodstone_wall",
|
||||
"broodstone_brick_stairs", "broodstone_brick_slab", "broodstone_brick_wall",
|
||||
"chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet",
|
||||
"glowcap_mushroom", "glowcap_mushroom_block" -> 8;
|
||||
case "ouranwood_leaves", "peach_leaves" -> 9;
|
||||
case "duplicator_sapling", "ouranwood_acorn", "peach_sapling", "corn_seeds" -> 10;
|
||||
case "orange_milkweed", "pink_milkweed", "camellia", "spider_lily", "lotus", "hushweed", "amber_lichen", "creepvine",
|
||||
case "orange_milkweed", "pink_milkweed", "camellia", "spider_lily", "lotus", "hushweed", "hanging_creeproots", "molting_vines", "amber_lichen", "creepvine",
|
||||
"triffid_goo_block", "cloud_block", "wasp_nest",
|
||||
"red_ant_nest", "brown_ant_nest", "rainbow_ant_nest", "termite_nest",
|
||||
"star_coral", "star_coral_fan", "star_coral_block",
|
||||
@@ -67,14 +73,14 @@ public final class CreativeTabOrder {
|
||||
case "dream_torch", "dream_lantern", "dream_campfire", "dream_fire", "dream_fire_ceiling",
|
||||
"lumen_froglight", "roseate_froglight" -> 12;
|
||||
case "antimetal_scaffolding" -> 13;
|
||||
case "infested_rooted_dirt", "infested_coarse_dirt", "bed_bug_egg" -> 14;
|
||||
case "infested_rooted_dirt", "infested_coarse_dirt", "bed_bug_egg", "creeping_horror_egg", "lurking_terror_egg", "jumpy_bug_egg" -> 14;
|
||||
case "ultimate_pickaxe", "ultimate_axe", "ultimate_shovel", "ultimate_hoe",
|
||||
"duct_tape", "diamond_minecart", "critter_cage", "gravity_sculk_sensor", "miners_dream" -> 15;
|
||||
case "bile_bucket", "ichor_bucket", "antiwater_bucket", "cloud_bucket", "lumen_bucket" -> 16;
|
||||
case "moggles", "brutalfly_elytra", "fallen_king_crown", "jumpy_boots" -> 17;
|
||||
case "battle_axe", "basilisk_dagger", "squidzooka", "rpo_launcher", "shrink_ray", "growth_ray",
|
||||
"gravity_gun", "water_cannon", "nightmare_sword", "lucid_pearl", "scorpion_whip", "blood_crystal_katana",
|
||||
"big_bertha", "big_bertha_blade", "big_bertha_handle", "big_bertha_hilt",
|
||||
"attitude_adjuster", "big_bertha", "big_bertha_blade", "big_bertha_handle", "big_bertha_hilt",
|
||||
"ultimate_sword", "ultimate_mace", "krakens_grasp" -> 18;
|
||||
case "primordial_helmet", "primordial_chestplate",
|
||||
"primordial_leggings", "primordial_boots",
|
||||
@@ -87,12 +93,12 @@ public final class CreativeTabOrder {
|
||||
case "ultimate_bow", "ultimate_crossbow" -> 20;
|
||||
case "cloud_shark_fin_soup", "mud_pie", "peach_pie", "cornbread", "popcorn", "rainbow_sugar",
|
||||
"blood_crystal_apple", "spirit_apple", "peach", "raw_corndog", "cooked_corndog",
|
||||
"raw_venison", "cooked_venison" -> 21;
|
||||
"raw_venison", "cooked_venison", "raw_bug_meat", "cooked_bug_meat", "broodfruit" -> 21;
|
||||
case "blood_crystal_shard", "cloud_shark_fin", "basilisk_fang", "kraken_tooth", "kraken_tentacle",
|
||||
"emperor_scorpion_stinger", "nightmare_scale", "molevore_nose",
|
||||
"moleworm", "uranium_nugget", "titanium_nugget",
|
||||
"uranium_ingot", "titanium_ingot", "lucid_eye",
|
||||
"mantis_claw", "jumpy_bug_leg", "brutalfly_wing", "cornea_ear",
|
||||
"mantis_claw", "hercules_horn", "jumpy_bug_leg", "brutalfly_wing", "cornea_ear",
|
||||
"primordial_scute", "triffid_goo", "vortex_eye",
|
||||
"king_scale", "queen_scale", "chiten", "stink_bug", "corn", "high_fructose_corn_syrup" -> 22;
|
||||
case "reverie_bottle", "glimmer_bottle", "root_beer" -> 24;
|
||||
@@ -102,7 +108,7 @@ public final class CreativeTabOrder {
|
||||
"moleworm_spawn_egg", "mantis_spawn_egg", "alpha_mantis_spawn_egg", "rolly_polly_spawn_egg",
|
||||
"molevore_spawn_egg", "triffid_spawn_egg", "apple_cow_spawn_egg", "golden_apple_cow_spawn_egg",
|
||||
"enchanted_golden_apple_cow_spawn_egg", "dr_trayaurus_spawn_egg", "wasp_spawn_egg",
|
||||
"bomber_spawn_egg", "jumpy_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg",
|
||||
"bomber_spawn_egg", "jumpy_bug_spawn_egg", "spit_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg",
|
||||
"kraken_spawn_egg", "missile_squid_spawn_egg", "octopus_bomb_spawn_egg",
|
||||
"nightmare_spawn_egg", "bed_bug_spawn_egg", "lucid_spawn_egg", "scorpion_spawn_egg",
|
||||
"basilisk_spawn_egg", "emperor_scorpion_spawn_egg", "toreterror_spawn_egg",
|
||||
@@ -163,6 +169,8 @@ public final class CreativeTabOrder {
|
||||
case "camellia" -> 2;
|
||||
case "spider_lily" -> 3;
|
||||
case "hushweed" -> 4;
|
||||
case "hanging_creeproots" -> 21;
|
||||
case "molting_vines" -> 22;
|
||||
case "amber_lichen" -> 5;
|
||||
case "creepvine" -> 6;
|
||||
case "triffid_goo_block" -> 7;
|
||||
@@ -187,14 +195,30 @@ public final class CreativeTabOrder {
|
||||
case "blood_crystal_cluster" -> 5;
|
||||
case "myrmite" -> 6;
|
||||
case "broodstone" -> 7;
|
||||
case "chiten_block" -> 8;
|
||||
case "chiten_spike" -> 9;
|
||||
case "amber_moss_block" -> 10;
|
||||
case "amber_moss_carpet" -> 11;
|
||||
case "polished_broodstone" -> 8;
|
||||
case "chiseled_broodstone" -> 9;
|
||||
case "broodstone_bricks" -> 10;
|
||||
case "broodstone_stairs" -> 11;
|
||||
case "broodstone_slab" -> 12;
|
||||
case "broodstone_wall" -> 13;
|
||||
case "polished_broodstone_stairs" -> 14;
|
||||
case "polished_broodstone_slab" -> 15;
|
||||
case "polished_broodstone_wall" -> 16;
|
||||
case "broodstone_brick_stairs" -> 17;
|
||||
case "broodstone_brick_slab" -> 18;
|
||||
case "broodstone_brick_wall" -> 19;
|
||||
case "chiten_block" -> 20;
|
||||
case "chiten_spike" -> 21;
|
||||
case "amber_moss_block" -> 22;
|
||||
case "amber_moss_carpet" -> 23;
|
||||
case "glowcap_mushroom" -> 24;
|
||||
case "glowcap_mushroom_block" -> 25;
|
||||
case "uranium_ore" -> 0;
|
||||
case "deepslate_uranium_ore" -> 1;
|
||||
case "titanium_ore" -> 2;
|
||||
case "deepslate_titanium_ore" -> 3;
|
||||
case "broodstone_uranium_ore" -> 2;
|
||||
case "titanium_ore" -> 3;
|
||||
case "deepslate_titanium_ore" -> 4;
|
||||
case "broodstone_titanium_ore" -> 5;
|
||||
case "uranium_block" -> 4;
|
||||
case "titanium_block" -> 5;
|
||||
case "cut_uranium" -> 6;
|
||||
@@ -256,16 +280,17 @@ public final class CreativeTabOrder {
|
||||
case "gravity_gun" -> 6;
|
||||
case "water_cannon" -> 7;
|
||||
case "nightmare_sword" -> 8;
|
||||
case "lucid_pearl" -> 9;
|
||||
case "scorpion_whip" -> 10;
|
||||
case "blood_crystal_katana" -> 11;
|
||||
case "big_bertha" -> 12;
|
||||
case "big_bertha_blade" -> 13;
|
||||
case "big_bertha_handle" -> 14;
|
||||
case "big_bertha_hilt" -> 15;
|
||||
case "ultimate_sword" -> 16;
|
||||
case "ultimate_mace" -> 17;
|
||||
case "krakens_grasp" -> 18;
|
||||
case "attitude_adjuster" -> 9;
|
||||
case "lucid_pearl" -> 10;
|
||||
case "scorpion_whip" -> 11;
|
||||
case "blood_crystal_katana" -> 12;
|
||||
case "big_bertha" -> 13;
|
||||
case "big_bertha_blade" -> 14;
|
||||
case "big_bertha_handle" -> 15;
|
||||
case "big_bertha_hilt" -> 16;
|
||||
case "ultimate_sword" -> 17;
|
||||
case "ultimate_mace" -> 18;
|
||||
case "krakens_grasp" -> 19;
|
||||
case "primordial_helmet" -> 0;
|
||||
case "primordial_chestplate" -> 1;
|
||||
case "primordial_leggings" -> 2;
|
||||
@@ -294,6 +319,9 @@ public final class CreativeTabOrder {
|
||||
case "cooked_corndog" -> 7;
|
||||
case "raw_venison" -> 8;
|
||||
case "cooked_venison" -> 9;
|
||||
case "raw_bug_meat" -> 10;
|
||||
case "cooked_bug_meat" -> 11;
|
||||
case "broodfruit" -> 12;
|
||||
case "blood_crystal_apple" -> 10;
|
||||
case "spirit_apple" -> 11;
|
||||
case "peach" -> 12;
|
||||
@@ -315,18 +343,19 @@ public final class CreativeTabOrder {
|
||||
case "titanium_ingot" -> 12;
|
||||
case "lucid_eye" -> 13;
|
||||
case "mantis_claw" -> 14;
|
||||
case "jumpy_bug_leg" -> 15;
|
||||
case "brutalfly_wing" -> 16;
|
||||
case "cornea_ear" -> 17;
|
||||
case "primordial_scute" -> 18;
|
||||
case "triffid_goo" -> 19;
|
||||
case "vortex_eye" -> 20;
|
||||
case "king_scale" -> 21;
|
||||
case "queen_scale" -> 22;
|
||||
case "chiten" -> 23;
|
||||
case "stink_bug" -> 24;
|
||||
case "corn" -> 25;
|
||||
case "high_fructose_corn_syrup" -> 26;
|
||||
case "hercules_horn" -> 15;
|
||||
case "jumpy_bug_leg" -> 16;
|
||||
case "brutalfly_wing" -> 17;
|
||||
case "cornea_ear" -> 18;
|
||||
case "primordial_scute" -> 19;
|
||||
case "triffid_goo" -> 20;
|
||||
case "vortex_eye" -> 21;
|
||||
case "king_scale" -> 22;
|
||||
case "queen_scale" -> 23;
|
||||
case "chiten" -> 24;
|
||||
case "stink_bug" -> 25;
|
||||
case "corn" -> 26;
|
||||
case "high_fructose_corn_syrup" -> 27;
|
||||
default -> 0;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,11 +2,14 @@ package com.craisinlord.antarchy.content.block;
|
||||
|
||||
import com.craisinlord.antarchy.content.AntarchyObjects;
|
||||
import com.craisinlord.antarchy.content.block.entity.CritterCageBlockEntity;
|
||||
import com.craisinlord.antarchy.content.entity.ant.AntTeleportHelper;
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import java.util.List;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.BaseEntityBlock;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
@@ -16,6 +19,9 @@ import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.storage.loot.LootParams;
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
|
||||
@@ -62,10 +68,24 @@ public class CritterCageBlock extends BaseEntityBlock {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) {
|
||||
super.playerDestroy(level, player, pos, state, blockEntity, stack);
|
||||
if (level instanceof ServerLevel serverLevel && blockEntity instanceof CritterCageBlockEntity critterCageBlockEntity) {
|
||||
Block.popResource(serverLevel, pos, critterCageBlockEntity.toItemStack());
|
||||
protected List<ItemStack> getDrops(BlockState state, LootParams.Builder params) {
|
||||
BlockEntity blockEntity = params.getOptionalParameter(LootContextParams.BLOCK_ENTITY);
|
||||
if (blockEntity instanceof CritterCageBlockEntity critterCageBlockEntity) {
|
||||
return List.of(critterCageBlockEntity.toItemStack());
|
||||
}
|
||||
|
||||
return super.getDrops(state, params);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
|
||||
if (!(player instanceof ServerPlayer serverPlayer)) {
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
if (!(level.getBlockEntity(pos) instanceof CritterCageBlockEntity blockEntity)) {
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
|
||||
return AntTeleportHelper.handleCagedAntTeleport(serverPlayer, blockEntity.entityTypeId(), blockEntity.entityData());
|
||||
}
|
||||
}
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
package com.craisinlord.antarchy.content.block;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.BonemealableBlock;
|
||||
import net.minecraft.world.level.block.BushBlock;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
|
||||
public class GlowcapMushroomBlock extends BushBlock implements BonemealableBlock {
|
||||
public static final MapCodec<GlowcapMushroomBlock> CODEC = Block.simpleCodec(GlowcapMushroomBlock::new);
|
||||
private static final VoxelShape SHAPE = Block.box(3.9D, 0.0D, 3.9D, 12.1D, 12.0D, 12.1D);
|
||||
private static final ResourceKey<ConfiguredFeature<?, ?>> HUGE_GLOWCAP_MUSHROOM = ResourceKey.create(
|
||||
Registries.CONFIGURED_FEATURE,
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "huge_glowcap_mushroom")
|
||||
);
|
||||
private static final int SPREAD_ATTEMPTS = 4;
|
||||
private static final int MAX_LIGHT_LEVEL = 13;
|
||||
|
||||
public GlowcapMushroomBlock(BlockBehaviour.Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MapCodec<GlowcapMushroomBlock> codec() {
|
||||
return CODEC;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VoxelShape getShape(BlockState state, net.minecraft.world.level.BlockGetter level, BlockPos pos, CollisionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean mayPlaceOn(BlockState state, net.minecraft.world.level.BlockGetter level, BlockPos pos) {
|
||||
return state.is(BlockTags.MUSHROOM_GROW_BLOCK) || state.isFaceSturdy(level, pos, Direction.UP);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) {
|
||||
BlockPos belowPos = pos.below();
|
||||
BlockState below = level.getBlockState(belowPos);
|
||||
return this.mayPlaceOn(below, level, belowPos) && (below.is(BlockTags.MUSHROOM_GROW_BLOCK) || level.getRawBrightness(pos, 0) < MAX_LIGHT_LEVEL);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isRandomlyTicking(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
|
||||
if (random.nextInt(25) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
int spreadRange = 4;
|
||||
BlockPos targetPos = pos;
|
||||
for (int i = 0; i < SPREAD_ATTEMPTS; i++) {
|
||||
targetPos = pos.offset(
|
||||
random.nextInt(spreadRange * 2 + 1) - spreadRange,
|
||||
random.nextInt(3) - 1,
|
||||
random.nextInt(spreadRange * 2 + 1) - spreadRange
|
||||
);
|
||||
if (level.isEmptyBlock(targetPos) && canSpreadTo(level, targetPos)) {
|
||||
level.setBlock(targetPos, this.defaultBlockState(), 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean canSpreadTo(ServerLevel level, BlockPos pos) {
|
||||
if (level.getRawBrightness(pos, 0) > MAX_LIGHT_LEVEL) {
|
||||
return false;
|
||||
}
|
||||
BlockState below = level.getBlockState(pos.below());
|
||||
return this.mayPlaceOn(below, level, pos.below());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) {
|
||||
return random.nextFloat() < 0.4F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
|
||||
Holder.Reference<ConfiguredFeature<?, ?>> feature = level.registryAccess()
|
||||
.lookupOrThrow(Registries.CONFIGURED_FEATURE)
|
||||
.getOrThrow(HUGE_GLOWCAP_MUSHROOM);
|
||||
level.removeBlock(pos, false);
|
||||
if (!feature.value().place(level, level.getChunkSource().getGenerator(), random, pos)) {
|
||||
level.setBlock(pos, state, 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
package com.craisinlord.antarchy.content.block;
|
||||
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.LevelAccessor;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.BushBlock;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition;
|
||||
import net.minecraft.world.level.block.state.properties.BooleanProperty;
|
||||
import net.minecraft.world.level.block.state.properties.IntegerProperty;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
|
||||
public class HangingCreeprootsBlock extends BushBlock {
|
||||
public static final MapCodec<HangingCreeprootsBlock> CODEC = Block.simpleCodec(HangingCreeprootsBlock::new);
|
||||
public static final IntegerProperty DISTANCE = IntegerProperty.create("distance", 0, 4);
|
||||
public static final BooleanProperty BOTTOM = BooleanProperty.create("bottom");
|
||||
private static final int MAX_DISTANCE = 4;
|
||||
private static final VoxelShape SHAPE = Block.box(4.0D, 0.0D, 4.0D, 12.0D, 16.0D, 12.0D);
|
||||
|
||||
public HangingCreeprootsBlock(BlockBehaviour.Properties properties) {
|
||||
super(properties);
|
||||
this.registerDefaultState(this.stateDefinition.any().setValue(DISTANCE, 0).setValue(BOTTOM, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public MapCodec<HangingCreeprootsBlock> codec() {
|
||||
return CODEC;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) {
|
||||
return state.is(this) || state.isFaceSturdy(level, pos, Direction.DOWN);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) {
|
||||
BlockPos abovePos = pos.above();
|
||||
return this.mayPlaceOn(level.getBlockState(abovePos), level, abovePos);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) {
|
||||
if (!state.canSurvive(level, pos)) {
|
||||
return net.minecraft.world.level.block.Blocks.AIR.defaultBlockState();
|
||||
}
|
||||
if (direction == Direction.DOWN) {
|
||||
boolean bottom = !neighborState.is(this);
|
||||
if (bottom != state.getValue(BOTTOM)) {
|
||||
state = state.setValue(BOTTOM, bottom);
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isRandomlyTicking(BlockState state) {
|
||||
return state.getValue(BOTTOM) && state.getValue(DISTANCE) < MAX_DISTANCE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
|
||||
if (!state.getValue(BOTTOM) || state.getValue(DISTANCE) >= MAX_DISTANCE) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockPos belowPos = pos.below();
|
||||
if (random.nextInt(4) != 0 || !level.getBlockState(belowPos).isAir()) {
|
||||
return;
|
||||
}
|
||||
|
||||
int distance = state.getValue(DISTANCE);
|
||||
level.setBlock(pos, state.setValue(BOTTOM, false), Block.UPDATE_CLIENTS);
|
||||
level.setBlock(belowPos, this.defaultBlockState().setValue(DISTANCE, distance + 1).setValue(BOTTOM, true), Block.UPDATE_ALL);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||
builder.add(DISTANCE, BOTTOM);
|
||||
}
|
||||
}
|
||||
@@ -29,6 +29,7 @@ import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class HushweedBlock extends BaseEntityBlock {
|
||||
private static final VoxelShape SHAPE = Block.box(4.0D, 0.0D, 4.0D, 12.0D, 18.0D, 12.0D);
|
||||
public static final DirectionProperty FACING = BlockStateProperties.VERTICAL_DIRECTION;
|
||||
public static final MapCodec<HushweedBlock> CODEC = Block.simpleCodec(HushweedBlock::new);
|
||||
|
||||
@@ -61,12 +62,12 @@ public class HushweedBlock extends BaseEntityBlock {
|
||||
|
||||
@Override
|
||||
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
|
||||
return Blocks.AZALEA.defaultBlockState().getShape(level, pos, context);
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
|
||||
return Blocks.AZALEA.defaultBlockState().getCollisionShape(level, pos, context);
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
package com.craisinlord.antarchy.content.block;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.entity.JumpyBugEntity;
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.item.context.BlockPlaceContext;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelAccessor;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.Mirror;
|
||||
import net.minecraft.world.level.block.Rotation;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition;
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
||||
import net.minecraft.world.level.block.state.properties.BooleanProperty;
|
||||
import net.minecraft.world.level.block.state.properties.IntegerProperty;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
|
||||
public class JumpyBugEggBlock extends Block {
|
||||
public static final MapCodec<JumpyBugEggBlock> CODEC = Block.simpleCodec(JumpyBugEggBlock::new);
|
||||
public static final IntegerProperty HATCH = BlockStateProperties.HATCH;
|
||||
public static final BooleanProperty HANGING = BlockStateProperties.HANGING;
|
||||
public static final BooleanProperty ROTATED = BooleanProperty.create("rotated");
|
||||
private static final int MAX_HATCH = 2;
|
||||
private static final VoxelShape FLOOR_SHAPE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D);
|
||||
private static final VoxelShape CEILING_SHAPE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D);
|
||||
private static final ResourceLocation JUMPY_BUG_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "jumpy_bug");
|
||||
|
||||
public JumpyBugEggBlock(BlockBehaviour.Properties properties) {
|
||||
super(properties);
|
||||
this.registerDefaultState(this.stateDefinition.any().setValue(HATCH, 0).setValue(HANGING, false).setValue(ROTATED, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public MapCodec<JumpyBugEggBlock> codec() {
|
||||
return CODEC;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
|
||||
return state.getValue(HANGING) ? CEILING_SHAPE : FLOOR_SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockPlaceContext context) {
|
||||
boolean hanging = context.getClickedFace() == Direction.DOWN
|
||||
|| (context.getClickedFace() != Direction.UP && !canSupportFloor(context.getLevel(), context.getClickedPos()) && canSupportCeiling(context.getLevel(), context.getClickedPos()));
|
||||
boolean rotated = context.getHorizontalDirection().getAxis() == Direction.Axis.X;
|
||||
return this.defaultBlockState().setValue(HANGING, hanging).setValue(ROTATED, rotated);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockState rotate(BlockState state, Rotation rotation) {
|
||||
return rotation == Rotation.CLOCKWISE_90 || rotation == Rotation.COUNTERCLOCKWISE_90
|
||||
? state.setValue(ROTATED, !state.getValue(ROTATED))
|
||||
: state;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockState mirror(BlockState state, Mirror mirror) {
|
||||
return state;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) {
|
||||
return state.getValue(HANGING) ? canSupportCeiling(level, pos) : canSupportFloor(level, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) {
|
||||
return state.canSurvive(level, pos) ? super.updateShape(state, direction, neighborState, level, pos, neighborPos) : Blocks.AIR.defaultBlockState();
|
||||
}
|
||||
|
||||
private static boolean canSupportFloor(LevelReader level, BlockPos pos) {
|
||||
return level.getBlockState(pos.below()).isFaceSturdy(level, pos.below(), Direction.UP);
|
||||
}
|
||||
|
||||
private static boolean canSupportCeiling(LevelReader level, BlockPos pos) {
|
||||
return level.getBlockState(pos.above()).isFaceSturdy(level, pos.above(), Direction.DOWN);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isRandomlyTicking(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
|
||||
if (!this.shouldUpdateHatchLevel(level, pos, state)) {
|
||||
return;
|
||||
}
|
||||
|
||||
int hatch = state.getValue(HATCH);
|
||||
if (hatch < MAX_HATCH) {
|
||||
level.setBlock(pos, state.setValue(HATCH, hatch + 1), 2);
|
||||
level.playSound(null, pos, SoundEvents.TURTLE_EGG_CRACK, SoundSource.BLOCKS, 0.7F, 0.95F + random.nextFloat() * 0.1F);
|
||||
return;
|
||||
}
|
||||
|
||||
this.hatch(level, pos, random);
|
||||
}
|
||||
|
||||
private boolean shouldUpdateHatchLevel(Level level, BlockPos pos, BlockState state) {
|
||||
BlockPos checkPos = state.getValue(HANGING) ? pos.above() : pos.below();
|
||||
boolean onAmberMoss = level.getBlockState(checkPos).getBlock() instanceof AmberMossBlock;
|
||||
return level.random.nextInt(onAmberMoss ? 150 : 500) == 0;
|
||||
}
|
||||
|
||||
private void hatch(ServerLevel level, BlockPos pos, RandomSource random) {
|
||||
level.removeBlock(pos, false);
|
||||
level.playSound(null, pos, SoundEvents.TURTLE_EGG_HATCH, SoundSource.BLOCKS, 0.75F, 0.95F + random.nextFloat() * 0.1F);
|
||||
@SuppressWarnings("unchecked")
|
||||
EntityType<JumpyBugEntity> jumpyBugType = (EntityType<JumpyBugEntity>) (EntityType<?>) BuiltInRegistries.ENTITY_TYPE.getOptional(JUMPY_BUG_ID).orElse(null);
|
||||
if (jumpyBugType == null) {
|
||||
return;
|
||||
}
|
||||
JumpyBugEntity entity = jumpyBugType.create(level);
|
||||
if (entity == null) {
|
||||
return;
|
||||
}
|
||||
double spawnX = pos.getX() + 0.25D + random.nextDouble() * 0.5D;
|
||||
double spawnZ = pos.getZ() + 0.25D + random.nextDouble() * 0.5D;
|
||||
entity.moveTo(spawnX, pos.getY() + 0.1D, spawnZ, random.nextFloat() * 360.0F, 0.0F);
|
||||
level.addFreshEntity(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||
builder.add(HATCH, HANGING, ROTATED);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
package com.craisinlord.antarchy.content.block;
|
||||
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.ItemInteractionResult;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.BlockPlaceContext;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelAccessor;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.BonemealableBlock;
|
||||
import net.minecraft.world.level.block.BushBlock;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition;
|
||||
import net.minecraft.world.level.block.state.properties.BooleanProperty;
|
||||
import net.minecraft.world.level.block.state.properties.EnumProperty;
|
||||
import net.minecraft.world.level.block.state.properties.IntegerProperty;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
|
||||
public class MoltingVinesBlock extends BushBlock implements BonemealableBlock {
|
||||
public static final MapCodec<MoltingVinesBlock> CODEC = Block.simpleCodec(MoltingVinesBlock::new);
|
||||
public static final EnumProperty<Direction> GROWTH_DIRECTION = EnumProperty.create("growth_direction", Direction.class, Direction.UP, Direction.DOWN);
|
||||
public static final BooleanProperty TOP_CAP = BooleanProperty.create("top_cap");
|
||||
public static final BooleanProperty BOTTOM_CAP = BooleanProperty.create("bottom_cap");
|
||||
public static final BooleanProperty BROODFRUIT = BooleanProperty.create("broodfruit");
|
||||
public static final IntegerProperty DISTANCE = IntegerProperty.create("distance", 0, 6);
|
||||
private static final int MAX_DISTANCE = 6;
|
||||
private static final int NATURAL_FRUIT_CHANCE = 40;
|
||||
private static final VoxelShape SHAPE = Block.box(5.0D, 0.0D, 5.0D, 11.0D, 16.0D, 11.0D);
|
||||
private static final ResourceLocation BROODFRUIT_ITEM_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "broodfruit");
|
||||
|
||||
public MoltingVinesBlock(BlockBehaviour.Properties properties) {
|
||||
super(properties);
|
||||
this.registerDefaultState(this.stateDefinition.any()
|
||||
.setValue(GROWTH_DIRECTION, Direction.DOWN)
|
||||
.setValue(TOP_CAP, false)
|
||||
.setValue(BOTTOM_CAP, true)
|
||||
.setValue(BROODFRUIT, false)
|
||||
.setValue(DISTANCE, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public MapCodec<MoltingVinesBlock> codec() {
|
||||
return CODEC;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockPlaceContext context) {
|
||||
BlockGetter level = context.getLevel();
|
||||
BlockPos pos = context.getClickedPos();
|
||||
Direction growthDirection = resolveGrowthDirection(level, pos);
|
||||
return computeState(this.defaultBlockState().setValue(GROWTH_DIRECTION, growthDirection).setValue(DISTANCE, 0), level, pos);
|
||||
}
|
||||
|
||||
private Direction resolveGrowthDirection(BlockGetter level, BlockPos pos) {
|
||||
BlockState belowState = level.getBlockState(pos.below());
|
||||
if (belowState.is(this) && belowState.getValue(GROWTH_DIRECTION) == Direction.UP) {
|
||||
return Direction.UP;
|
||||
}
|
||||
|
||||
BlockState aboveState = level.getBlockState(pos.above());
|
||||
if (aboveState.is(this) && aboveState.getValue(GROWTH_DIRECTION) == Direction.DOWN) {
|
||||
return Direction.DOWN;
|
||||
}
|
||||
|
||||
return hasSturdyAnchor(level, pos, Direction.UP) ? Direction.DOWN : Direction.UP;
|
||||
}
|
||||
|
||||
private static boolean hasSturdyAnchor(BlockGetter level, BlockPos pos, Direction towardAnchor) {
|
||||
BlockPos anchorPos = pos.relative(towardAnchor);
|
||||
BlockState anchorState = level.getBlockState(anchorPos);
|
||||
return anchorState.isFaceSturdy(level, anchorPos, towardAnchor.getOpposite());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) {
|
||||
return state.is(this) || state.isFaceSturdy(level, pos, Direction.DOWN) || state.isFaceSturdy(level, pos, Direction.UP);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) {
|
||||
Direction anchorDirection = state.getValue(GROWTH_DIRECTION).getOpposite();
|
||||
BlockPos anchorPos = pos.relative(anchorDirection);
|
||||
BlockState anchorState = level.getBlockState(anchorPos);
|
||||
if (anchorState.is(this)) {
|
||||
return true;
|
||||
}
|
||||
return anchorState.isFaceSturdy(level, anchorPos, anchorDirection.getOpposite());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) {
|
||||
if (!state.canSurvive(level, pos)) {
|
||||
return net.minecraft.world.level.block.Blocks.AIR.defaultBlockState();
|
||||
}
|
||||
if (direction == Direction.UP || direction == Direction.DOWN) {
|
||||
return computeState(state, level, pos);
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
private static BlockState computeState(BlockState state, BlockGetter level, BlockPos pos) {
|
||||
boolean aboveIsSame = level.getBlockState(pos.above()).is(state.getBlock());
|
||||
boolean belowIsSame = level.getBlockState(pos.below()).is(state.getBlock());
|
||||
Direction growthDirection = state.getValue(GROWTH_DIRECTION);
|
||||
|
||||
boolean topCap = growthDirection == Direction.UP && !aboveIsSame;
|
||||
boolean bottomCap = growthDirection == Direction.DOWN && !belowIsSame;
|
||||
|
||||
state = state.setValue(TOP_CAP, topCap).setValue(BOTTOM_CAP, bottomCap);
|
||||
if (topCap || bottomCap) {
|
||||
state = state.setValue(BROODFRUIT, false);
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isRandomlyTicking(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
|
||||
boolean isTip = state.getValue(GROWTH_DIRECTION) == Direction.DOWN ? state.getValue(BOTTOM_CAP) : state.getValue(TOP_CAP);
|
||||
if (isTip && state.getValue(DISTANCE) < MAX_DISTANCE && random.nextInt(6) == 0) {
|
||||
BlockPos growPos = pos.relative(state.getValue(GROWTH_DIRECTION));
|
||||
if (level.getBlockState(growPos).isAir()) {
|
||||
BlockState grownState = this.defaultBlockState()
|
||||
.setValue(GROWTH_DIRECTION, state.getValue(GROWTH_DIRECTION))
|
||||
.setValue(DISTANCE, state.getValue(DISTANCE) + 1);
|
||||
level.setBlock(growPos, grownState, Block.UPDATE_ALL);
|
||||
|
||||
BlockState posState = level.getBlockState(pos);
|
||||
if (posState.is(this)) {
|
||||
level.setBlock(pos, computeState(posState, level, pos), Block.UPDATE_CLIENTS);
|
||||
}
|
||||
BlockState growState = level.getBlockState(growPos);
|
||||
if (growState.is(this)) {
|
||||
level.setBlock(growPos, computeState(growState, level, growPos), Block.UPDATE_CLIENTS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!state.getValue(TOP_CAP) && !state.getValue(BOTTOM_CAP) && !state.getValue(BROODFRUIT) && random.nextInt(NATURAL_FRUIT_CHANCE) == 0) {
|
||||
level.setBlock(pos, state.setValue(BROODFRUIT, true), Block.UPDATE_ALL);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) {
|
||||
return !state.getValue(TOP_CAP) && !state.getValue(BOTTOM_CAP) && !state.getValue(BROODFRUIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
|
||||
level.setBlock(pos, state.setValue(BROODFRUIT, true), Block.UPDATE_ALL);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) {
|
||||
if (!state.getValue(BROODFRUIT)) {
|
||||
return super.useItemOn(stack, state, level, pos, player, hand, hitResult);
|
||||
}
|
||||
|
||||
if (!level.isClientSide) {
|
||||
BuiltInRegistries.ITEM.getOptional(BROODFRUIT_ITEM_ID).ifPresent(item -> harvestFruit(level, pos, item));
|
||||
level.setBlock(pos, state.setValue(BROODFRUIT, false), Block.UPDATE_ALL);
|
||||
}
|
||||
|
||||
return ItemInteractionResult.sidedSuccess(level.isClientSide);
|
||||
}
|
||||
|
||||
private static void harvestFruit(Level level, BlockPos pos, Item item) {
|
||||
Block.popResource(level, pos, new ItemStack(item, 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||
builder.add(GROWTH_DIRECTION, TOP_CAP, BOTTOM_CAP, BROODFRUIT, DISTANCE);
|
||||
}
|
||||
}
|
||||
+10
@@ -95,6 +95,16 @@ public class CritterCageBlockEntity extends BlockEntity {
|
||||
return this.secondaryColor;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public ResourceLocation entityTypeId() {
|
||||
return this.entityTypeId;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public CompoundTag entityData() {
|
||||
return this.entityData == null ? null : this.entityData.copy();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Entity getOrCreateClientDisplayEntity(Level level) {
|
||||
if (level == null || level.isClientSide == false) {
|
||||
|
||||
+38
-4
@@ -16,7 +16,14 @@ public final class CameraShakeClientState {
|
||||
private record Source(double range, float strength, BooleanSupplier active) {
|
||||
}
|
||||
|
||||
private record Impact(Vec3 position, float intensity, int remainingTicks, int totalTicks, float radius) {
|
||||
private Impact ticked() {
|
||||
return new Impact(position, intensity, remainingTicks - 1, totalTicks, radius);
|
||||
}
|
||||
}
|
||||
|
||||
private static final Map<LivingEntity, Source> SOURCES = new HashMap<>();
|
||||
private static final java.util.List<Impact> IMPACTS = new java.util.ArrayList<>();
|
||||
|
||||
private CameraShakeClientState() {
|
||||
}
|
||||
@@ -26,10 +33,6 @@ public final class CameraShakeClientState {
|
||||
}
|
||||
|
||||
public static float getStrength(Vec3 cameraPos) {
|
||||
if (SOURCES.isEmpty()) {
|
||||
return 0.0F;
|
||||
}
|
||||
|
||||
float total = 0.0F;
|
||||
Iterator<Map.Entry<LivingEntity, Source>> iterator = SOURCES.entrySet().iterator();
|
||||
while (iterator.hasNext()) {
|
||||
@@ -49,10 +52,41 @@ public final class CameraShakeClientState {
|
||||
total += (float) ((1.0D - distance / source.range()) * source.strength());
|
||||
}
|
||||
|
||||
Iterator<Impact> impactIterator = IMPACTS.iterator();
|
||||
while (impactIterator.hasNext()) {
|
||||
Impact impact = impactIterator.next();
|
||||
if (impact.remainingTicks() <= 0) {
|
||||
impactIterator.remove();
|
||||
continue;
|
||||
}
|
||||
double distance = Math.sqrt(cameraPos.distanceToSqr(impact.position()));
|
||||
if (distance > impact.radius()) {
|
||||
continue;
|
||||
}
|
||||
total += (float) ((1.0D - distance / impact.radius()) * impact.intensity() * (impact.remainingTicks() / (float) Math.max(1, impact.totalTicks())));
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
public static void triggerImpact(Vec3 position, float intensity, int durationTicks, float radius) {
|
||||
int ticks = Math.max(1, durationTicks);
|
||||
IMPACTS.add(new Impact(position, intensity, ticks, ticks, Math.max(1.0F, radius)));
|
||||
}
|
||||
|
||||
public static void tick() {
|
||||
for (int i = IMPACTS.size() - 1; i >= 0; i--) {
|
||||
Impact impact = IMPACTS.get(i);
|
||||
if (impact.remainingTicks() <= 1) {
|
||||
IMPACTS.remove(i);
|
||||
} else {
|
||||
IMPACTS.set(i, impact.ticked());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
SOURCES.clear();
|
||||
IMPACTS.clear();
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,8 @@ import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class BasiliskModel extends GeoModel<BasiliskEntity> {
|
||||
public static final ResourceLocation EMISSIVE_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/basilisk_emissive.png");
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(BasiliskEntity animatable) {
|
||||
|
||||
@@ -6,6 +6,9 @@ import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class BedBugModel extends GeoModel<BedBugEntity> {
|
||||
public static final ResourceLocation EMISSIVE_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/bed_bug_emissive.png");
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(BedBugEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/bed_bug.geo.json");
|
||||
|
||||
@@ -6,6 +6,9 @@ import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class BrutalflyModel extends GeoModel<BrutalflyEntity> {
|
||||
public static final ResourceLocation EMISSIVE_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/brutalfly_emissive.png");
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(BrutalflyEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/brutalfly.geo.json");
|
||||
|
||||
+2
@@ -10,6 +10,8 @@ public class HerculesBeetleModel extends GeoModel<HerculesBeetleEntity> {
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/hercules_beetle/hercules_beetle.png");
|
||||
private static final ResourceLocation TEXTURE_SADDLED =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/hercules_beetle/hercules_beetle_saddle.png");
|
||||
public static final ResourceLocation EMISSIVE_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/hercules_beetle/hercules_beetle_emissive.png");
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(HerculesBeetleEntity animatable) {
|
||||
|
||||
@@ -6,6 +6,9 @@ import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class JumpyBugModel extends GeoModel<JumpyBugEntity> {
|
||||
public static final ResourceLocation EMISSIVE_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/jumpy_bug_emissive.png");
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(JumpyBugEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/jumpy_bug.geo.json");
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
package com.craisinlord.antarchy.content.client.model;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class KrakenModel extends GeoModel<KrakenEntity> {
|
||||
public static final ResourceLocation EMISSIVE_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/kraken_emissive.png");
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(KrakenEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath("antarchy", "geo/kraken.geo.json");
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.craisinlord.antarchy.content.client.model;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.entity.SpitBugEntity;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class SpitBugModel extends GeoModel<SpitBugEntity> {
|
||||
@Override
|
||||
public ResourceLocation getModelResource(SpitBugEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/spit_bug.geo.json");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getTextureResource(SpitBugEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/spit_bug.png");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getAnimationResource(SpitBugEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "animations/spit_bug.animation.json");
|
||||
}
|
||||
}
|
||||
+30
@@ -5,16 +5,20 @@ import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.cache.object.BakedGeoModel;
|
||||
import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
|
||||
|
||||
public class BasiliskRenderer extends GeoEntityRenderer<BasiliskEntity> {
|
||||
|
||||
public BasiliskRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new BasiliskModel());
|
||||
this.shadowRadius = 1.0F;
|
||||
this.addRenderLayer(new BasiliskEmissiveLayer(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -31,4 +35,30 @@ public class BasiliskRenderer extends GeoEntityRenderer<BasiliskEntity> {
|
||||
protected float getDeathMaxRotation(BasiliskEntity animatable) {
|
||||
return 0.0F;
|
||||
}
|
||||
|
||||
private static final class BasiliskEmissiveLayer extends GeoRenderLayer<BasiliskEntity> {
|
||||
private BasiliskEmissiveLayer(GeoEntityRenderer<BasiliskEntity> renderer) {
|
||||
super(renderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack poseStack, BasiliskEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
|
||||
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
|
||||
int packedLight, int packedOverlay) {
|
||||
RenderType emissiveType = RenderType.eyes(BasiliskModel.EMISSIVE_TEXTURE);
|
||||
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
emissiveType,
|
||||
emissiveBuffer,
|
||||
partialTick,
|
||||
0xF000F0,
|
||||
OverlayTexture.NO_OVERLAY,
|
||||
0xFFFFFFFF
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
+30
@@ -5,10 +5,13 @@ import com.craisinlord.antarchy.content.entity.BedBugEntity;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.cache.object.BakedGeoModel;
|
||||
import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
|
||||
|
||||
public class BedBugRenderer extends GeoEntityRenderer<BedBugEntity> {
|
||||
private static final float ADULT_SCALE = 0.9F;
|
||||
@@ -19,6 +22,7 @@ public class BedBugRenderer extends GeoEntityRenderer<BedBugEntity> {
|
||||
super(context, new BedBugModel());
|
||||
this.shadowRadius = ADULT_SHADOW_RADIUS;
|
||||
this.withScale(ADULT_SCALE);
|
||||
this.addRenderLayer(new BedBugEmissiveLayer(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -32,4 +36,30 @@ public class BedBugRenderer extends GeoEntityRenderer<BedBugEntity> {
|
||||
this.shadowRadius = ADULT_SHADOW_RADIUS;
|
||||
}
|
||||
}
|
||||
|
||||
private static final class BedBugEmissiveLayer extends GeoRenderLayer<BedBugEntity> {
|
||||
private BedBugEmissiveLayer(GeoEntityRenderer<BedBugEntity> renderer) {
|
||||
super(renderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack poseStack, BedBugEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
|
||||
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
|
||||
int packedLight, int packedOverlay) {
|
||||
RenderType emissiveType = RenderType.eyes(BedBugModel.EMISSIVE_TEXTURE);
|
||||
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
emissiveType,
|
||||
emissiveBuffer,
|
||||
partialTick,
|
||||
0xF000F0,
|
||||
OverlayTexture.NO_OVERLAY,
|
||||
0xFFFFFFFF
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
+29
@@ -7,11 +7,13 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.cache.object.BakedGeoModel;
|
||||
import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
|
||||
|
||||
public class BrutalflyRenderer extends GeoEntityRenderer<BrutalflyEntity> {
|
||||
|
||||
@@ -20,6 +22,7 @@ public class BrutalflyRenderer extends GeoEntityRenderer<BrutalflyEntity> {
|
||||
public BrutalflyRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new BrutalflyModel());
|
||||
this.shadowRadius = 1.35F;
|
||||
this.addRenderLayer(new BrutalflyEmissiveLayer(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -53,4 +56,30 @@ public class BrutalflyRenderer extends GeoEntityRenderer<BrutalflyEntity> {
|
||||
protected float getDeathMaxRotation(BrutalflyEntity animatable) {
|
||||
return 0.0F;
|
||||
}
|
||||
|
||||
private static final class BrutalflyEmissiveLayer extends GeoRenderLayer<BrutalflyEntity> {
|
||||
private BrutalflyEmissiveLayer(GeoEntityRenderer<BrutalflyEntity> renderer) {
|
||||
super(renderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack poseStack, BrutalflyEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
|
||||
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
|
||||
int packedLight, int packedOverlay) {
|
||||
RenderType emissiveType = RenderType.eyes(BrutalflyModel.EMISSIVE_TEXTURE);
|
||||
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
emissiveType,
|
||||
emissiveBuffer,
|
||||
partialTick,
|
||||
0xF000F0,
|
||||
OverlayTexture.NO_OVERLAY,
|
||||
0xFFFFFFFF
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
+35
@@ -2,11 +2,46 @@ package com.craisinlord.antarchy.content.client.renderer;
|
||||
|
||||
import com.craisinlord.antarchy.content.client.model.HerculesBeetleModel;
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.cache.object.BakedGeoModel;
|
||||
import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
|
||||
|
||||
public class HerculesBeetleRenderer extends GeoEntityRenderer<HerculesBeetleEntity> {
|
||||
public HerculesBeetleRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new HerculesBeetleModel());
|
||||
this.addRenderLayer(new HerculesBeetleEmissiveLayer(this));
|
||||
}
|
||||
|
||||
private static final class HerculesBeetleEmissiveLayer extends GeoRenderLayer<HerculesBeetleEntity> {
|
||||
private HerculesBeetleEmissiveLayer(GeoEntityRenderer<HerculesBeetleEntity> renderer) {
|
||||
super(renderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack poseStack, HerculesBeetleEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
|
||||
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
|
||||
int packedLight, int packedOverlay) {
|
||||
RenderType emissiveType = RenderType.eyes(HerculesBeetleModel.EMISSIVE_TEXTURE);
|
||||
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
emissiveType,
|
||||
emissiveBuffer,
|
||||
partialTick,
|
||||
0xF000F0,
|
||||
OverlayTexture.NO_OVERLAY,
|
||||
0xFFFFFFFF
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
+33
@@ -8,16 +8,19 @@ import com.mojang.math.Axis;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.cache.object.BakedGeoModel;
|
||||
import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
|
||||
import software.bernie.geckolib.util.Color;
|
||||
|
||||
public class JumpyBugRenderer extends GeoEntityRenderer<JumpyBugEntity> {
|
||||
public JumpyBugRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new JumpyBugModel());
|
||||
this.shadowRadius = 6.0F;
|
||||
this.addRenderLayer(new JumpyBugEmissiveLayer(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -41,4 +44,34 @@ public class JumpyBugRenderer extends GeoEntityRenderer<JumpyBugEntity> {
|
||||
poseStack.mulPose(Axis.ZP.rotationDegrees(180.0F));
|
||||
}
|
||||
}
|
||||
|
||||
private static final class JumpyBugEmissiveLayer extends GeoRenderLayer<JumpyBugEntity> {
|
||||
private JumpyBugEmissiveLayer(GeoEntityRenderer<JumpyBugEntity> renderer) {
|
||||
super(renderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack poseStack, JumpyBugEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
|
||||
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
|
||||
int packedLight, int packedOverlay) {
|
||||
RenderType emissiveType = animatable.isCamouflaged()
|
||||
? RenderType.entityTranslucent(JumpyBugModel.EMISSIVE_TEXTURE)
|
||||
: RenderType.eyes(JumpyBugModel.EMISSIVE_TEXTURE);
|
||||
int alpha = Math.max(10, Math.min(255, Math.round(animatable.getVisualAlpha(partialTick) * 255.0F)));
|
||||
int colour = (alpha << 24) | 0x00FFFFFF;
|
||||
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
emissiveType,
|
||||
emissiveBuffer,
|
||||
partialTick,
|
||||
0xF000F0,
|
||||
OverlayTexture.NO_OVERLAY,
|
||||
colour
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
+35
@@ -2,13 +2,48 @@ package com.craisinlord.antarchy.content.client.renderer;
|
||||
|
||||
import com.craisinlord.antarchy.content.client.model.KrakenModel;
|
||||
import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.cache.object.BakedGeoModel;
|
||||
import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
|
||||
|
||||
public class KrakenRenderer extends GeoEntityRenderer<KrakenEntity> {
|
||||
public KrakenRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new KrakenModel());
|
||||
this.shadowRadius = 2.0F;
|
||||
this.withScale(1.5F);
|
||||
this.addRenderLayer(new KrakenEmissiveLayer(this));
|
||||
}
|
||||
|
||||
private static final class KrakenEmissiveLayer extends GeoRenderLayer<KrakenEntity> {
|
||||
private KrakenEmissiveLayer(GeoEntityRenderer<KrakenEntity> renderer) {
|
||||
super(renderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack poseStack, KrakenEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
|
||||
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
|
||||
int packedLight, int packedOverlay) {
|
||||
RenderType emissiveType = RenderType.eyes(KrakenModel.EMISSIVE_TEXTURE);
|
||||
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
emissiveType,
|
||||
emissiveBuffer,
|
||||
partialTick,
|
||||
0xF000F0,
|
||||
OverlayTexture.NO_OVERLAY,
|
||||
0xFFFFFFFF
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
package com.craisinlord.antarchy.content.client.renderer;
|
||||
|
||||
import com.craisinlord.antarchy.content.entity.SpitBugProjectileEntity;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderer;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import org.joml.Matrix4f;
|
||||
|
||||
public class SpitBugProjectileRenderer extends EntityRenderer<SpitBugProjectileEntity> {
|
||||
private static final ResourceLocation PROJECTILE_TEXTURE =
|
||||
ResourceLocation.withDefaultNamespace("textures/entity/enderdragon/dragon_fireball.png");
|
||||
|
||||
public SpitBugProjectileRenderer(EntityRendererProvider.Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getBlockLightLevel(SpitBugProjectileEntity entity, BlockPos pos) {
|
||||
return 15;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(SpitBugProjectileEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight) {
|
||||
poseStack.pushPose();
|
||||
poseStack.mulPose(this.entityRenderDispatcher.cameraOrientation());
|
||||
|
||||
float scale = entity.getRenderScale(partialTick);
|
||||
poseStack.scale(scale, scale, scale);
|
||||
|
||||
VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.entityTranslucent(PROJECTILE_TEXTURE));
|
||||
PoseStack.Pose pose = poseStack.last();
|
||||
Matrix4f matrix4f = pose.pose();
|
||||
float alpha = entity.isLingering() ? 0.78F : 0.95F;
|
||||
|
||||
addVertex(vertexConsumer, pose, matrix4f, -0.5F, -0.5F, 0.0F, 1.0F, alpha, packedLight);
|
||||
addVertex(vertexConsumer, pose, matrix4f, 0.5F, -0.5F, 1.0F, 1.0F, alpha, packedLight);
|
||||
addVertex(vertexConsumer, pose, matrix4f, 0.5F, 0.5F, 1.0F, 0.0F, alpha, packedLight);
|
||||
addVertex(vertexConsumer, pose, matrix4f, -0.5F, 0.5F, 0.0F, 0.0F, alpha, packedLight);
|
||||
|
||||
poseStack.popPose();
|
||||
super.render(entity, entityYaw, partialTick, poseStack, buffer, packedLight);
|
||||
}
|
||||
|
||||
private static void addVertex(
|
||||
VertexConsumer vertexConsumer,
|
||||
PoseStack.Pose pose,
|
||||
Matrix4f matrix4f,
|
||||
float x,
|
||||
float y,
|
||||
float u,
|
||||
float v,
|
||||
float alpha,
|
||||
int packedLight
|
||||
) {
|
||||
vertexConsumer.addVertex(matrix4f, x, y, 0.0F)
|
||||
.setColor(0.55F, 1.0F, 0.35F, alpha)
|
||||
.setUv(u, v)
|
||||
.setOverlay(OverlayTexture.NO_OVERLAY)
|
||||
.setLight(packedLight)
|
||||
.setNormal(pose, 0.0F, 0.0F, 1.0F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getTextureLocation(SpitBugProjectileEntity entity) {
|
||||
return PROJECTILE_TEXTURE;
|
||||
}
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package com.craisinlord.antarchy.content.client.renderer;
|
||||
|
||||
import com.craisinlord.antarchy.content.client.model.SpitBugModel;
|
||||
import com.craisinlord.antarchy.content.entity.SpitBugEntity;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
|
||||
public class SpitBugRenderer extends GeoEntityRenderer<SpitBugEntity> {
|
||||
public SpitBugRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new SpitBugModel());
|
||||
this.shadowRadius = 1.6F;
|
||||
this.withScale(0.85F);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -49,8 +49,8 @@ public class GlimmerRenderer extends GeoEntityRenderer<GlimmerEntity> {
|
||||
poseStack.scale(growth, growth, growth);
|
||||
|
||||
// Compute body yaw directly from the entity's own tracked fields rather than trusting
|
||||
// the ambient entityYaw parameter, so the body pose and the head-offset math below are
|
||||
// always self-consistent (this is what caused the head to look "detached" from the body).
|
||||
// the ambient entityYaw parameter, so the body pose and the head-offset math below stay
|
||||
// self-consistent.
|
||||
float bodyYaw = Mth.rotLerp(partialTick, entity.yBodyRotO, entity.yBodyRot);
|
||||
poseStack.mulPose(Axis.YP.rotationDegrees(180.0F - bodyYaw));
|
||||
poseStack.scale(-1.0F, -1.0F, 1.0F);
|
||||
|
||||
+28
@@ -115,6 +115,34 @@ public final class AntarchyDamageSources {
|
||||
);
|
||||
}
|
||||
|
||||
public static DamageSource spitBugDisrespect(ServerLevel level, @Nullable Entity directEntity, @Nullable Entity causingEntity) {
|
||||
return new DamageSource(
|
||||
level.registryAccess()
|
||||
.registryOrThrow(Registries.DAMAGE_TYPE)
|
||||
.getHolderOrThrow(AntarchyDamageTypes.SPIT_BUG_DISRESPECT),
|
||||
directEntity,
|
||||
causingEntity
|
||||
);
|
||||
}
|
||||
|
||||
public static DamageSource jumpyBugJump(ServerLevel level, Entity attacker) {
|
||||
return new DamageSource(
|
||||
level.registryAccess()
|
||||
.registryOrThrow(Registries.DAMAGE_TYPE)
|
||||
.getHolderOrThrow(AntarchyDamageTypes.JUMPY_BUG_JUMP),
|
||||
attacker
|
||||
);
|
||||
}
|
||||
|
||||
public static DamageSource herculesBeetleObliteration(ServerLevel level, Entity attacker) {
|
||||
return new DamageSource(
|
||||
level.registryAccess()
|
||||
.registryOrThrow(Registries.DAMAGE_TYPE)
|
||||
.getHolderOrThrow(AntarchyDamageTypes.HERCULES_BEETLE_OBLITERATION),
|
||||
attacker
|
||||
);
|
||||
}
|
||||
|
||||
public static DamageSource waterSoaked(Level level, @Nullable Entity directEntity, @Nullable Entity causingEntity) {
|
||||
return new DamageSource(
|
||||
level.registryAccess()
|
||||
|
||||
@@ -85,6 +85,24 @@ public final class AntarchyDamageTypes {
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "rpo_launcher_blast")
|
||||
);
|
||||
|
||||
public static final ResourceKey<DamageType> SPIT_BUG_DISRESPECT =
|
||||
ResourceKey.create(
|
||||
Registries.DAMAGE_TYPE,
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "spit_bug_disrespect")
|
||||
);
|
||||
|
||||
public static final ResourceKey<DamageType> JUMPY_BUG_JUMP =
|
||||
ResourceKey.create(
|
||||
Registries.DAMAGE_TYPE,
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "jumpy_bug_jump")
|
||||
);
|
||||
|
||||
public static final ResourceKey<DamageType> HERCULES_BEETLE_OBLITERATION =
|
||||
ResourceKey.create(
|
||||
Registries.DAMAGE_TYPE,
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "hercules_beetle_obliteration")
|
||||
);
|
||||
|
||||
private AntarchyDamageTypes() {
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ public class DrTrayaurusEntity extends AbstractVillager {
|
||||
|
||||
public DrTrayaurusEntity(EntityType<? extends AbstractVillager> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
this.setCustomName(DISPLAY_NAME);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+21
-8
@@ -1,7 +1,9 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import com.craisinlord.antarchy.content.AntarchySoundEvents;
|
||||
import com.craisinlord.antarchy.content.AntarchyTags;
|
||||
import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
|
||||
import com.craisinlord.antarchy.content.item.BigBerthaItem;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakeSync;
|
||||
import java.util.EnumSet;
|
||||
@@ -18,6 +20,7 @@ import net.minecraft.network.syncher.EntityDataSerializers;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.server.level.ServerBossEvent;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.advancements.CriteriaTriggers;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
@@ -315,6 +318,10 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
|
||||
this.flightCooldown--;
|
||||
}
|
||||
|
||||
if (this.isFlying() && this.tickCount % 16 == 0) {
|
||||
this.playSound(AntarchySoundEvents.MANTIS_FLY_LOOP.get(), 0.5F, 0.85F + this.random.nextFloat() * 0.1F);
|
||||
}
|
||||
|
||||
if (!this.level().isClientSide && !this.isKnockedDown() && this.isInWall()) {
|
||||
this.breakBlocksForSuffocation();
|
||||
}
|
||||
@@ -564,6 +571,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
|
||||
this.setDeltaMovement(Vec3.ZERO);
|
||||
this.actionTicks = KNOCKED_DOWN_TICKS;
|
||||
this.setAnimationState(ANIM_KNOCKED_DOWN);
|
||||
this.playSound(AntarchySoundEvents.HERCULES_BEETLE_KNOCKED_DOWN.get(), 1.2F, 0.9F);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -578,6 +586,9 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
|
||||
if (this.random.nextInt(3) == 0) {
|
||||
this.setTame(true, true);
|
||||
this.setOwnerUUID(player.getUUID());
|
||||
if (player instanceof ServerPlayer serverPlayer) {
|
||||
CriteriaTriggers.TAME_ANIMAL.trigger(serverPlayer, this);
|
||||
}
|
||||
this.setKnockedDown(false);
|
||||
this.heal(this.getMaxHealth());
|
||||
this.setTarget(null);
|
||||
@@ -702,7 +713,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
|
||||
this.cryCooldown = CRY_COOLDOWN_TICKS;
|
||||
this.combatCryDone = true;
|
||||
this.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 200, 1));
|
||||
this.playSound(SoundEvents.RAVAGER_ROAR, 1.5F, 0.7F);
|
||||
this.playSound(AntarchySoundEvents.HERCULES_BEETLE_CRY.get(), 1.5F, 0.7F);
|
||||
}
|
||||
|
||||
private void startRegularAttack(boolean flyingAttack, @Nullable LivingEntity target) {
|
||||
@@ -727,14 +738,16 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
|
||||
}
|
||||
}
|
||||
}
|
||||
this.playSound(SoundEvents.RAVAGER_ATTACK, 1.2F, flyingAttack ? 1.1F : 0.9F);
|
||||
this.playSound(AntarchySoundEvents.HERCULES_BEETLE_ATTACK.get(), 1.2F, flyingAttack ? 1.1F : 0.9F);
|
||||
}
|
||||
|
||||
private boolean hurtAndLaunchTarget(LivingEntity target, float damage, double horizontalKnockback) {
|
||||
if (!this.canHarm(target)) {
|
||||
return false;
|
||||
}
|
||||
boolean hurt = target.hurt(this.damageSources().mobAttack(this), damage);
|
||||
boolean hurt = this.level() instanceof ServerLevel serverLevel
|
||||
? target.hurt(AntarchyDamageSources.herculesBeetleObliteration(serverLevel, this), damage)
|
||||
: target.hurt(this.damageSources().mobAttack(this), damage);
|
||||
if (hurt) {
|
||||
Vec3 push = target.position().subtract(this.position()).multiply(1.0D, 0.0D, 1.0D);
|
||||
if (push.lengthSqr() < 1.0E-4D) {
|
||||
@@ -770,7 +783,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
|
||||
this.pendingMountedCharge = mountedCharge;
|
||||
this.setAnimationState(ANIM_CHARGE_START);
|
||||
this.actionTicks = CHARGE_START_TICKS;
|
||||
this.playSound(SoundEvents.ENDER_DRAGON_FLAP, 1.3F, 0.7F);
|
||||
this.playSound(AntarchySoundEvents.HERCULES_BEETLE_CHARGE_START.get(), 1.3F, 0.7F);
|
||||
}
|
||||
|
||||
private void beginChargeLoop() {
|
||||
@@ -802,7 +815,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
|
||||
if (victim == this) {
|
||||
continue;
|
||||
}
|
||||
if (victim.hurt(this.damageSources().mobAttack(this), damage)) {
|
||||
if (victim.hurt(AntarchyDamageSources.herculesBeetleObliteration(serverLevel, this), damage)) {
|
||||
Vec3 push = victim.position().subtract(this.position());
|
||||
if (push.lengthSqr() < 1.0E-4D) {
|
||||
push = this.chargeDirection;
|
||||
@@ -1175,17 +1188,17 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
|
||||
|
||||
@Override
|
||||
protected SoundEvent getAmbientSound() {
|
||||
return this.isKnockedDown() ? null : SoundEvents.RAVAGER_AMBIENT;
|
||||
return this.isKnockedDown() ? null : AntarchySoundEvents.HERCULES_BEETLE_IDLE.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getHurtSound(DamageSource damageSource) {
|
||||
return SoundEvents.RAVAGER_HURT;
|
||||
return AntarchySoundEvents.HERCULES_BEETLE_HURT.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getDeathSound() {
|
||||
return SoundEvents.RAVAGER_DEATH;
|
||||
return AntarchySoundEvents.HERCULES_BEETLE_HURT.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import com.craisinlord.antarchy.content.AntarchySoundEvents;
|
||||
import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
|
||||
import com.mojang.serialization.Codec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
@@ -71,6 +73,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
private static final double MELEE_WALK_RANGE = 4.0D;
|
||||
private static final double CHASE_LEAP_RANGE_SQR = 8.0D * 8.0D;
|
||||
private static final int DEFAULT_POUNCE_COOLDOWN = 60;
|
||||
private static final int POUNCE_PREFERENCE_CHANCE = 7;
|
||||
private static final int DEFAULT_RECOVERY_TICKS = 20;
|
||||
private static final int CHASE_JUMP_COOLDOWN = 25;
|
||||
private static final double POUNCE_HORIZONTAL_SPEED = 0.92D;
|
||||
@@ -79,12 +82,15 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
private static final double CHASE_LEAP_VERTICAL = 0.55D;
|
||||
private static final double QUICK_MOVE_SQR = 0.14D * 0.14D;
|
||||
private static final double POUNCE_LAND_DAMAGE_RANGE = 5.0D;
|
||||
private static final int MAX_POUNCE_TICKS = 60;
|
||||
private static final int CEILING_SEARCH_RANGE = 30;
|
||||
private static final double CAMOUFLAGE_PLAYER_RANGE = 24.0D;
|
||||
|
||||
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle");
|
||||
private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk");
|
||||
private static final RawAnimation JUMP_ANIM = RawAnimation.begin().thenLoop("jump");
|
||||
private static final RawAnimation JUMP_ANIM = RawAnimation.begin().thenPlay("jump_start").thenLoop("jump_loop");
|
||||
private static final RawAnimation JUMP_END_ANIM = RawAnimation.begin().thenPlay("jump_end");
|
||||
private static final RawAnimation HANGING_ANIM = RawAnimation.begin().thenLoop("hanging");
|
||||
private static final RawAnimation ATTACK_ANIM = RawAnimation.begin().thenPlay("attack");
|
||||
|
||||
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
|
||||
@@ -94,6 +100,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
private int pounceTicks;
|
||||
private int leapingTicks;
|
||||
private int chaseJumpCooldownTicks;
|
||||
private boolean preferPounceThisWindow = true;
|
||||
private float visualAlpha = 1.0F;
|
||||
private float previousVisualAlpha = 1.0F;
|
||||
|
||||
@@ -130,8 +137,8 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
this.goalSelector.addGoal(1, new CloseMeleeGoal());
|
||||
this.goalSelector.addGoal(2, new PounceAttackGoal());
|
||||
this.goalSelector.addGoal(1, new PounceAttackGoal());
|
||||
this.goalSelector.addGoal(2, new CloseMeleeGoal());
|
||||
this.goalSelector.addGoal(3, new HideOnCeilingGoal());
|
||||
this.goalSelector.addGoal(4, new ChaseTargetGoal());
|
||||
this.goalSelector.addGoal(5, new WanderGoal());
|
||||
@@ -192,6 +199,9 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
|
||||
if (this.pounceCooldownTicks > 0) {
|
||||
this.pounceCooldownTicks--;
|
||||
if (this.pounceCooldownTicks == 0) {
|
||||
this.preferPounceThisWindow = this.random.nextInt(10) < POUNCE_PREFERENCE_CHANCE;
|
||||
}
|
||||
}
|
||||
if (this.recoveryTicks > 0) {
|
||||
this.recoveryTicks--;
|
||||
@@ -252,14 +262,21 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doHurtTarget(Entity target) {
|
||||
return target instanceof LivingEntity livingTarget && this.level() instanceof ServerLevel serverLevel
|
||||
? livingTarget.hurt(AntarchyDamageSources.jumpyBugJump(serverLevel, this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE))
|
||||
: super.doHurtTarget(target);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getAmbientSound() {
|
||||
return SoundEvents.SPIDER_AMBIENT;
|
||||
return AntarchySoundEvents.JUMPY_BUG_IDLE.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getHurtSound(DamageSource damageSource) {
|
||||
return SoundEvents.SPIDER_HURT;
|
||||
return AntarchySoundEvents.JUMPY_BUG_HURT.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -314,11 +331,14 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
|
||||
private PlayState mainAnimController(AnimationState<JumpyBugEntity> state) {
|
||||
AttackState attackState = this.getAttackState();
|
||||
if (attackState == AttackState.POUNCING || attackState == AttackState.CLINGING || attackState == AttackState.LEAPING_TO_CEILING) {
|
||||
if (attackState == AttackState.CLINGING) {
|
||||
return state.setAndContinue(HANGING_ANIM);
|
||||
}
|
||||
if ((attackState == AttackState.POUNCING || attackState == AttackState.LEAPING_TO_CEILING) && !this.onGround()) {
|
||||
return state.setAndContinue(JUMP_ANIM);
|
||||
}
|
||||
if (attackState == AttackState.RECOVERING) {
|
||||
return state.setAndContinue(ATTACK_ANIM);
|
||||
return state.setAndContinue(JUMP_END_ANIM);
|
||||
}
|
||||
return state.setAndContinue(state.isMoving() ? WALK_ANIM : IDLE_ANIM);
|
||||
}
|
||||
@@ -345,11 +365,15 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
this.setCamouflaged(false);
|
||||
this.pounceTicks++;
|
||||
|
||||
if (this.onGround() && this.pounceTicks > 8) {
|
||||
if ((this.onGround() && this.pounceTicks > 8) || this.pounceTicks > MAX_POUNCE_TICKS) {
|
||||
LivingEntity target = this.getTarget();
|
||||
if (target != null && target.isAlive() && this.distanceToSqr(target) <= POUNCE_LAND_DAMAGE_RANGE * POUNCE_LAND_DAMAGE_RANGE) {
|
||||
if (this.level() instanceof ServerLevel serverLevel) {
|
||||
target.hurt(AntarchyDamageSources.jumpyBugJump(serverLevel, this), (float) AntarchySettings.jumpyBugPounceDamage());
|
||||
} else {
|
||||
target.hurt(this.damageSources().mobAttack(this), (float) AntarchySettings.jumpyBugPounceDamage());
|
||||
}
|
||||
}
|
||||
this.finishPounce(false);
|
||||
}
|
||||
}
|
||||
@@ -437,6 +461,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
double upwardSpeed = Math.min(2.5D, Math.sqrt(0.16D * Math.max(dy, 1.0D)) + 0.4D);
|
||||
this.setDeltaMovement(0.0D, upwardSpeed, 0.0D);
|
||||
this.hasImpulse = true;
|
||||
this.playSound(AntarchySoundEvents.JUMPY_BUG_JUMP.get(), 1.0F, 0.95F + this.random.nextFloat() * 0.1F);
|
||||
}
|
||||
|
||||
private void cancelLeap() {
|
||||
@@ -460,6 +485,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
double upward = POUNCE_UPWARD_SPEED + Mth.clamp(to.y * 0.08D, -0.04D, 0.22D);
|
||||
this.setDeltaMovement(direction.x * POUNCE_HORIZONTAL_SPEED, upward, direction.z * POUNCE_HORIZONTAL_SPEED);
|
||||
this.hasImpulse = true;
|
||||
this.playSound(AntarchySoundEvents.JUMPY_BUG_JUMP.get(), 1.0F, 0.95F + this.random.nextFloat() * 0.1F);
|
||||
}
|
||||
|
||||
private void finishPounce(boolean keepMomentum) {
|
||||
@@ -573,6 +599,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
|
||||
&& target.isAlive()
|
||||
&& JumpyBugEntity.this.canUseAmbush()
|
||||
&& JumpyBugEntity.this.pounceCooldownTicks <= 0
|
||||
&& JumpyBugEntity.this.preferPounceThisWindow
|
||||
&& (JumpyBugEntity.this.hasLineOfSight(target) || JumpyBugEntity.this.distanceToSqr(target) <= 9.0D);
|
||||
}
|
||||
|
||||
|
||||
@@ -268,8 +268,6 @@ public class MantisEntity extends Monster implements GeoEntity {
|
||||
|
||||
@Override
|
||||
public void setYBodyRot(float yBodyRot) {
|
||||
// Only sync yRot from body rotation during flight — on the ground this
|
||||
// conflicted with navigation and contributed to post-attack spinning
|
||||
if (this.isFlyingNow()) {
|
||||
this.setYRot(yBodyRot);
|
||||
}
|
||||
@@ -330,8 +328,6 @@ public class MantisEntity extends Monster implements GeoEntity {
|
||||
}
|
||||
|
||||
private void updateFlightRotation() {
|
||||
// Only override rotation during actual flight — on the ground this fought the
|
||||
// navigation system, causing the mantis to spin 180° after each attack
|
||||
if (!this.isFlyingNow()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import com.craisinlord.antarchy.content.AntarchyTags;
|
||||
import com.craisinlord.antarchy.content.AntarchySoundEvents;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import net.minecraft.core.BlockPos;
|
||||
@@ -13,6 +14,7 @@ import net.minecraft.network.syncher.EntityDataSerializers;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.advancements.CriteriaTriggers;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
@@ -39,6 +41,7 @@ import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal;
|
||||
import net.minecraft.world.entity.ai.util.DefaultRandomPos;
|
||||
import net.minecraft.world.entity.item.ItemEntity;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.crafting.Ingredient;
|
||||
import net.minecraft.world.level.Level;
|
||||
@@ -93,6 +96,14 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
|
||||
super(entityType, level);
|
||||
}
|
||||
|
||||
public static boolean canSpawn(EntityType<RollyPollyEntity> entityType, net.minecraft.world.level.ServerLevelAccessor level, net.minecraft.world.entity.MobSpawnType spawnReason, BlockPos pos, net.minecraft.util.RandomSource random) {
|
||||
if (spawnReason == net.minecraft.world.entity.MobSpawnType.SPAWN_EGG || spawnReason == net.minecraft.world.entity.MobSpawnType.SPAWNER || spawnReason == net.minecraft.world.entity.MobSpawnType.COMMAND) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return Mob.checkMobSpawnRules(entityType, level, spawnReason, pos, random);
|
||||
}
|
||||
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
return Mob.createMobAttributes()
|
||||
.add(Attributes.MAX_HEALTH, AntarchySettings.rollyPollyHealth())
|
||||
@@ -155,6 +166,9 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
|
||||
if (this.random.nextInt(AntarchySettings.rollyPollyTameChance()) == 0) {
|
||||
this.setTame(true, true);
|
||||
this.setOwnerUUID(player.getUUID());
|
||||
if (player instanceof ServerPlayer serverPlayer) {
|
||||
CriteriaTriggers.TAME_ANIMAL.trigger(serverPlayer, this);
|
||||
}
|
||||
this.stopDefensiveCurl();
|
||||
this.setTarget(null);
|
||||
this.level().broadcastEntityEvent(this, (byte) 7);
|
||||
@@ -241,14 +255,19 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
|
||||
this.unrolling = false;
|
||||
this.rollTransitionTicks = ROLL_UP_TICKS;
|
||||
this.setAnimationState(ANIM_ROLL_UP);
|
||||
this.playSound(SoundEvents.ARMOR_EQUIP_TURTLE.value(), 0.8F, 1.4F);
|
||||
this.playSound(SoundEvents.ARMADILLO_ROLL, 0.8F, 1.0F);
|
||||
}
|
||||
|
||||
private void startUnroll() {
|
||||
this.unrolling = true;
|
||||
this.rollTransitionTicks = UNROLL_TICKS;
|
||||
this.setAnimationState(ANIM_UNROLL);
|
||||
this.playSound(SoundEvents.ARMOR_EQUIP_TURTLE.value(), 0.8F, 1.1F);
|
||||
this.playSound(SoundEvents.ARMADILLO_UNROLL_START, 0.8F, 1.0F);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getAmbientSound() {
|
||||
return AntarchySoundEvents.ROLLY_POLLY_IDLE.get();
|
||||
}
|
||||
|
||||
private void stopDefensiveCurl() {
|
||||
|
||||
@@ -0,0 +1,269 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.AntarchySoundEvents;
|
||||
import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.network.syncher.EntityDataAccessor;
|
||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.Difficulty;
|
||||
import net.minecraft.world.damagesource.DamageSource;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.Mob;
|
||||
import net.minecraft.world.entity.MobSpawnType;
|
||||
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
|
||||
import net.minecraft.world.entity.ai.attributes.Attributes;
|
||||
import net.minecraft.world.entity.ai.goal.FloatGoal;
|
||||
import net.minecraft.world.entity.ai.goal.Goal;
|
||||
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal;
|
||||
import net.minecraft.world.entity.ai.goal.MeleeAttackGoal;
|
||||
import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;
|
||||
import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal;
|
||||
import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal;
|
||||
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;
|
||||
import net.minecraft.world.entity.monster.Monster;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.ServerLevelAccessor;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.Heightmap;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import software.bernie.geckolib.animatable.GeoEntity;
|
||||
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
|
||||
import software.bernie.geckolib.animation.AnimatableManager;
|
||||
import software.bernie.geckolib.animation.AnimationController;
|
||||
import software.bernie.geckolib.animation.AnimationState;
|
||||
import software.bernie.geckolib.animation.PlayState;
|
||||
import software.bernie.geckolib.animation.RawAnimation;
|
||||
import software.bernie.geckolib.util.GeckoLibUtil;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
public class SpitBugEntity extends Monster implements GeoEntity {
|
||||
private static final EntityDataAccessor<Integer> SPIT_ANIM_TICKS =
|
||||
SynchedEntityData.defineId(SpitBugEntity.class, EntityDataSerializers.INT);
|
||||
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle");
|
||||
private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk");
|
||||
private static final RawAnimation SPIT_ANIM = RawAnimation.begin().thenPlay("spit");
|
||||
|
||||
private static final double MAX_HEALTH = 50.0D;
|
||||
private static final double MOVEMENT_SPEED = 0.23D;
|
||||
private static final double ATTACK_DAMAGE = 5.0D;
|
||||
private static final double FOLLOW_RANGE = 24.0D;
|
||||
private static final double SPIT_RANGE_SQR = 14.0D * 14.0D;
|
||||
private static final double MELEE_RANGE_SQR = 3.5D * 3.5D;
|
||||
private static final int SPIT_COOLDOWN_TICKS = 55;
|
||||
private static final int SPIT_ANIMATION_TICKS = 18;
|
||||
private static final int SPIT_RELEASE_TICKS = 8;
|
||||
|
||||
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
|
||||
|
||||
private int spitCooldownTicks;
|
||||
private int spitAnimationTicks;
|
||||
private int spitReleaseTicks;
|
||||
|
||||
public SpitBugEntity(EntityType<? extends SpitBugEntity> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
this.xpReward = 10;
|
||||
}
|
||||
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
return Mob.createMobAttributes()
|
||||
.add(Attributes.MAX_HEALTH, MAX_HEALTH)
|
||||
.add(Attributes.MOVEMENT_SPEED, MOVEMENT_SPEED)
|
||||
.add(Attributes.ATTACK_DAMAGE, ATTACK_DAMAGE)
|
||||
.add(Attributes.FOLLOW_RANGE, FOLLOW_RANGE)
|
||||
.add(Attributes.ARMOR, 4.0D)
|
||||
.add(Attributes.KNOCKBACK_RESISTANCE, 0.2D);
|
||||
}
|
||||
|
||||
public static boolean canSpawn(EntityType<SpitBugEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
|
||||
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return level.getDifficulty() != Difficulty.PEACEFUL
|
||||
&& level.isEmptyBlock(pos)
|
||||
&& level.isEmptyBlock(pos.above())
|
||||
&& Monster.checkMonsterSpawnRules(entityType, level, spawnReason, pos, random);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
builder.define(SPIT_ANIM_TICKS, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
this.goalSelector.addGoal(1, new SpitAttackGoal());
|
||||
this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0D, false));
|
||||
this.goalSelector.addGoal(3, new WaterAvoidingRandomStrollGoal(this, 0.9D));
|
||||
this.goalSelector.addGoal(4, new LookAtPlayerGoal(this, Player.class, 12.0F));
|
||||
this.goalSelector.addGoal(5, new RandomLookAroundGoal(this));
|
||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this));
|
||||
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||
controllers.add(new AnimationController<>(this, "main_controller", 2, this::mainAnimController));
|
||||
}
|
||||
|
||||
@Override
|
||||
public AnimatableInstanceCache getAnimatableInstanceCache() {
|
||||
return this.geoCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
if (this.level().isClientSide) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.spitCooldownTicks > 0) {
|
||||
this.spitCooldownTicks--;
|
||||
}
|
||||
|
||||
if (this.spitAnimationTicks > 0) {
|
||||
this.spitAnimationTicks--;
|
||||
this.entityData.set(SPIT_ANIM_TICKS, this.spitAnimationTicks);
|
||||
if (this.spitReleaseTicks > 0 && --this.spitReleaseTicks == 0) {
|
||||
this.fireSpitProjectile();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doHurtTarget(net.minecraft.world.entity.Entity target) {
|
||||
boolean hurt = target instanceof LivingEntity livingTarget && this.level() instanceof ServerLevel serverLevel
|
||||
? livingTarget.hurt(AntarchyDamageSources.spitBugDisrespect(serverLevel, this, this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE))
|
||||
: super.doHurtTarget(target);
|
||||
if (hurt) {
|
||||
this.playSound(SoundEvents.SPIDER_HURT, 0.7F, 0.8F + this.random.nextFloat() * 0.2F);
|
||||
}
|
||||
return hurt;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getAmbientSound() {
|
||||
return AntarchySoundEvents.SPIT_BUG_IDLE.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getHurtSound(DamageSource damageSource) {
|
||||
return AntarchySoundEvents.SPIT_BUG_HURT.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getDeathSound() {
|
||||
return SoundEvents.SPIDER_DEATH;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void playStepSound(BlockPos pos, BlockState blockState) {
|
||||
this.playSound(SoundEvents.SPIDER_STEP, 0.18F, 0.95F);
|
||||
}
|
||||
|
||||
private PlayState mainAnimController(AnimationState<SpitBugEntity> state) {
|
||||
if (this.entityData.get(SPIT_ANIM_TICKS) > 0) {
|
||||
return state.setAndContinue(SPIT_ANIM);
|
||||
}
|
||||
return state.setAndContinue(state.isMoving() ? WALK_ANIM : IDLE_ANIM);
|
||||
}
|
||||
|
||||
private boolean canSpitAt(LivingEntity target) {
|
||||
return this.spitCooldownTicks <= 0
|
||||
&& this.spitAnimationTicks <= 0
|
||||
&& this.hasLineOfSight(target)
|
||||
&& this.distanceToSqr(target) <= SPIT_RANGE_SQR
|
||||
&& this.distanceToSqr(target) > MELEE_RANGE_SQR;
|
||||
}
|
||||
|
||||
private void startSpitAttack() {
|
||||
this.spitCooldownTicks = SPIT_COOLDOWN_TICKS;
|
||||
this.spitAnimationTicks = SPIT_ANIMATION_TICKS;
|
||||
this.spitReleaseTicks = SPIT_RELEASE_TICKS;
|
||||
this.entityData.set(SPIT_ANIM_TICKS, this.spitAnimationTicks);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void fireSpitProjectile() {
|
||||
if (!(this.level() instanceof ServerLevel serverLevel)) {
|
||||
return;
|
||||
}
|
||||
|
||||
LivingEntity target = this.getTarget();
|
||||
if (target == null || !target.isAlive()) {
|
||||
return;
|
||||
}
|
||||
|
||||
EntityType<SpitBugProjectileEntity> projectileType = (EntityType<SpitBugProjectileEntity>) BuiltInRegistries.ENTITY_TYPE.getOptional(
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "spit_bug_projectile")
|
||||
).orElse(null);
|
||||
if (projectileType == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
SpitBugProjectileEntity projectile = new SpitBugProjectileEntity(projectileType, this, serverLevel);
|
||||
Vec3 origin = this.position()
|
||||
.add(0.0D, this.getBbHeight() * 0.55D, 0.0D)
|
||||
.add(this.getViewVector(0.0F).scale(1.35D));
|
||||
Vec3 aimPoint = target.getEyePosition().add(target.getDeltaMovement().scale(0.45D));
|
||||
Vec3 direction = aimPoint.subtract(origin).normalize();
|
||||
|
||||
projectile.setPos(origin.x, origin.y, origin.z);
|
||||
projectile.shoot(direction.x, direction.y, direction.z, 1.05F, 0.0F);
|
||||
serverLevel.addFreshEntity(projectile);
|
||||
this.playSound(AntarchySoundEvents.SPIT_BUG_SPIT.get(), 1.0F, 0.85F + this.random.nextFloat() * 0.15F);
|
||||
}
|
||||
|
||||
private final class SpitAttackGoal extends Goal {
|
||||
SpitAttackGoal() {
|
||||
this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
LivingEntity target = SpitBugEntity.this.getTarget();
|
||||
return target != null && target.isAlive();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
return this.canUse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
LivingEntity target = SpitBugEntity.this.getTarget();
|
||||
if (target == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
SpitBugEntity.this.getLookControl().setLookAt(target, 30.0F, 30.0F);
|
||||
|
||||
if (SpitBugEntity.this.canSpitAt(target)) {
|
||||
SpitBugEntity.this.getNavigation().stop();
|
||||
SpitBugEntity.this.startSpitAttack();
|
||||
return;
|
||||
}
|
||||
|
||||
if (SpitBugEntity.this.distanceToSqr(target) > 36.0D || !SpitBugEntity.this.hasLineOfSight(target)) {
|
||||
SpitBugEntity.this.getNavigation().moveTo(target, 1.0D);
|
||||
} else {
|
||||
SpitBugEntity.this.getNavigation().stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+175
@@ -0,0 +1,175 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
|
||||
import net.minecraft.core.particles.ParticleTypes;
|
||||
import net.minecraft.network.syncher.EntityDataAccessor;
|
||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import net.minecraft.world.effect.MobEffects;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.projectile.ThrowableItemProjectile;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.EntityHitResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
|
||||
public class SpitBugProjectileEntity extends ThrowableItemProjectile {
|
||||
private static final EntityDataAccessor<Boolean> LINGERING =
|
||||
SynchedEntityData.defineId(SpitBugProjectileEntity.class, EntityDataSerializers.BOOLEAN);
|
||||
private static final int MAX_FLIGHT_TICKS = 100;
|
||||
private static final int LINGER_DURATION_TICKS = 300;
|
||||
private static final int DIRECT_HIT_DAMAGE = 8;
|
||||
private static final float LINGER_RADIUS = 1.65F;
|
||||
|
||||
private boolean lingering;
|
||||
private int lingeringTicks;
|
||||
|
||||
public SpitBugProjectileEntity(EntityType<? extends SpitBugProjectileEntity> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
}
|
||||
|
||||
public SpitBugProjectileEntity(EntityType<? extends SpitBugProjectileEntity> entityType, LivingEntity owner, Level level) {
|
||||
super(entityType, owner, level);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
builder.define(LINGERING, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Item getDefaultItem() {
|
||||
return Items.SLIME_BALL;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected double getDefaultGravity() {
|
||||
return 0.03D;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeCollidedWith() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAttackable() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isLingering() {
|
||||
return this.entityData.get(LINGERING);
|
||||
}
|
||||
|
||||
public float getRenderScale(float partialTick) {
|
||||
if (!this.isLingering()) {
|
||||
return 0.65F;
|
||||
}
|
||||
float progress = Math.min(1.0F, (this.lingeringTicks + partialTick) / 8.0F);
|
||||
return 0.6F + progress * 0.5F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (this.isLingering()) {
|
||||
this.tickLingering();
|
||||
return;
|
||||
}
|
||||
|
||||
super.tick();
|
||||
if (this.tickCount > MAX_FLIGHT_TICKS) {
|
||||
this.discard();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.level().isClientSide) {
|
||||
this.level().addParticle(ParticleTypes.ITEM_SLIME, this.getX(), this.getY(), this.getZ(), 0.0D, 0.0D, 0.0D);
|
||||
}
|
||||
}
|
||||
|
||||
private void tickLingering() {
|
||||
this.lingeringTicks++;
|
||||
this.setDeltaMovement(Vec3.ZERO);
|
||||
|
||||
if (this.level().isClientSide) {
|
||||
double radius = 0.4D + this.random.nextDouble() * 0.45D;
|
||||
this.level().addParticle(
|
||||
ParticleTypes.ITEM_SLIME,
|
||||
this.getX() + (this.random.nextDouble() - 0.5D) * radius,
|
||||
this.getY() + 0.04D,
|
||||
this.getZ() + (this.random.nextDouble() - 0.5D) * radius,
|
||||
0.0D,
|
||||
0.0D,
|
||||
0.0D
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.lingeringTicks % 4 == 0) {
|
||||
this.applyLingeringSpit();
|
||||
}
|
||||
|
||||
if (this.lingeringTicks >= LINGER_DURATION_TICKS) {
|
||||
this.discard();
|
||||
}
|
||||
}
|
||||
|
||||
private void applyLingeringSpit() {
|
||||
for (LivingEntity target : this.level().getEntitiesOfClass(
|
||||
LivingEntity.class,
|
||||
this.getBoundingBox().inflate(LINGER_RADIUS, 0.6D, LINGER_RADIUS),
|
||||
entity -> entity.isAlive() && entity != this.getOwner()
|
||||
)) {
|
||||
target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 30, 3, false, true, true));
|
||||
target.makeStuckInBlock(Blocks.HONEY_BLOCK.defaultBlockState(), new Vec3(0.2D, 0.0D, 0.2D));
|
||||
}
|
||||
|
||||
if (this.level() instanceof ServerLevel serverLevel) {
|
||||
serverLevel.sendParticles(ParticleTypes.ITEM_SLIME, this.getX(), this.getY() + 0.05D, this.getZ(), 3, 0.45D, 0.02D, 0.45D, 0.0D);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onHitEntity(EntityHitResult result) {
|
||||
if (!this.level().isClientSide && result.getEntity() instanceof LivingEntity livingTarget) {
|
||||
Entity owner = this.getOwner();
|
||||
if (owner instanceof SpitBugEntity && this.level() instanceof ServerLevel serverLevel) {
|
||||
livingTarget.hurt(AntarchyDamageSources.spitBugDisrespect(serverLevel, this, owner), DIRECT_HIT_DAMAGE);
|
||||
} else if (owner instanceof LivingEntity livingOwner) {
|
||||
livingTarget.hurt(this.damageSources().mobProjectile(this, livingOwner), DIRECT_HIT_DAMAGE);
|
||||
} else {
|
||||
livingTarget.hurt(this.damageSources().magic(), DIRECT_HIT_DAMAGE);
|
||||
}
|
||||
livingTarget.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 80, 3, false, true, true));
|
||||
livingTarget.makeStuckInBlock(Blocks.HONEY_BLOCK.defaultBlockState(), new Vec3(0.25D, 0.0D, 0.25D));
|
||||
}
|
||||
|
||||
this.beginLingering(result.getLocation());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onHitBlock(BlockHitResult result) {
|
||||
this.beginLingering(result.getLocation());
|
||||
}
|
||||
|
||||
private void beginLingering(Vec3 location) {
|
||||
if (this.isLingering()) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.lingering = true;
|
||||
this.entityData.set(LINGERING, true);
|
||||
this.lingeringTicks = 0;
|
||||
this.noPhysics = true;
|
||||
this.setPos(location.x, location.y + 0.05D, location.z);
|
||||
this.setDeltaMovement(Vec3.ZERO);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.content.AntarchyObjects;
|
||||
import com.craisinlord.antarchy.content.AntarchySoundEvents;
|
||||
import com.craisinlord.antarchy.content.StinkyBehavior;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
@@ -20,6 +21,7 @@ import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;
|
||||
import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal;
|
||||
import net.minecraft.world.entity.animal.Animal;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.ServerLevelAccessor;
|
||||
@@ -67,7 +69,7 @@ public class StinkBugEntity extends Animal implements GeoEntity {
|
||||
return true;
|
||||
}
|
||||
return level.getDifficulty() != Difficulty.PEACEFUL
|
||||
&& Animal.checkAnimalSpawnRules(entityType, level, spawnReason, pos, random);
|
||||
&& Mob.checkMobSpawnRules(entityType, level, spawnReason, pos, random);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -86,6 +88,7 @@ public class StinkBugEntity extends Animal implements GeoEntity {
|
||||
if (this.fartAnimationTicks > 0) {
|
||||
this.fartAnimationTicks--;
|
||||
if (this.fartAnimationTicks == FART_RELEASE_TICKS && this.pendingFartBurst && !this.level().isClientSide()) {
|
||||
this.playSound(AntarchySoundEvents.STINK_BUG_FART.get(), 0.85F, 0.9F + this.random.nextFloat() * 0.1F);
|
||||
StinkyBehavior.emitBurst(this, STINK_BURST_PARTICLES);
|
||||
StinkyBehavior.applyBurstStinkyEffect(this, STINK_BURST_RADIUS, STINK_BURST_DURATION_TICKS);
|
||||
this.pendingFartBurst = false;
|
||||
@@ -121,6 +124,11 @@ public class StinkBugEntity extends Animal implements GeoEntity {
|
||||
.triggerableAnim(FART_TRIGGER, FART_ANIM));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getAmbientSound() {
|
||||
return AntarchySoundEvents.STINK_BUG_IDLE.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AnimatableInstanceCache getAnimatableInstanceCache() {
|
||||
return this.geoCache;
|
||||
|
||||
+43
-1
@@ -7,8 +7,10 @@ import java.util.List;
|
||||
import java.util.Set;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.PlayerRespawnLogic;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
@@ -98,6 +100,47 @@ public final class AntTeleportHelper {
|
||||
return moved instanceof Mob mob ? mob : null;
|
||||
}
|
||||
|
||||
public static InteractionResult teleportPlayerToDimension(ServerPlayer player, ResourceKey<Level> destinationKey) {
|
||||
ServerLevel destination = player.server.getLevel(destinationKey);
|
||||
if (destination == null) {
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
|
||||
Vec3 destinationPos = getDestinationPosition(player, destination);
|
||||
teleportPlayerWithCompanions(player, destination, destinationPos);
|
||||
player.playSound(SoundEvents.ENDERMAN_TELEPORT, 1.0F, 1.0F);
|
||||
return InteractionResult.CONSUME;
|
||||
}
|
||||
|
||||
public static InteractionResult teleportPlayerToReturnDestination(ServerPlayer player) {
|
||||
ServerLevel destination = resolveReturnDestinationLevel(player);
|
||||
Vec3 destinationPos = getDestinationPosition(player, destination);
|
||||
teleportPlayerWithCompanions(player, destination, destinationPos);
|
||||
player.playSound(SoundEvents.ENDERMAN_TELEPORT, 1.0F, 1.0F);
|
||||
return InteractionResult.CONSUME;
|
||||
}
|
||||
|
||||
public static InteractionResult handleCagedAntTeleport(ServerPlayer player, @Nullable ResourceLocation entityTypeId, @Nullable CompoundTag entityData) {
|
||||
if (entityTypeId == null) {
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
|
||||
if (entityTypeId.equals(ResourceLocation.fromNamespaceAndPath("antarchy", "brown_ant"))) {
|
||||
return teleportPlayerToDimension(player, AntarchySettings.brownAntDestinationDimension());
|
||||
}
|
||||
if (entityTypeId.equals(ResourceLocation.fromNamespaceAndPath("antarchy", "red_ant"))) {
|
||||
return teleportPlayerToDimension(player, AntarchySettings.redAntDestinationDimension());
|
||||
}
|
||||
if (entityTypeId.equals(ResourceLocation.fromNamespaceAndPath("antarchy", "termite"))) {
|
||||
return teleportPlayerToDimension(player, AntarchySettings.termiteDestinationDimension());
|
||||
}
|
||||
if (entityTypeId.equals(ResourceLocation.fromNamespaceAndPath("antarchy", "rainbow_ant"))) {
|
||||
return RainbowAntEntity.teleportPlayerFromStoredData(player, entityData);
|
||||
}
|
||||
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
|
||||
static InteractionResult handleInteraction(BaseAntEntity ant, Player player, ItemStack itemStack) {
|
||||
if (ant.requiresActivationReagent() && !ant.isTeleportActivatedState()) {
|
||||
if (!(player instanceof ServerPlayer serverPlayer)) {
|
||||
@@ -161,7 +204,6 @@ public final class AntTeleportHelper {
|
||||
return destination;
|
||||
}
|
||||
|
||||
// If the player's respawn is not in the overworld, return them to overworld spawn instead
|
||||
return player.server.overworld();
|
||||
}
|
||||
|
||||
|
||||
+38
@@ -24,6 +24,7 @@ import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.storage.LevelResource;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.animatable.GeoEntity;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -46,6 +47,29 @@ public class RainbowAntEntity extends BaseAntEntity implements GeoEntity {
|
||||
super(entityType, level);
|
||||
}
|
||||
|
||||
public static InteractionResult teleportPlayerFromStoredData(ServerPlayer player, @Nullable CompoundTag entityData) {
|
||||
if (!AntarchySettings.rainbowAntsLeadToInfinityDimensions() || !InfinityCompat.get().isAvailable()) {
|
||||
return AntTeleportHelper.teleportPlayerToDimension(player, AntarchySettings.rainbowAntNonInfinityFallbackDimension());
|
||||
}
|
||||
|
||||
if (INFINITY_NAMESPACE.equals(player.serverLevel().dimension().location().getNamespace())) {
|
||||
return AntTeleportHelper.teleportPlayerToReturnDestination(player);
|
||||
}
|
||||
|
||||
ResourceLocation dimensionId = parseStoredDimensionId(entityData);
|
||||
if (dimensionId == null) {
|
||||
return AntTeleportHelper.teleportPlayerToDimension(player, AntarchySettings.rainbowAntNonInfinityFallbackDimension());
|
||||
}
|
||||
|
||||
if (!InfinityCompat.get().requestWarp(player, dimensionId)) {
|
||||
player.displayClientMessage(Component.translatable("message.antarchy.rainbow_ant_failed_dimension_create"), true);
|
||||
return InteractionResult.CONSUME;
|
||||
}
|
||||
|
||||
player.playSound(SoundEvents.ENDERMAN_TELEPORT, 1.0F, 1.0F);
|
||||
return InteractionResult.CONSUME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean requiresCustomPersistence() {
|
||||
return this.hasActiveInfinityDestination() || super.requiresCustomPersistence();
|
||||
@@ -281,6 +305,20 @@ public class RainbowAntEntity extends BaseAntEntity implements GeoEntity {
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static ResourceLocation parseStoredDimensionId(@Nullable CompoundTag entityData) {
|
||||
if (entityData == null || !entityData.contains(DIMENSION_ID_TAG)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
String storedDimensionId = entityData.getString(DIMENSION_ID_TAG);
|
||||
return storedDimensionId.isEmpty() ? null : ResourceLocation.parse(storedDimensionId);
|
||||
} catch (Throwable throwable) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean teleportToInfinity(ServerPlayer player, ResourceLocation dimensionId) {
|
||||
if (!InfinityCompat.get().requestWarp(player, dimensionId)) {
|
||||
this.deleteGeneratedArtifacts(player.server, dimensionId);
|
||||
|
||||
+22
-5
@@ -14,6 +14,7 @@ import net.minecraft.world.level.GameRules;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.SoundType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.pathfinder.Path;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.animatable.GeoEntity;
|
||||
@@ -149,7 +150,7 @@ public class TermiteEntity extends BaseAntEntity implements GeoEntity {
|
||||
|
||||
@Nullable
|
||||
private BlockPos getCurrentWoodTarget() {
|
||||
if (this.targetWoodPos != null && this.isValidWoodTarget(this.targetWoodPos)) {
|
||||
if (this.targetWoodPos != null && this.isValidWoodTarget(this.targetWoodPos) && this.canReachWoodTarget(this.targetWoodPos)) {
|
||||
return this.targetWoodPos;
|
||||
}
|
||||
|
||||
@@ -221,28 +222,44 @@ public class TermiteEntity extends BaseAntEntity implements GeoEntity {
|
||||
return this.level().getBlockState(targetPos).is(AntarchyTags.Blocks.TERMITE_FOODS);
|
||||
}
|
||||
|
||||
private boolean canReachWoodTarget(BlockPos targetPos) {
|
||||
BlockPos approachPos = this.getWoodApproachBlockPos(targetPos);
|
||||
if (approachPos == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Path path = this.getNavigation().createPath(approachPos, 0);
|
||||
return path != null && path.canReach();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Vec3 getWoodApproachTarget(BlockPos targetPos) {
|
||||
private BlockPos getWoodApproachBlockPos(BlockPos targetPos) {
|
||||
BlockPos belowTarget = targetPos.below();
|
||||
if (this.isWalkableStandPos(belowTarget)) {
|
||||
return Vec3.atBottomCenterOf(belowTarget);
|
||||
return belowTarget;
|
||||
}
|
||||
|
||||
for (Direction direction : Direction.Plane.HORIZONTAL) {
|
||||
BlockPos sidePos = targetPos.relative(direction);
|
||||
if (this.isWalkableStandPos(sidePos)) {
|
||||
return Vec3.atBottomCenterOf(sidePos);
|
||||
return sidePos;
|
||||
}
|
||||
|
||||
BlockPos belowSidePos = sidePos.below();
|
||||
if (this.isWalkableStandPos(belowSidePos)) {
|
||||
return Vec3.atBottomCenterOf(belowSidePos);
|
||||
return belowSidePos;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Vec3 getWoodApproachTarget(BlockPos targetPos) {
|
||||
BlockPos approachPos = this.getWoodApproachBlockPos(targetPos);
|
||||
return approachPos == null ? null : Vec3.atBottomCenterOf(approachPos);
|
||||
}
|
||||
|
||||
private boolean isWalkableStandPos(BlockPos pos) {
|
||||
BlockPos floor = pos.below();
|
||||
BlockState floorState = this.level().getBlockState(floor);
|
||||
|
||||
+1
@@ -496,6 +496,7 @@ public class BrutalflyEntity extends Monster implements GeoEntity {
|
||||
}
|
||||
|
||||
Vec3 origin = this.getSpitOrigin();
|
||||
this.playSound(AntarchySoundEvents.BRUTALFLY_SPIT.get(), 1.0F, 0.9F + this.random.nextFloat() * 0.2F);
|
||||
switch (this.getFightPhase()) {
|
||||
case PHASE_THREE -> {
|
||||
this.launchOrb(serverLevel, origin, target, BrutalflyOrbEntity.OrbVariant.POISON, -8.0F);
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ public class GlimmerAntBehavior implements GlimmerVariantBehavior {
|
||||
|
||||
@Override
|
||||
public ResourceLocation emissiveTexture(GlimmerEntity entity) {
|
||||
return rl("textures/entity/glimmer/glimmer_ant_emmisive.png");
|
||||
return rl("textures/entity/glimmer/glimmer_ant_emissive.png");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -60,7 +60,7 @@ public class GlimmerElkaBehavior implements GlimmerVariantBehavior {
|
||||
|
||||
@Override
|
||||
public ResourceLocation emissiveTexture(GlimmerEntity entity) {
|
||||
return rl("textures/entity/glimmer/elka_glimmer_emmisive.png");
|
||||
return rl("textures/entity/glimmer/elka_glimmer_emissive.png");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -91,7 +91,7 @@ public class GlimmerFrogBehavior implements GlimmerVariantBehavior {
|
||||
|
||||
@Override
|
||||
public ResourceLocation emissiveTexture(GlimmerEntity entity) {
|
||||
return rl("textures/entity/glimmer/frog_glimmer_emmisive.png");
|
||||
return rl("textures/entity/glimmer/frog_glimmer_emissive.png");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
package com.craisinlord.antarchy.content.item;
|
||||
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import java.util.List;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.InteractionResultHolder;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.ai.attributes.Attributes;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.SwordItem;
|
||||
import net.minecraft.world.item.Tier;
|
||||
import net.minecraft.world.item.TooltipFlag;
|
||||
import net.minecraft.world.item.UseAnim;
|
||||
import net.minecraft.world.item.component.ItemAttributeModifiers;
|
||||
import net.minecraft.world.level.Level;
|
||||
|
||||
public class AttitudeAdjusterItem extends SwordItem {
|
||||
private static final float ATTACK_SPEED = -3.6F;
|
||||
private static final int USE_DURATION = 12;
|
||||
private final Tier tier;
|
||||
|
||||
public AttitudeAdjusterItem(Tier tier, Item.Properties properties) {
|
||||
super(tier, properties);
|
||||
this.tier = tier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemAttributeModifiers getDefaultAttributeModifiers() {
|
||||
return SwordItem.createAttributes(
|
||||
this.tier,
|
||||
(int) Math.round(AntarchySettings.attitudeAdjusterBaseDamage()),
|
||||
ATTACK_SPEED
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void appendHoverText(ItemStack stack, Item.TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
|
||||
tooltipComponents.add(Component.translatable("tooltip.antarchy.attitude_adjuster.grounded").withStyle(ChatFormatting.DARK_GRAY));
|
||||
tooltipComponents.add(Component.translatable("tooltip.antarchy.attitude_adjuster.slam").withStyle(ChatFormatting.YELLOW));
|
||||
super.appendHoverText(stack, context, tooltipComponents, tooltipFlag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) {
|
||||
boolean hurt = super.hurtEnemy(stack, target, attacker);
|
||||
if (!hurt || !(attacker instanceof Player player) || attacker.level().isClientSide || player.getMainHandItem() != stack || !(attacker.level() instanceof ServerLevel serverLevel)) {
|
||||
return hurt;
|
||||
}
|
||||
if (!AttitudeAdjusterSlamManager.consumeSpecialHit(player)) {
|
||||
return hurt;
|
||||
}
|
||||
if (target.onGround()) {
|
||||
AttitudeAdjusterSlamManager.onGroundedHit(serverLevel, player, target);
|
||||
} else {
|
||||
AttitudeAdjusterSlamManager.onAirborneHit(serverLevel, player, target);
|
||||
}
|
||||
return hurt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
|
||||
ItemStack stack = player.getItemInHand(hand);
|
||||
if (!(player instanceof ServerPlayer serverPlayer) || serverPlayer.getCooldowns().isOnCooldown(this)) {
|
||||
return InteractionResultHolder.pass(stack);
|
||||
}
|
||||
if (!AttitudeAdjusterSlamManager.tryStartPlayerSlam(serverPlayer, hand)) {
|
||||
return InteractionResultHolder.pass(stack);
|
||||
}
|
||||
return InteractionResultHolder.sidedSuccess(stack, level.isClientSide);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnchantable(ItemStack stack) {
|
||||
return stack.getCount() == 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canAttackBlock(net.minecraft.world.level.block.state.BlockState state, Level level, net.minecraft.core.BlockPos pos, Player miner) {
|
||||
return !miner.isCreative();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getUseDuration(ItemStack stack, LivingEntity entity) {
|
||||
return USE_DURATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UseAnim getUseAnimation(ItemStack stack) {
|
||||
return UseAnim.SPEAR;
|
||||
}
|
||||
}
|
||||
+311
@@ -0,0 +1,311 @@
|
||||
package com.craisinlord.antarchy.content.item;
|
||||
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import com.craisinlord.antarchy.content.network.ImpactShakePayload;
|
||||
import com.craisinlord.antarchy.content.network.ImpactShakeSync;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.particles.BlockParticleOption;
|
||||
import net.minecraft.core.particles.DustParticleOptions;
|
||||
import net.minecraft.core.particles.ParticleTypes;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.entity.projectile.Projectile;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.gameevent.GameEvent;
|
||||
import net.minecraft.world.phys.AABB;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.joml.Vector3f;
|
||||
|
||||
public final class AttitudeAdjusterSlamManager {
|
||||
private static final int SLAM_TIMEOUT_TICKS = 40;
|
||||
private static final int PLAYER_SLAM_COOLDOWN_TICKS = 28;
|
||||
private static final double GROUNDED_VERTICAL_KNOCKBACK = 1.35D;
|
||||
private static final double GROUNDED_HORIZONTAL_KNOCKBACK = 0.5D;
|
||||
private static final double AIRBORNE_SLAM_DOWNWARD_VELOCITY = -1.8D;
|
||||
private static final double SLAM_BONUS_DAMAGE_SCALE = 10.0D;
|
||||
private static final double SLAM_MAX_BONUS_DAMAGE = 18.0D;
|
||||
private static final double SLAM_IMPACT_RADIUS = 3.75D;
|
||||
private static final double SLAM_RADIAL_KNOCKBACK = 0.55D;
|
||||
private static final double PLAYER_SLAM_START_VELOCITY = -2.15D;
|
||||
private static final double PLAYER_SLAM_RADIUS = 4.75D;
|
||||
private static final double PLAYER_SLAM_BASE_DAMAGE = 12.0D;
|
||||
private static final double PLAYER_SLAM_DAMAGE_SCALE = 0.85D;
|
||||
private static final double PLAYER_SLAM_MAX_DAMAGE = 24.0D;
|
||||
private static final double PLAYER_SLAM_UPWARD_KNOCKBACK = 0.9D;
|
||||
private static final double PLAYER_SLAM_HORIZONTAL_KNOCKBACK = 0.9D;
|
||||
private static final float NORMAL_SHAKE_INTENSITY = 0.5F;
|
||||
private static final int NORMAL_SHAKE_DURATION = 10;
|
||||
private static final float ENEMY_SLAM_SHAKE_INTENSITY = 0.95F;
|
||||
private static final int ENEMY_SLAM_SHAKE_DURATION = 16;
|
||||
private static final float PLAYER_SLAM_SHAKE_INTENSITY = 1.2F;
|
||||
private static final int PLAYER_SLAM_SHAKE_DURATION = 20;
|
||||
private static final float IMPACT_SHAKE_RADIUS = 24.0F;
|
||||
private static final float NORMAL_BREAK_HARDNESS_LIMIT = 6.0F;
|
||||
private static final int MAX_BROKEN_BLOCKS = 9;
|
||||
private static final Map<UUID, SlammedTargetState> SLAMMED_TARGETS = new HashMap<>();
|
||||
private static final Map<UUID, PlayerSlamState> PLAYER_SLAMS = new HashMap<>();
|
||||
private static final Map<UUID, Long> SPECIAL_HIT_MARKS = new HashMap<>();
|
||||
|
||||
private AttitudeAdjusterSlamManager() {
|
||||
}
|
||||
|
||||
public static void markSpecialHit(Player player) {
|
||||
SPECIAL_HIT_MARKS.put(player.getUUID(), player.level().getGameTime());
|
||||
}
|
||||
|
||||
public static boolean consumeSpecialHit(Player player) {
|
||||
Long markedTime = SPECIAL_HIT_MARKS.get(player.getUUID());
|
||||
if (markedTime == null || markedTime != player.level().getGameTime()) {
|
||||
return false;
|
||||
}
|
||||
SPECIAL_HIT_MARKS.remove(player.getUUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void onGroundedHit(ServerLevel level, Player attacker, LivingEntity target) {
|
||||
Vec3 push = horizontalAway(attacker.position(), target.position(), attacker.getLookAngle()).scale(GROUNDED_HORIZONTAL_KNOCKBACK);
|
||||
double resistanceScale = resistanceScale(target);
|
||||
Vec3 motion = target.getDeltaMovement().add(push.x * resistanceScale, Math.max(GROUNDED_VERTICAL_KNOCKBACK * resistanceScale, 0.45D), push.z * resistanceScale);
|
||||
target.setDeltaMovement(motion);
|
||||
target.hurtMarked = true;
|
||||
playNormalImpact(level, target.position().add(0.0D, target.getBbHeight() * 0.5D, 0.0D), target.getOnPosLegacy());
|
||||
}
|
||||
|
||||
public static void onAirborneHit(ServerLevel level, Player attacker, LivingEntity target) {
|
||||
Vec3 push = horizontalAway(attacker.position(), target.position(), attacker.getLookAngle()).scale(0.18D);
|
||||
target.setDeltaMovement(push.x, Math.min(target.getDeltaMovement().y, AIRBORNE_SLAM_DOWNWARD_VELOCITY), push.z);
|
||||
target.hurtMarked = true;
|
||||
SLAMMED_TARGETS.put(target.getUUID(), new SlammedTargetState(
|
||||
target.getUUID(),
|
||||
attacker.getUUID(),
|
||||
level.dimension().location().toString(),
|
||||
level.getGameTime() + SLAM_TIMEOUT_TICKS,
|
||||
target.getDeltaMovement().y,
|
||||
target.fallDistance
|
||||
));
|
||||
level.playSound(null, target.getX(), target.getY(), target.getZ(), SoundEvents.ANVIL_LAND, SoundSource.PLAYERS, 1.0F, 0.7F);
|
||||
}
|
||||
|
||||
public static boolean tryStartPlayerSlam(ServerPlayer player, net.minecraft.world.InteractionHand hand) {
|
||||
if (player.onGround() || player.isInWaterOrBubble() || player.isInLava() || player.isFallFlying() || player.getAbilities().flying || PLAYER_SLAMS.containsKey(player.getUUID())) {
|
||||
return false;
|
||||
}
|
||||
PLAYER_SLAMS.put(player.getUUID(), new PlayerSlamState(player.getUUID(), player.serverLevel().dimension().location().toString(), player.serverLevel().getGameTime() + SLAM_TIMEOUT_TICKS, player.fallDistance));
|
||||
Vec3 motion = player.getDeltaMovement();
|
||||
player.setDeltaMovement(motion.x * 0.25D, PLAYER_SLAM_START_VELOCITY, motion.z * 0.25D);
|
||||
player.hurtMarked = true;
|
||||
player.fallDistance = 0.0F;
|
||||
player.swing(hand, true);
|
||||
player.serverLevel().playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.MACE_SMASH_AIR, SoundSource.PLAYERS, 1.0F, 0.8F);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void tick(ServerLevel level) {
|
||||
tickSlammedTargets(level);
|
||||
tickPlayerSlams(level);
|
||||
}
|
||||
|
||||
private static void tickSlammedTargets(ServerLevel level) {
|
||||
Iterator<SlammedTargetState> iterator = SLAMMED_TARGETS.values().iterator();
|
||||
while (iterator.hasNext()) {
|
||||
SlammedTargetState state = iterator.next();
|
||||
if (!state.dimensionId.equals(level.dimension().location().toString())) {
|
||||
continue;
|
||||
}
|
||||
Entity entity = level.getEntity(state.targetId);
|
||||
if (!(entity instanceof LivingEntity target) || !target.isAlive() || level.getGameTime() > state.expiresAt || target.isInWaterOrBubble() || target.isInLava() || target.isFallFlying() || (target instanceof Player player && player.getAbilities().flying)) {
|
||||
iterator.remove();
|
||||
continue;
|
||||
}
|
||||
if (!target.onGround()) {
|
||||
continue;
|
||||
}
|
||||
Player attacker = level.getPlayerByUUID(state.attackerId);
|
||||
double impactSpeed = Math.max(Math.abs(Math.min(target.getDeltaMovement().y, state.startDownwardVelocity)), Math.max(0.0D, target.fallDistance * 0.125D));
|
||||
float bonusDamage = (float) Mth.clamp(impactSpeed * SLAM_BONUS_DAMAGE_SCALE, 4.0D, SLAM_MAX_BONUS_DAMAGE);
|
||||
if (attacker != null) {
|
||||
target.hurt(level.damageSources().playerAttack(attacker), bonusDamage);
|
||||
} else {
|
||||
target.hurt(level.damageSources().generic(), bonusDamage);
|
||||
}
|
||||
Vec3 impactPos = target.position();
|
||||
BlockPos groundPos = target.getOnPosLegacy();
|
||||
playSlamImpact(level, impactPos, groundPos, true);
|
||||
knockbackNearby(level, impactPos, target, SLAM_IMPACT_RADIUS, SLAM_RADIAL_KNOCKBACK, 0.3D);
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
private static void tickPlayerSlams(ServerLevel level) {
|
||||
Iterator<PlayerSlamState> iterator = PLAYER_SLAMS.values().iterator();
|
||||
while (iterator.hasNext()) {
|
||||
PlayerSlamState state = iterator.next();
|
||||
if (!state.dimensionId.equals(level.dimension().location().toString())) {
|
||||
continue;
|
||||
}
|
||||
Player entity = level.getPlayerByUUID(state.playerId);
|
||||
if (!(entity instanceof ServerPlayer player) || !player.isAlive() || level.getGameTime() > state.expiresAt || player.isInWaterOrBubble() || player.isInLava() || player.isFallFlying() || player.getAbilities().flying) {
|
||||
iterator.remove();
|
||||
continue;
|
||||
}
|
||||
player.fallDistance = 0.0F;
|
||||
if (!player.onGround()) {
|
||||
continue;
|
||||
}
|
||||
Vec3 impactPos = player.position();
|
||||
BlockPos groundPos = player.getOnPosLegacy();
|
||||
double impactStrength = Math.max(Math.abs(Math.min(player.getDeltaMovement().y, PLAYER_SLAM_START_VELOCITY)), Math.max(state.startFallDistance, player.fallDistance) * 0.15D);
|
||||
float damage = (float) Mth.clamp(PLAYER_SLAM_BASE_DAMAGE + impactStrength * PLAYER_SLAM_DAMAGE_SCALE * 10.0D, PLAYER_SLAM_BASE_DAMAGE, PLAYER_SLAM_MAX_DAMAGE);
|
||||
AABB area = new AABB(impactPos.x - PLAYER_SLAM_RADIUS, impactPos.y - 1.5D, impactPos.z - PLAYER_SLAM_RADIUS, impactPos.x + PLAYER_SLAM_RADIUS, impactPos.y + 2.5D, impactPos.z + PLAYER_SLAM_RADIUS);
|
||||
for (LivingEntity target : level.getEntitiesOfClass(LivingEntity.class, area, candidate -> candidate.isAlive() && candidate != player)) {
|
||||
if (!target.hurt(level.damageSources().playerAttack(player), damage)) {
|
||||
continue;
|
||||
}
|
||||
Vec3 away = horizontalAway(impactPos, target.position(), player.getLookAngle()).scale(PLAYER_SLAM_HORIZONTAL_KNOCKBACK);
|
||||
double resistanceScale = resistanceScale(target);
|
||||
target.setDeltaMovement(target.getDeltaMovement().add(away.x * resistanceScale, Math.max(PLAYER_SLAM_UPWARD_KNOCKBACK * resistanceScale, 0.35D), away.z * resistanceScale));
|
||||
target.hurtMarked = true;
|
||||
}
|
||||
playSlamImpact(level, impactPos, groundPos, false);
|
||||
if (AntarchySettings.attitudeAdjusterBreaksBlocks()) {
|
||||
breakBlocks(level, player, groundPos);
|
||||
}
|
||||
if (player.getMainHandItem().getItem() instanceof AttitudeAdjusterItem item) {
|
||||
player.getCooldowns().addCooldown(item, PLAYER_SLAM_COOLDOWN_TICKS);
|
||||
}
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
private static void breakBlocks(ServerLevel level, ServerPlayer player, BlockPos center) {
|
||||
int broken = 0;
|
||||
for (int y = -1; y <= 0 && broken < MAX_BROKEN_BLOCKS; y++) {
|
||||
for (int x = -1; x <= 1 && broken < MAX_BROKEN_BLOCKS; x++) {
|
||||
for (int z = -1; z <= 1 && broken < MAX_BROKEN_BLOCKS; z++) {
|
||||
BlockPos pos = center.offset(x, y, z);
|
||||
BlockState state = level.getBlockState(pos);
|
||||
BlockEntity blockEntity = level.getBlockEntity(pos);
|
||||
if (state.isAir() || blockEntity != null || state.getDestroySpeed(level, pos) < 0.0F || state.getDestroySpeed(level, pos) > NORMAL_BREAK_HARDNESS_LIMIT) {
|
||||
continue;
|
||||
}
|
||||
if (!state.isFaceSturdy(level, pos, Direction.UP) && pos.getY() < center.getY()) {
|
||||
continue;
|
||||
}
|
||||
if (player.gameMode.destroyBlock(pos)) {
|
||||
broken++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void playNormalImpact(ServerLevel level, Vec3 impactPos, BlockPos groundPos) {
|
||||
level.playSound(null, impactPos.x, impactPos.y, impactPos.z, SoundEvents.MACE_SMASH_GROUND_HEAVY, SoundSource.PLAYERS, 0.95F, 0.75F);
|
||||
spawnImpactParticles(level, impactPos, groundPos, 10, 20);
|
||||
shake(level, impactPos, NORMAL_SHAKE_INTENSITY, NORMAL_SHAKE_DURATION);
|
||||
}
|
||||
|
||||
private static void playSlamImpact(ServerLevel level, Vec3 impactPos, BlockPos groundPos, boolean enemySlam) {
|
||||
level.playSound(null, impactPos.x, impactPos.y, impactPos.z, enemySlam ? SoundEvents.GENERIC_EXPLODE.value() : SoundEvents.MACE_SMASH_GROUND, SoundSource.PLAYERS, enemySlam ? 1.2F : 1.35F, enemySlam ? 0.65F : 0.55F);
|
||||
spawnImpactParticles(level, impactPos, groundPos, enemySlam ? 20 : 28, enemySlam ? 32 : 42);
|
||||
spawnShockwaveParticles(level, impactPos, enemySlam ? 18 : 28);
|
||||
shake(level, impactPos, enemySlam ? ENEMY_SLAM_SHAKE_INTENSITY : PLAYER_SLAM_SHAKE_INTENSITY, enemySlam ? ENEMY_SLAM_SHAKE_DURATION : PLAYER_SLAM_SHAKE_DURATION);
|
||||
level.gameEvent(GameEvent.EXPLODE, impactPos, GameEvent.Context.of(level.getBlockState(groundPos)));
|
||||
}
|
||||
|
||||
private static void spawnImpactParticles(ServerLevel level, Vec3 impactPos, BlockPos groundPos, int dustCount, int debrisCount) {
|
||||
level.sendParticles(new DustParticleOptions(new Vector3f(1.00F, 0.92F, 0.18F), 1.35F), impactPos.x, impactPos.y + 0.1D, impactPos.z, dustCount, 0.45D, 0.15D, 0.45D, 0.035D);
|
||||
BlockState groundState = level.getBlockState(groundPos);
|
||||
if (!groundState.isAir()) {
|
||||
level.sendParticles(new BlockParticleOption(ParticleTypes.BLOCK, groundState), impactPos.x, impactPos.y + 0.05D, impactPos.z, debrisCount, 0.7D, 0.15D, 0.7D, 0.06D);
|
||||
}
|
||||
level.sendParticles(ParticleTypes.POOF, impactPos.x, impactPos.y + 0.2D, impactPos.z, 8, 0.45D, 0.05D, 0.45D, 0.02D);
|
||||
}
|
||||
|
||||
private static void spawnShockwaveParticles(ServerLevel level, Vec3 impactPos, int count) {
|
||||
for (int i = 0; i < count; i++) {
|
||||
double angle = (Math.PI * 2.0D * i) / count;
|
||||
double x = impactPos.x + Math.cos(angle) * 0.6D;
|
||||
double z = impactPos.z + Math.sin(angle) * 0.6D;
|
||||
double dx = Math.cos(angle) * 0.18D;
|
||||
double dz = Math.sin(angle) * 0.18D;
|
||||
level.sendParticles(new DustParticleOptions(new Vector3f(1.00F, 0.85F, 0.22F), 0.95F), x, impactPos.y + 0.05D, z, 1, dx, 0.01D, dz, 0.0D);
|
||||
}
|
||||
}
|
||||
|
||||
private static void knockbackNearby(ServerLevel level, Vec3 center, LivingEntity ignored, double radius, double horizontalStrength, double verticalStrength) {
|
||||
AABB area = new AABB(center.x - radius, center.y - 1.5D, center.z - radius, center.x + radius, center.y + 2.5D, center.z + radius);
|
||||
for (LivingEntity entity : level.getEntitiesOfClass(LivingEntity.class, area, candidate -> candidate.isAlive() && candidate != ignored)) {
|
||||
Vec3 away = horizontalAway(center, entity.position(), entity.getLookAngle()).scale(horizontalStrength);
|
||||
double resistanceScale = resistanceScale(entity);
|
||||
entity.setDeltaMovement(entity.getDeltaMovement().add(away.x * resistanceScale, Math.max(verticalStrength * resistanceScale, 0.1D), away.z * resistanceScale));
|
||||
entity.hurtMarked = true;
|
||||
}
|
||||
}
|
||||
|
||||
private static void shake(ServerLevel level, Vec3 pos, float intensity, int durationTicks) {
|
||||
ImpactShakePayload payload = new ImpactShakePayload(pos.x, pos.y, pos.z, intensity, durationTicks, IMPACT_SHAKE_RADIUS);
|
||||
double radiusSqr = IMPACT_SHAKE_RADIUS * IMPACT_SHAKE_RADIUS;
|
||||
for (ServerPlayer player : level.players()) {
|
||||
if (player.distanceToSqr(pos.x, pos.y, pos.z) <= radiusSqr) {
|
||||
ImpactShakeSync.send(player, payload);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static Vec3 horizontalAway(Vec3 from, Vec3 to, Vec3 fallback) {
|
||||
Vec3 horizontal = to.subtract(from).multiply(1.0D, 0.0D, 1.0D);
|
||||
if (horizontal.lengthSqr() < 1.0E-4D) {
|
||||
horizontal = fallback.multiply(1.0D, 0.0D, 1.0D);
|
||||
}
|
||||
return horizontal.lengthSqr() < 1.0E-4D ? new Vec3(1.0D, 0.0D, 0.0D) : horizontal.normalize();
|
||||
}
|
||||
|
||||
private static double resistanceScale(LivingEntity entity) {
|
||||
return Mth.clamp(1.0D - entity.getAttributeValue(net.minecraft.world.entity.ai.attributes.Attributes.KNOCKBACK_RESISTANCE), 0.15D, 1.0D);
|
||||
}
|
||||
|
||||
private static final class SlammedTargetState {
|
||||
private final UUID targetId;
|
||||
private final UUID attackerId;
|
||||
private final String dimensionId;
|
||||
private final long expiresAt;
|
||||
private final double startDownwardVelocity;
|
||||
private final float startFallDistance;
|
||||
|
||||
private SlammedTargetState(UUID targetId, UUID attackerId, String dimensionId, long expiresAt, double startDownwardVelocity, float startFallDistance) {
|
||||
this.targetId = targetId;
|
||||
this.attackerId = attackerId;
|
||||
this.dimensionId = dimensionId;
|
||||
this.expiresAt = expiresAt;
|
||||
this.startDownwardVelocity = startDownwardVelocity;
|
||||
this.startFallDistance = startFallDistance;
|
||||
}
|
||||
}
|
||||
|
||||
private static final class PlayerSlamState {
|
||||
private final UUID playerId;
|
||||
private final String dimensionId;
|
||||
private final long expiresAt;
|
||||
private final float startFallDistance;
|
||||
|
||||
private PlayerSlamState(UUID playerId, String dimensionId, long expiresAt, float startFallDistance) {
|
||||
this.playerId = playerId;
|
||||
this.dimensionId = dimensionId;
|
||||
this.expiresAt = expiresAt;
|
||||
this.startFallDistance = startFallDistance;
|
||||
}
|
||||
}
|
||||
}
|
||||
+10
-1
@@ -27,7 +27,7 @@ public class PrimordialArmorItem extends ArmorItem {
|
||||
private final Type armorType;
|
||||
|
||||
public PrimordialArmorItem(Holder<ArmorMaterial> material, Type type, Properties properties) {
|
||||
super(material, type, properties);
|
||||
super(material, type, properties.stacksTo(1).durability(resolveDurability(type)));
|
||||
this.armorType = type;
|
||||
}
|
||||
|
||||
@@ -141,4 +141,13 @@ public class PrimordialArmorItem extends ArmorItem {
|
||||
case BOOTS -> 0.20D;
|
||||
};
|
||||
}
|
||||
|
||||
private static int resolveDurability(Type armorType) {
|
||||
return switch (armorType) {
|
||||
case HELMET -> Type.HELMET.getDurability(37);
|
||||
case CHESTPLATE, BODY -> Type.CHESTPLATE.getDurability(37);
|
||||
case LEGGINGS -> Type.LEGGINGS.getDurability(37);
|
||||
case BOOTS -> Type.BOOTS.getDurability(37);
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.craisinlord.antarchy.content.network;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.network.codec.ByteBufCodecs;
|
||||
import net.minecraft.network.codec.StreamCodec;
|
||||
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
public record ImpactShakePayload(double x, double y, double z, float intensity, int durationTicks, float radius) implements CustomPacketPayload {
|
||||
public static final Type<ImpactShakePayload> TYPE =
|
||||
new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "impact_shake"));
|
||||
public static final StreamCodec<ByteBuf, ImpactShakePayload> STREAM_CODEC = StreamCodec.composite(
|
||||
ByteBufCodecs.DOUBLE,
|
||||
ImpactShakePayload::x,
|
||||
ByteBufCodecs.DOUBLE,
|
||||
ImpactShakePayload::y,
|
||||
ByteBufCodecs.DOUBLE,
|
||||
ImpactShakePayload::z,
|
||||
ByteBufCodecs.FLOAT,
|
||||
ImpactShakePayload::intensity,
|
||||
ByteBufCodecs.VAR_INT,
|
||||
ImpactShakePayload::durationTicks,
|
||||
ByteBufCodecs.FLOAT,
|
||||
ImpactShakePayload::radius,
|
||||
ImpactShakePayload::new
|
||||
);
|
||||
|
||||
@Override
|
||||
public Type<ImpactShakePayload> type() {
|
||||
return TYPE;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.craisinlord.antarchy.content.network;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
|
||||
public final class ImpactShakeSync {
|
||||
private static final BiConsumer<ServerPlayer, ImpactShakePayload> NOOP = (player, payload) -> {
|
||||
};
|
||||
private static volatile BiConsumer<ServerPlayer, ImpactShakePayload> sink = NOOP;
|
||||
|
||||
private ImpactShakeSync() {
|
||||
}
|
||||
|
||||
public static void setSink(BiConsumer<ServerPlayer, ImpactShakePayload> sink) {
|
||||
ImpactShakeSync.sink = sink == null ? NOOP : sink;
|
||||
}
|
||||
|
||||
public static void send(ServerPlayer player, ImpactShakePayload payload) {
|
||||
sink.accept(player, payload);
|
||||
}
|
||||
}
|
||||
+10
-2
@@ -220,7 +220,13 @@ public final class PermanentPortalTeleporter {
|
||||
BlockPos preferred = BlockPos.containing(safePos);
|
||||
int minY = destination.getMinBuildHeight() + 2;
|
||||
int maxY = destination.getMaxBuildHeight() - 4;
|
||||
int clampedY = Mth.clamp(preferred.getY(), minY, maxY);
|
||||
int startY = Mth.clamp(preferred.getY(), minY, maxY);
|
||||
|
||||
for (int yOff = 0; yOff <= 6; yOff++) {
|
||||
for (int y : new int[]{startY + yOff, startY - yOff}) {
|
||||
if (y < minY || y > maxY) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int radius = 0; radius <= 4; radius++) {
|
||||
for (int xOff = -radius; xOff <= radius; xOff++) {
|
||||
@@ -229,7 +235,7 @@ public final class PermanentPortalTeleporter {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockPos anchor = new BlockPos(preferred.getX() + xOff, clampedY, preferred.getZ() + zOff);
|
||||
BlockPos anchor = new BlockPos(preferred.getX() + xOff, y, preferred.getZ() + zOff);
|
||||
PermanentPortalShape xShape = PermanentPortalShape.create(destination, anchor, type, Direction.Axis.X);
|
||||
if (xShape != null) {
|
||||
return xShape;
|
||||
@@ -241,6 +247,8 @@ public final class PermanentPortalTeleporter {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
+109
@@ -0,0 +1,109 @@
|
||||
package com.craisinlord.antarchy.content.worldgen.cavaryn;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.block.HangingCreeprootsBlock;
|
||||
import com.mojang.serialization.Codec;
|
||||
import java.util.Optional;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
public final class HangingCreeprootsFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private static final ResourceLocation HANGING_CREEPROOTS_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "hanging_creeproots");
|
||||
private static final int SEARCH_RADIUS = 8;
|
||||
private static final int SEARCH_ATTEMPTS = 24;
|
||||
private static final int VERTICAL_SCAN = 12;
|
||||
|
||||
public HangingCreeprootsFeature(Codec<NoneFeatureConfiguration> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
Block block = getBlock(HANGING_CREEPROOTS_ID);
|
||||
if (!(block instanceof HangingCreeprootsBlock rootsBlock)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
WorldGenLevel level = context.level();
|
||||
RandomSource random = context.random();
|
||||
BlockPos anchor = findAnchor(level, context.origin(), random);
|
||||
if (anchor == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return placeColumn(level, rootsBlock, anchor, random);
|
||||
}
|
||||
|
||||
private static BlockPos findAnchor(WorldGenLevel level, BlockPos origin, RandomSource random) {
|
||||
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
|
||||
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
|
||||
int x = origin.getX() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
|
||||
int z = origin.getZ() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
|
||||
int startY = origin.getY() + random.nextInt(VERTICAL_SCAN * 2 + 1) - VERTICAL_SCAN;
|
||||
startY = Math.max(level.getMinBuildHeight() + 3, Math.min(level.getMaxBuildHeight() - 3, startY));
|
||||
|
||||
for (int y = startY; y <= Math.min(level.getMaxBuildHeight() - 2, startY + VERTICAL_SCAN); y++) {
|
||||
mutable.set(x, y, z);
|
||||
if (!level.getBlockState(mutable).canBeReplaced()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockPos abovePos = mutable.above();
|
||||
BlockState aboveState = level.getBlockState(abovePos);
|
||||
if (aboveState.isFaceSturdy(level, abovePos, net.minecraft.core.Direction.DOWN)) {
|
||||
return mutable.immutable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean placeColumn(WorldGenLevel level, HangingCreeprootsBlock rootsBlock, BlockPos startPos, RandomSource random) {
|
||||
boolean placedAny = false;
|
||||
int length = 1 + random.nextInt(5);
|
||||
|
||||
for (int offset = 0; offset < length; offset++) {
|
||||
BlockPos rootsPos = startPos.below(offset);
|
||||
if (rootsPos.getY() <= level.getMinBuildHeight()) {
|
||||
break;
|
||||
}
|
||||
|
||||
BlockState existing = level.getBlockState(rootsPos);
|
||||
if (!existing.canBeReplaced() && !existing.is(rootsBlock)) {
|
||||
break;
|
||||
}
|
||||
|
||||
int distance = Math.min(offset, 4);
|
||||
boolean bottom = offset == length - 1 || !level.getBlockState(rootsPos.below()).canBeReplaced();
|
||||
BlockState state = rootsBlock.defaultBlockState()
|
||||
.setValue(HangingCreeprootsBlock.DISTANCE, distance)
|
||||
.setValue(HangingCreeprootsBlock.BOTTOM, bottom);
|
||||
if (!state.canSurvive(level, rootsPos)) {
|
||||
break;
|
||||
}
|
||||
|
||||
level.setBlock(rootsPos, state, 3);
|
||||
placedAny = true;
|
||||
if (!bottom && !level.getBlockState(rootsPos.below()).canBeReplaced()) {
|
||||
level.setBlock(rootsPos, state.setValue(HangingCreeprootsBlock.BOTTOM, true), 3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return placedAny;
|
||||
}
|
||||
|
||||
private static Block getBlock(ResourceLocation id) {
|
||||
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
|
||||
return block.orElse(null);
|
||||
}
|
||||
}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
package com.craisinlord.antarchy.content.worldgen.cavaryn;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.block.JumpyBugEggBlock;
|
||||
import com.mojang.serialization.Codec;
|
||||
import java.util.Optional;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
public final class JumpyBugEggCeilingFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private static final ResourceLocation JUMPY_BUG_EGG_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "jumpy_bug_egg");
|
||||
private static final int SEARCH_RADIUS = 8;
|
||||
private static final int VERTICAL_SCAN = 6;
|
||||
private static final int SEARCH_ATTEMPTS = 10;
|
||||
private static final float PLACE_CHANCE = 0.5F;
|
||||
|
||||
public JumpyBugEggCeilingFeature(Codec<NoneFeatureConfiguration> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
Block eggBlock = getBlock(JUMPY_BUG_EGG_ID);
|
||||
if (eggBlock == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
WorldGenLevel level = context.level();
|
||||
RandomSource random = context.random();
|
||||
BlockPos origin = context.origin();
|
||||
|
||||
boolean placedAny = false;
|
||||
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
|
||||
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
|
||||
if (random.nextFloat() > PLACE_CHANCE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int x = origin.getX() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
|
||||
int z = origin.getZ() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
|
||||
int y = origin.getY() + random.nextInt(VERTICAL_SCAN * 2 + 1) - VERTICAL_SCAN;
|
||||
mutable.set(x, y, z);
|
||||
|
||||
if (!isValidCeilingSpot(level, mutable)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockState eggState = eggBlock.defaultBlockState()
|
||||
.setValue(JumpyBugEggBlock.HANGING, true)
|
||||
.setValue(JumpyBugEggBlock.ROTATED, random.nextBoolean());
|
||||
level.setBlock(mutable, eggState, 3);
|
||||
placedAny = true;
|
||||
}
|
||||
|
||||
return placedAny;
|
||||
}
|
||||
|
||||
private static boolean isValidCeilingSpot(WorldGenLevel level, BlockPos pos) {
|
||||
BlockState state = level.getBlockState(pos);
|
||||
if (!state.isAir()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockPos abovePos = pos.above();
|
||||
BlockState aboveState = level.getBlockState(abovePos);
|
||||
return aboveState.isFaceSturdy(level, abovePos, Direction.DOWN);
|
||||
}
|
||||
|
||||
private static Block getBlock(ResourceLocation id) {
|
||||
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
|
||||
return block.orElse(null);
|
||||
}
|
||||
}
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
package com.craisinlord.antarchy.content.worldgen.cavaryn;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.block.MoltingVinesBlock;
|
||||
import com.mojang.serialization.Codec;
|
||||
import java.util.Optional;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
public final class MoltingVinesFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private static final ResourceLocation MOLTING_VINES_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "molting_vines");
|
||||
private static final int SEARCH_RADIUS = 8;
|
||||
private static final int SEARCH_ATTEMPTS = 24;
|
||||
private static final int VERTICAL_SCAN = 12;
|
||||
private static final int MIN_LENGTH = 2;
|
||||
private static final int MAX_LENGTH = 6;
|
||||
private static final int BROODFRUIT_CHANCE = 3;
|
||||
|
||||
public MoltingVinesFeature(Codec<NoneFeatureConfiguration> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
Block block = getBlock(MOLTING_VINES_ID);
|
||||
if (!(block instanceof MoltingVinesBlock moltingVinesBlock)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
WorldGenLevel level = context.level();
|
||||
RandomSource random = context.random();
|
||||
BlockPos anchorPos = findAnchor(level, context.origin(), random);
|
||||
if (anchorPos == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return placeColumn(level, moltingVinesBlock, anchorPos, random);
|
||||
}
|
||||
|
||||
private static BlockPos findAnchor(WorldGenLevel level, BlockPos origin, RandomSource random) {
|
||||
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
|
||||
int minY = level.getMinBuildHeight() + 2;
|
||||
int maxY = level.getMaxBuildHeight() - 2;
|
||||
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
|
||||
int x = origin.getX() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
|
||||
int z = origin.getZ() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
|
||||
int startY = origin.getY() + random.nextInt(VERTICAL_SCAN * 2 + 1) - VERTICAL_SCAN;
|
||||
startY = Math.max(minY, Math.min(maxY, startY));
|
||||
|
||||
for (int y = startY; y >= Math.max(minY, startY - VERTICAL_SCAN); y--) {
|
||||
mutable.set(x, y, z);
|
||||
if (!level.getBlockState(mutable).canBeReplaced()) {
|
||||
continue;
|
||||
}
|
||||
BlockPos abovePos = mutable.above();
|
||||
BlockState aboveState = level.getBlockState(abovePos);
|
||||
if (!aboveState.isFaceSturdy(level, abovePos, net.minecraft.core.Direction.DOWN)) {
|
||||
continue;
|
||||
}
|
||||
if (!level.getBlockState(mutable.below()).canBeReplaced()) {
|
||||
continue;
|
||||
}
|
||||
return mutable.immutable();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean placeColumn(WorldGenLevel level, MoltingVinesBlock block, BlockPos anchorPos, RandomSource random) {
|
||||
int maxLength = MIN_LENGTH + random.nextInt(MAX_LENGTH - MIN_LENGTH + 1);
|
||||
int length = 0;
|
||||
BlockPos.MutableBlockPos mutable = anchorPos.mutable();
|
||||
while (length < maxLength && mutable.getY() > level.getMinBuildHeight()) {
|
||||
BlockState existing = level.getBlockState(mutable);
|
||||
if (!existing.canBeReplaced()) {
|
||||
break;
|
||||
}
|
||||
length++;
|
||||
mutable.move(0, -1, 0);
|
||||
}
|
||||
|
||||
if (length < MIN_LENGTH) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int fruitIndex = -1;
|
||||
if (length >= 3 && random.nextInt(BROODFRUIT_CHANCE) == 0) {
|
||||
fruitIndex = 1 + random.nextInt(length - 2);
|
||||
}
|
||||
|
||||
for (int offset = 0; offset < length; offset++) {
|
||||
BlockPos pos = anchorPos.below(offset);
|
||||
BlockState state = block.defaultBlockState()
|
||||
.setValue(MoltingVinesBlock.DISTANCE, Math.min(offset, MoltingVinesBlock.DISTANCE.getPossibleValues().stream().max(Integer::compareTo).orElse(6)))
|
||||
.setValue(MoltingVinesBlock.BOTTOM_CAP, offset == length - 1)
|
||||
.setValue(MoltingVinesBlock.BROODFRUIT, offset == fruitIndex);
|
||||
if (!state.canSurvive(level, pos)) {
|
||||
return false;
|
||||
}
|
||||
level.setBlock(pos, state, 3);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static Block getBlock(ResourceLocation id) {
|
||||
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
|
||||
return block.orElse(null);
|
||||
}
|
||||
}
|
||||
+486
@@ -0,0 +1,486 @@
|
||||
package com.craisinlord.antarchy.content.worldgen.cavaryn;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.AntarchyTags;
|
||||
import com.mojang.serialization.Codec;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.CaveVinesBlock;
|
||||
import net.minecraft.world.level.block.RotatedPillarBlock;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
||||
import net.minecraft.world.level.block.state.properties.Tilt;
|
||||
import net.minecraft.world.level.biome.Biome;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
public final class RollyCavesGiantCavernFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private static final ResourceKey<Biome> ROLLY_CAVES = ResourceKey.create(
|
||||
Registries.BIOME, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "rolly_caves"));
|
||||
private static final ResourceLocation GLOWCAP_MUSHROOM_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glowcap_mushroom");
|
||||
private static final ResourceLocation AMBER_MOSS_BLOCK_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "amber_moss_block");
|
||||
private static final ResourceLocation OURANWOOD_WOOD_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "ouranwood_wood");
|
||||
private static final ResourceLocation MOSSY_OURANWOOD_WOOD_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "mossy_ouranwood_wood");
|
||||
private static final ResourceLocation MOSSY_OURANWOOD_LOG_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "mossy_ouranwood_log");
|
||||
|
||||
private static final int TRUNK_RADIUS = 2;
|
||||
private static final int MOSSY_PATCH_CHANCE = 4;
|
||||
|
||||
private static final int BIOME_SAMPLE_RADIUS = 10;
|
||||
private static final int BIOME_SAMPLE_STEP = 5;
|
||||
private static final int MIN_BIOME_SAMPLE_MATCHES = 5;
|
||||
|
||||
private static final int MIN_NATURAL_CLEARANCE = 6;
|
||||
private static final int SCAN_LIMIT = 48;
|
||||
|
||||
private static final int CHAMBER_HEIGHT_MIN = 26;
|
||||
private static final int CHAMBER_HEIGHT_MAX = 46;
|
||||
private static final int CHAMBER_RADIUS_MIN = 8;
|
||||
private static final int CHAMBER_RADIUS_MAX = 12;
|
||||
private static final int BLOB_LAYER_COUNT = 9;
|
||||
private static final double MAX_DRIFT_FROM_CENTER = 6.0;
|
||||
|
||||
private static final int MAX_PROCESSED_POSITIONS = 60000;
|
||||
|
||||
private static final int FLOOR_DECORATION_ATTEMPTS = 40;
|
||||
private static final int CEILING_DECORATION_ATTEMPTS = 30;
|
||||
private static final int MAX_VINE_LENGTH = 10;
|
||||
|
||||
public RollyCavesGiantCavernFeature(Codec<NoneFeatureConfiguration> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
try {
|
||||
return tryPlace(context);
|
||||
} catch (RuntimeException exception) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean tryPlace(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
WorldGenLevel level = context.level();
|
||||
RandomSource random = context.random();
|
||||
BlockPos origin = context.origin();
|
||||
|
||||
if (!isSurroundedByRollyCaves(level, origin)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
NaturalPocket pocket = findNaturalPocket(level, origin);
|
||||
if (pocket == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<Blob> blobs = buildBlobs(random, pocket.center());
|
||||
int carvedPositions = carveBlobs(level, blobs);
|
||||
if (carvedPositions == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
placeTrunk(level, random, blobs);
|
||||
decorateFloor(level, random, blobs);
|
||||
decorateCeiling(level, random, blobs);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void placeTrunk(WorldGenLevel level, RandomSource random, List<Blob> blobs) {
|
||||
Block woodBlock = getBlock(OURANWOOD_WOOD_ID);
|
||||
Block mossyWoodBlock = getBlock(MOSSY_OURANWOOD_WOOD_ID);
|
||||
Block mossyLogBlock = getBlock(MOSSY_OURANWOOD_LOG_ID);
|
||||
if (woodBlock == null || mossyWoodBlock == null || mossyLogBlock == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Blob bottom = blobs.get(0);
|
||||
Blob top = blobs.get(blobs.size() - 1);
|
||||
int trunkBottomY = (int) Math.floor(bottom.y() - bottom.verticalRadius()) + 1;
|
||||
int trunkTopY = (int) Math.ceil(top.y() + top.verticalRadius()) - 1;
|
||||
|
||||
BlockState woodState = woodBlock.defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y);
|
||||
BlockState mossyWoodState = mossyWoodBlock.defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y);
|
||||
BlockState mossyLogState = mossyLogBlock.defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y);
|
||||
|
||||
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
|
||||
for (int y = trunkBottomY; y <= trunkTopY; y++) {
|
||||
double[] center = interpolateCenter(blobs, y);
|
||||
int centerX = (int) Math.round(center[0]);
|
||||
int centerZ = (int) Math.round(center[1]);
|
||||
|
||||
for (int dx = -TRUNK_RADIUS; dx <= TRUNK_RADIUS; dx++) {
|
||||
for (int dz = -TRUNK_RADIUS; dz <= TRUNK_RADIUS; dz++) {
|
||||
if (dx * dx + dz * dz > TRUNK_RADIUS * TRUNK_RADIUS) {
|
||||
continue;
|
||||
}
|
||||
|
||||
mutable.set(centerX + dx, y, centerZ + dz);
|
||||
BlockState existing = level.getBlockState(mutable);
|
||||
if (existing.is(Blocks.BEDROCK) || level.getBlockEntity(mutable) != null) {
|
||||
continue;
|
||||
}
|
||||
if (!existing.getFluidState().isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean surface = dx * dx + dz * dz >= (TRUNK_RADIUS - 1) * (TRUNK_RADIUS - 1);
|
||||
BlockState toPlace = woodState;
|
||||
if (surface && random.nextInt(MOSSY_PATCH_CHANCE) == 0) {
|
||||
toPlace = random.nextBoolean() ? mossyWoodState : mossyLogState;
|
||||
}
|
||||
|
||||
level.setBlock(mutable, toPlace, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static double[] interpolateCenter(List<Blob> blobs, int y) {
|
||||
Blob lower = blobs.get(0);
|
||||
Blob upper = blobs.get(blobs.size() - 1);
|
||||
|
||||
for (int i = 0; i < blobs.size() - 1; i++) {
|
||||
if (y >= blobs.get(i).y() && y <= blobs.get(i + 1).y()) {
|
||||
lower = blobs.get(i);
|
||||
upper = blobs.get(i + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
double span = upper.y() - lower.y();
|
||||
double t = span == 0 ? 0 : (y - lower.y()) / span;
|
||||
t = Math.max(0.0, Math.min(1.0, t));
|
||||
|
||||
double x = lower.x() + (upper.x() - lower.x()) * t;
|
||||
double z = lower.z() + (upper.z() - lower.z()) * t;
|
||||
return new double[] {x, z};
|
||||
}
|
||||
|
||||
private static boolean isSurroundedByRollyCaves(WorldGenLevel level, BlockPos origin) {
|
||||
int matches = 0;
|
||||
int samples = 0;
|
||||
for (int dx = -BIOME_SAMPLE_RADIUS; dx <= BIOME_SAMPLE_RADIUS; dx += BIOME_SAMPLE_STEP) {
|
||||
for (int dz = -BIOME_SAMPLE_RADIUS; dz <= BIOME_SAMPLE_RADIUS; dz += BIOME_SAMPLE_STEP) {
|
||||
samples++;
|
||||
if (level.getBiome(origin.offset(dx, 0, dz)).is(ROLLY_CAVES)) {
|
||||
matches++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return samples > 0 && matches >= MIN_BIOME_SAMPLE_MATCHES;
|
||||
}
|
||||
|
||||
private static NaturalPocket findNaturalPocket(WorldGenLevel level, BlockPos origin) {
|
||||
BlockPos.MutableBlockPos cursor = origin.mutable();
|
||||
|
||||
if (!level.getBlockState(cursor).isAir()) {
|
||||
boolean found = false;
|
||||
for (int radius = 1; radius <= 6 && !found; radius++) {
|
||||
for (Direction direction : Direction.Plane.HORIZONTAL) {
|
||||
BlockPos candidate = origin.relative(direction, radius);
|
||||
if (level.getBlockState(candidate).isAir()) {
|
||||
cursor.set(candidate);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
int floorY = cursor.getY();
|
||||
for (int steps = 0; steps < SCAN_LIMIT; steps++) {
|
||||
BlockPos below = new BlockPos(cursor.getX(), floorY - 1, cursor.getZ());
|
||||
if (!level.getBlockState(below).isAir()) {
|
||||
break;
|
||||
}
|
||||
floorY--;
|
||||
}
|
||||
|
||||
int ceilingY = cursor.getY();
|
||||
for (int steps = 0; steps < SCAN_LIMIT; steps++) {
|
||||
BlockPos above = new BlockPos(cursor.getX(), ceilingY + 1, cursor.getZ());
|
||||
if (!level.getBlockState(above).isAir()) {
|
||||
break;
|
||||
}
|
||||
ceilingY++;
|
||||
}
|
||||
|
||||
int clearance = ceilingY - floorY;
|
||||
if (clearance < MIN_NATURAL_CLEARANCE) {
|
||||
return null;
|
||||
}
|
||||
|
||||
BlockPos center = new BlockPos(cursor.getX(), (floorY + ceilingY) / 2, cursor.getZ());
|
||||
return new NaturalPocket(center);
|
||||
}
|
||||
|
||||
private static List<Blob> buildBlobs(RandomSource random, BlockPos center) {
|
||||
int chamberHeight = CHAMBER_HEIGHT_MIN + random.nextInt(CHAMBER_HEIGHT_MAX - CHAMBER_HEIGHT_MIN + 1);
|
||||
int baseY = center.getY() - chamberHeight / 2;
|
||||
|
||||
List<Blob> blobs = new ArrayList<>(BLOB_LAYER_COUNT);
|
||||
double driftX = center.getX();
|
||||
double driftZ = center.getZ();
|
||||
|
||||
for (int i = 0; i < BLOB_LAYER_COUNT; i++) {
|
||||
double t = (double) i / (BLOB_LAYER_COUNT - 1);
|
||||
double taper = Math.sin(Math.PI * t);
|
||||
int layerY = baseY + (int) Math.round(t * chamberHeight);
|
||||
|
||||
double baseRadius = CHAMBER_RADIUS_MIN + (CHAMBER_RADIUS_MAX - CHAMBER_RADIUS_MIN) * taper;
|
||||
double jitter = 0.85 + random.nextDouble() * 0.3;
|
||||
double horizontalRadius = Math.max(2.5, baseRadius * jitter);
|
||||
double verticalRadius = Math.max(3.0, chamberHeight / (double) BLOB_LAYER_COUNT * 1.6);
|
||||
|
||||
driftX = clampDrift(driftX + (random.nextDouble() - 0.5) * 3.0, center.getX());
|
||||
driftZ = clampDrift(driftZ + (random.nextDouble() - 0.5) * 3.0, center.getZ());
|
||||
|
||||
blobs.add(new Blob(driftX, layerY, driftZ, horizontalRadius, verticalRadius));
|
||||
}
|
||||
|
||||
return blobs;
|
||||
}
|
||||
|
||||
private static double clampDrift(double value, double center) {
|
||||
return Math.max(center - MAX_DRIFT_FROM_CENTER, Math.min(center + MAX_DRIFT_FROM_CENTER, value));
|
||||
}
|
||||
|
||||
private static int carveBlobs(WorldGenLevel level, List<Blob> blobs) {
|
||||
int minX = Integer.MAX_VALUE;
|
||||
int maxX = Integer.MIN_VALUE;
|
||||
int minY = Integer.MAX_VALUE;
|
||||
int maxY = Integer.MIN_VALUE;
|
||||
int minZ = Integer.MAX_VALUE;
|
||||
int maxZ = Integer.MIN_VALUE;
|
||||
|
||||
for (Blob blob : blobs) {
|
||||
minX = Math.min(minX, (int) Math.floor(blob.x() - blob.horizontalRadius()));
|
||||
maxX = Math.max(maxX, (int) Math.ceil(blob.x() + blob.horizontalRadius()));
|
||||
minY = Math.min(minY, (int) Math.floor(blob.y() - blob.verticalRadius()));
|
||||
maxY = Math.max(maxY, (int) Math.ceil(blob.y() + blob.verticalRadius()));
|
||||
minZ = Math.min(minZ, (int) Math.floor(blob.z() - blob.horizontalRadius()));
|
||||
maxZ = Math.max(maxZ, (int) Math.ceil(blob.z() + blob.horizontalRadius()));
|
||||
}
|
||||
|
||||
BlockState caveAir = Blocks.CAVE_AIR.defaultBlockState();
|
||||
int processed = 0;
|
||||
int carved = 0;
|
||||
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
|
||||
|
||||
for (int x = minX; x <= maxX && processed < MAX_PROCESSED_POSITIONS; x++) {
|
||||
for (int y = minY; y <= maxY && processed < MAX_PROCESSED_POSITIONS; y++) {
|
||||
for (int z = minZ; z <= maxZ && processed < MAX_PROCESSED_POSITIONS; z++) {
|
||||
processed++;
|
||||
|
||||
if (!insideAnyBlob(blobs, x, y, z)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
mutable.set(x, y, z);
|
||||
BlockState state = level.getBlockState(mutable);
|
||||
if (state.is(Blocks.BEDROCK) || !state.getFluidState().isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
if (level.getBlockEntity(mutable) != null) {
|
||||
continue;
|
||||
}
|
||||
if (state.isAir()) {
|
||||
continue;
|
||||
}
|
||||
if (!state.is(AntarchyTags.Blocks.ROLLY_CAVERN_CARVEABLE)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
level.setBlock(mutable, caveAir, 2);
|
||||
carved++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return carved;
|
||||
}
|
||||
|
||||
private static boolean insideAnyBlob(List<Blob> blobs, int x, int y, int z) {
|
||||
for (Blob blob : blobs) {
|
||||
double dx = (x + 0.5 - blob.x()) / blob.horizontalRadius();
|
||||
double dy = (y + 0.5 - blob.y()) / blob.verticalRadius();
|
||||
double dz = (z + 0.5 - blob.z()) / blob.horizontalRadius();
|
||||
if (dx * dx + dy * dy + dz * dz <= 1.0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void decorateFloor(WorldGenLevel level, RandomSource random, List<Blob> blobs) {
|
||||
Blob widest = widestBlob(blobs);
|
||||
Block glowcap = getBlock(GLOWCAP_MUSHROOM_ID);
|
||||
Block amberMoss = getBlock(AMBER_MOSS_BLOCK_ID);
|
||||
|
||||
for (int attempt = 0; attempt < FLOOR_DECORATION_ATTEMPTS; attempt++) {
|
||||
double angle = random.nextDouble() * Math.PI * 2;
|
||||
double distance = random.nextDouble() * widest.horizontalRadius();
|
||||
int x = (int) Math.round(widest.x() + Math.cos(angle) * distance);
|
||||
int z = (int) Math.round(widest.z() + Math.sin(angle) * distance);
|
||||
|
||||
BlockPos floorPos = findFloor(level, x, (int) Math.round(widest.y()), z);
|
||||
if (floorPos == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockPos abovePos = floorPos.above();
|
||||
if (!level.getBlockState(abovePos).isAir()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int roll = random.nextInt(100);
|
||||
if (roll < 28) {
|
||||
level.setBlock(floorPos, Blocks.MOSS_BLOCK.defaultBlockState(), 2);
|
||||
if (random.nextBoolean()) {
|
||||
level.setBlock(abovePos, Blocks.MOSS_CARPET.defaultBlockState(), 2);
|
||||
}
|
||||
} else if (roll < 40) {
|
||||
level.setBlock(abovePos, Blocks.SHORT_GRASS.defaultBlockState(), 2);
|
||||
} else if (roll < 50) {
|
||||
level.setBlock(abovePos, Blocks.SMALL_DRIPLEAF.defaultBlockState(), 2);
|
||||
} else if (roll < 58) {
|
||||
placeBigDripleaf(level, random, abovePos);
|
||||
} else if (roll < 74 && glowcap != null && amberMoss != null) {
|
||||
level.setBlock(floorPos, amberMoss.defaultBlockState(), 2);
|
||||
level.setBlock(abovePos, glowcap.defaultBlockState(), 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void placeBigDripleaf(WorldGenLevel level, RandomSource random, BlockPos basePos) {
|
||||
int height = 1 + random.nextInt(3);
|
||||
BlockPos.MutableBlockPos cursor = basePos.mutable();
|
||||
for (int i = 0; i < height; i++) {
|
||||
if (!level.getBlockState(cursor).isAir()) {
|
||||
return;
|
||||
}
|
||||
level.setBlock(cursor, Blocks.BIG_DRIPLEAF_STEM.defaultBlockState(), 2);
|
||||
cursor.move(Direction.UP);
|
||||
}
|
||||
if (level.getBlockState(cursor).isAir()) {
|
||||
level.setBlock(cursor, Blocks.BIG_DRIPLEAF.defaultBlockState().setValue(BlockStateProperties.TILT, Tilt.NONE), 2);
|
||||
}
|
||||
}
|
||||
|
||||
private static void decorateCeiling(WorldGenLevel level, RandomSource random, List<Blob> blobs) {
|
||||
Blob widest = widestBlob(blobs);
|
||||
|
||||
for (int attempt = 0; attempt < CEILING_DECORATION_ATTEMPTS; attempt++) {
|
||||
double angle = random.nextDouble() * Math.PI * 2;
|
||||
double distance = random.nextDouble() * widest.horizontalRadius();
|
||||
int x = (int) Math.round(widest.x() + Math.cos(angle) * distance);
|
||||
int z = (int) Math.round(widest.z() + Math.sin(angle) * distance);
|
||||
|
||||
BlockPos ceilingAttach = findCeiling(level, x, (int) Math.round(widest.y()), z);
|
||||
if (ceilingAttach == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockPos hangPos = ceilingAttach.below();
|
||||
if (!level.getBlockState(hangPos).isAir()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int roll = random.nextInt(100);
|
||||
if (roll < 30) {
|
||||
level.setBlock(hangPos, Blocks.SPORE_BLOSSOM.defaultBlockState(), 2);
|
||||
} else {
|
||||
placeCaveVineCurtain(level, random, hangPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void placeCaveVineCurtain(WorldGenLevel level, RandomSource random, BlockPos hangPos) {
|
||||
int length = availableAirLength(level, hangPos, MAX_VINE_LENGTH);
|
||||
if (length <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockPos.MutableBlockPos cursor = hangPos.mutable();
|
||||
for (int i = 0; i < length - 1; i++) {
|
||||
boolean berries = random.nextInt(4) == 0;
|
||||
level.setBlock(cursor, Blocks.CAVE_VINES_PLANT.defaultBlockState().setValue(CaveVinesBlock.BERRIES, berries), 2);
|
||||
cursor.move(Direction.DOWN);
|
||||
}
|
||||
boolean tipBerries = random.nextInt(3) == 0;
|
||||
level.setBlock(cursor, Blocks.CAVE_VINES.defaultBlockState().setValue(CaveVinesBlock.BERRIES, tipBerries), 2);
|
||||
}
|
||||
|
||||
private static int availableAirLength(WorldGenLevel level, BlockPos start, int cap) {
|
||||
BlockPos.MutableBlockPos cursor = start.mutable();
|
||||
int length = 0;
|
||||
while (length < cap && level.getBlockState(cursor).isAir()) {
|
||||
length++;
|
||||
cursor.move(Direction.DOWN);
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
private static BlockPos findFloor(WorldGenLevel level, int x, int startY, int z) {
|
||||
BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(x, startY, z);
|
||||
for (int steps = 0; steps < SCAN_LIMIT; steps++) {
|
||||
BlockState state = level.getBlockState(cursor);
|
||||
BlockState below = level.getBlockState(cursor.below());
|
||||
if (state.isAir() && !below.isAir() && below.isFaceSturdy(level, cursor.below(), Direction.UP)) {
|
||||
return cursor.immutable();
|
||||
}
|
||||
cursor.move(Direction.DOWN);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static BlockPos findCeiling(WorldGenLevel level, int x, int startY, int z) {
|
||||
BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(x, startY, z);
|
||||
for (int steps = 0; steps < SCAN_LIMIT; steps++) {
|
||||
BlockState state = level.getBlockState(cursor);
|
||||
BlockState above = level.getBlockState(cursor.above());
|
||||
if (state.isAir() && !above.isAir() && above.isFaceSturdy(level, cursor.above(), Direction.DOWN)) {
|
||||
return cursor.above().immutable();
|
||||
}
|
||||
cursor.move(Direction.UP);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Blob widestBlob(List<Blob> blobs) {
|
||||
Blob widest = blobs.get(0);
|
||||
for (Blob blob : blobs) {
|
||||
if (blob.horizontalRadius() > widest.horizontalRadius()) {
|
||||
widest = blob;
|
||||
}
|
||||
}
|
||||
return widest;
|
||||
}
|
||||
|
||||
private static Block getBlock(ResourceLocation id) {
|
||||
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
|
||||
return block.orElse(null);
|
||||
}
|
||||
|
||||
private record NaturalPocket(BlockPos center) {
|
||||
}
|
||||
|
||||
private record Blob(double x, double y, double z, double horizontalRadius, double verticalRadius) {
|
||||
}
|
||||
}
|
||||
+158
@@ -0,0 +1,158 @@
|
||||
package com.craisinlord.antarchy.content.worldgen.mushroom;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.mojang.serialization.Codec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.HugeMushroomBlock;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
public final class GlowcapHugeMushroomFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private static final ResourceLocation GLOWCAP_MUSHROOM_BLOCK_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glowcap_mushroom_block");
|
||||
private static final int MIN_STEM_HEIGHT = 5;
|
||||
private static final int MAX_STEM_HEIGHT = 8;
|
||||
private static final int CAP_RADIUS = 2;
|
||||
private static final int TOP_RADIUS = 1;
|
||||
public GlowcapHugeMushroomFeature(Codec<NoneFeatureConfiguration> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
Block glowcapBlock = getBlock(GLOWCAP_MUSHROOM_BLOCK_ID);
|
||||
if (glowcapBlock == null || !(glowcapBlock.defaultBlockState().getBlock() instanceof HugeMushroomBlock)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
WorldGenLevel level = context.level();
|
||||
RandomSource random = context.random();
|
||||
int stemHeight = MIN_STEM_HEIGHT + random.nextInt(MAX_STEM_HEIGHT - MIN_STEM_HEIGHT + 1);
|
||||
BlockPos origin = context.origin();
|
||||
if (!isValidPlacementOrigin(level, origin, stemHeight + 2)) {
|
||||
return false;
|
||||
}
|
||||
BlockState capBase = glowcapBlock.defaultBlockState();
|
||||
BlockState stemState = Blocks.MUSHROOM_STEM.defaultBlockState();
|
||||
|
||||
Direction lean = Direction.Plane.HORIZONTAL.getRandomDirection(random);
|
||||
|
||||
BlockPos.MutableBlockPos cursor = origin.mutable();
|
||||
boolean placedAny = false;
|
||||
|
||||
for (int i = 0; i < stemHeight; i++) {
|
||||
if (i > 1 && i % 2 == 0) {
|
||||
cursor.move(lean);
|
||||
}
|
||||
cursor.setY(origin.getY() + i);
|
||||
if (!canReplace(level, cursor)) {
|
||||
continue;
|
||||
}
|
||||
level.setBlock(cursor, stemState, 3);
|
||||
placedAny = true;
|
||||
}
|
||||
|
||||
BlockPos capCenter = cursor.above().immutable();
|
||||
placedAny |= placeUmbrellaCap(level, random, capCenter, capBase);
|
||||
|
||||
return placedAny;
|
||||
}
|
||||
|
||||
private static boolean isValidPlacementOrigin(WorldGenLevel level, BlockPos origin, int clearanceHeight) {
|
||||
if (!level.getBlockState(origin).isAir()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockPos belowPos = origin.below();
|
||||
BlockState belowState = level.getBlockState(belowPos);
|
||||
if (!belowState.is(BlockTags.MUSHROOM_GROW_BLOCK) && !belowState.isFaceSturdy(level, belowPos, Direction.UP)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return hasVerticalClearance(level, origin, clearanceHeight);
|
||||
}
|
||||
|
||||
private static boolean hasVerticalClearance(WorldGenLevel level, BlockPos origin, int clearanceHeight) {
|
||||
for (int offset = 0; offset <= clearanceHeight; offset++) {
|
||||
if (!canReplace(level, origin.above(offset))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean placeUmbrellaCap(WorldGenLevel level, RandomSource random, BlockPos capCenter, BlockState capBase) {
|
||||
boolean placedAny = false;
|
||||
BlockState stemState = Blocks.MUSHROOM_STEM.defaultBlockState();
|
||||
|
||||
for (int dx = -CAP_RADIUS; dx <= CAP_RADIUS; dx++) {
|
||||
for (int dz = -CAP_RADIUS; dz <= CAP_RADIUS; dz++) {
|
||||
boolean isCenter = dx == 0 && dz == 0;
|
||||
boolean coveredByTopTier = Math.abs(dx) <= TOP_RADIUS && Math.abs(dz) <= TOP_RADIUS;
|
||||
|
||||
BlockPos pos = new BlockPos(capCenter.getX() + dx, capCenter.getY(), capCenter.getZ() + dz);
|
||||
if (!canReplace(level, pos)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isCenter) {
|
||||
level.setBlock(pos, stemState, 3);
|
||||
placedAny = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockState state = capBase
|
||||
.setValue(HugeMushroomBlock.NORTH, dz == -CAP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.SOUTH, dz == CAP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.EAST, dx == CAP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.WEST, dx == -CAP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.UP, !coveredByTopTier)
|
||||
.setValue(HugeMushroomBlock.DOWN, true);
|
||||
|
||||
level.setBlock(pos, state, 3);
|
||||
placedAny = true;
|
||||
}
|
||||
}
|
||||
|
||||
int topY = capCenter.getY() + 1;
|
||||
for (int dx = -TOP_RADIUS; dx <= TOP_RADIUS; dx++) {
|
||||
for (int dz = -TOP_RADIUS; dz <= TOP_RADIUS; dz++) {
|
||||
BlockPos pos = new BlockPos(capCenter.getX() + dx, topY, capCenter.getZ() + dz);
|
||||
if (!canReplace(level, pos)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockState state = capBase
|
||||
.setValue(HugeMushroomBlock.NORTH, dz == -TOP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.SOUTH, dz == TOP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.EAST, dx == TOP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.WEST, dx == -TOP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.UP, true)
|
||||
.setValue(HugeMushroomBlock.DOWN, false);
|
||||
|
||||
level.setBlock(pos, state, 3);
|
||||
placedAny = true;
|
||||
}
|
||||
}
|
||||
|
||||
return placedAny;
|
||||
}
|
||||
|
||||
private static boolean canReplace(WorldGenLevel level, BlockPos pos) {
|
||||
BlockState existing = level.getBlockState(pos);
|
||||
return existing.isAir() || existing.canBeReplaced();
|
||||
}
|
||||
|
||||
private static Block getBlock(ResourceLocation id) {
|
||||
return BuiltInRegistries.BLOCK.getOptional(id).orElse(null);
|
||||
}
|
||||
}
|
||||
+180
@@ -0,0 +1,180 @@
|
||||
package com.craisinlord.antarchy.content.worldgen.mushroom;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.mojang.serialization.Codec;
|
||||
import java.util.Optional;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.HugeMushroomBlock;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
public final class GlowcapHugeMushroomWorldgenFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private static final ResourceLocation GLOWCAP_MUSHROOM_BLOCK_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glowcap_mushroom_block");
|
||||
private static final int MIN_STEM_HEIGHT = 5;
|
||||
private static final int MAX_STEM_HEIGHT = 8;
|
||||
private static final int CAP_RADIUS = 2;
|
||||
private static final int TOP_RADIUS = 1;
|
||||
private static final int SEARCH_RADIUS = 6;
|
||||
private static final int SEARCH_ATTEMPTS = 20;
|
||||
private static final int VERTICAL_SCAN = 12;
|
||||
|
||||
public GlowcapHugeMushroomWorldgenFeature(Codec<NoneFeatureConfiguration> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
Block glowcapBlock = getBlock(GLOWCAP_MUSHROOM_BLOCK_ID);
|
||||
if (glowcapBlock == null || !(glowcapBlock.defaultBlockState().getBlock() instanceof HugeMushroomBlock)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
WorldGenLevel level = context.level();
|
||||
RandomSource random = context.random();
|
||||
int stemHeight = MIN_STEM_HEIGHT + random.nextInt(MAX_STEM_HEIGHT - MIN_STEM_HEIGHT + 1);
|
||||
BlockPos origin = findPlacementOrigin(level, context.origin(), random, stemHeight + 2);
|
||||
if (origin == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockState capBase = glowcapBlock.defaultBlockState();
|
||||
BlockState stemState = Blocks.MUSHROOM_STEM.defaultBlockState();
|
||||
Direction lean = Direction.Plane.HORIZONTAL.getRandomDirection(random);
|
||||
BlockPos.MutableBlockPos cursor = origin.mutable();
|
||||
boolean placedAny = false;
|
||||
|
||||
for (int i = 0; i < stemHeight; i++) {
|
||||
if (i > 1 && i % 2 == 0) {
|
||||
cursor.move(lean);
|
||||
}
|
||||
cursor.setY(origin.getY() + i);
|
||||
if (!canReplace(level, cursor)) {
|
||||
continue;
|
||||
}
|
||||
level.setBlock(cursor, stemState, 3);
|
||||
placedAny = true;
|
||||
}
|
||||
|
||||
BlockPos capCenter = cursor.above().immutable();
|
||||
placedAny |= placeUmbrellaCap(level, capCenter, capBase);
|
||||
return placedAny;
|
||||
}
|
||||
|
||||
private static BlockPos findPlacementOrigin(WorldGenLevel level, BlockPos origin, RandomSource random, int clearanceHeight) {
|
||||
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
|
||||
int minY = Math.max(level.getMinBuildHeight() + 2, origin.getY() - VERTICAL_SCAN);
|
||||
int maxY = Math.min(level.getMaxBuildHeight() - clearanceHeight - 2, origin.getY() + VERTICAL_SCAN);
|
||||
|
||||
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
|
||||
int x = origin.getX() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
|
||||
int z = origin.getZ() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
|
||||
|
||||
for (int y = maxY; y >= minY; y--) {
|
||||
mutable.set(x, y, z);
|
||||
if (!isValidPlacementOrigin(level, mutable, clearanceHeight)) {
|
||||
continue;
|
||||
}
|
||||
return mutable.immutable();
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean isValidPlacementOrigin(WorldGenLevel level, BlockPos origin, int clearanceHeight) {
|
||||
if (!level.getBlockState(origin).isAir()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockPos belowPos = origin.below();
|
||||
BlockState belowState = level.getBlockState(belowPos);
|
||||
if (!belowState.is(BlockTags.MUSHROOM_GROW_BLOCK) && !belowState.isFaceSturdy(level, belowPos, Direction.UP)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return hasVerticalClearance(level, origin, clearanceHeight);
|
||||
}
|
||||
|
||||
private static boolean hasVerticalClearance(WorldGenLevel level, BlockPos origin, int clearanceHeight) {
|
||||
for (int offset = 0; offset <= clearanceHeight; offset++) {
|
||||
if (!canReplace(level, origin.above(offset))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean placeUmbrellaCap(WorldGenLevel level, BlockPos capCenter, BlockState capBase) {
|
||||
boolean placedAny = false;
|
||||
BlockState stemState = Blocks.MUSHROOM_STEM.defaultBlockState();
|
||||
|
||||
for (int dx = -CAP_RADIUS; dx <= CAP_RADIUS; dx++) {
|
||||
for (int dz = -CAP_RADIUS; dz <= CAP_RADIUS; dz++) {
|
||||
boolean isCenter = dx == 0 && dz == 0;
|
||||
boolean coveredByTopTier = Math.abs(dx) <= TOP_RADIUS && Math.abs(dz) <= TOP_RADIUS;
|
||||
BlockPos pos = new BlockPos(capCenter.getX() + dx, capCenter.getY(), capCenter.getZ() + dz);
|
||||
if (!canReplace(level, pos)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isCenter) {
|
||||
level.setBlock(pos, stemState, 3);
|
||||
placedAny = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockState state = capBase
|
||||
.setValue(HugeMushroomBlock.NORTH, dz == -CAP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.SOUTH, dz == CAP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.EAST, dx == CAP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.WEST, dx == -CAP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.UP, !coveredByTopTier)
|
||||
.setValue(HugeMushroomBlock.DOWN, true);
|
||||
level.setBlock(pos, state, 3);
|
||||
placedAny = true;
|
||||
}
|
||||
}
|
||||
|
||||
int topY = capCenter.getY() + 1;
|
||||
for (int dx = -TOP_RADIUS; dx <= TOP_RADIUS; dx++) {
|
||||
for (int dz = -TOP_RADIUS; dz <= TOP_RADIUS; dz++) {
|
||||
BlockPos pos = new BlockPos(capCenter.getX() + dx, topY, capCenter.getZ() + dz);
|
||||
if (!canReplace(level, pos)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockState state = capBase
|
||||
.setValue(HugeMushroomBlock.NORTH, dz == -TOP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.SOUTH, dz == TOP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.EAST, dx == TOP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.WEST, dx == -TOP_RADIUS)
|
||||
.setValue(HugeMushroomBlock.UP, true)
|
||||
.setValue(HugeMushroomBlock.DOWN, false);
|
||||
level.setBlock(pos, state, 3);
|
||||
placedAny = true;
|
||||
}
|
||||
}
|
||||
|
||||
return placedAny;
|
||||
}
|
||||
|
||||
private static boolean canReplace(WorldGenLevel level, BlockPos pos) {
|
||||
BlockState existing = level.getBlockState(pos);
|
||||
return existing.isAir() || existing.canBeReplaced();
|
||||
}
|
||||
|
||||
private static Block getBlock(ResourceLocation id) {
|
||||
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
|
||||
return block.orElse(null);
|
||||
}
|
||||
}
|
||||
-52
@@ -1,14 +1,11 @@
|
||||
package com.craisinlord.antarchy.content.worldgen.thoraxis;
|
||||
|
||||
import com.craisinlord.antarchy.content.AntarchyObjects;
|
||||
import com.craisinlord.antarchy.content.block.PotentNyxiteBlock;
|
||||
import com.craisinlord.antarchy.content.block.state.PotentNyxiteState;
|
||||
import com.mojang.serialization.Codec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.LiquidBlock;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.material.FluidState;
|
||||
@@ -60,7 +57,6 @@ public final class LucidAntiwaterPoolFeature extends Feature<ThoraxisAntiwaterPo
|
||||
|
||||
placedAny |= placeCeilingBasin(level, random, offsetX, floorY, offsetZ, lobeRadius, ceilingY, profile, basaltState, antiwaterSourceState);
|
||||
placedAny |= placeAntiwaterSources(level, random, offsetX, floorY, offsetZ, Math.max(2, lobeRadius - 1), ventBudget, antiwaterSourceState);
|
||||
// placedAny |= maybePlacePotentNyxite(level, random, offsetX, floorY, offsetZ, Math.max(2, lobeRadius - 1));
|
||||
}
|
||||
|
||||
return placedAny;
|
||||
@@ -229,54 +225,6 @@ public final class LucidAntiwaterPoolFeature extends Feature<ThoraxisAntiwaterPo
|
||||
return placedAny;
|
||||
}
|
||||
|
||||
private static boolean maybePlacePotentNyxite(
|
||||
WorldGenLevel level,
|
||||
RandomSource random,
|
||||
int centerX,
|
||||
int floorY,
|
||||
int centerZ,
|
||||
int radius
|
||||
) {
|
||||
if (random.nextInt(8) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
|
||||
BlockState magmaState = Blocks.MAGMA_BLOCK.defaultBlockState();
|
||||
BlockState potentState = AntarchyObjects.POTENT_NYXITE.get()
|
||||
.defaultBlockState()
|
||||
.setValue(PotentNyxiteBlock.STATE, PotentNyxiteState.DORMANT);
|
||||
|
||||
for (int attempt = 0; attempt < 12; attempt++) {
|
||||
int dx = random.nextInt(radius * 2 + 1) - radius;
|
||||
int dz = random.nextInt(radius * 2 + 1) - radius;
|
||||
if (dx * dx + dz * dz > radius * radius) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int worldX = centerX + dx;
|
||||
int worldZ = centerZ + dz;
|
||||
int localCeilingY = findCeilingY(level, worldX, worldZ, floorY);
|
||||
if (localCeilingY <= floorY + MIN_CAVITY_HEIGHT) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockPos magmaPos = new BlockPos(worldX, localCeilingY, worldZ);
|
||||
BlockPos potentPos = magmaPos.below();
|
||||
if (!isSolidSurface(level.getBlockState(magmaPos)) || !isOpenBlock(level.getBlockState(potentPos))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
mutable.set(magmaPos);
|
||||
level.setBlock(mutable, magmaState, 2);
|
||||
mutable.set(potentPos);
|
||||
level.setBlock(mutable, potentState, 2);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static BlockPos findSupportedSourcePos(WorldGenLevel level, int x, int floorY, int z) {
|
||||
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
|
||||
for (int y = floorY + 2; y >= floorY - 3; y--) {
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
"multipart.EntityMultipartLifecycleMixin"
|
||||
],
|
||||
"client": [
|
||||
"client.CavarynSkyMixin",
|
||||
"client.ElythiaSkyMixin",
|
||||
"client.ElytraModelAccessor",
|
||||
"client.FrogRendererElythiaMixin",
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,150 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen"
|
||||
},
|
||||
"when": {
|
||||
"north": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen"
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"up": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"x": 90
|
||||
},
|
||||
"when": {
|
||||
"down": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"x": 90
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/amber_moss_block"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet"
|
||||
},
|
||||
"when": {
|
||||
"bottom": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet"
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall"
|
||||
},
|
||||
"when": {
|
||||
"north": "tall"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_small"
|
||||
},
|
||||
"when": {
|
||||
"north": "low"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall"
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "tall"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_small",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "low"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "tall"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_small",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "low"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "tall"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_small",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "low"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/bile_vein"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/broodstone"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"variants": {
|
||||
"type=double": {
|
||||
"model": "antarchy:block/broodstone_bricks"
|
||||
},
|
||||
"type=bottom": {
|
||||
"model": "antarchy:block/broodstone_brick_slab"
|
||||
},
|
||||
"type=top": {
|
||||
"model": "antarchy:block/broodstone_brick_slab_top"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner"
|
||||
},
|
||||
"facing=east,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer"
|
||||
},
|
||||
"facing=east,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs"
|
||||
},
|
||||
"facing=east,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=east,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=east,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=east,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=east,half=top,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=north,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=north,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=north,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=north,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=north,half=top,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner"
|
||||
},
|
||||
"facing=south,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer"
|
||||
},
|
||||
"facing=south,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=south,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=south,half=top,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=west,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=west,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=west,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=west,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=west,half=top,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_brick_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"when": { "up": "true" },
|
||||
"apply": { "model": "antarchy:block/broodstone_brick_wall_post" }
|
||||
},
|
||||
{
|
||||
"when": { "north": "low" },
|
||||
"apply": { "model": "antarchy:block/broodstone_brick_wall_side", "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "east": "low" },
|
||||
"apply": { "model": "antarchy:block/broodstone_brick_wall_side", "y": 90, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "south": "low" },
|
||||
"apply": { "model": "antarchy:block/broodstone_brick_wall_side", "y": 180, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "west": "low" },
|
||||
"apply": { "model": "antarchy:block/broodstone_brick_wall_side", "y": 270, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "north": "tall" },
|
||||
"apply": { "model": "antarchy:block/broodstone_brick_wall_side_tall", "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "east": "tall" },
|
||||
"apply": { "model": "antarchy:block/broodstone_brick_wall_side_tall", "y": 90, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "south": "tall" },
|
||||
"apply": { "model": "antarchy:block/broodstone_brick_wall_side_tall", "y": 180, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "west": "tall" },
|
||||
"apply": { "model": "antarchy:block/broodstone_brick_wall_side_tall", "y": 270, "uvlock": true }
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/broodstone_bricks"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"variants": {
|
||||
"type=double": {
|
||||
"model": "antarchy:block/broodstone"
|
||||
},
|
||||
"type=bottom": {
|
||||
"model": "antarchy:block/broodstone_slab"
|
||||
},
|
||||
"type=top": {
|
||||
"model": "antarchy:block/broodstone_slab_top"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner"
|
||||
},
|
||||
"facing=east,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer"
|
||||
},
|
||||
"facing=east,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_stairs"
|
||||
},
|
||||
"facing=east,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=east,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=east,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=east,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=east,half=top,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=north,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=north,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=north,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=north,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=north,half=top,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner"
|
||||
},
|
||||
"facing=south,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer"
|
||||
},
|
||||
"facing=south,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=south,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=south,half=top,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=west,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=west,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=west,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=west,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=west,half=top,shape=straight": {
|
||||
"model": "antarchy:block/broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/broodstone_titanium_ore"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/broodstone_uranium_ore"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"when": { "up": "true" },
|
||||
"apply": { "model": "antarchy:block/broodstone_wall_post" }
|
||||
},
|
||||
{
|
||||
"when": { "north": "low" },
|
||||
"apply": { "model": "antarchy:block/broodstone_wall_side", "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "east": "low" },
|
||||
"apply": { "model": "antarchy:block/broodstone_wall_side", "y": 90, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "south": "low" },
|
||||
"apply": { "model": "antarchy:block/broodstone_wall_side", "y": 180, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "west": "low" },
|
||||
"apply": { "model": "antarchy:block/broodstone_wall_side", "y": 270, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "north": "tall" },
|
||||
"apply": { "model": "antarchy:block/broodstone_wall_side_tall", "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "east": "tall" },
|
||||
"apply": { "model": "antarchy:block/broodstone_wall_side_tall", "y": 90, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "south": "tall" },
|
||||
"apply": { "model": "antarchy:block/broodstone_wall_side_tall", "y": 180, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "west": "tall" },
|
||||
"apply": { "model": "antarchy:block/broodstone_wall_side_tall", "y": 270, "uvlock": true }
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"variants": {
|
||||
"axis=x": { "model": "antarchy:block/cavaryn_portal_x" },
|
||||
"axis=z": { "model": "antarchy:block/cavaryn_portal_z" }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/chiseled_broodstone"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"variants": {
|
||||
"axis=x": {
|
||||
"model": "antarchy:block/chiten_block",
|
||||
"x": 90,
|
||||
"y": 90
|
||||
},
|
||||
"axis=y": {
|
||||
"model": "antarchy:block/chiten_block"
|
||||
},
|
||||
"axis=z": {
|
||||
"model": "antarchy:block/chiten_block",
|
||||
"x": 90
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"variants": {
|
||||
"thickness=base,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_base" },
|
||||
"thickness=base,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_base" },
|
||||
"thickness=frustum,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_frustum" },
|
||||
"thickness=frustum,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_frustum" },
|
||||
"thickness=middle,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_middle" },
|
||||
"thickness=middle,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_middle" },
|
||||
"thickness=tip,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_tip" },
|
||||
"thickness=tip,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_tip" },
|
||||
"thickness=tip_merge,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_tip_merge" },
|
||||
"thickness=tip_merge,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_tip_merge" }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"variants": {
|
||||
"eggs=1,hatch=0": [
|
||||
{ "model": "antarchy:block/creeping_horror_egg_1" },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=1,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_1" },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=1,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_1" },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=0": [
|
||||
{ "model": "antarchy:block/creeping_horror_egg_2" },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_2" },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_2" },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=0": [
|
||||
{ "model": "antarchy:block/creeping_horror_egg_3" },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_3" },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_3" },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=0": [
|
||||
{ "model": "antarchy:block/creeping_horror_egg_4" },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_4", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_4" },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_4", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_4" },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_4", "y": 270 }
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine"
|
||||
},
|
||||
"when": {
|
||||
"north": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine"
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"up": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/glowcap_mushroom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/glowcap_mushroom_block"
|
||||
},
|
||||
"when": {
|
||||
"north": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/glowcap_mushroom_block",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/glowcap_mushroom_block",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/glowcap_mushroom_block",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/glowcap_mushroom_block",
|
||||
"uvlock": true,
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"up": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/glowcap_mushroom_block",
|
||||
"uvlock": true,
|
||||
"x": 90
|
||||
},
|
||||
"when": {
|
||||
"down": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "minecraft:block/mushroom_block_inside"
|
||||
},
|
||||
"when": {
|
||||
"north": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "minecraft:block/mushroom_block_inside",
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "minecraft:block/mushroom_block_inside",
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "minecraft:block/mushroom_block_inside",
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "minecraft:block/mushroom_block_inside",
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"up": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "minecraft:block/mushroom_block_inside",
|
||||
"x": 90
|
||||
},
|
||||
"when": {
|
||||
"down": "false"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"variants": {
|
||||
"bottom=false": {
|
||||
"model": "antarchy:block/hanging_creeproots"
|
||||
},
|
||||
"bottom=true": {
|
||||
"model": "antarchy:block/hanging_creeproots_bottom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"variants": {
|
||||
"hanging=false,rotated=false": {
|
||||
"model": "antarchy:block/jumpy_bug_egg"
|
||||
},
|
||||
"hanging=false,rotated=true": {
|
||||
"model": "antarchy:block/jumpy_bug_egg",
|
||||
"y": 90
|
||||
},
|
||||
"hanging=true,rotated=false": {
|
||||
"model": "antarchy:block/jumpy_bug_egg",
|
||||
"x": 180
|
||||
},
|
||||
"hanging=true,rotated=true": {
|
||||
"model": "antarchy:block/jumpy_bug_egg",
|
||||
"x": 180,
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"variants": {
|
||||
"eggs=1,hatch=0": [
|
||||
{ "model": "antarchy:block/lurking_terror_egg_1" },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=1,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_1" },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=1,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_1" },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=0": [
|
||||
{ "model": "antarchy:block/lurking_terror_egg_2" },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_2" },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_2" },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=0": [
|
||||
{ "model": "antarchy:block/lurking_terror_egg_3" },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_3" },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_3" },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=0": [
|
||||
{ "model": "antarchy:block/lurking_terror_egg_4" },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_4", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_4" },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_4", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_4" },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_4", "y": 270 }
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"variants": {
|
||||
"growth_direction=up,top_cap=true,bottom_cap=false,broodfruit=false": {
|
||||
"model": "antarchy:block/molting_vines_top"
|
||||
},
|
||||
"growth_direction=up,top_cap=false,bottom_cap=false,broodfruit=false": {
|
||||
"model": "antarchy:block/molting_vines"
|
||||
},
|
||||
"growth_direction=up,top_cap=false,bottom_cap=false,broodfruit=true": {
|
||||
"model": "antarchy:block/molting_vines_broodfruit"
|
||||
},
|
||||
"growth_direction=down,top_cap=false,bottom_cap=true,broodfruit=false": {
|
||||
"model": "antarchy:block/molting_vines_bottom"
|
||||
},
|
||||
"growth_direction=down,top_cap=false,bottom_cap=false,broodfruit=false": {
|
||||
"model": "antarchy:block/molting_vines"
|
||||
},
|
||||
"growth_direction=down,top_cap=false,bottom_cap=false,broodfruit=true": {
|
||||
"model": "antarchy:block/molting_vines_broodfruit"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/myrmite"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/polished_broodstone"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"variants": {
|
||||
"type=double": {
|
||||
"model": "antarchy:block/polished_broodstone"
|
||||
},
|
||||
"type=bottom": {
|
||||
"model": "antarchy:block/polished_broodstone_slab"
|
||||
},
|
||||
"type=top": {
|
||||
"model": "antarchy:block/polished_broodstone_slab_top"
|
||||
}
|
||||
}
|
||||
}
|
||||
+209
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=east,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner"
|
||||
},
|
||||
"facing=east,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=east,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer"
|
||||
},
|
||||
"facing=east,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs"
|
||||
},
|
||||
"facing=east,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=east,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=east,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=east,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=east,half=top,shape=straight": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=north,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=north,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=north,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=north,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=north,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180
|
||||
},
|
||||
"facing=north,half=top,shape=straight": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner"
|
||||
},
|
||||
"facing=south,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer"
|
||||
},
|
||||
"facing=south,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=south,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=south,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=south,half=top,shape=straight": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
"facing=west,half=bottom,shape=inner_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=west,half=bottom,shape=inner_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=bottom,shape=outer_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"facing=west,half=bottom,shape=outer_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=bottom,shape=straight": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=top,shape=inner_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=top,shape=inner_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_inner",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=west,half=top,shape=outer_left": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west,half=top,shape=outer_right": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs_outer",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
"facing=west,half=top,shape=straight": {
|
||||
"model": "antarchy:block/polished_broodstone_stairs",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"when": { "up": "true" },
|
||||
"apply": { "model": "antarchy:block/polished_broodstone_wall_post" }
|
||||
},
|
||||
{
|
||||
"when": { "north": "low" },
|
||||
"apply": { "model": "antarchy:block/polished_broodstone_wall_side", "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "east": "low" },
|
||||
"apply": { "model": "antarchy:block/polished_broodstone_wall_side", "y": 90, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "south": "low" },
|
||||
"apply": { "model": "antarchy:block/polished_broodstone_wall_side", "y": 180, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "west": "low" },
|
||||
"apply": { "model": "antarchy:block/polished_broodstone_wall_side", "y": 270, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "north": "tall" },
|
||||
"apply": { "model": "antarchy:block/polished_broodstone_wall_side_tall", "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "east": "tall" },
|
||||
"apply": { "model": "antarchy:block/polished_broodstone_wall_side_tall", "y": 90, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "south": "tall" },
|
||||
"apply": { "model": "antarchy:block/polished_broodstone_wall_side_tall", "y": 180, "uvlock": true }
|
||||
},
|
||||
{
|
||||
"when": { "west": "tall" },
|
||||
"apply": { "model": "antarchy:block/polished_broodstone_wall_side_tall", "y": 270, "uvlock": true }
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/potted_glowcap_mushroom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=north": {"model": "antarchy:block/termite_nest"},
|
||||
"facing=east": {"model": "antarchy:block/termite_nest", "y": 90},
|
||||
"facing=south": {"model": "antarchy:block/termite_nest", "y": 180},
|
||||
"facing=west": {"model": "antarchy:block/termite_nest", "y": 270}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
{
|
||||
"format_version": "1.12.0",
|
||||
"minecraft:geometry": [
|
||||
{
|
||||
"description": {
|
||||
"identifier": "geometry.spitbug",
|
||||
"texture_width": 256,
|
||||
"texture_height": 256,
|
||||
"visible_bounds_width": 6,
|
||||
"visible_bounds_height": 5.5,
|
||||
"visible_bounds_offset": [0, 2.25, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
"name": "root",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "root",
|
||||
"pivot": [0, 36, 0],
|
||||
"cubes": [
|
||||
{"origin": [-11.5, 36, -18], "size": [23, 18, 37], "inflate": -0.05, "uv": [0, 103]},
|
||||
{"origin": [-9.5, 54, -35], "size": [19, 7, 59], "uv": [0, 0]},
|
||||
{"origin": [-7.5, 54, -52], "size": [15, 7, 17], "uv": [112, 28]},
|
||||
{"origin": [-6.5, 42, -51.75], "size": [3, 12, 5], "uv": [34, 23]},
|
||||
{"origin": [3.5, 42, -51.75], "size": [3, 12, 5], "uv": [34, 23], "mirror": true},
|
||||
{"origin": [-7.5, 52, -52], "size": [15, 2, 0], "uv": [0, 24]},
|
||||
{"origin": [-7.5, 44, -52], "size": [0, 10, 17], "uv": [5, 29]},
|
||||
{"origin": [-9.5, 47, -35], "size": [2, 7, 0], "uv": [37, 16]},
|
||||
{"origin": [-9.5, 45, -35], "size": [0, 9, 17], "uv": [0, 18]},
|
||||
{"origin": [9.5, 45, -35], "size": [0, 9, 17], "uv": [0, 18], "mirror": true},
|
||||
{"origin": [7.5, 47, -35], "size": [2, 7, 0], "uv": [37, 16], "mirror": true},
|
||||
{"origin": [7.5, 44, -52], "size": [0, 10, 17], "uv": [5, 29], "mirror": true},
|
||||
{"origin": [-11.5, 32.1, -18], "size": [23, 4, 33], "inflate": -0.05, "uv": [0, 66]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "jaw",
|
||||
"parent": "body",
|
||||
"pivot": [-3.07143, 33.92857, -16],
|
||||
"cubes": [
|
||||
{"origin": [-8.5, 32, -51], "size": [17, 2, 18], "uv": [97, 0]},
|
||||
{"origin": [-11.5, 30, -33], "size": [23, 4, 17], "uv": [79, 66]},
|
||||
{"origin": [-11.5, 34, -33], "size": [0, 8, 17], "uv": [0, -17]},
|
||||
{"origin": [-11.5, 34, -33], "size": [3, 8, 0], "uv": [0, 8]},
|
||||
{"origin": [8.5, 34, -33], "size": [3, 8, 0], "uv": [0, 8], "mirror": true},
|
||||
{"origin": [11.5, 34, -33], "size": [0, 8, 17], "uv": [0, -17], "mirror": true},
|
||||
{"origin": [-8.5, 34, -51], "size": [0, 8, 18], "uv": [0, -2]},
|
||||
{"origin": [-4.5, 32.5, -52.575], "size": [3, 8, 4], "pivot": [-3, 36.5, -50.575], "rotation": [22.5, 0, 0], "uv": [35, 0]},
|
||||
{"origin": [1.5, 32.5, -52.575], "size": [3, 8, 4], "pivot": [3, 36.5, -50.575], "rotation": [22.5, 0, 0], "uv": [35, 0], "mirror": true},
|
||||
{"origin": [-8.5, 34, -51], "size": [17, 8, 0], "uv": [0, 26]},
|
||||
{"origin": [8.5, 34, -51], "size": [0, 8, 18], "uv": [0, -2], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rightEye",
|
||||
"parent": "body",
|
||||
"pivot": [-11, 45.5, -17],
|
||||
"cubes": [
|
||||
{"origin": [-12, 45.5, -19], "size": [3, 3, 3], "uv": [83, 114]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leftEye",
|
||||
"parent": "body",
|
||||
"pivot": [11, 45.5, -17],
|
||||
"cubes": [
|
||||
{"origin": [9, 45.5, -19], "size": [3, 3, 3], "uv": [83, 114], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rightGrip",
|
||||
"parent": "body",
|
||||
"pivot": [-11.5, 54, -16],
|
||||
"rotation": [0, 0, 90]
|
||||
},
|
||||
{
|
||||
"name": "leftGrip",
|
||||
"parent": "body",
|
||||
"pivot": [11.5, 54, -16],
|
||||
"rotation": [0, 0, -90]
|
||||
},
|
||||
{
|
||||
"name": "backRightThigh",
|
||||
"parent": "root",
|
||||
"pivot": [-11.5, 37, 10],
|
||||
"cubes": [
|
||||
{"origin": [-20.5, 33, 8], "size": [9, 4, 4], "uv": [83, 120]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backRightKnee",
|
||||
"parent": "backRightThigh",
|
||||
"pivot": [-20.5, 37, 10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [-34.5, 32, 7], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backRightLeg",
|
||||
"parent": "backRightKnee",
|
||||
"pivot": [-34.5, 32, 10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [-53.5, 32, 8], "size": [19, 4, 4], "uv": [97, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backRightFoot",
|
||||
"parent": "backRightLeg",
|
||||
"pivot": [-53.5, 32, 10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [-67.5, 30, 9], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]},
|
||||
{"origin": [-76.5, 30, 10], "size": [9, 2, 0], "uv": [97, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backLeftThigh",
|
||||
"parent": "root",
|
||||
"pivot": [11.5, 37, 10],
|
||||
"cubes": [
|
||||
{"origin": [11.5, 33, 8], "size": [9, 4, 4], "uv": [83, 120]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backLeftKnee",
|
||||
"parent": "backLeftThigh",
|
||||
"pivot": [20.5, 37, 10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [20.5, 32, 7], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backLeftLeg",
|
||||
"parent": "backLeftKnee",
|
||||
"pivot": [34.5, 32, 10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [34.5, 32, 8], "size": [19, 4, 4], "uv": [97, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backLeftFoot",
|
||||
"parent": "backLeftLeg",
|
||||
"pivot": [53.5, 32, 10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [53.5, 30, 9], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]},
|
||||
{"origin": [67.5, 30, 10], "size": [9, 2, 0], "uv": [97, 32], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontRightThigh",
|
||||
"parent": "root",
|
||||
"pivot": [-11.5, 37, -10],
|
||||
"cubes": [
|
||||
{"origin": [-20.5, 33, -12], "size": [9, 4, 4], "uv": [83, 120]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontRightKnee",
|
||||
"parent": "frontRightThigh",
|
||||
"pivot": [-20.5, 37, -10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [-34.5, 32, -13], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontRightLeg",
|
||||
"parent": "frontRightKnee",
|
||||
"pivot": [-34.5, 32, -10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [-53.5, 32, -12], "size": [19, 4, 4], "uv": [97, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontRightFoot",
|
||||
"parent": "frontRightLeg",
|
||||
"pivot": [-53.5, 32, -10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [-67.5, 30, -11], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]},
|
||||
{"origin": [-76.5, 30, -10], "size": [9, 2, 0], "uv": [97, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontLeftThigh",
|
||||
"parent": "root",
|
||||
"pivot": [11.5, 37, -10],
|
||||
"cubes": [
|
||||
{"origin": [11.5, 33, -12], "size": [9, 4, 4], "uv": [83, 120]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontLeftKnee",
|
||||
"parent": "frontLeftThigh",
|
||||
"pivot": [20.5, 37, -10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [20.5, 32, -13], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontLeftLeg",
|
||||
"parent": "frontLeftKnee",
|
||||
"pivot": [34.5, 32, -10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [34.5, 32, -12], "size": [19, 4, 4], "uv": [97, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontLeftFoot",
|
||||
"parent": "frontLeftLeg",
|
||||
"pivot": [53.5, 32, -10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [53.5, 30, -11], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]},
|
||||
{"origin": [67.5, 30, -10], "size": [9, 2, 0], "uv": [97, 32], "mirror": true}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -209,6 +209,9 @@
|
||||
"item.antarchy.big_bertha_handle": "Big Bertha Handle",
|
||||
"item.antarchy.big_bertha_hilt": "Big Bertha Hilt",
|
||||
"item.antarchy.battle_axe": "Battle Axe",
|
||||
"item.antarchy.attitude_adjuster": "Attitude Adjuster",
|
||||
"tooltip.antarchy.attitude_adjuster.grounded": "Smashes targets on the ground upward, targets in the air slam onto the ground.",
|
||||
"tooltip.antarchy.attitude_adjuster.slam": "Right-click while airborne to ground slam.",
|
||||
"item.antarchy.cloud_shark_fin": "Cloud Shark Fin",
|
||||
"item.antarchy.cloud_shark_fin_soup": "Cloud Shark Fin Soup",
|
||||
"tooltip.antarchy.cloud_shark_fin_soup": "Grants Strength and Slow Falling.",
|
||||
@@ -487,11 +490,13 @@
|
||||
"item.antarchy.mantis_spawn_egg": "Mantis Spawn Egg",
|
||||
"item.antarchy.alpha_mantis_spawn_egg": "Alpha Mantis Spawn Egg",
|
||||
"biome.antarchy.moleworm_caves": "Moleworm Caves",
|
||||
"biome.antarchy.elythia_meadow": "Elythian Meadows",
|
||||
"biome.antarchy.butterfly_fields": "Butterfly Fields",
|
||||
"biome.antarchy.ouranwood_forest": "Ouranwood Forest",
|
||||
"biome.antarchy.glimmering_pools": "Glimmering Pools",
|
||||
"biome.antarchy.peach_forest": "Peach Forest",
|
||||
"biome.antarchy.fungal_ouranwood_forest": "Fungal Ouranwood Forest",
|
||||
"biome.antarchy.glowcap_caves": "Glowcap Caves",
|
||||
"message.antarchy.brown_ant_activated": "The brown ant is ready to open its destination.",
|
||||
"message.antarchy.brown_ant_needs_reagent": "This brown ant needs a reagent before it can open its destination.",
|
||||
"message.antarchy.rainbow_ant_activated": "The rainbow ant hums with a new Infinity destination.",
|
||||
@@ -504,6 +509,9 @@
|
||||
"message.antarchy.red_ant_needs_reagent": "This red ant needs a reagent before it can open its destination.",
|
||||
"message.antarchy.termite_activated": "The termite is ready to open its destination.",
|
||||
"message.antarchy.termite_needs_reagent": "This termite needs a reagent before it can open its destination.",
|
||||
"death.attack.spit_bug_disrespect": "%1$s was disrespected by Spit Bug",
|
||||
"death.attack.jumpy_bug_jump": "%1$s was jumped by Jumpy Bug",
|
||||
"death.attack.hercules_beetle_obliteration": "%1$s was obliterated by Hercules Beetle",
|
||||
"message.antarchy.big_bertha.mode": "Big Bertha Mode: %s",
|
||||
"message.antarchy.big_bertha.mode.basilisk": "Basilisk",
|
||||
"message.antarchy.big_bertha.mode.lucid": "Lucid",
|
||||
@@ -850,5 +858,90 @@
|
||||
"advancements.antarchy.rocket_powered_octopus.title": "Rocket Powered Octopus",
|
||||
"advancements.antarchy.rocket_powered_octopus.description": "Craft an R.P.O. Launcher.",
|
||||
"advancements.antarchy.gravity_gun_craft.title": "Pick Up Artist",
|
||||
"advancements.antarchy.gravity_gun_craft.description": "Craft a Gravity Gun."
|
||||
"advancements.antarchy.gravity_gun_craft.description": "Craft a Gravity Gun.",
|
||||
"block.antarchy.cavaryn_portal": "Cavaryn Portal",
|
||||
"block.antarchy.termite_nest": "Termite Nest",
|
||||
"block.antarchy.chiten_spike": "Chiten Spike",
|
||||
"block.antarchy.chiten_block": "Chiten Block",
|
||||
"block.antarchy.myrmite": "Myrmite",
|
||||
"block.antarchy.broodstone": "Broodstone",
|
||||
"block.antarchy.amber_moss_block": "Amber Moss Block",
|
||||
"block.antarchy.amber_moss_carpet": "Amber Moss Carpet",
|
||||
"block.antarchy.amber_lichen": "Amber Lichen",
|
||||
"block.antarchy.bile_vein": "Bile Vein",
|
||||
"block.antarchy.creepvine": "Creepvine",
|
||||
"block.antarchy.creeping_horror_egg": "Creeping Horror Egg",
|
||||
"block.antarchy.lurking_terror_egg": "Lurking Terror Egg",
|
||||
"entity.antarchy.termite": "Termite",
|
||||
"entity.antarchy.jumpy_bug": "Jumpy Bug",
|
||||
"entity.antarchy.spit_bug": "Spit Bug",
|
||||
"entity.antarchy.stink_bug": "Stink Bug",
|
||||
"entity.antarchy.rolly_polly": "Rolly Polly",
|
||||
"entity.antarchy.creeping_horror": "Creeping Horror",
|
||||
"entity.antarchy.lurking_terror": "Lurking Terror",
|
||||
"entity.antarchy.hercules_beetle": "Hercules Beetle",
|
||||
"item.antarchy.jumpy_bug_spawn_egg": "Jumpy Bug Spawn Egg",
|
||||
"item.antarchy.spit_bug_spawn_egg": "Spit Bug Spawn Egg",
|
||||
"item.antarchy.stink_bug_spawn_egg": "Stink Bug Spawn Egg",
|
||||
"item.antarchy.termite_spawn_egg": "Termite Spawn Egg",
|
||||
"item.antarchy.rolly_polly_spawn_egg": "Rolly Polly Spawn Egg",
|
||||
"item.antarchy.creeping_horror_spawn_egg": "Creeping Horror Spawn Egg",
|
||||
"item.antarchy.lurking_terror_spawn_egg": "Lurking Terror Spawn Egg",
|
||||
"item.antarchy.hercules_beetle_spawn_egg": "Hercules Beetle Spawn Egg",
|
||||
"item.antarchy.chiten": "Chiten",
|
||||
"block.antarchy.polished_broodstone": "Polished Broodstone",
|
||||
"block.antarchy.chiseled_broodstone": "Chiseled Broodstone",
|
||||
"block.antarchy.broodstone_bricks": "Broodstone Bricks",
|
||||
"block.antarchy.broodstone_stairs": "Broodstone Stairs",
|
||||
"block.antarchy.broodstone_slab": "Broodstone Slab",
|
||||
"block.antarchy.broodstone_wall": "Broodstone Wall",
|
||||
"block.antarchy.polished_broodstone_stairs": "Polished Broodstone Stairs",
|
||||
"block.antarchy.polished_broodstone_slab": "Polished Broodstone Slab",
|
||||
"block.antarchy.polished_broodstone_wall": "Polished Broodstone Wall",
|
||||
"block.antarchy.broodstone_brick_stairs": "Broodstone Brick Stairs",
|
||||
"block.antarchy.broodstone_brick_slab": "Broodstone Brick Slab",
|
||||
"block.antarchy.broodstone_brick_wall": "Broodstone Brick Wall",
|
||||
"block.antarchy.broodstone_uranium_ore": "Broodstone Uranium Ore",
|
||||
"block.antarchy.broodstone_titanium_ore": "Broodstone Titanium Ore",
|
||||
"item.antarchy.raw_bug_meat": "Raw Bug Meat",
|
||||
"item.antarchy.cooked_bug_meat": "Cooked Bug Meat",
|
||||
"item.antarchy.hercules_horn": "Hercules Horn",
|
||||
"block.antarchy.hanging_creeproots": "Hanging Creeproots",
|
||||
"block.antarchy.glowcap_mushroom": "Glowcap Mushroom",
|
||||
"block.antarchy.potted_glowcap_mushroom": "Potted Glowcap Mushroom",
|
||||
"block.antarchy.glowcap_mushroom_block": "Glowcap Mushroom Block",
|
||||
"block.antarchy.molting_vines": "Molting Vines",
|
||||
"item.antarchy.broodfruit": "Broodfruit",
|
||||
"block.antarchy.jumpy_bug_egg": "Jumpy Bug Egg",
|
||||
"subtitles.antarchy.creeping_horror_growl": "Creeping Horror growls",
|
||||
"subtitles.antarchy.creeping_horror_hurt": "Creeping Horror hurts",
|
||||
"subtitles.antarchy.creeping_horror_bite": "Creeping Horror bites",
|
||||
"subtitles.antarchy.lurking_terror_snarl": "Lurking Terror snarls",
|
||||
"subtitles.antarchy.lurking_terror_hurt": "Lurking Terror hurts",
|
||||
"subtitles.antarchy.lurking_terror_bite": "Lurking Terror bites",
|
||||
"subtitles.antarchy.lurking_terror_fly_loop": "Lurking Terror flies",
|
||||
"subtitles.antarchy.stink_bug_fart": "Stink Bug farts",
|
||||
"subtitles.antarchy.stink_bug_idle": "Stink Bug idles",
|
||||
"subtitles.antarchy.rolly_polly_idle": "Rolly Polly idles",
|
||||
"subtitles.antarchy.hercules_beetle_idle": "Hercules Beetle idles",
|
||||
"subtitles.antarchy.hercules_beetle_hurt": "Hercules Beetle hurts",
|
||||
"subtitles.antarchy.hercules_beetle_attack": "Hercules Beetle attacks",
|
||||
"subtitles.antarchy.hercules_beetle_cry": "Hercules Beetle roars",
|
||||
"subtitles.antarchy.hercules_beetle_charge_start": "Hercules Beetle charges up",
|
||||
"subtitles.antarchy.hercules_beetle_knocked_down": "Hercules Beetle is knocked down",
|
||||
"subtitles.antarchy.jumpy_bug_idle": "Jumpy Bug idles",
|
||||
"subtitles.antarchy.spit_bug_idle": "Spit Bug idles",
|
||||
"subtitles.antarchy.jumpy_bug_hurt": "Jumpy Bug hurts",
|
||||
"subtitles.antarchy.jumpy_bug_jump": "Jumpy Bug jumps",
|
||||
"subtitles.antarchy.spit_bug_hurt": "Spit Bug hurts",
|
||||
"subtitles.antarchy.spit_bug_spit": "Spit Bug spits",
|
||||
"subtitles.antarchy.brutalfly_spit": "Brutalfly spits",
|
||||
"advancements.antarchy.bug_apetit.title": "Bug Apétit",
|
||||
"advancements.antarchy.bug_apetit.description": "Eat Cooked Bug Meat.",
|
||||
"advancements.antarchy.behavioral_correction.title": "Behavioral Correction",
|
||||
"advancements.antarchy.behavioral_correction.description": "Obtain an Attitude Adjuster.",
|
||||
"advancements.antarchy.beetle_buddies.title": "Beetle Buddies",
|
||||
"advancements.antarchy.beetle_buddies.description": "Tame a Hercules Beetle.",
|
||||
"advancements.antarchy.herculean_task.title": "Herculean Task",
|
||||
"advancements.antarchy.herculean_task.description": "Slay a Hercules Beetle."
|
||||
}
|
||||
@@ -0,0 +1,834 @@
|
||||
{
|
||||
"block.antarchy.duplicator_log": "Бревно-дупликатор",
|
||||
"block.antarchy.ouranwood_log": "Оурановое бревно",
|
||||
"block.antarchy.ouranwood_wood": "Оурановое дерево",
|
||||
"block.antarchy.mossy_ouranwood_log": "Замшелое оурановое бревно",
|
||||
"block.antarchy.mossy_ouranwood_wood": "Замшелое оурановое дерево",
|
||||
"block.antarchy.stripped_ouranwood_log": "Обтёсанное оурановое бревно",
|
||||
"block.antarchy.stripped_ouranwood_wood": "Обтёсанное оурановое дерево",
|
||||
"block.antarchy.ouranwood_planks": "Оурановые доски",
|
||||
"block.antarchy.ouranwood_stairs": "Оурановые ступени",
|
||||
"block.antarchy.ouranwood_slab": "Оурановая плита",
|
||||
"block.antarchy.ouranwood_fence": "Оурановый забор",
|
||||
"block.antarchy.ouranwood_fence_gate": "Оурановая калитка",
|
||||
"block.antarchy.ouranwood_door": "Оурановая дверь",
|
||||
"block.antarchy.ouranwood_trapdoor": "Оурановый люк",
|
||||
"block.antarchy.ouranwood_pressure_plate": "Оурановая нажимная плита",
|
||||
"block.antarchy.ouranwood_button": "Оурановая кнопка",
|
||||
"block.antarchy.ouranwood_leaves": "Листья оуранового дерева",
|
||||
"block.antarchy.ouranwood_acorn": "Оурановый жёлудь",
|
||||
"block.antarchy.ouranwood_sign": "Оурановая табличка",
|
||||
"block.antarchy.ouranwood_hanging_sign": "Оурановая подвесная табличка",
|
||||
"block.antarchy.peach_log": "Персиковое бревно",
|
||||
"block.antarchy.peach_wood": "Персиковое дерево",
|
||||
"block.antarchy.stripped_peach_log": "Обтёсанное персиковое бревно",
|
||||
"block.antarchy.stripped_peach_wood": "Обтёсанное персиковое дерево",
|
||||
"block.antarchy.peach_planks": "Персиковые доски",
|
||||
"block.antarchy.peach_stairs": "Персиковые ступени",
|
||||
"block.antarchy.peach_slab": "Персиковая плита",
|
||||
"block.antarchy.peach_fence": "Персиковый забор",
|
||||
"block.antarchy.peach_fence_gate": "Персиковая калитка",
|
||||
"block.antarchy.peach_door": "Персиковая дверь",
|
||||
"block.antarchy.peach_trapdoor": "Персиковый люк",
|
||||
"block.antarchy.peach_pressure_plate": "Персиковая нажимная плита",
|
||||
"block.antarchy.peach_button": "Персиковая кнопка",
|
||||
"block.antarchy.peach_leaves": "Листья персикового дерева",
|
||||
"block.antarchy.hanging_peach": "Висячий персик",
|
||||
"block.antarchy.peach_sapling": "Саженец персикового дерева",
|
||||
"block.antarchy.peach_sign": "Персиковая табличка",
|
||||
"block.antarchy.peach_hanging_sign": "Персиковая подвесная табличка",
|
||||
"block.antarchy.orange_milkweed": "Оранжевый ваточник",
|
||||
"block.antarchy.pink_milkweed": "Розовый ваточник",
|
||||
"block.antarchy.camellia": "Камелия",
|
||||
"block.antarchy.spider_lily": "Паучья лилия",
|
||||
"block.antarchy.hushweed": "Тишь-трава",
|
||||
"block.antarchy.umbral_moss_block": "Блок теневого мха",
|
||||
"block.antarchy.umbral_moss_carpet": "Ковёр из теневого мха",
|
||||
"block.antarchy.blush_moss_block": "Блок румяного мха",
|
||||
"block.antarchy.blush_moss_carpet": "Ковёр из румяного мха",
|
||||
"block.antarchy.duplicator_sapling": "Саженец дупликатора",
|
||||
"block.antarchy.duct_tape": "Клейкая лента",
|
||||
"block.antarchy.infested_rooted_dirt": "Заражённая корнями земля",
|
||||
"block.antarchy.infested_coarse_dirt": "Заражённая каменистая земля",
|
||||
"block.antarchy.nyxite": "Никсит",
|
||||
"block.antarchy.polished_nyxite": "Полированный никсит",
|
||||
"block.antarchy.chiseled_nyxite": "Резной никсит",
|
||||
"block.antarchy.nyxite_bricks": "Никситовые кирпичи",
|
||||
"block.antarchy.shellstone": "Ракушечник",
|
||||
"block.antarchy.polished_shellstone": "Полированный ракушечник",
|
||||
"block.antarchy.shellstone_bricks": "Кирпичи из ракушечника",
|
||||
"block.antarchy.chiseled_shellstone": "Резной ракушечник",
|
||||
"block.antarchy.mossy_shellstone_bricks": "Замшелые кирпичи из ракушечника",
|
||||
"block.antarchy.mossy_shellstone_brick_stairs": "Ступени из замшелого ракушечника",
|
||||
"block.antarchy.mossy_shellstone_brick_slab": "Плита из замшелого ракушечника",
|
||||
"block.antarchy.mossy_shellstone_brick_wall": "Ограда из замшелого ракушечника",
|
||||
"block.antarchy.cracked_shellstone_bricks": "Потрескавшиеся кирпичи из ракушечника",
|
||||
"block.antarchy.shellstone_stairs": "Ступени из ракушечника",
|
||||
"block.antarchy.shellstone_slab": "Плита из ракушечника",
|
||||
"block.antarchy.shellstone_wall": "Ограда из ракушечника",
|
||||
"block.antarchy.polished_shellstone_stairs": "Ступени из полированного ракушечника",
|
||||
"block.antarchy.polished_shellstone_slab": "Плита из полированного ракушечника",
|
||||
"block.antarchy.polished_shellstone_wall": "Ограда из полированного ракушечника",
|
||||
"block.antarchy.shellstone_brick_stairs": "Ступени из кирпичей ракушечника",
|
||||
"block.antarchy.shellstone_brick_slab": "Плита из кирпичей ракушечника",
|
||||
"block.antarchy.shellstone_brick_wall": "Ограда из кирпичей ракушечника",
|
||||
"block.antarchy.nyxite_stairs": "Никситовые ступени",
|
||||
"block.antarchy.nyxite_slab": "Никситовая плита",
|
||||
"block.antarchy.nyxite_wall": "Никситовая ограда",
|
||||
"block.antarchy.polished_nyxite_stairs": "Ступени из полированного никсита",
|
||||
"block.antarchy.polished_nyxite_slab": "Плита из полированного никсита",
|
||||
"block.antarchy.polished_nyxite_wall": "Ограда из полированного никсита",
|
||||
"block.antarchy.nyxite_brick_stairs": "Ступени из никситового кирпича",
|
||||
"block.antarchy.nyxite_brick_slab": "Плита из никситового кирпича",
|
||||
"block.antarchy.nyxite_brick_wall": "Ограда из никситового кирпича",
|
||||
"block.antarchy.pale_nyxite": "Бледный никсит",
|
||||
"block.antarchy.nyxite_spike": "Никситовый шип",
|
||||
"block.antarchy.potent_nyxite": "Насыщенный никсит",
|
||||
"block.antarchy.triffid_goo_block": "Блок слизи триффида",
|
||||
"block.antarchy.elythia_portal": "Портал в Элитию",
|
||||
"block.antarchy.cloud_block": "Облачный блок",
|
||||
"block.antarchy.thoraxis_portal": "Портал в Тораксис",
|
||||
"block.antarchy.antimetal": "Антиметалл",
|
||||
"block.antarchy.polished_antimetal": "Полированный антиметалл",
|
||||
"block.antarchy.antimetal_scaffolding": "Антиметаллические подмостки",
|
||||
"block.antarchy.cornea_stalk": "Глазной стебель",
|
||||
"block.antarchy.corn_crop": "Посевы кукурузы",
|
||||
"block.antarchy.dream_torch": "Факел сновидений",
|
||||
"block.antarchy.dream_wall_torch": "Настенный факел сновидений",
|
||||
"block.antarchy.dream_lantern": "Фонарь сновидений",
|
||||
"block.antarchy.dream_campfire": "Костёр сновидений",
|
||||
"block.antarchy.dream_fire": "Огонь сновидений",
|
||||
"block.antarchy.dream_fire_ceiling": "Огонь сновидений",
|
||||
"block.antarchy.budding_blood_crystal": "Цветущий кровавый кристалл",
|
||||
"block.antarchy.blood_crystal_block": "Блок кровавого кристалла",
|
||||
"block.antarchy.small_blood_crystal_bud": "Малый бутон кровавого кристалла",
|
||||
"block.antarchy.medium_blood_crystal_bud": "Средний бутон кровавого кристалла",
|
||||
"block.antarchy.large_blood_crystal_bud": "Большой бутон кровавого кристалла",
|
||||
"block.antarchy.blood_crystal_cluster": "Скопление кровавого кристалла",
|
||||
"block.antarchy.dream_sand": "Песок сновидений",
|
||||
"block.antarchy.dream_sandstone": "Песчаник сновидений",
|
||||
"block.antarchy.chiseled_dream_sandstone": "Резной песчаник сновидений",
|
||||
"block.antarchy.cut_dream_sandstone": "Гладкий песчаник сновидений",
|
||||
"block.antarchy.smooth_dream_sandstone": "Пиленый песчаник сновидений",
|
||||
"block.antarchy.dream_sandstone_stairs": "Ступени из песчаника сновидений",
|
||||
"block.antarchy.dream_sandstone_slab": "Плита из песчаника сновидений",
|
||||
"block.antarchy.dream_sandstone_wall": "Ограда из песчаника сновидений",
|
||||
"block.antarchy.smooth_dream_sandstone_stairs": "Ступени из гладкого песчаника сновидений",
|
||||
"block.antarchy.smooth_dream_sandstone_slab": "Плита из гладкого песчаника сновидений",
|
||||
"block.antarchy.cut_dream_sandstone_slab": "Плита из пиленого песчаника сновидений",
|
||||
"block.antarchy.bed_bug_egg": "Яйцо постельного клопа",
|
||||
"block.antarchy.wasp_nest": "Осиное гнездо",
|
||||
"block.antarchy.red_ant_nest": "Гнездо красных муравьёв",
|
||||
"block.antarchy.brown_ant_nest": "Гнездо коричневых муравьёв",
|
||||
"block.antarchy.rainbow_ant_nest": "Гнездо радужных муравьёв",
|
||||
"block.antarchy.uranium_ore": "Урановая руда",
|
||||
"block.antarchy.deepslate_uranium_ore": "Глубинная урановая руда",
|
||||
"block.antarchy.titanium_ore": "Титановая руда",
|
||||
"block.antarchy.deepslate_titanium_ore": "Глубинная титановая руда",
|
||||
"block.antarchy.uranium_block": "Урановый блок",
|
||||
"block.antarchy.titanium_block": "Титановый блок",
|
||||
"block.antarchy.raw_uranium_block": "Блок неочищенного урана",
|
||||
"block.antarchy.raw_titanium_block": "Блок неочищенного титана",
|
||||
"block.antarchy.cut_uranium": "Огранённый уран",
|
||||
"block.antarchy.cut_titanium": "Огранённый титан",
|
||||
"block.antarchy.cut_uranium_slab": "Плита из огранённого урана",
|
||||
"block.antarchy.cut_titanium_slab": "Плита из огранённого титана",
|
||||
"block.antarchy.cut_uranium_stairs": "Ступени из огранённого урана",
|
||||
"block.antarchy.cut_titanium_stairs": "Ступени из огранённого титана",
|
||||
"block.antarchy.chiseled_uranium": "Резной уран",
|
||||
"block.antarchy.chiseled_titanium": "Резной титан",
|
||||
"block.antarchy.uranium_bulb": "Урановая лампа",
|
||||
"block.antarchy.titanium_bulb": "Титановая лампа",
|
||||
"block.antarchy.uranium_door": "Урановая дверь",
|
||||
"block.antarchy.titanium_door": "Титановая дверь",
|
||||
"block.antarchy.uranium_trapdoor": "Урановый люк",
|
||||
"block.antarchy.titanium_trapdoor": "Титановый люк",
|
||||
"block.antarchy.uranium_bars": "Урановые прутья",
|
||||
"block.antarchy.titanium_bars": "Титановые прутья",
|
||||
"tooltip.antarchy.signal_saving_bulb": "Включается и выключается. Уровень излучаемого света равен силе сохранённого редстоун-сигнала.",
|
||||
"block.antarchy.bile": "Желчь",
|
||||
"block.antarchy.ichor": "Ихор",
|
||||
"block.antarchy.antiwater": "Антивода",
|
||||
"block.antarchy.lumen": "Люмен",
|
||||
"block.antarchy.lumen_froglight": "Люменовый квампост",
|
||||
"block.antarchy.roseate_froglight": "Розоватый квампост",
|
||||
"entity.antarchy.apple_cow": "Яблочная корова",
|
||||
"entity.antarchy.golden_apple_cow": "Золотая яблочная корова",
|
||||
"entity.antarchy.enchanted_golden_apple_cow": "Зачарованная золотая яблочная корова",
|
||||
"entity.antarchy.easter_bunny": "Пасхальный кролик",
|
||||
"entity.antarchy.glimmer": "Блик",
|
||||
"entity.antarchy.ouranwood_deer": "Оурановый олень",
|
||||
"entity.antarchy.elka": "Элка",
|
||||
"entity.antarchy.dorrie": "Дорри",
|
||||
"entity.antarchy.flying_squirrel": "Белка-летяга",
|
||||
"entity.antarchy.caterpillar": "Гусеница",
|
||||
"entity.antarchy.butterfly": "Бабочка",
|
||||
"entity.antarchy.brutalfly": "Жестококрыл",
|
||||
"entity.antarchy.red_ant": "Красный муравей",
|
||||
"entity.antarchy.brown_ant": "Коричневый муравей",
|
||||
"entity.antarchy.rainbow_ant": "Радужный муравей",
|
||||
"entity.antarchy.diamond_minecart": "Алмазная вагонетка",
|
||||
"entity.antarchy.dr_trayaurus": "Доктор Траяурус",
|
||||
"entity.antarchy.cloud_shark": "Облачная акула",
|
||||
"entity.antarchy.kraken": "Кракен",
|
||||
"entity.antarchy.missile_squid": "Кальмар-ракета",
|
||||
"entity.antarchy.octopus_bomb": "Осьминог-бомба",
|
||||
"entity.antarchy.nightmare": "Кошмар",
|
||||
"entity.antarchy.bed_bug": "Постельный клоп",
|
||||
"entity.antarchy.wasp": "Оса",
|
||||
"entity.antarchy.bomber": "Бомбардир",
|
||||
"entity.antarchy.moleworm": "Кроточервь",
|
||||
"entity.antarchy.molevore": "Кротожор",
|
||||
"entity.antarchy.mantis": "Богомол",
|
||||
"entity.antarchy.alpha_mantis": "Альфа-богомол",
|
||||
"entity.antarchy.triffid": "Триффид",
|
||||
"entity.antarchy.toreterror": "Тортеррор",
|
||||
"entity.antarchy.water_bomb": "Водяная бомба",
|
||||
"subtitles.antarchy.mantis_ambient": "Богомол щёлкает",
|
||||
"subtitles.antarchy.mantis_hurt": "Богомол визжит",
|
||||
"subtitles.antarchy.mantis_attack": "Богомол кусает",
|
||||
"subtitles.antarchy.mantis_fly_loop": "Крылья богомола жужжат",
|
||||
"item.antarchy.big_bertha": "Большая Берта",
|
||||
"item.antarchy.wasp_nest": "Осиное гнездо",
|
||||
"item.antarchy.stink_bug": "Клоп-вонючка",
|
||||
"item.antarchy.wasp_spawn_egg": "Яйцо призыва осы",
|
||||
"item.antarchy.bomber_spawn_egg": "Яйцо призыва бомбардира",
|
||||
"item.antarchy.big_bertha_blade": "Лезвие Большой Берты",
|
||||
"item.antarchy.big_bertha_handle": "Рукоять Большой Берты",
|
||||
"item.antarchy.big_bertha_hilt": "Эфес Большой Берты",
|
||||
"item.antarchy.battle_axe": "Боевой топор",
|
||||
"item.antarchy.cloud_shark_fin": "Плавник облачной акулы",
|
||||
"item.antarchy.cloud_shark_fin_soup": "Суп из плавников облачной акулы",
|
||||
"tooltip.antarchy.cloud_shark_fin_soup": "Даёт Силу и Плавное падение.",
|
||||
"item.antarchy.kraken_tooth": "Зуб кракена",
|
||||
"item.antarchy.basilisk_fang": "Клык василиска",
|
||||
"item.antarchy.basilisk_dagger": "Кинжал василиска",
|
||||
"item.antarchy.blood_crystal_block": "Блок кровавого кристалла",
|
||||
"item.antarchy.small_blood_crystal_bud": "Малый бутон кровавого кристалла",
|
||||
"item.antarchy.medium_blood_crystal_bud": "Средний бутон кровавого кристалла",
|
||||
"item.antarchy.large_blood_crystal_bud": "Большой бутон кровавого кристалла",
|
||||
"item.antarchy.blood_crystal_cluster": "Скопление кровавого кристалла",
|
||||
"item.antarchy.dream_sand": "Песок сновидений",
|
||||
"item.antarchy.dream_sandstone": "Песчаник сновидений",
|
||||
"item.antarchy.chiseled_dream_sandstone": "Резной песчаник сновидений",
|
||||
"item.antarchy.cut_dream_sandstone": "Пиленый песчаник сновидений",
|
||||
"item.antarchy.smooth_dream_sandstone": "Гладкий песчаник сновидений",
|
||||
"item.antarchy.dream_sandstone_stairs": "Ступени из песчаника сновидений",
|
||||
"item.antarchy.dream_sandstone_slab": "Плита из песчаника сновидений",
|
||||
"item.antarchy.dream_sandstone_wall": "Ограда из песчаника сновидений",
|
||||
"item.antarchy.smooth_dream_sandstone_stairs": "Ступени из гладкого песчаника сновидений",
|
||||
"item.antarchy.smooth_dream_sandstone_slab": "Плита из гладкого песчаника сновидений",
|
||||
"item.antarchy.cut_dream_sandstone_slab": "Плита из пиленого песчаника сновидений",
|
||||
"item.antarchy.dream_torch": "Факел сновидений",
|
||||
"item.antarchy.dream_lantern": "Фонарь сновидений",
|
||||
"item.antarchy.dream_campfire": "Костёр сновидений",
|
||||
"item.antarchy.nightmare_scale": "Чешуйка кошмара",
|
||||
"item.antarchy.nightmare_helmet": "Шлем кошмара",
|
||||
"item.antarchy.nightmare_chestplate": "Нагрудник кошмара",
|
||||
"item.antarchy.nightmare_leggings": "Поножи кошмара",
|
||||
"item.antarchy.nightmare_boots": "Ботинки кошмара",
|
||||
"item.antarchy.nightmare_sword": "Меч кошмара",
|
||||
"tooltip.antarchy.nightmare_armor_double_damage": "%s%% шанс нанести двойной урон",
|
||||
"tooltip.antarchy.nightmare_armor_set_bonus": "Полный комплект: Иммунитет к Иссушению и Ужасу",
|
||||
"tooltip.antarchy.nightmare_sword": "Наносит больше урона по мере снижения вашего здоровья.",
|
||||
"tooltip.antarchy.nightmare_sword_damage": "Наносит %s урона",
|
||||
"tooltip.antarchy.primordial_helmet_water_breathing": "Даёт владельцу Подводное дыхание",
|
||||
"tooltip.antarchy.primordial_armor_knockback_dealt": "Добавляет %s к отбрасыванию при атаке за каждый элемент",
|
||||
"tooltip.antarchy.primordial_armor_set_bonus": "Полный комплект: Атаки игнорируют сопротивление отбрасыванию у врагов",
|
||||
"attribute.antarchy.double_damage_chance": "Шанс двойного урона",
|
||||
"attribute.antarchy.bloodglass_max_hearts": "Макс. сердец кровавого стекла",
|
||||
"item.antarchy.molevore_nose": "Нос кротожора",
|
||||
"item.antarchy.moleworm": "Кроточервь",
|
||||
"item.antarchy.triffid_spawn_egg": "Яйцо призыва триффида",
|
||||
"item.antarchy.infested_rooted_dirt": "Заражённая корнями земля",
|
||||
"item.antarchy.infested_coarse_dirt": "Заражённая каменистая земля",
|
||||
"item.antarchy.pale_nyxite": "Бледный никсит",
|
||||
"item.antarchy.polished_nyxite": "Полированный никсит",
|
||||
"item.antarchy.chiseled_nyxite": "Резной никсит",
|
||||
"item.antarchy.nyxite_bricks": "Никситовые кирпичи",
|
||||
"item.antarchy.shellstone": "Ракушечник",
|
||||
"item.antarchy.polished_shellstone": "Полированный ракушечник",
|
||||
"item.antarchy.shellstone_bricks": "Кирпичи из ракушечника",
|
||||
"item.antarchy.chiseled_shellstone": "Резной ракушечник",
|
||||
"item.antarchy.mossy_shellstone_bricks": "Замшелые кирпичи из ракушечника",
|
||||
"item.antarchy.mossy_shellstone_brick_stairs": "Ступени из замшелого ракушечника",
|
||||
"item.antarchy.mossy_shellstone_brick_slab": "Плита из замшелого ракушечника",
|
||||
"item.antarchy.mossy_shellstone_brick_wall": "Ограда из замшелого ракушечника",
|
||||
"item.antarchy.cracked_shellstone_bricks": "Потрескавшиеся кирпичи из ракушечника",
|
||||
"item.antarchy.shellstone_stairs": "Ступени из ракушечника",
|
||||
"item.antarchy.shellstone_slab": "Плита из ракушечника",
|
||||
"item.antarchy.shellstone_wall": "Ограда из ракушечника",
|
||||
"item.antarchy.polished_shellstone_stairs": "Ступени из полированного ракушечника",
|
||||
"item.antarchy.polished_shellstone_slab": "Плита из полированного ракушечника",
|
||||
"item.antarchy.polished_shellstone_wall": "Ограда из полированного ракушечника",
|
||||
"item.antarchy.shellstone_brick_stairs": "Ступени из кирпичей ракушечника",
|
||||
"item.antarchy.shellstone_brick_slab": "Плита из кирпичей ракушечника",
|
||||
"item.antarchy.shellstone_brick_wall": "Ограда из кирпичей ракушечника",
|
||||
"item.antarchy.nyxite_stairs": "Никситовые ступени",
|
||||
"item.antarchy.nyxite_slab": "Никситовая плита",
|
||||
"item.antarchy.nyxite_wall": "Никситовая ограда",
|
||||
"item.antarchy.polished_nyxite_stairs": "Ступени из полированного никсита",
|
||||
"item.antarchy.polished_nyxite_slab": "Плита из полированного никсита",
|
||||
"item.antarchy.polished_nyxite_wall": "Ограда из полированного никсита",
|
||||
"item.antarchy.nyxite_brick_stairs": "Ступени из никситового кирпича",
|
||||
"item.antarchy.nyxite_brick_slab": "Плита из никситового кирпича",
|
||||
"item.antarchy.nyxite_brick_wall": "Ограда из никситового кирпича",
|
||||
"item.antarchy.potent_nyxite": "Насыщенный никсит",
|
||||
"item.antarchy.antimetal": "Антиметалл",
|
||||
"item.antarchy.polished_antimetal": "Полированный антиметалл",
|
||||
"item.antarchy.antimetal_scaffolding": "Антиметаллические подмостки",
|
||||
"item.antarchy.ouranwood_acorn": "Оурановый жёлудь",
|
||||
"item.antarchy.ouranwood_boat": "Оурановая лодка",
|
||||
"item.antarchy.ouranwood_chest_boat": "Оурановая лодка с сундуком",
|
||||
"item.antarchy.raw_venison": "Сырая оленина",
|
||||
"item.antarchy.cooked_venison": "Жареная оленина",
|
||||
"item.antarchy.peach_sapling": "Саженец персикового дерева",
|
||||
"item.antarchy.peach": "Персик",
|
||||
"item.antarchy.peach_pie": "Персиковый пирог",
|
||||
"item.antarchy.cornbread": "Кукурузный хлеб",
|
||||
"item.antarchy.popcorn": "Попкорн",
|
||||
"item.antarchy.peach_sign": "Персиковая табличка",
|
||||
"item.antarchy.peach_hanging_sign": "Персиковая подвесная табличка",
|
||||
"item.antarchy.peach_boat": "Персиковая лодка",
|
||||
"item.antarchy.peach_chest_boat": "Персиковая лодка с сундуком",
|
||||
"item.antarchy.orange_milkweed": "Оранжевый ваточник",
|
||||
"item.antarchy.pink_milkweed": "Розовый ваточник",
|
||||
"item.antarchy.camellia": "Камелия",
|
||||
"item.antarchy.spider_lily": "Паучья лилия",
|
||||
"item.antarchy.hushweed": "Тишь-трава",
|
||||
"item.antarchy.umbral_moss_block": "Блок теневого мха",
|
||||
"item.antarchy.umbral_moss_carpet": "Ковёр из теневого мха",
|
||||
"item.antarchy.blush_moss_block": "Блок румяного мха",
|
||||
"item.antarchy.blush_moss_carpet": "Ковёр из румяного мха",
|
||||
"item.antarchy.mud_pie": "Грязевой пирог",
|
||||
"item.antarchy.duct_tape": "Клейкая лента",
|
||||
"item.antarchy.duct_tape.tooltip": "Разместите и нажмите ПКМ, чтобы починить инструменты",
|
||||
"item.antarchy.rainbow_sugar": "Радужный сахар",
|
||||
"item.antarchy.uranium_nugget": "Кусочек урана",
|
||||
"item.antarchy.titanium_nugget": "Кусочек титана",
|
||||
"item.antarchy.raw_uranium_scrap": "Осколок неочищенного урана",
|
||||
"item.antarchy.raw_titanium_scrap": "Осколок неочищенного титана",
|
||||
"item.antarchy.raw_uranium": "Неочищенный уран",
|
||||
"item.antarchy.raw_titanium": "Неочищенный титан",
|
||||
"item.antarchy.uranium_ingot": "Урановый слиток",
|
||||
"item.antarchy.titanium_ingot": "Титановый слиток",
|
||||
"item.antarchy.blood_crystal_shard": "Осколок кровавого кристалла",
|
||||
"item.antarchy.blood_crystal_apple": "Яблоко кровавого кристалла",
|
||||
"item.antarchy.blood_crystal_katana": "Катана из кровавого кристалла",
|
||||
"item.antarchy.blood_crystal_helmet": "Шлем из кровавого кристалла",
|
||||
"item.antarchy.blood_crystal_chestplate": "Нагрудник из кровавого кристалла",
|
||||
"item.antarchy.blood_crystal_leggings": "Поножи из кровавого кристалла",
|
||||
"item.antarchy.blood_crystal_boots": "Ботинки из кровавого кристалла",
|
||||
"item.antarchy.blood_crystal_armor.tooltip": "Даёт Сердце кровавого стекла, которое блокирует один входящий удар, разбивается, а затем восстанавливается.",
|
||||
"item.antarchy.blood_crystal_boots.tooltip2": "Отменяет урон от падения при падении вверх во время инверсии гравитации.",
|
||||
"item.antarchy.blood_crystal_apple.tooltip": "Даёт Защиту кровавого стекла, предоставляя временные Сердца кровавого стекла, которые восстанавливаются, пока длится эффект.",
|
||||
"tooltip.antarchy.blood_crystal_katana.launch": "Толкает вас вперёд при ударе.",
|
||||
"tooltip.antarchy.blood_crystal_katana.trail": "Оставляет за вами багровый след.",
|
||||
"item.antarchy.mantis_claw": "Клешня богомола",
|
||||
"item.antarchy.king_scale": "Чешуйка короля",
|
||||
"item.antarchy.queen_scale": "Чешуйка королевы",
|
||||
"item.antarchy.jumpy_bug_leg": "Ножка прыгучего жука",
|
||||
"item.antarchy.jumpy_boots": "Прыгучие ботинки",
|
||||
"tooltip.antarchy.jumpy_boots": "Зажмите Shift, чтобы зарядить, затем прыгните, чтобы взмыть вверх.",
|
||||
"item.antarchy.brutalfly_wing": "Крыло жестококрыла",
|
||||
"item.antarchy.brutalfly_elytra": "Элитры жестококрыла",
|
||||
"tooltip.antarchy.brutalfly_elytra.flap": "Во время полёта зажмите %s, чтобы махать крыльями",
|
||||
"item.antarchy.cornea_ear": "Глазной початок",
|
||||
"item.antarchy.corn": "Кукуруза",
|
||||
"item.antarchy.corn_seeds": "Семена кукурузы",
|
||||
"item.antarchy.raw_corndog": "Сырой корндог",
|
||||
"item.antarchy.cooked_corndog": "Готовый корндог",
|
||||
"item.antarchy.high_fructose_corn_syrup": "Кукурузный сироп",
|
||||
"jei.antarchy.americanize": "Американизировать",
|
||||
"item.antarchy.american_name": "Американский %s",
|
||||
"item.antarchy.root_beer": "Рутбир",
|
||||
"item.antarchy.primordial_scute": "Первобытный щиток",
|
||||
"item.antarchy.triffid_goo": "Слизь триффида",
|
||||
"item.antarchy.triffid_goo_block": "Блок слизи триффида",
|
||||
"tooltip.antarchy.triffid_goo_block": "При высокой скорости отталкивает вверх, иначе засасывает.",
|
||||
"item.antarchy.cloud_bucket": "Ведро облаков",
|
||||
"tooltip.antarchy.cloud_bucket.midair": "Можно разместить прямо в воздухе",
|
||||
"item.antarchy.lumen_bucket": "Ведро люмена",
|
||||
"item.antarchy.scorpion_whip": "Хлыст императорского скорпиона",
|
||||
"tooltip.antarchy.scorpion_whip.lash": "Атакует жертву издалека и внедряет ядовитую привязь.",
|
||||
"tooltip.antarchy.scorpion_whip.reel": "Нажмите ПКМ, чтобы притянуть привязанную добычу.",
|
||||
"tooltip.antarchy.scorpion_whip.snap": "Нажмите ЛКМ по привязанной добыче, чтобы вырвать жало.",
|
||||
"item.antarchy.fallen_king_crown": "Корона павшего короля",
|
||||
"tooltip.antarchy.fallen_king_crown.hero": "Даёт эффект «Герой деревни» при убийстве враждебных мобов",
|
||||
"item.antarchy.vortex_eye": "Око вихря",
|
||||
"item.antarchy.ultimate_helmet": "Ультимативный шлем",
|
||||
"item.antarchy.ultimate_chestplate": "Ультимативный нагрудник",
|
||||
"item.antarchy.ultimate_leggings": "Ультимативные поножи",
|
||||
"item.antarchy.ultimate_boots": "Ультимативные ботинки",
|
||||
"item.antarchy.ultimate_sword": "Ультимативный меч",
|
||||
"item.antarchy.ultimate_pickaxe": "Ультимативная кирка",
|
||||
"item.antarchy.ultimate_axe": "Ультимативный топор",
|
||||
"item.antarchy.ultimate_shovel": "Ультимативная лопата",
|
||||
"item.antarchy.ultimate_hoe": "Ультимативная мотыга",
|
||||
"item.antarchy.ultimate_bow": "Ультимативный лук",
|
||||
"item.antarchy.ultimate_crossbow": "Ультимативный арбалет",
|
||||
"item.antarchy.ultimate_crossbow.capacity": "Заряжает до 16 стрел одновременно",
|
||||
"item.antarchy.ultimate_crossbow.arrows_remaining": "%1$s %2$s заряжено",
|
||||
"item.antarchy.ultimate_mace": "Ультимативная булава",
|
||||
"item.antarchy.moggles": "Могглы",
|
||||
"itemGroup.antarchy.antarchy": "Antarchy",
|
||||
"item.antarchy.bile_bucket": "Ведро желчи",
|
||||
"item.antarchy.ichor_bucket": "Ведро ихора",
|
||||
"item.antarchy.antiwater_bucket": "Ведро антиводы",
|
||||
"item.antarchy.reverie_bottle": "Бутылочка с грёзой",
|
||||
"item.antarchy.squidzooka": "Сквидзука",
|
||||
"item.antarchy.shrink_ray": "Уменьшитель",
|
||||
"item.antarchy.growth_ray": "Увеличитель",
|
||||
"tooltip.antarchy.shrink_ray": "Навсегда уменьшает цель. Зажмите, чтобы зарядить.",
|
||||
"tooltip.antarchy.growth_ray": "Навсегда увеличивает цель. Зажмите, чтобы зарядить.",
|
||||
"tooltip.antarchy.reverie_bottle.capture": "Нажмите ПКМ стеклянной бутылочкой по грёзе, чтобы поймать её.",
|
||||
"tooltip.antarchy.reverie_bottle.release": "Нажмите ПКМ, чтобы выпустить грёзу.",
|
||||
"item.antarchy.gravity_gun": "Гравитационная пушка",
|
||||
"item.antarchy.miners_dream": "Мечта шахтёра",
|
||||
"tooltip.antarchy.miners_dream.line1": "Нажмите ПКМ, чтобы вырезать извилистую пещеру.",
|
||||
"tooltip.antarchy.miners_dream.line2": "Оставляет ценные блоки нетронутыми.",
|
||||
"message.antarchy.miners_dream_disabled": "Мечта шахтёра отключена.",
|
||||
"message.antarchy.miners_dream_busy": "Ваша предыдущая мечта всё ещё воплощается.",
|
||||
"item.antarchy.diamond_minecart": "Алмазная вагонетка",
|
||||
"item.antarchy.cogwheel_pet": "Шестерёнка-питомец",
|
||||
"item.antarchy.fire_dragon_pet": "Огненный дракон-питомец",
|
||||
"item.antarchy.ice_dragon_pet": "Ледяной дракон-питомец",
|
||||
"item.antarchy.lightning_dragon_pet": "Электрический дракон-питомец",
|
||||
"item.antarchy.gorgon_pet": "Горгона-питомец",
|
||||
"item.antarchy.apple_cow_spawn_egg": "Яйцо призыва яблочной коровы",
|
||||
"item.antarchy.red_ant_spawn_egg": "Яйцо призыва красного муравья",
|
||||
"item.antarchy.brown_ant_spawn_egg": "Яйцо призыва коричневого муравья",
|
||||
"item.antarchy.rainbow_ant_spawn_egg": "Яйцо призыва радужного муравья",
|
||||
"item.antarchy.golden_apple_cow_spawn_egg": "Яйцо призыва золотой яблочной коровы",
|
||||
"item.antarchy.enchanted_golden_apple_cow_spawn_egg": "Яйцо призыва зачарованной золотой яблочной коровы",
|
||||
"item.antarchy.dr_trayaurus_spawn_egg": "Яйцо призыва доктора Траяуруса",
|
||||
"item.antarchy.easter_bunny_spawn_egg": "Яйцо призыва пасхального кролика",
|
||||
"item.antarchy.glimmer_spawn_egg": "Яйцо призыва блика",
|
||||
"item.antarchy.ouranwood_deer_spawn_egg": "Яйцо призыва оуранового оленя",
|
||||
"item.antarchy.spirit_apple": "Духовное яблоко",
|
||||
"item.antarchy.elka_spawn_egg": "Яйцо призыва Элки",
|
||||
"item.antarchy.glimmer_bottle": "Бутылочка с бликом",
|
||||
"item.antarchy.glimmer_bottle.contains": "Содержит: %s",
|
||||
"glimmer_variant.antarchy.apple_cow": "Яблочная корова",
|
||||
"glimmer_variant.antarchy.ouranwood_deer": "Оурановый олень",
|
||||
"glimmer_variant.antarchy.frog": "Жаба",
|
||||
"glimmer_variant.antarchy.ant": "Муравей",
|
||||
"glimmer_variant.antarchy.elka": "Элка",
|
||||
"entity.antarchy.glimmer.set_sit": "Блик теперь сидит.",
|
||||
"entity.antarchy.glimmer.set_follow": "Блик теперь следует за вами.",
|
||||
"entity.antarchy.glimmer.set_wander": "Блик теперь бродит.",
|
||||
"entity.antarchy.glimmer.ability.ant": "Ваш муравей натравливает вас на %s!",
|
||||
"entity.antarchy.glimmer.ability.apple_cow": "Ваша яблочная корова мычит и кормит вас!",
|
||||
"entity.antarchy.glimmer.ability.elka": "Ваша Элка издаёт крик и разрушает защиту!",
|
||||
"entity.antarchy.glimmer.ability.deer": "Ваш оурановый олень проносится сквозь врага!",
|
||||
"entity.antarchy.glimmer.ability.frog": "Ваша жаба проглотила %s!",
|
||||
"item.antarchy.glimmer_bottle.passive.apple_cow": "Пассивный эффект: Голод тратится на 25% медленнее",
|
||||
"item.antarchy.glimmer_bottle.ability.apple_cow": "Способность: Мычит и даёт Насыщение и Регенерацию, когда у вас мало еды",
|
||||
"item.antarchy.glimmer_bottle.passive.ouranwood_deer": "Пассивный эффект: Скорость I",
|
||||
"item.antarchy.glimmer_bottle.ability.ouranwood_deer": "Способность: Прорывается сквозь враждебных мобов, когда вы бежите на них, подкидывая их в воздух",
|
||||
"item.antarchy.glimmer_bottle.passive.frog": "Пассивный эффект: Прыгучесть I",
|
||||
"item.antarchy.glimmer_bottle.ability.frog": "Способность: Пожирает ближайшего враждебного моба, становясь больше и сильнее на время",
|
||||
"item.antarchy.glimmer_bottle.passive.ant": "Пассивный эффект: Слегка увеличенная дальность атаки",
|
||||
"item.antarchy.glimmer_bottle.ability.ant": "Способность: Удар по крупному врагу даёт вам кратковременную Силу II",
|
||||
"item.antarchy.glimmer_bottle.passive.elka": "Пассивный эффект: Защита кровавого стекла II",
|
||||
"item.antarchy.glimmer_bottle.ability.elka": "Способность: Кричит и вызывает ударную волну при разрушении одного из сердец защиты",
|
||||
"advancements.antarchy.spirant_animal.title": "Муравьиная душа",
|
||||
"advancements.antarchy.spirant_animal.description": "Приручите муравья-блика",
|
||||
"advancements.antarchy.hoppy_together.title": "Вместе веселее",
|
||||
"advancements.antarchy.hoppy_together.description": "Приручите жабу-блика",
|
||||
"advancements.antarchy.deerly_beloved.title": "Дорогой олень",
|
||||
"advancements.antarchy.deerly_beloved.description": "Приручите оленя-блика",
|
||||
"advancements.antarchy.elkcellent_choice.title": "Отличный выбор",
|
||||
"advancements.antarchy.elkcellent_choice.description": "Приручите Элку-блика",
|
||||
"advancements.antarchy.apple_of_my_eye.title": "Яблоко от яблони",
|
||||
"advancements.antarchy.apple_of_my_eye.description": "Приручите корову-блика",
|
||||
"item.antarchy.dorrie_spawn_egg": "Яйцо призыва Дорри",
|
||||
"item.antarchy.flying_squirrel_spawn_egg": "Яйцо призыва белки-летяги",
|
||||
"item.antarchy.caterpillar_spawn_egg": "Яйцо призыва гусеницы",
|
||||
"item.antarchy.butterfly_spawn_egg": "Яйцо призыва бабочки",
|
||||
"item.antarchy.brutalfly_spawn_egg": "Яйцо призыва жестококрыла",
|
||||
"item.antarchy.cloud_shark_spawn_egg": "Яйцо призыва облачной акулы",
|
||||
"item.antarchy.kraken_spawn_egg": "Ох, нет. Не стоит.",
|
||||
"item.antarchy.missile_squid_spawn_egg": "Яйцо призыва кальмара-ракеты",
|
||||
"item.antarchy.octopus_bomb_spawn_egg": "Яйцо призыва осьминога-бомбы",
|
||||
"item.antarchy.nightmare_spawn_egg": "Яйцо призыва кошмара",
|
||||
"item.antarchy.toreterror_spawn_egg": "Яйцо призыва тортеррора",
|
||||
"item.antarchy.water_cannon": "Водяная пушка",
|
||||
"item.antarchy.primordial_helmet": "Первобытный шлем",
|
||||
"item.antarchy.primordial_chestplate": "Первобытный нагрудник",
|
||||
"item.antarchy.primordial_leggings": "Первобытные поножи",
|
||||
"item.antarchy.primordial_boots": "Первобытные ботинки",
|
||||
"item.antarchy.bed_bug_spawn_egg": "Яйцо призыва постельного клопа",
|
||||
"item.antarchy.moleworm_spawn_egg": "Яйцо призыва кроточервя",
|
||||
"item.antarchy.molevore_spawn_egg": "Яйцо призыва кротожора",
|
||||
"item.antarchy.reverie_spawn_egg": "Яйцо призыва грёзы",
|
||||
"item.antarchy.mantis_spawn_egg": "Яйцо призыва богомола",
|
||||
"item.antarchy.alpha_mantis_spawn_egg": "Яйцо призыва альфа-богомола",
|
||||
"biome.antarchy.moleworm_caves": "Пещеры кроточервей",
|
||||
"biome.antarchy.butterfly_fields": "Поля бабочек",
|
||||
"biome.antarchy.ouranwood_forest": "Оурановый лес",
|
||||
"biome.antarchy.glimmering_pools": "Мерцающие пруды",
|
||||
"biome.antarchy.peach_forest": "Персиковый лес",
|
||||
"biome.antarchy.fungal_ouranwood_forest": "Грибной оурановый лес",
|
||||
"message.antarchy.brown_ant_activated": "Коричневый муравей готов открыть путь в свой мир.",
|
||||
"message.antarchy.brown_ant_needs_reagent": "Этому коричневому муравью нужен реагент, чтобы открыть путь в свой мир.",
|
||||
"message.antarchy.rainbow_ant_activated": "Радужный муравей гудит новым измерением из Infinity.",
|
||||
"message.antarchy.rainbow_ant_activated_inherited": "Радужный муравей гудит унаследованным измерением из Infinity.",
|
||||
"message.antarchy.rainbow_ant_activated_inherited_existing": "Радужный муравей переподключается к унаследованному измерению Infinity.",
|
||||
"message.antarchy.rainbow_ant_failed_dimension_create": "Не удалось создать измерение. Вероятно, ошибка в конфигурации мода Infinity. Перезапустите игру и попробуйте снова.",
|
||||
"message.antarchy.rainbow_ant_infinity_missing": "Мод Infinity должен быть установлен, чтобы миры радужных муравьёв работали.",
|
||||
"message.antarchy.rainbow_ant_needs_reagent": "Этому радужному муравью нужен реагент, чтобы открыть измерение.",
|
||||
"message.antarchy.red_ant_activated": "Красный муравей готов открыть путь в свой мир.",
|
||||
"message.antarchy.red_ant_needs_reagent": "Этому красному муравью нужен реагент, чтобы открыть путь в свой мир.",
|
||||
"message.antarchy.termite_activated": "Термит готов открыть путь к своей цели.",
|
||||
"message.antarchy.termite_needs_reagent": "Этому термиту нужен реагент, чтобы открыть путь к своей цели.",
|
||||
"message.antarchy.big_bertha.mode": "Режим Большой Берты: %s",
|
||||
"message.antarchy.big_bertha.mode.basilisk": "Василиск",
|
||||
"message.antarchy.big_bertha.mode.lucid": "Люцид",
|
||||
"message.antarchy.big_bertha.mode.nightmare": "Кошмар",
|
||||
"message.antarchy.big_bertha.mode.kraken": "Кракен",
|
||||
"message.antarchy.big_bertha.mode.molevore": "Кротожор",
|
||||
"message.antarchy.big_bertha.mode.toreterror": "Тортеррор",
|
||||
"message.antarchy.ultimate_tool.mode_3x3": "Включено копание 3x3",
|
||||
"message.antarchy.ultimate_tool.mode_default": "Включено обычное копание",
|
||||
"advancements.antarchy.hey_listen.title": "Эй, послушай",
|
||||
"advancements.antarchy.hey_listen.description": "К вам присоединилась грёза.",
|
||||
"advancements.antarchy.very_hungry_caterpillar.title": "Очень голодная гусеница",
|
||||
"advancements.antarchy.very_hungry_caterpillar.description": "Помогите гусенице вырасти.",
|
||||
"effect.antarchy.dread": "Ужас",
|
||||
"effect.antarchy.paralyzed": "Паралич",
|
||||
"effect.antarchy.inverted": "Инверсия",
|
||||
"effect.antarchy.stinky": "Вонючесть",
|
||||
"effect.antarchy.shrinking": "Уменьшение",
|
||||
"effect.antarchy.growth": "Увеличение",
|
||||
"effect.antarchy.bloodglass_ward": "Защита кровавого стекла",
|
||||
"death.attack.triffid_mauling": "%1$s был растерзан растением",
|
||||
"death.attack.triffid_mauling.player": "%1$s был растерзан растением",
|
||||
"death.attack.triffid_swallow": "%1$s был проглочен триффидом",
|
||||
"death.attack.triffid_swallow.player": "%1$s был проглочен триффидом",
|
||||
"potion.antarchy.haste": "Зелье спешки",
|
||||
"potion.antarchy.strong_haste": "Мощное зелье спешки",
|
||||
"tooltip.antarchy.big_bertha.mode": "Режим: %s",
|
||||
"tooltip.antarchy.big_bertha.toggle_mode": "Shift + ПКМ для переключения режимов босса.",
|
||||
"tooltip.antarchy.big_bertha.mode.basilisk": "ПКМ парализует цель. Удары накладывают отравление и замедление.",
|
||||
"tooltip.antarchy.big_bertha.mode.lucid": "Удары инвертируют цель на несколько секунд. Удары наносят больше урона, когда вы инвертированы.",
|
||||
"tooltip.antarchy.big_bertha.mode.nightmare": "Игроки страдают от Ужаса; удары накладывают слабость.",
|
||||
"tooltip.antarchy.big_bertha.mode.kraken": "Удары отбрасывают цели и вызывают молнию.",
|
||||
"tooltip.antarchy.big_bertha.mode.molevore": "ПКМ для рывка вперёд и бурения сквозь блоки кротожора.",
|
||||
"tooltip.antarchy.big_bertha.mode.toreterror": "ПКМ запускает вас в воздух и обрушивает вниз с ударной волной по площади.",
|
||||
"tooltip.antarchy.ultimate_tools_3x3": "Shift + ПКМ для переключения режима копания 3x3.",
|
||||
"tooltip.antarchy.moggles.reveal": "Дают ночное зрение и указывают на ближайшие пещеры.",
|
||||
"tooltip.antarchy.moggles.underground": "Работает только если над вами нет открытого неба.",
|
||||
"tooltip.antarchy.cornea_ear.vision": "Даёт Ночное зрение на %s секунд.",
|
||||
"tooltip.antarchy.mob_coming_soon": "Моб появится в будущем!",
|
||||
"tooltip.antarchy.gravity_gun.primary": "ЛКМ: отбрасывает ближайших сущностей или бросает удерживаемую цель.",
|
||||
"tooltip.antarchy.gravity_gun.secondary": "ПКМ: притягивает сущность или подходящий блок.",
|
||||
"tooltip.antarchy.gravity_gun.scroll": "Удерживайте Ctrl и крутите колёсико мыши, чтобы приблизить или отдалить удерживаемую цель.",
|
||||
"tooltip.antarchy.gravity_gun.blacklist": "Не действует на блоки и сущности из чёрного списка.",
|
||||
"tooltip.antarchy.antimetal_inversion": "Инвертирует сущности прямо под собой",
|
||||
"tooltip.antarchy.diamond_minecart.forward": "Будет добавлено позже.",
|
||||
"tooltip.antarchy.diamond_minecart.rails": " ",
|
||||
"tooltip.antarchy.rainbow_sugar": "Активирует измерения радужного муравья. Съешьте, находясь в нём, чтобы вернуться домой.",
|
||||
"advancements.antarchy.visit_elythia.title": "Межмуравьиное пространство",
|
||||
"advancements.antarchy.visit_elythia.description": "Используйте коричневого муравья, чтобы попасть в Элитию.",
|
||||
"advancements.antarchy.visit_thoraxis.title": "Муравьиный гнев",
|
||||
"advancements.antarchy.visit_thoraxis.description": "Используйте красного муравья, чтобы попасть в Тораксис.",
|
||||
"advancements.antarchy.fallen_kingdom_castle.title": "Я когда-то правил миром...",
|
||||
"advancements.antarchy.fallen_kingdom_castle.description": "Найдите замок падшего королевства.",
|
||||
"advancements.antarchy.fallen_king_crown.title": "Чанки грузились по моему приказу...",
|
||||
"advancements.antarchy.fallen_king_crown.description": "Добудьте корону павшего короля.",
|
||||
"advancements.antarchy.the_lab.title": "Всем привет, с вами Дэн!",
|
||||
"advancements.antarchy.the_lab.description": "Найдите лабораторию доктора Траяуруса.",
|
||||
"advancements.antarchy.sweater_dreams.title": "Тёплые сны",
|
||||
"advancements.antarchy.sweater_dreams.description": "Победите Кошмара.",
|
||||
"advancements.antarchy.stone_cold.title": "Холодный как камень",
|
||||
"advancements.antarchy.stone_cold.description": "Победите василиска.",
|
||||
"advancements.antarchy.moley_poley.title": "Кротовьи забавы",
|
||||
"advancements.antarchy.moley_poley.description": "Победите кротожора.",
|
||||
"advancements.antarchy.lucid_dreams.title": "Осознанные сновидения",
|
||||
"advancements.antarchy.lucid_dreams.description": "Победите люцида.",
|
||||
"advancements.antarchy.davy_jones_locker.title": "Тайник Дэйви Джонса",
|
||||
"advancements.antarchy.davy_jones_locker.description": "Победите кракена.",
|
||||
"advancements.antarchy.shark_weak.title": "Когда акулы полетят",
|
||||
"advancements.antarchy.shark_weak.description": "Победите облачную акулу.",
|
||||
"advancements.antarchy.dont_let_the_bed_bugs_bite.title": "И пусть клопы не кусают",
|
||||
"advancements.antarchy.dont_let_the_bed_bugs_bite.description": "Победите постельного клопа.",
|
||||
"advancements.antarchy.soups_up.title": "Суп готов",
|
||||
"advancements.antarchy.soups_up.description": "Съешьте суп из плавников облачной акулы.",
|
||||
"advancements.antarchy.in_the_upside_down.title": "Вверх тормашками",
|
||||
"advancements.antarchy.in_the_upside_down.description": "Окажитесь под эффектом инверсии впервые.",
|
||||
"advancements.antarchy.whoever_smelt_it_dealt_it.title": "Кто унюхал, тот и пукнул",
|
||||
"advancements.antarchy.whoever_smelt_it_dealt_it.description": "Окажитесь вонючим в первый раз.",
|
||||
"advancements.antarchy.ultimate_armor.title": "Абсолютная защита",
|
||||
"advancements.antarchy.ultimate_armor.description": "Соберите полный комплект ультимативной брони.",
|
||||
"advancements.antarchy.ultimate_bow.title": "Богемская рапсодия",
|
||||
"advancements.antarchy.ultimate_bow.description": "Добудьте ультимативный лук.",
|
||||
"advancements.antarchy.brutalfly.title": "Порхай как жестококрыл, жаль как пчела",
|
||||
"advancements.antarchy.brutalfly.description": "Получите элитры жестококрыла.",
|
||||
"advancements.antarchy.now_watch_me_whip.title": "А теперь смотри",
|
||||
"advancements.antarchy.now_watch_me_whip.description": "А теперь смотри, как я делаю нэй-нэй",
|
||||
"advancements.antarchy.kill_molevore.title": "Кротовьи забавы",
|
||||
"advancements.antarchy.kill_molevore.description": "Убейте кротожора.",
|
||||
"advancements.antarchy.water_cannon_craft.title": "Мокрее — лучше!",
|
||||
"advancements.antarchy.water_cannon_craft.description": "Создайте водяную пушку.",
|
||||
"advancements.antarchy.kill_toreterror.title": "Тортеррор сбежал!",
|
||||
"advancements.antarchy.kill_toreterror.description": "Победите тортеррора.",
|
||||
"advancements.antarchy.challenge_games.title": "Испытания начинаются!",
|
||||
"advancements.antarchy.challenge_games.description": "Войдите на Разрушенную арену.",
|
||||
"advancements.antarchy.bugged_out.title": "Жук-переросток",
|
||||
"advancements.antarchy.bugged_out.description": "Победите альфа-богомола.",
|
||||
"death.attack.bed_bug_bite": "%1$s был покусан постельными клопами",
|
||||
"death.attack.bed_bug_bite.player": "%1$s был покусан постельными клопами во время сражения с %2$s",
|
||||
"message.antarchy.dread_too_scared_to_sleep": "Вы слишком напуганы, чтобы уснуть.",
|
||||
"death.attack.kraken_mauling": "%1$s был затянут на дно кракеном",
|
||||
"death.attack.kraken_mauling.player": "%1$s был затянут на дно кракеном во время сражения с %2$s",
|
||||
"death.attack.kraken_lightning": "%1$s был поражён штормом кракена",
|
||||
"death.attack.kraken_lightning.player": "%1$s был поражён штормом кракена во время сражения с %2$s",
|
||||
"death.attack.nightmare_mauling": "%1$s был сожран кошмаром",
|
||||
"death.attack.nightmare_mauling.player": "%1$s был сожран кошмаром во время сражения с %2$s",
|
||||
"death.attack.basilisk_bite": "%1$s был проглочен василиском",
|
||||
"death.attack.basilisk_bite.player": "%1$s был проглочен василиском во время сражения с %2$s",
|
||||
"death.attack.emperor_scorpion_sting": "%1$s был ужален императорским скорпионом",
|
||||
"death.attack.emperor_scorpion_sting.player": "%1$s был ужален императорским скорпионом во время сражения с %2$s",
|
||||
"death.attack.cornea_stalk_prick": "%1$s был заколот насмерть глазным стеблем",
|
||||
"death.attack.toreterror_spin": "%1$s был закручен до смерти тортеррором",
|
||||
"death.attack.toreterror_spin.player": "%1$s был закручен до смерти тортеррором",
|
||||
"death.attack.toreterror_jump": "%1$s был раздавлен насмерть тортеррором",
|
||||
"death.attack.toreterror_jump.player": "%1$s был раздавлен насмерть тортеррором",
|
||||
"death.attack.water_soaked": "%1$s был намочен до смерти сущностью %2$s",
|
||||
"death.attack.water_soaked.player": "%1$s был намочен до смерти сущностью %2$s",
|
||||
"entity.antarchy.lucid": "Люцид",
|
||||
"item.antarchy.lucid_spawn_egg": "Яйцо призыва люцида",
|
||||
"item.antarchy.lucid_eye": "Глаз люцида",
|
||||
"entity.antarchy.scorpion": "Скорпион",
|
||||
"item.antarchy.scorpion_spawn_egg": "Яйцо призыва скорпиона",
|
||||
"entity.antarchy.basilisk": "Василиск",
|
||||
"item.antarchy.basilisk_spawn_egg": "Яйцо призыва василиска",
|
||||
"entity.antarchy.emperor_scorpion": "Императорский скорпион",
|
||||
"item.antarchy.emperor_scorpion_spawn_egg": "Яйцо призыва императорского скорпиона",
|
||||
"item.antarchy.emperor_scorpion_stinger": "Жало императорского скорпиона",
|
||||
"item.antarchy.lucid_pearl": "Жемчуг люцида",
|
||||
"tooltip.antarchy.lucid_pearl": "Бросает снаряд, инвертирующий гравитацию.",
|
||||
"tooltip.antarchy.lucid_pearl.detail": "Телепортирует вас в точку падения и накладывает Инверсию.",
|
||||
"subtitles.antarchy.squidzooka_fire": "Сквидзука стреляет",
|
||||
"subtitles.antarchy.shrink_ray": "Уменьшитель стреляет",
|
||||
"subtitles.antarchy.growth_ray": "Увеличитель стреляет",
|
||||
"subtitles.antarchy.size_ray_charge": "Лучевое ружьё заряжается",
|
||||
"subtitles.antarchy.ant_ambient": "Муравьи стрекочут",
|
||||
"subtitles.antarchy.ant_idle": "Муравьи шевелятся",
|
||||
"subtitles.antarchy.ant_hurt": "Муравью больно",
|
||||
"subtitles.antarchy.ant_bite": "Муравьи кусают",
|
||||
"subtitles.antarchy.ant_gather": "Муравьи собираются",
|
||||
"subtitles.antarchy.ant_nest": "Муравейник шуршит",
|
||||
"subtitles.antarchy.cloud_shark_bite": "Облачная акула кусает",
|
||||
"subtitles.antarchy.cloud_shark_idle": "Облачная акула парит",
|
||||
"subtitles.antarchy.cloud_shark_hurt": "Облачной акуле больно",
|
||||
"subtitles.antarchy.cloud_shark_death": "Облачная акула умирает",
|
||||
"subtitles.antarchy.cloud_shark_fly": "Облачная акула летит",
|
||||
"subtitles.antarchy.caterpillar_idle": "Гусеница шевелится",
|
||||
"subtitles.antarchy.caterpillar_hurt": "Гусенице больно",
|
||||
"subtitles.antarchy.caterpillar_crawl": "Гусеница ползёт",
|
||||
"subtitles.antarchy.butterfly_hurt": "Бабочке больно",
|
||||
"subtitles.antarchy.brutalfly_idle": "Жестококрыл парит",
|
||||
"subtitles.antarchy.brutalfly_death": "Жестококрыл умирает",
|
||||
"subtitles.antarchy.thoraxis_nightmare_wastes_ambient": "Пустоши кошмара гудят",
|
||||
"subtitles.antarchy.thoraxis_nightmare_wastes_additions": "Пустоши кошмара волнуются",
|
||||
"subtitles.antarchy.thoraxis_nightmare_wastes_mood": "Пустоши кошмара шепчут",
|
||||
"subtitles.antarchy.thoraxis_dream_dunes_ambient": "Дюны сновидений шепчут",
|
||||
"subtitles.antarchy.thoraxis_dream_dunes_additions": "Дюны сновидений шуршат",
|
||||
"subtitles.antarchy.thoraxis_dream_dunes_mood": "Дюны сновидений вздыхают",
|
||||
"subtitles.antarchy.thoraxis_lucid_pools_ambient": "Пруды люцидов гудят",
|
||||
"subtitles.antarchy.thoraxis_lucid_pools_additions": "Пруды люцидов зловеще шумят",
|
||||
"subtitles.antarchy.thoraxis_lucid_pools_mood": "Пруды люцидов бормочут",
|
||||
"subtitles.antarchy.lucid_ambient": "Люцид гудит",
|
||||
"subtitles.antarchy.lucid_flying": "Люцид порхает",
|
||||
"subtitles.antarchy.lucid_attack": "Люцид атакует",
|
||||
"subtitles.antarchy.lucid_bolt": "Люцид стреляет",
|
||||
"subtitles.antarchy.lucid_hurt": "Люциду больно",
|
||||
"subtitles.antarchy.lucid_death": "Люцид умирает",
|
||||
"subtitles.antarchy.reverie_idle": "Грёза дрейфует",
|
||||
"subtitles.antarchy.reverie_hurt": "Грёзе больно",
|
||||
"subtitles.antarchy.reverie_worry": "Грёза тревожится",
|
||||
"subtitles.antarchy.reverie_save": "Грёза спасает вас",
|
||||
"subtitles.antarchy.reverie_join_player": "Грёза присоединяется к вам",
|
||||
"subtitles.antarchy.reverie_alert": "Грёза предупреждает вас",
|
||||
"subtitles.antarchy.flying_squirrel_idle": "Белка-летяга щебечет",
|
||||
"subtitles.antarchy.flying_squirrel_beg": "Белка-летяга просит еду",
|
||||
"subtitles.antarchy.flying_squirrel_nut": "Белка-летяга ест",
|
||||
"subtitles.antarchy.flying_squirrel_glide_loop": "Белка-летяга парит",
|
||||
"subtitles.antarchy.flying_squirrel_hurt": "Белке-летяге больно",
|
||||
"subtitles.antarchy.flying_squirrel_death": "Белка-летяга умирает",
|
||||
"subtitles.antarchy.nightmare_idle": "Кошмар рычит",
|
||||
"subtitles.antarchy.nightmare_hurt": "Кошмару больно",
|
||||
"subtitles.antarchy.nightmare_roar": "Кошмар ревёт",
|
||||
"subtitles.antarchy.nightmare_death": "Кошмар умирает",
|
||||
"subtitles.antarchy.nightmare_bite": "Кошмар кусает",
|
||||
"subtitles.antarchy.nightmare_flap": "Кошмар машет крыльями",
|
||||
"subtitles.antarchy.triffid_attack": "Триффид атакует",
|
||||
"subtitles.antarchy.triffid_grab": "Триффид хватает",
|
||||
"subtitles.antarchy.triffid_hurt": "Триффиду больно",
|
||||
"subtitles.antarchy.triffid_death": "Триффид умирает",
|
||||
"subtitles.antarchy.triffid_hiss": "Триффид шипит",
|
||||
"subtitles.antarchy.triffid_growl": "Триффид урчит",
|
||||
"subtitles.antarchy.gravity_gun_pickup": "Пушка притягивает",
|
||||
"subtitles.antarchy.gravity_gun_drop": "Пушка отпускает",
|
||||
"subtitles.antarchy.gravity_gun_hold_loop": "Пушка гудит",
|
||||
"subtitles.antarchy.gravity_gun_launch": "Пушка стреляет",
|
||||
"subtitles.antarchy.gravity_gun_dryfire": "Осечка пушки",
|
||||
"subtitles.antarchy.bed_bug_ambient": "Постельный клоп стрекочет",
|
||||
"subtitles.antarchy.bed_bug_hurt": "Постельному клопу больно",
|
||||
"subtitles.antarchy.bed_bug_attack": "Постельный клоп кусает",
|
||||
"subtitles.antarchy.wasp_idle": "Оса жужжит",
|
||||
"subtitles.antarchy.wasp_hurt": "Осе больно",
|
||||
"subtitles.antarchy.wasp_attack": "Оса жалит",
|
||||
"subtitles.antarchy.wasp_death": "Оса умирает",
|
||||
"subtitles.antarchy.scorpion_ambient": "Скорпион гремит",
|
||||
"subtitles.antarchy.scorpion_hurt": "Скорпиону больно",
|
||||
"subtitles.antarchy.scorpion_attack": "Скорпион атакует",
|
||||
"subtitles.antarchy.emperor_scorpion_ambient": "Императорский скорпион гремит",
|
||||
"subtitles.antarchy.emperor_scorpion_hurt": "Императорскому скорпиону больно",
|
||||
"subtitles.antarchy.emperor_scorpion_attack": "Императорский скорпион атакует",
|
||||
"subtitles.antarchy.emperor_scorpion_roar": "Императорский скорпион ревёт",
|
||||
"subtitles.antarchy.moleworm_ambient": "Кроточервь шуршит",
|
||||
"subtitles.antarchy.moleworm_hurt": "Кроточервю больно",
|
||||
"subtitles.antarchy.moleworm_attack": "Кроточервь атакует",
|
||||
"subtitles.antarchy.moleworm_dig": "Кроточервь копает",
|
||||
"subtitles.antarchy.molevore_ambient": "Кротожор урчит",
|
||||
"subtitles.antarchy.molevore_hurt": "Кротожору больно",
|
||||
"subtitles.antarchy.molevore_attack": "Кротожор атакует",
|
||||
"subtitles.antarchy.molevore_dig": "Кротожор копает",
|
||||
"subtitles.antarchy.duct_tape_use": "Лента рвётся",
|
||||
"subtitles.antarchy.potent_nyxite_hypnotic_gas": "Насыщенный никсит шипит",
|
||||
"subtitles.antarchy.potent_nyxite_geyser_eruption": "Насыщенный никсит извергается",
|
||||
"subtitles.antarchy.potent_nyxite_geyser_continuous": "Гейзер насыщенного никсита ревёт",
|
||||
"subtitles.antarchy.missile_squid_ambient": "Кальмар-ракета гудит",
|
||||
"subtitles.antarchy.missile_squid_hurt": "Кальмару-ракете больно",
|
||||
"subtitles.antarchy.missile_squid_death": "Кальмар-ракета умирает",
|
||||
"subtitles.antarchy.missile_squid_attack": "Кальмар-ракета атакует",
|
||||
"subtitles.antarchy.kraken_flying_loop": "Кракен парит",
|
||||
"subtitles.antarchy.kraken_flying_sideways_loop": "Кракен кружит",
|
||||
"subtitles.antarchy.kraken_attack": "Кракен бьёт",
|
||||
"subtitles.antarchy.kraken_spin": "Кракен вращается",
|
||||
"subtitles.antarchy.kraken_roar": "Кракен ревёт",
|
||||
"subtitles.antarchy.kraken_summon": "Кракен появляется",
|
||||
"subtitles.antarchy.kraken_hurt": "Кракену больно",
|
||||
"subtitles.antarchy.kraken_death": "Кракен умирает",
|
||||
"subtitles.antarchy.basilisk_idle_loop": "Василиск шипит",
|
||||
"subtitles.antarchy.basilisk_slither_loop": "Василиск ползёт",
|
||||
"subtitles.antarchy.basilisk_bite": "Василиск кусает",
|
||||
"subtitles.antarchy.basilisk_hiss": "Василиск шипит",
|
||||
"subtitles.antarchy.basilisk_hurt": "Василиску больно",
|
||||
"subtitles.antarchy.basilisk_death": "Василиск умирает",
|
||||
"subtitles.antarchy.bomber_walk": "Бомбардир идёт",
|
||||
"subtitles.antarchy.bomber_knock": "Бомбардир получает удар",
|
||||
"subtitles.antarchy.bomber_explode": "Фитиль бомбардира шипит",
|
||||
"subtitles.antarchy.toreterror_idle": "Тортеррор дышит",
|
||||
"subtitles.antarchy.toreterror_hurt": "Тортеррору больно",
|
||||
"subtitles.antarchy.toreterror_death": "Тортеррор умирает",
|
||||
"subtitles.antarchy.toreterror_bomber_fire": "Тортеррор выпускает бомбардиров",
|
||||
"subtitles.antarchy.toreterror_spin": "Тортеррор крутится",
|
||||
"subtitles.antarchy.toreterror_ricochet": "Тортеррор рикошетит",
|
||||
"subtitles.antarchy.water_cannon_fire": "Водяная пушка стреляет",
|
||||
"subtitles.antarchy.toreterror_jump_up": "Тортеррор прыгает",
|
||||
"subtitles.antarchy.toreterror_jump_land": "Тортеррор приземляется",
|
||||
"subtitles.antarchy.stinky_fly": "Вонючие мухи жужжат",
|
||||
"item.minecraft.potion.effect.inversion": "Зелье инверсии",
|
||||
"item.minecraft.potion.effect.long_inversion": "Зелье инверсии",
|
||||
"item.minecraft.splash_potion.effect.inversion": "Взрывное зелье инверсии",
|
||||
"item.minecraft.splash_potion.effect.long_inversion": "Взрывное зелье инверсии",
|
||||
"item.minecraft.lingering_potion.effect.inversion": "Туманное зелье инверсии",
|
||||
"item.minecraft.lingering_potion.effect.long_inversion": "Туманное зелье инверсии",
|
||||
"item.minecraft.tipped_arrow.effect.inversion": "Стрела инверсии",
|
||||
"item.minecraft.tipped_arrow.effect.long_inversion": "Стрела инверсии",
|
||||
"item.minecraft.potion.effect.paralysis": "Зелье паралича",
|
||||
"item.minecraft.potion.effect.long_paralysis": "Зелье паралича",
|
||||
"item.minecraft.splash_potion.effect.paralysis": "Взрывное зелье паралича",
|
||||
"item.minecraft.splash_potion.effect.long_paralysis": "Взрывное зелье паралича",
|
||||
"item.minecraft.lingering_potion.effect.paralysis": "Туманное зелье паралича",
|
||||
"item.minecraft.lingering_potion.effect.long_paralysis": "Туманное зелье паралича",
|
||||
"item.minecraft.tipped_arrow.effect.paralysis": "Стрела паралича",
|
||||
"item.minecraft.tipped_arrow.effect.long_paralysis": "Стрела паралича",
|
||||
"item.minecraft.potion.effect.shrinking": "Зелье уменьшения",
|
||||
"item.minecraft.potion.effect.strong_shrinking": "Зелье уменьшения II",
|
||||
"item.minecraft.potion.effect.extreme_shrinking": "Зелье уменьшения III",
|
||||
"item.minecraft.splash_potion.effect.shrinking": "Взрывное зелье уменьшения",
|
||||
"item.minecraft.splash_potion.effect.strong_shrinking": "Взрывное зелье уменьшения II",
|
||||
"item.minecraft.splash_potion.effect.extreme_shrinking": "Взрывное зелье уменьшения III",
|
||||
"item.minecraft.lingering_potion.effect.shrinking": "Туманное зелье уменьшения",
|
||||
"item.minecraft.lingering_potion.effect.strong_shrinking": "Туманное зелье уменьшения II",
|
||||
"item.minecraft.lingering_potion.effect.extreme_shrinking": "Туманное зелье уменьшения III",
|
||||
"item.minecraft.tipped_arrow.effect.shrinking": "Стрела уменьшения",
|
||||
"item.minecraft.tipped_arrow.effect.strong_shrinking": "Стрела уменьшения II",
|
||||
"item.minecraft.tipped_arrow.effect.extreme_shrinking": "Стрела уменьшения III",
|
||||
"item.minecraft.potion.effect.growing": "Зелье увеличения",
|
||||
"item.minecraft.potion.effect.strong_growing": "Зелье увеличения II",
|
||||
"item.minecraft.potion.effect.extreme_growing": "Зелье увеличения III",
|
||||
"item.minecraft.splash_potion.effect.growing": "Взрывное зелье увеличения",
|
||||
"item.minecraft.splash_potion.effect.strong_growing": "Взрывное зелье увеличения II",
|
||||
"item.minecraft.splash_potion.effect.extreme_growing": "Взрывное зелье увеличения III",
|
||||
"item.minecraft.lingering_potion.effect.growing": "Туманное зелье увеличения",
|
||||
"item.minecraft.lingering_potion.effect.strong_growing": "Туманное зелье увеличения II",
|
||||
"item.minecraft.lingering_potion.effect.extreme_growing": "Туманное зелье увеличения III",
|
||||
"item.minecraft.tipped_arrow.effect.growing": "Стрела увеличения",
|
||||
"item.minecraft.tipped_arrow.effect.strong_growing": "Стрела увеличения II",
|
||||
"item.minecraft.tipped_arrow.effect.extreme_growing": "Стрела увеличения III",
|
||||
"item.minecraft.potion.effect.dread": "Зелье ужаса",
|
||||
"item.minecraft.potion.effect.long_dread": "Зелье ужаса",
|
||||
"item.minecraft.splash_potion.effect.dread": "Взрывное зелье ужаса",
|
||||
"item.minecraft.splash_potion.effect.long_dread": "Взрывное зелье ужаса",
|
||||
"item.minecraft.lingering_potion.effect.dread": "Туманное зелье ужаса",
|
||||
"item.minecraft.lingering_potion.effect.long_dread": "Туманное зелье ужаса",
|
||||
"item.minecraft.tipped_arrow.effect.dread": "Стрела ужаса",
|
||||
"item.minecraft.tipped_arrow.effect.long_dread": "Стрела ужаса",
|
||||
"item.minecraft.potion.effect.stinky": "Зелье вонючести",
|
||||
"item.minecraft.potion.effect.long_stinky": "Зелье вонючести",
|
||||
"item.minecraft.splash_potion.effect.stinky": "Взрывное зелье вонючести",
|
||||
"item.minecraft.splash_potion.effect.long_stinky": "Взрывное зелье вонючести",
|
||||
"item.minecraft.lingering_potion.effect.stinky": "Туманное зелье вонючести",
|
||||
"item.minecraft.lingering_potion.effect.long_stinky": "Туманное зелье вонючести",
|
||||
"item.minecraft.tipped_arrow.effect.stinky": "Стрела вонючести",
|
||||
"item.minecraft.tipped_arrow.effect.long_stinky": "Стрела вонючести",
|
||||
"item.minecraft.potion.effect.haste": "Зелье спешки",
|
||||
"item.minecraft.potion.effect.strong_haste": "Зелье спешки II",
|
||||
"item.minecraft.splash_potion.effect.haste": "Взрывное зелье спешки",
|
||||
"item.minecraft.splash_potion.effect.strong_haste": "Взрывное зелье спешки II",
|
||||
"item.minecraft.lingering_potion.effect.haste": "Туманное зелье спешки",
|
||||
"item.minecraft.lingering_potion.effect.strong_haste": "Туманное зелье спешки II",
|
||||
"item.minecraft.tipped_arrow.effect.haste": "Стрела спешки",
|
||||
"item.minecraft.tipped_arrow.effect.strong_haste": "Стрела спешки II",
|
||||
"advancements.antarchy.cancel_out.title": "1 - 1 = ?",
|
||||
"advancements.antarchy.cancel_out.description": "Имейте эффекты увеличения и уменьшения активными одновременно.",
|
||||
"entity.antarchy.cheep": "Чип",
|
||||
"item.antarchy.cheep": "Чип",
|
||||
"item.antarchy.cheep_spawn_egg": "Яйцо призыва чипа",
|
||||
"entity.antarchy.reverie": "Грёза",
|
||||
"biome.antarchy.thoraxis": "Тораксис",
|
||||
"biome.antarchy.nightmare_wastes": "Пустоши кошмара",
|
||||
"biome.antarchy.umbral_hills": "Теневые холмы",
|
||||
"biome.antarchy.lucid_pools": "Пруды люцидов",
|
||||
"biome.antarchy.dream_dunes": "Дюны сновидений",
|
||||
"biome.antarchy.cloud_sea": "Облачное море",
|
||||
"block.antarchy.wild_corn": "Дикая кукуруза",
|
||||
"trim_material.antarchy.blood_crystal": "Кровавый кристалл",
|
||||
"trim_material.antarchy.nightmare_scale": "Чешуя кошмара",
|
||||
"trim_material.antarchy.uranium": "Уран",
|
||||
"trim_material.antarchy.titanium": "Титан",
|
||||
"advancements.antarchy.duct_tape.title": "Я распилил эту лодку пополам!",
|
||||
"advancements.antarchy.duct_tape.description": "и починил её с помощью силы клейкой ленты!",
|
||||
"key.categories.antarchy": "Antarchy",
|
||||
"key.antarchy.brutalfly_flap": "Элитры жестококрыла: Взмах крыльями",
|
||||
"advancements.antarchy.shrink_ray_craft.title": "Дорогая, я уменьшил мобов",
|
||||
"advancements.antarchy.shrink_ray_craft.description": "Создайте уменьшитель.",
|
||||
"advancements.antarchy.growth_ray_craft.title": "Размер имеет значение",
|
||||
"advancements.antarchy.growth_ray_craft.description": "Создайте увеличитель.",
|
||||
"advancements.antarchy.squidzooka_craft.title": "Чернильный армагеддон",
|
||||
"advancements.antarchy.squidzooka_craft.description": "Создайте сквидзуку.",
|
||||
"advancements.antarchy.gravity_gun_craft.title": "Мастер притяжения",
|
||||
"advancements.antarchy.gravity_gun_craft.description": "Создайте гравитационную пушку."
|
||||
"subtitles.antarchy.stink_bug_fart": "Вонь жука пукает",
|
||||
"subtitles.antarchy.stink_bug_idle": "Вонь жук бурчит",
|
||||
"subtitles.antarchy.rolly_polly_idle": "Rolly Polly бурчит",
|
||||
"death.attack.spit_bug_disrespect": "%1$s был унижен Spit Bug",
|
||||
"death.attack.jumpy_bug_jump": "%1$s был атакован Jumpy Bug",
|
||||
"death.attack.hercules_beetle_obliteration": "%1$s был Ñтёрт Hercules Beetle"
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"particle": "antarchy:block/amber_moss/amber_lichen",
|
||||
"glow_lichen": "antarchy:block/amber_moss/amber_lichen"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [0, 0, 0.1],
|
||||
"to": [16, 16, 0.1],
|
||||
"faces": {
|
||||
"north": { "uv": [16, 0, 0, 16], "texture": "#glow_lichen" },
|
||||
"south": { "uv": [0, 0, 16, 16], "texture": "#glow_lichen" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube_all",
|
||||
"textures": {
|
||||
"all": "antarchy:block/amber_moss/amber_moss_block"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "minecraft:block/carpet",
|
||||
"textures": {
|
||||
"wool": "antarchy:block/amber_moss/amber_moss_carpet"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "minecraft:block/mossy_carpet_side",
|
||||
"textures": {
|
||||
"side": "antarchy:block/amber_moss/amber_moss_carpet"
|
||||
}
|
||||
}
|
||||
Loaded 100 of 571 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user