From 0ced670f5b5cc0f31376474410c19b66693a5edf Mon Sep 17 00:00:00 2001 From: Koukunn_ Date: Fri, 8 Sep 2023 11:02:43 +0900 Subject: [PATCH] test --- .distignore | 11 + .gitignore | 8 + .mcattributes | 1 + .prettierignore | 17 + .prettierrc | 8 + build/CHANGELOG.md | 456 --- build/LICENSE | 674 ---- build/README.md | 203 - .../animation_controllers/detect_actions.json | 3103 ---------------- build/animations/onTick.json | 12 - build/entities/agent.json | 35 - build/entities/allay.json | 266 -- build/entities/area_effect_cloud.json | 31 - build/entities/armor_stand.json | 66 - build/entities/arrow.json | 187 - build/entities/axolotl.json | 480 --- build/entities/balloon.json | 30 - build/entities/bat.json | 91 - build/entities/bee.json | 808 ---- build/entities/blaze.json | 189 - build/entities/boat.json | 317 -- build/entities/camel.json | 330 -- build/entities/cat.json | 639 ---- build/entities/cave_spider.json | 467 --- build/entities/chest_boat.json | 277 -- build/entities/chest_minecart.json | 69 - build/entities/chicken.json | 226 -- build/entities/command_block_minecart.json | 107 - build/entities/cow.json | 237 -- build/entities/creeper.json | 319 -- build/entities/dolphin.json | 421 --- build/entities/donkey.json | 545 --- build/entities/dragon_fireball.json | 67 - build/entities/drowned.json | 656 ---- build/entities/egg.json | 70 - build/entities/elder_guardian.json | 143 - build/entities/ender_crystal.json | 61 - build/entities/ender_dragon.json | 147 - build/entities/ender_pearl.json | 86 - build/entities/enderman.json | 220 -- build/entities/endermite.json | 118 - build/entities/evocation_illager.json | 375 -- build/entities/eye_of_ender_signal.json | 43 - build/entities/fireball.json | 84 - build/entities/fireworks_rocket.json | 43 - build/entities/fish.json | 163 - build/entities/fishing_hook.json | 69 - build/entities/fox.json | 1046 ------ build/entities/frog.json | 525 --- build/entities/ghast.json | 111 - build/entities/glow_squid.json | 129 - build/entities/goat.json | 419 --- build/entities/guardian.json | 238 -- build/entities/hoglin.json | 472 --- build/entities/hopper_minecart.json | 103 - build/entities/horse.json | 705 ---- build/entities/husk.json | 603 --- build/entities/ice_bomb.json | 30 - build/entities/iron_golem.json | 398 -- build/entities/lightning_bolt.json | 37 - build/entities/lingering_potion.json | 59 - build/entities/llama.json | 689 ---- build/entities/llama_spit.json | 60 - build/entities/magma_cube.json | 293 -- build/entities/minecart.json | 73 - build/entities/mooshroom.json | 1043 ------ build/entities/mule.json | 477 --- build/entities/npc.json | 252 -- build/entities/ocelot.json | 374 -- build/entities/panda.json | 644 ---- build/entities/parrot.json | 311 -- build/entities/phantom.json | 154 - build/entities/pig.json | 291 -- build/entities/piglin.json | 1085 ------ build/entities/piglin_brute.json | 339 -- build/entities/pillager.json | 507 --- build/entities/player.json | 541 --- build/entities/polar_bear.json | 266 -- build/entities/pufferfish.json | 420 --- build/entities/rabbit.json | 400 -- build/entities/ravager.json | 484 --- build/entities/salmon.json | 204 - build/entities/sheep.json | 409 -- build/entities/shulker.json | 743 ---- build/entities/shulker_bullet.json | 72 - build/entities/silverfish.json | 170 - build/entities/skeleton.json | 644 ---- build/entities/skeleton_horse.json | 213 -- build/entities/slime.json | 290 -- build/entities/small_fireball.json | 66 - build/entities/sniffer.json | 346 -- build/entities/snow_golem.json | 199 - build/entities/snowball.json | 64 - build/entities/spider.json | 326 -- build/entities/splash_potion.json | 54 - build/entities/squid.json | 130 - build/entities/stray.json | 547 --- build/entities/strider.json | 442 --- build/entities/tadpole.json | 124 - build/entities/thrown_trident.json | 68 - build/entities/tnt.json | 68 - build/entities/tnt_minecart.json | 187 - build/entities/trader_llama.json | 740 ---- build/entities/tripod_camera.json | 57 - build/entities/tropicalfish.json | 1024 ----- build/entities/turtle.json | 273 -- build/entities/vex.json | 141 - build/entities/villager.json | 1074 ------ build/entities/villager_v2.json | 3301 ----------------- build/entities/vindicator.json | 459 --- build/entities/wandering_trader.json | 430 --- build/entities/warden.json | 250 -- build/entities/witch.json | 408 -- build/entities/wither.json | 147 - build/entities/wither_skeleton.json | 524 --- build/entities/wither_skull.json | 86 - build/entities/wither_skull_dangerous.json | 89 - build/entities/wolf.json | 482 --- build/entities/xp_bottle.json | 56 - build/entities/xp_orb.json | 54 - build/entities/zoglin.json | 258 -- build/entities/zombie.json | 612 --- build/entities/zombie_horse.json | 171 - build/entities/zombie_pigman.json | 438 --- build/entities/zombie_villager.json | 1013 ----- build/entities/zombie_villager_v2.json | 1414 ------- .../checks/optional/armorNBT.mcfunction | 31 - .../optional/nocommandblocks.mcfunction | 5 - .../overridecommandblocksenabled.mcfunction | 2 - build/functions/checks/others.mcfunction | 2 - build/functions/main.mcfunction | 15 - build/pack_icon.png | Bin 225835 -> 0 bytes .../commands/debug_commands/listitems.js | 58 - build/scripts/commands/handler.js | 219 -- build/scripts/commands/moderation/ban.js | 97 - build/scripts/commands/moderation/credits.js | 85 - build/scripts/commands/moderation/deop.js | 89 - build/scripts/commands/moderation/despawn.js | 126 - build/scripts/commands/moderation/help.js | 131 - build/scripts/commands/moderation/kick.js | 105 - build/scripts/commands/moderation/lockdown.js | 104 - build/scripts/commands/moderation/modules.js | 152 - build/scripts/commands/moderation/mute.js | 115 - .../commands/moderation/nonstaffhelp.js | 39 - build/scripts/commands/moderation/notify.js | 60 - build/scripts/commands/moderation/op.js | 127 - .../scripts/commands/moderation/paradoxui.js | 55 - build/scripts/commands/moderation/prefix.js | 79 - build/scripts/commands/moderation/punish.js | 108 - build/scripts/commands/moderation/tpa.js | 88 - build/scripts/commands/moderation/unban.js | 83 - build/scripts/commands/moderation/unmute.js | 105 - build/scripts/commands/settings/afk.js | 72 - build/scripts/commands/settings/allowgma.js | 83 - build/scripts/commands/settings/allowgmc.js | 84 - build/scripts/commands/settings/allowgms.js | 84 - build/scripts/commands/settings/antifalla.js | 72 - build/scripts/commands/settings/antikb.js | 85 - build/scripts/commands/settings/antinukera.js | 72 - build/scripts/commands/settings/antiphasea.js | 72 - .../commands/settings/antiscaffolda.js | 72 - .../scripts/commands/settings/antishulker.js | 70 - build/scripts/commands/settings/antispam.js | 74 - build/scripts/commands/settings/auracheck.js | 81 - build/scripts/commands/settings/autoban.js | 72 - .../scripts/commands/settings/autoclicker.js | 85 - .../scripts/commands/settings/badpackets1.js | 72 - .../scripts/commands/settings/badpackets2.js | 72 - .../commands/settings/bedrockvalidate.js | 72 - build/scripts/commands/settings/chatranks.js | 70 - build/scripts/commands/settings/crashera.js | 72 - .../commands/settings/enchantedarmor.js | 80 - build/scripts/commands/settings/flya.js | 72 - .../commands/settings/illegalenchant.js | 70 - .../commands/settings/illegalitemsa.js | 80 - .../commands/settings/illegalitemsb.js | 72 - .../commands/settings/illegalitemsc.js | 72 - .../scripts/commands/settings/illegallores.js | 70 - .../commands/settings/invalidsprinta.js | 72 - build/scripts/commands/settings/jesusa.js | 72 - build/scripts/commands/settings/lagclear.js | 72 - build/scripts/commands/settings/namespoofa.js | 72 - build/scripts/commands/settings/namespoofb.js | 72 - .../commands/settings/oneplayersleep.js | 72 - .../settings/overidecommandblocksenabled.js | 85 - build/scripts/commands/settings/reacha.js | 72 - build/scripts/commands/settings/reachb.js | 72 - .../commands/settings/removecommandblocks.js | 80 - .../commands/settings/salvagesystem.js | 70 - build/scripts/commands/settings/showrules.js | 72 - build/scripts/commands/settings/spammera.js | 72 - build/scripts/commands/settings/spammerb.js | 72 - build/scripts/commands/settings/spammerc.js | 72 - build/scripts/commands/settings/speeda.js | 72 - build/scripts/commands/settings/stackban.js | 82 - .../scripts/commands/settings/worldborder.js | 124 - build/scripts/commands/settings/xraya.js | 72 - build/scripts/commands/utility/biome.js | 174 - build/scripts/commands/utility/channel.js | 288 -- build/scripts/commands/utility/clearchat.js | 52 - build/scripts/commands/utility/delhome.js | 79 - build/scripts/commands/utility/ecwipe.js | 84 - build/scripts/commands/utility/fly.js | 116 - build/scripts/commands/utility/freeze.js | 108 - build/scripts/commands/utility/fullreport.js | 154 - build/scripts/commands/utility/give.js | 125 - build/scripts/commands/utility/gohome.js | 166 - build/scripts/commands/utility/hotbar.js | 107 - build/scripts/commands/utility/invsee.js | 78 - build/scripts/commands/utility/listhome.js | 106 - .../commands/utility/paradoxVersion.js | 42 - build/scripts/commands/utility/rank.js | 106 - build/scripts/commands/utility/report.js | 69 - build/scripts/commands/utility/sethome.js | 102 - build/scripts/commands/utility/stats.js | 166 - build/scripts/commands/utility/tpr.js | 158 - build/scripts/commands/utility/vanish.js | 76 - build/scripts/data/clearlag.js | 477 --- build/scripts/data/config.js | 282 -- build/scripts/data/globalban.js | 511 --- build/scripts/data/illegalItemsB_whitelist.js | 2 - build/scripts/data/itemban.js | 154 - build/scripts/data/onjoindata.js | 47 - build/scripts/data/xray.js | 16 - .../gui/PlayerSpawnAfterEvent/rules/rules.js | 45 - .../guiHandlerChat/chatui.js | 52 - .../guiHandlerChat/results/chatranks.js | 33 - .../guiHandlerChat/results/clearchat.js | 32 - .../guiHandlerChat/results/mute.js | 28 - .../guiHandlerChat/results/notify.js | 29 - .../guiHandlerChat/results/unmute.js | 28 - .../guiHandlerModeration/moderationui.js | 100 - .../guiHandlerModeration/results/autoban.js | 25 - .../guiHandlerModeration/results/ban.js | 29 - .../guiHandlerModeration/results/despawn.js | 24 - .../guiHandlerModeration/results/ecwipe.js | 26 - .../guiHandlerModeration/results/fly.js | 26 - .../guiHandlerModeration/results/freeze.js | 26 - .../results/inventoryui.js | 29 - .../guiHandlerModeration/results/kick.js | 27 - .../guiHandlerModeration/results/lockdown.js | 28 - .../results/managePlayersSavedLocations.js | 26 - .../guiHandlerModeration/results/punish.js | 54 - .../guiHandlerModeration/results/rules.js | 29 - .../guiHandlerModeration/results/tpa.js | 28 - .../guiHandlerModeration/results/unban.js | 25 - .../guiHandlerModeration/results/vanish.js | 26 - .../guiHandlerMovement/movementui.js | 59 - .../guiHandlerMovement/results/antifall.js | 26 - .../guiHandlerMovement/results/antifly.js | 26 - .../guiHandlerMovement/results/antijesusa.js | 26 - .../results/antiknockback.js | 26 - .../results/antiscaffolda.js | 26 - .../results/invalidsprint.js | 26 - .../guiHandlerMovement/results/speeda.js | 26 - .../guiHandler/guiHandlerModules/modulesui.js | 145 - .../guiHandlerModules/results/afk.js | 27 - .../results/antiautoclicker.js | 25 - .../guiHandlerModules/results/anticrasher.js | 25 - .../guiHandlerModules/results/antikillaura.js | 25 - .../guiHandlerModules/results/antinuker.js | 25 - .../guiHandlerModules/results/antiphase.js | 25 - .../guiHandlerModules/results/antishulker.js | 25 - .../guiHandlerModules/results/antispam.js | 25 - .../guiHandlerModules/results/badpackets.js | 27 - .../results/bedrockvalidation.js | 25 - .../results/commandblocks.js | 42 - .../results/enchantedarmor.js | 36 - .../guiHandlerModules/results/gamemodes.js | 30 - .../guiHandlerModules/results/hotbar.js | 29 - .../guiHandlerModules/results/illegalitems.js | 36 - .../guiHandlerModules/results/lagclear.js | 26 - .../guiHandlerModules/results/namespoofing.js | 28 - .../results/oneplayersleep.js | 25 - .../guiHandlerModules/results/reach.js | 27 - .../guiHandlerModules/results/salvage.js | 26 - .../guiHandlerModules/results/spammers.js | 29 - .../guiHandlerModules/results/worldborder.js | 31 - .../guiHandlerModules/results/xray.js | 25 - .../guiHandler/results/chatChannelsMenu.js | 27 - build/scripts/gui/guiHandler/results/deop.js | 27 - .../gui/guiHandler/results/location.js | 72 - build/scripts/gui/guiHandler/results/op.js | 41 - .../scripts/gui/guiHandler/results/prefix.js | 30 - .../scripts/gui/guiHandler/results/report.js | 28 - build/scripts/gui/guiHandler/results/stats.js | 27 - build/scripts/gui/guiHandler/results/tpr.js | 91 - build/scripts/gui/moderation/uiAutoBan.js | 34 - build/scripts/gui/moderation/uiBan.js | 46 - build/scripts/gui/moderation/uiChatranks.js | 81 - build/scripts/gui/moderation/uiClearchat.js | 8 - build/scripts/gui/moderation/uiDeop.js | 42 - build/scripts/gui/moderation/uiDespawner.js | 105 - build/scripts/gui/moderation/uiEwipe.js | 68 - build/scripts/gui/moderation/uiFly.js | 86 - build/scripts/gui/moderation/uiFreeze.js | 70 - build/scripts/gui/moderation/uiInventory.js | 1413 ------- .../uiInventory/uiInvEditorHelpMenu.js | 27 - .../uiInventory/uiInvEditorMainMenu.js | 71 - .../uiInventory/uiInvEditorNameMenu.js | 26 - .../uiInventory/uiInvEditorRepairItemMenu.js | 24 - .../uiInventory/uiInvEditorReplaceMenu.js | 25 - .../uiInventory/uiInvEditorTransferMenu.js | 28 - .../moderation/uiInventory/uiItemEditor.js | 241 -- .../uiItemEditorEnchantmentsMenu.js | 27 - .../uiInventory/uiItemEditorStats.js | 63 - build/scripts/gui/moderation/uiKick.js | 54 - build/scripts/gui/moderation/uiLockdown.js | 72 - .../uiManagePlayerSavedLocations.js | 118 - build/scripts/gui/moderation/uiMute.js | 67 - build/scripts/gui/moderation/uiNotify.js | 54 - build/scripts/gui/moderation/uiOp.js | 86 - build/scripts/gui/moderation/uiPrefix.js | 61 - build/scripts/gui/moderation/uiPunish.js | 81 - build/scripts/gui/moderation/uiRules.js | 44 - build/scripts/gui/moderation/uiStats.js | 128 - build/scripts/gui/moderation/uiTpa.js | 55 - build/scripts/gui/moderation/uiTpr.js | 34 - build/scripts/gui/moderation/uiTprSend.js | 31 - build/scripts/gui/moderation/uiUnban.js | 26 - build/scripts/gui/moderation/uiUnmute.js | 59 - build/scripts/gui/moderation/uiVanish.js | 74 - build/scripts/gui/modules/uiAFK.js | 34 - .../scripts/gui/modules/uiAntiAutoClicker.js | 54 - build/scripts/gui/modules/uiAntiCrasher.js | 34 - build/scripts/gui/modules/uiAntiFall.js | 54 - build/scripts/gui/modules/uiAntiFly.js | 34 - build/scripts/gui/modules/uiAntiJesus.js | 34 - build/scripts/gui/modules/uiAntiKillaura.js | 54 - build/scripts/gui/modules/uiAntiKnockback.js | 54 - build/scripts/gui/modules/uiAntiNuker.js | 33 - build/scripts/gui/modules/uiAntiPhase.js | 33 - build/scripts/gui/modules/uiAntiScaffold.js | 54 - build/scripts/gui/modules/uiAntiShulker.js | 32 - build/scripts/gui/modules/uiAntiSpam.js | 34 - build/scripts/gui/modules/uiBadpackets.js | 50 - .../gui/modules/uiBedrockValidation.js | 34 - build/scripts/gui/modules/uiCommandBlocks.js | 79 - build/scripts/gui/modules/uiEnchantedArmor.js | 50 - .../scripts/gui/modules/uiExpSalvageSystem.js | 32 - build/scripts/gui/modules/uiGamemodes.js | 94 - build/scripts/gui/modules/uiHotbar.js | 50 - build/scripts/gui/modules/uiIllegaItems.js | 109 - build/scripts/gui/modules/uiInvalidSprint.js | 33 - build/scripts/gui/modules/uiLagClear.js | 34 - build/scripts/gui/modules/uiNameSpoofing.js | 50 - build/scripts/gui/modules/uiOnePlayerSleep.js | 33 - build/scripts/gui/modules/uiReach.js | 50 - build/scripts/gui/modules/uiSpammer.js | 65 - build/scripts/gui/modules/uiSpeed.js | 33 - build/scripts/gui/modules/uiWorldborder.js | 44 - build/scripts/gui/modules/uiXray.js | 34 - build/scripts/gui/paradoxui.js | 144 - .../playerui/chatChannels/uiChatChannels.js | 231 -- .../chatChannels/uiChatChannelsCreateMenu.js | 23 - .../chatChannels/uiChatChannelsInviteMenu.js | 38 - .../chatChannels/uiChatChannelsJoinMenu.js | 32 - .../chatChannels/uiChatChannelsLeaveMenu.js | 31 - build/scripts/gui/playerui/uiReport.js | 31 - .../scripts/gui/playerui/uiSavedLocations.js | 113 - build/scripts/gui/showrules/showrules.js | 78 - build/scripts/kickcheck.js | 9 - build/scripts/paradox.js | 138 - .../BlockBreakAfterEvent/nuker/nuker_a.js | 250 -- .../BlockBreakAfterEvent/xray/xray_a.js | 94 - .../illegalitems/illegalitems_b.js | 349 -- .../BlockPlaceAfterEvent/reach/reach_a.js | 151 - .../scaffold/scaffold_a.js | 87 - .../chat/afterprefixcommand.js | 9 - .../ChatSendAfterEvent/chat/antispam.js | 53 - .../ChatSendAfterEvent/chat/chatfilter.js | 75 - .../ChatSendBeforeEvent/chat/antispam.js | 90 - .../chat/beforeprefixcommand.js | 10 - .../ChatSendBeforeEvent/chat/chatfilter.js | 39 - .../spammer/badpackets_1.js | 29 - .../ChatSendBeforeEvent/spammer/spammer_a.js | 27 - .../ChatSendBeforeEvent/spammer/spammer_b.js | 27 - .../ChatSendBeforeEvent/spammer/spammer_c.js | 27 - .../EntityDieAfterEvent/death_coordinates.js | 14 - .../EntityHitEntityAfterEvent/autoclicker.js | 91 - .../EntityHitEntityAfterEvent/killaura.js | 104 - .../EntityHitEntityAfterEvent/reach_b.js | 134 - .../ban/globalbanlist.js | 29 - .../PlayerSpawnAfterEvent/hash/hash.js | 35 - .../PlayerSpawnAfterEvent/onjoin/onjoin.js | 74 - build/scripts/penrose/SystemEvent/watchdog.js | 10 - build/scripts/penrose/TickEvent/afk/afk.js | 123 - .../penrose/TickEvent/antifalla/antifall_a.js | 72 - .../penrose/TickEvent/antivoid/antivoid.js | 68 - .../TickEvent/badpackets2/badpackets2.js | 31 - .../scripts/penrose/TickEvent/ban/autoban.js | 50 - .../penrose/TickEvent/ban/serverban.js | 53 - .../TickEvent/bedrock/bedrockvalidate.js | 58 - .../penrose/TickEvent/clearlag/clearlag.js | 92 - .../penrose/TickEvent/crasher/crasher_a.js | 40 - build/scripts/penrose/TickEvent/fly/fly_a.js | 128 - .../penrose/TickEvent/freeze/freeze.js | 162 - .../penrose/TickEvent/gamemode/adventure.js | 68 - .../penrose/TickEvent/gamemode/creative.js | 69 - .../penrose/TickEvent/gamemode/survival.js | 69 - .../penrose/TickEvent/hotbar/hotbar.js | 42 - .../TickEvent/illegalitems/illegalitems_a.js | 291 -- .../TickEvent/illegalitems/illegalitems_c.js | 57 - .../invalidsprint/invalidsprint_a.js | 129 - .../penrose/TickEvent/jesus/jesus_a.js | 74 - .../penrose/TickEvent/knockback/antikb_a.js | 51 - .../TickEvent/namespoof/namespoof_a.js | 41 - .../TickEvent/namespoof/namespoof_b.js | 57 - .../penrose/TickEvent/noperms/nopermission.js | 48 - .../TickEvent/noperms/verifypermission.js | 53 - .../oneplayersleep/oneplayersleep.js | 70 - .../penrose/TickEvent/phase/phase_a.js | 83 - .../penrose/TickEvent/speed/speed_a.js | 131 - .../penrose/TickEvent/vanish/vanish.js | 54 - .../TickEvent/worldborder/worldborder.js | 153 - .../WorldInitializeAfterEvent/registry.js | 173 - build/scripts/util.js | 587 --- build/scripts/version.js | 3 - manifest.json | 41 + node_modules/.package-lock.json | 25 +- package-lock.json | 72 + package.json | 8 +- 422 files changed, 176 insertions(+), 67661 deletions(-) create mode 100644 .distignore create mode 100644 .gitignore create mode 100644 .mcattributes create mode 100644 .prettierignore create mode 100644 .prettierrc delete mode 100644 build/CHANGELOG.md delete mode 100644 build/LICENSE delete mode 100644 build/README.md delete mode 100644 build/animation_controllers/detect_actions.json delete mode 100644 build/animations/onTick.json delete mode 100644 build/entities/agent.json delete mode 100644 build/entities/allay.json delete mode 100644 build/entities/area_effect_cloud.json delete mode 100644 build/entities/armor_stand.json delete mode 100644 build/entities/arrow.json delete mode 100644 build/entities/axolotl.json delete mode 100644 build/entities/balloon.json delete mode 100644 build/entities/bat.json delete mode 100644 build/entities/bee.json delete mode 100644 build/entities/blaze.json delete mode 100644 build/entities/boat.json delete mode 100644 build/entities/camel.json delete mode 100644 build/entities/cat.json delete mode 100644 build/entities/cave_spider.json delete mode 100644 build/entities/chest_boat.json delete mode 100644 build/entities/chest_minecart.json delete mode 100644 build/entities/chicken.json delete mode 100644 build/entities/command_block_minecart.json delete mode 100644 build/entities/cow.json delete mode 100644 build/entities/creeper.json delete mode 100644 build/entities/dolphin.json delete mode 100644 build/entities/donkey.json delete mode 100644 build/entities/dragon_fireball.json delete mode 100644 build/entities/drowned.json delete mode 100644 build/entities/egg.json delete mode 100644 build/entities/elder_guardian.json delete mode 100644 build/entities/ender_crystal.json delete mode 100644 build/entities/ender_dragon.json delete mode 100644 build/entities/ender_pearl.json delete mode 100644 build/entities/enderman.json delete mode 100644 build/entities/endermite.json delete mode 100644 build/entities/evocation_illager.json delete mode 100644 build/entities/eye_of_ender_signal.json delete mode 100644 build/entities/fireball.json delete mode 100644 build/entities/fireworks_rocket.json delete mode 100644 build/entities/fish.json delete mode 100644 build/entities/fishing_hook.json delete mode 100644 build/entities/fox.json delete mode 100644 build/entities/frog.json delete mode 100644 build/entities/ghast.json delete mode 100644 build/entities/glow_squid.json delete mode 100644 build/entities/goat.json delete mode 100644 build/entities/guardian.json delete mode 100644 build/entities/hoglin.json delete mode 100644 build/entities/hopper_minecart.json delete mode 100644 build/entities/horse.json delete mode 100644 build/entities/husk.json delete mode 100644 build/entities/ice_bomb.json delete mode 100644 build/entities/iron_golem.json delete mode 100644 build/entities/lightning_bolt.json delete mode 100644 build/entities/lingering_potion.json delete mode 100644 build/entities/llama.json delete mode 100644 build/entities/llama_spit.json delete mode 100644 build/entities/magma_cube.json delete mode 100644 build/entities/minecart.json delete mode 100644 build/entities/mooshroom.json delete mode 100644 build/entities/mule.json delete mode 100644 build/entities/npc.json delete mode 100644 build/entities/ocelot.json delete mode 100644 build/entities/panda.json delete mode 100644 build/entities/parrot.json delete mode 100644 build/entities/phantom.json delete mode 100644 build/entities/pig.json delete mode 100644 build/entities/piglin.json delete mode 100644 build/entities/piglin_brute.json delete mode 100644 build/entities/pillager.json delete mode 100644 build/entities/player.json delete mode 100644 build/entities/polar_bear.json delete mode 100644 build/entities/pufferfish.json delete mode 100644 build/entities/rabbit.json delete mode 100644 build/entities/ravager.json delete mode 100644 build/entities/salmon.json delete mode 100644 build/entities/sheep.json delete mode 100644 build/entities/shulker.json delete mode 100644 build/entities/shulker_bullet.json delete mode 100644 build/entities/silverfish.json delete mode 100644 build/entities/skeleton.json delete mode 100644 build/entities/skeleton_horse.json delete mode 100644 build/entities/slime.json delete mode 100644 build/entities/small_fireball.json delete mode 100644 build/entities/sniffer.json delete mode 100644 build/entities/snow_golem.json delete mode 100644 build/entities/snowball.json delete mode 100644 build/entities/spider.json delete mode 100644 build/entities/splash_potion.json delete mode 100644 build/entities/squid.json delete mode 100644 build/entities/stray.json delete mode 100644 build/entities/strider.json delete mode 100644 build/entities/tadpole.json delete mode 100644 build/entities/thrown_trident.json delete mode 100644 build/entities/tnt.json delete mode 100644 build/entities/tnt_minecart.json delete mode 100644 build/entities/trader_llama.json delete mode 100644 build/entities/tripod_camera.json delete mode 100644 build/entities/tropicalfish.json delete mode 100644 build/entities/turtle.json delete mode 100644 build/entities/vex.json delete mode 100644 build/entities/villager.json delete mode 100644 build/entities/villager_v2.json delete mode 100644 build/entities/vindicator.json delete mode 100644 build/entities/wandering_trader.json delete mode 100644 build/entities/warden.json delete mode 100644 build/entities/witch.json delete mode 100644 build/entities/wither.json delete mode 100644 build/entities/wither_skeleton.json delete mode 100644 build/entities/wither_skull.json delete mode 100644 build/entities/wither_skull_dangerous.json delete mode 100644 build/entities/wolf.json delete mode 100644 build/entities/xp_bottle.json delete mode 100644 build/entities/xp_orb.json delete mode 100644 build/entities/zoglin.json delete mode 100644 build/entities/zombie.json delete mode 100644 build/entities/zombie_horse.json delete mode 100644 build/entities/zombie_pigman.json delete mode 100644 build/entities/zombie_villager.json delete mode 100644 build/entities/zombie_villager_v2.json delete mode 100644 build/functions/checks/optional/armorNBT.mcfunction delete mode 100644 build/functions/checks/optional/nocommandblocks.mcfunction delete mode 100644 build/functions/checks/optional/overridecommandblocksenabled.mcfunction delete mode 100644 build/functions/checks/others.mcfunction delete mode 100644 build/functions/main.mcfunction delete mode 100644 build/pack_icon.png delete mode 100644 build/scripts/commands/debug_commands/listitems.js delete mode 100644 build/scripts/commands/handler.js delete mode 100644 build/scripts/commands/moderation/ban.js delete mode 100644 build/scripts/commands/moderation/credits.js delete mode 100644 build/scripts/commands/moderation/deop.js delete mode 100644 build/scripts/commands/moderation/despawn.js delete mode 100644 build/scripts/commands/moderation/help.js delete mode 100644 build/scripts/commands/moderation/kick.js delete mode 100644 build/scripts/commands/moderation/lockdown.js delete mode 100644 build/scripts/commands/moderation/modules.js delete mode 100644 build/scripts/commands/moderation/mute.js delete mode 100644 build/scripts/commands/moderation/nonstaffhelp.js delete mode 100644 build/scripts/commands/moderation/notify.js delete mode 100644 build/scripts/commands/moderation/op.js delete mode 100644 build/scripts/commands/moderation/paradoxui.js delete mode 100644 build/scripts/commands/moderation/prefix.js delete mode 100644 build/scripts/commands/moderation/punish.js delete mode 100644 build/scripts/commands/moderation/tpa.js delete mode 100644 build/scripts/commands/moderation/unban.js delete mode 100644 build/scripts/commands/moderation/unmute.js delete mode 100644 build/scripts/commands/settings/afk.js delete mode 100644 build/scripts/commands/settings/allowgma.js delete mode 100644 build/scripts/commands/settings/allowgmc.js delete mode 100644 build/scripts/commands/settings/allowgms.js delete mode 100644 build/scripts/commands/settings/antifalla.js delete mode 100644 build/scripts/commands/settings/antikb.js delete mode 100644 build/scripts/commands/settings/antinukera.js delete mode 100644 build/scripts/commands/settings/antiphasea.js delete mode 100644 build/scripts/commands/settings/antiscaffolda.js delete mode 100644 build/scripts/commands/settings/antishulker.js delete mode 100644 build/scripts/commands/settings/antispam.js delete mode 100644 build/scripts/commands/settings/auracheck.js delete mode 100644 build/scripts/commands/settings/autoban.js delete mode 100644 build/scripts/commands/settings/autoclicker.js delete mode 100644 build/scripts/commands/settings/badpackets1.js delete mode 100644 build/scripts/commands/settings/badpackets2.js delete mode 100644 build/scripts/commands/settings/bedrockvalidate.js delete mode 100644 build/scripts/commands/settings/chatranks.js delete mode 100644 build/scripts/commands/settings/crashera.js delete mode 100644 build/scripts/commands/settings/enchantedarmor.js delete mode 100644 build/scripts/commands/settings/flya.js delete mode 100644 build/scripts/commands/settings/illegalenchant.js delete mode 100644 build/scripts/commands/settings/illegalitemsa.js delete mode 100644 build/scripts/commands/settings/illegalitemsb.js delete mode 100644 build/scripts/commands/settings/illegalitemsc.js delete mode 100644 build/scripts/commands/settings/illegallores.js delete mode 100644 build/scripts/commands/settings/invalidsprinta.js delete mode 100644 build/scripts/commands/settings/jesusa.js delete mode 100644 build/scripts/commands/settings/lagclear.js delete mode 100644 build/scripts/commands/settings/namespoofa.js delete mode 100644 build/scripts/commands/settings/namespoofb.js delete mode 100644 build/scripts/commands/settings/oneplayersleep.js delete mode 100644 build/scripts/commands/settings/overidecommandblocksenabled.js delete mode 100644 build/scripts/commands/settings/reacha.js delete mode 100644 build/scripts/commands/settings/reachb.js delete mode 100644 build/scripts/commands/settings/removecommandblocks.js delete mode 100644 build/scripts/commands/settings/salvagesystem.js delete mode 100644 build/scripts/commands/settings/showrules.js delete mode 100644 build/scripts/commands/settings/spammera.js delete mode 100644 build/scripts/commands/settings/spammerb.js delete mode 100644 build/scripts/commands/settings/spammerc.js delete mode 100644 build/scripts/commands/settings/speeda.js delete mode 100644 build/scripts/commands/settings/stackban.js delete mode 100644 build/scripts/commands/settings/worldborder.js delete mode 100644 build/scripts/commands/settings/xraya.js delete mode 100644 build/scripts/commands/utility/biome.js delete mode 100644 build/scripts/commands/utility/channel.js delete mode 100644 build/scripts/commands/utility/clearchat.js delete mode 100644 build/scripts/commands/utility/delhome.js delete mode 100644 build/scripts/commands/utility/ecwipe.js delete mode 100644 build/scripts/commands/utility/fly.js delete mode 100644 build/scripts/commands/utility/freeze.js delete mode 100644 build/scripts/commands/utility/fullreport.js delete mode 100644 build/scripts/commands/utility/give.js delete mode 100644 build/scripts/commands/utility/gohome.js delete mode 100644 build/scripts/commands/utility/hotbar.js delete mode 100644 build/scripts/commands/utility/invsee.js delete mode 100644 build/scripts/commands/utility/listhome.js delete mode 100644 build/scripts/commands/utility/paradoxVersion.js delete mode 100644 build/scripts/commands/utility/rank.js delete mode 100644 build/scripts/commands/utility/report.js delete mode 100644 build/scripts/commands/utility/sethome.js delete mode 100644 build/scripts/commands/utility/stats.js delete mode 100644 build/scripts/commands/utility/tpr.js delete mode 100644 build/scripts/commands/utility/vanish.js delete mode 100644 build/scripts/data/clearlag.js delete mode 100644 build/scripts/data/config.js delete mode 100644 build/scripts/data/globalban.js delete mode 100644 build/scripts/data/illegalItemsB_whitelist.js delete mode 100644 build/scripts/data/itemban.js delete mode 100644 build/scripts/data/onjoindata.js delete mode 100644 build/scripts/data/xray.js delete mode 100644 build/scripts/gui/PlayerSpawnAfterEvent/rules/rules.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/chatui.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/chatranks.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/clearchat.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/mute.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/notify.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/unmute.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/moderationui.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/autoban.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/ban.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/despawn.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/ecwipe.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/fly.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/freeze.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/inventoryui.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/kick.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/lockdown.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/managePlayersSavedLocations.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/punish.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/rules.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/tpa.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/unban.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModeration/results/vanish.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/movementui.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antifall.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antifly.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antijesusa.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antiknockback.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antiscaffolda.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/invalidsprint.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/speeda.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/modulesui.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/afk.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/antiautoclicker.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/anticrasher.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/antikillaura.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/antinuker.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/antiphase.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/antishulker.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/antispam.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/badpackets.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/bedrockvalidation.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/commandblocks.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/enchantedarmor.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/gamemodes.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/hotbar.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/illegalitems.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/lagclear.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/namespoofing.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/oneplayersleep.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/reach.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/salvage.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/spammers.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/worldborder.js delete mode 100644 build/scripts/gui/guiHandler/guiHandlerModules/results/xray.js delete mode 100644 build/scripts/gui/guiHandler/results/chatChannelsMenu.js delete mode 100644 build/scripts/gui/guiHandler/results/deop.js delete mode 100644 build/scripts/gui/guiHandler/results/location.js delete mode 100644 build/scripts/gui/guiHandler/results/op.js delete mode 100644 build/scripts/gui/guiHandler/results/prefix.js delete mode 100644 build/scripts/gui/guiHandler/results/report.js delete mode 100644 build/scripts/gui/guiHandler/results/stats.js delete mode 100644 build/scripts/gui/guiHandler/results/tpr.js delete mode 100644 build/scripts/gui/moderation/uiAutoBan.js delete mode 100644 build/scripts/gui/moderation/uiBan.js delete mode 100644 build/scripts/gui/moderation/uiChatranks.js delete mode 100644 build/scripts/gui/moderation/uiClearchat.js delete mode 100644 build/scripts/gui/moderation/uiDeop.js delete mode 100644 build/scripts/gui/moderation/uiDespawner.js delete mode 100644 build/scripts/gui/moderation/uiEwipe.js delete mode 100644 build/scripts/gui/moderation/uiFly.js delete mode 100644 build/scripts/gui/moderation/uiFreeze.js delete mode 100644 build/scripts/gui/moderation/uiInventory.js delete mode 100644 build/scripts/gui/moderation/uiInventory/uiInvEditorHelpMenu.js delete mode 100644 build/scripts/gui/moderation/uiInventory/uiInvEditorMainMenu.js delete mode 100644 build/scripts/gui/moderation/uiInventory/uiInvEditorNameMenu.js delete mode 100644 build/scripts/gui/moderation/uiInventory/uiInvEditorRepairItemMenu.js delete mode 100644 build/scripts/gui/moderation/uiInventory/uiInvEditorReplaceMenu.js delete mode 100644 build/scripts/gui/moderation/uiInventory/uiInvEditorTransferMenu.js delete mode 100644 build/scripts/gui/moderation/uiInventory/uiItemEditor.js delete mode 100644 build/scripts/gui/moderation/uiInventory/uiItemEditorEnchantmentsMenu.js delete mode 100644 build/scripts/gui/moderation/uiInventory/uiItemEditorStats.js delete mode 100644 build/scripts/gui/moderation/uiKick.js delete mode 100644 build/scripts/gui/moderation/uiLockdown.js delete mode 100644 build/scripts/gui/moderation/uiManagePlayerSavedLocations.js delete mode 100644 build/scripts/gui/moderation/uiMute.js delete mode 100644 build/scripts/gui/moderation/uiNotify.js delete mode 100644 build/scripts/gui/moderation/uiOp.js delete mode 100644 build/scripts/gui/moderation/uiPrefix.js delete mode 100644 build/scripts/gui/moderation/uiPunish.js delete mode 100644 build/scripts/gui/moderation/uiRules.js delete mode 100644 build/scripts/gui/moderation/uiStats.js delete mode 100644 build/scripts/gui/moderation/uiTpa.js delete mode 100644 build/scripts/gui/moderation/uiTpr.js delete mode 100644 build/scripts/gui/moderation/uiTprSend.js delete mode 100644 build/scripts/gui/moderation/uiUnban.js delete mode 100644 build/scripts/gui/moderation/uiUnmute.js delete mode 100644 build/scripts/gui/moderation/uiVanish.js delete mode 100644 build/scripts/gui/modules/uiAFK.js delete mode 100644 build/scripts/gui/modules/uiAntiAutoClicker.js delete mode 100644 build/scripts/gui/modules/uiAntiCrasher.js delete mode 100644 build/scripts/gui/modules/uiAntiFall.js delete mode 100644 build/scripts/gui/modules/uiAntiFly.js delete mode 100644 build/scripts/gui/modules/uiAntiJesus.js delete mode 100644 build/scripts/gui/modules/uiAntiKillaura.js delete mode 100644 build/scripts/gui/modules/uiAntiKnockback.js delete mode 100644 build/scripts/gui/modules/uiAntiNuker.js delete mode 100644 build/scripts/gui/modules/uiAntiPhase.js delete mode 100644 build/scripts/gui/modules/uiAntiScaffold.js delete mode 100644 build/scripts/gui/modules/uiAntiShulker.js delete mode 100644 build/scripts/gui/modules/uiAntiSpam.js delete mode 100644 build/scripts/gui/modules/uiBadpackets.js delete mode 100644 build/scripts/gui/modules/uiBedrockValidation.js delete mode 100644 build/scripts/gui/modules/uiCommandBlocks.js delete mode 100644 build/scripts/gui/modules/uiEnchantedArmor.js delete mode 100644 build/scripts/gui/modules/uiExpSalvageSystem.js delete mode 100644 build/scripts/gui/modules/uiGamemodes.js delete mode 100644 build/scripts/gui/modules/uiHotbar.js delete mode 100644 build/scripts/gui/modules/uiIllegaItems.js delete mode 100644 build/scripts/gui/modules/uiInvalidSprint.js delete mode 100644 build/scripts/gui/modules/uiLagClear.js delete mode 100644 build/scripts/gui/modules/uiNameSpoofing.js delete mode 100644 build/scripts/gui/modules/uiOnePlayerSleep.js delete mode 100644 build/scripts/gui/modules/uiReach.js delete mode 100644 build/scripts/gui/modules/uiSpammer.js delete mode 100644 build/scripts/gui/modules/uiSpeed.js delete mode 100644 build/scripts/gui/modules/uiWorldborder.js delete mode 100644 build/scripts/gui/modules/uiXray.js delete mode 100644 build/scripts/gui/paradoxui.js delete mode 100644 build/scripts/gui/playerui/chatChannels/uiChatChannels.js delete mode 100644 build/scripts/gui/playerui/chatChannels/uiChatChannelsCreateMenu.js delete mode 100644 build/scripts/gui/playerui/chatChannels/uiChatChannelsInviteMenu.js delete mode 100644 build/scripts/gui/playerui/chatChannels/uiChatChannelsJoinMenu.js delete mode 100644 build/scripts/gui/playerui/chatChannels/uiChatChannelsLeaveMenu.js delete mode 100644 build/scripts/gui/playerui/uiReport.js delete mode 100644 build/scripts/gui/playerui/uiSavedLocations.js delete mode 100644 build/scripts/gui/showrules/showrules.js delete mode 100644 build/scripts/kickcheck.js delete mode 100644 build/scripts/paradox.js delete mode 100644 build/scripts/penrose/BlockBreakAfterEvent/nuker/nuker_a.js delete mode 100644 build/scripts/penrose/BlockBreakAfterEvent/xray/xray_a.js delete mode 100644 build/scripts/penrose/BlockPlaceAfterEvent/illegalitems/illegalitems_b.js delete mode 100644 build/scripts/penrose/BlockPlaceAfterEvent/reach/reach_a.js delete mode 100644 build/scripts/penrose/BlockPlaceAfterEvent/scaffold/scaffold_a.js delete mode 100644 build/scripts/penrose/ChatSendAfterEvent/chat/afterprefixcommand.js delete mode 100644 build/scripts/penrose/ChatSendAfterEvent/chat/antispam.js delete mode 100644 build/scripts/penrose/ChatSendAfterEvent/chat/chatfilter.js delete mode 100644 build/scripts/penrose/ChatSendBeforeEvent/chat/antispam.js delete mode 100644 build/scripts/penrose/ChatSendBeforeEvent/chat/beforeprefixcommand.js delete mode 100644 build/scripts/penrose/ChatSendBeforeEvent/chat/chatfilter.js delete mode 100644 build/scripts/penrose/ChatSendBeforeEvent/spammer/badpackets_1.js delete mode 100644 build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_a.js delete mode 100644 build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_b.js delete mode 100644 build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_c.js delete mode 100644 build/scripts/penrose/EntityDieAfterEvent/death_coordinates.js delete mode 100644 build/scripts/penrose/EntityHitEntityAfterEvent/autoclicker.js delete mode 100644 build/scripts/penrose/EntityHitEntityAfterEvent/killaura.js delete mode 100644 build/scripts/penrose/EntityHitEntityAfterEvent/reach_b.js delete mode 100644 build/scripts/penrose/PlayerSpawnAfterEvent/ban/globalbanlist.js delete mode 100644 build/scripts/penrose/PlayerSpawnAfterEvent/hash/hash.js delete mode 100644 build/scripts/penrose/PlayerSpawnAfterEvent/onjoin/onjoin.js delete mode 100644 build/scripts/penrose/SystemEvent/watchdog.js delete mode 100644 build/scripts/penrose/TickEvent/afk/afk.js delete mode 100644 build/scripts/penrose/TickEvent/antifalla/antifall_a.js delete mode 100644 build/scripts/penrose/TickEvent/antivoid/antivoid.js delete mode 100644 build/scripts/penrose/TickEvent/badpackets2/badpackets2.js delete mode 100644 build/scripts/penrose/TickEvent/ban/autoban.js delete mode 100644 build/scripts/penrose/TickEvent/ban/serverban.js delete mode 100644 build/scripts/penrose/TickEvent/bedrock/bedrockvalidate.js delete mode 100644 build/scripts/penrose/TickEvent/clearlag/clearlag.js delete mode 100644 build/scripts/penrose/TickEvent/crasher/crasher_a.js delete mode 100644 build/scripts/penrose/TickEvent/fly/fly_a.js delete mode 100644 build/scripts/penrose/TickEvent/freeze/freeze.js delete mode 100644 build/scripts/penrose/TickEvent/gamemode/adventure.js delete mode 100644 build/scripts/penrose/TickEvent/gamemode/creative.js delete mode 100644 build/scripts/penrose/TickEvent/gamemode/survival.js delete mode 100644 build/scripts/penrose/TickEvent/hotbar/hotbar.js delete mode 100644 build/scripts/penrose/TickEvent/illegalitems/illegalitems_a.js delete mode 100644 build/scripts/penrose/TickEvent/illegalitems/illegalitems_c.js delete mode 100644 build/scripts/penrose/TickEvent/invalidsprint/invalidsprint_a.js delete mode 100644 build/scripts/penrose/TickEvent/jesus/jesus_a.js delete mode 100644 build/scripts/penrose/TickEvent/knockback/antikb_a.js delete mode 100644 build/scripts/penrose/TickEvent/namespoof/namespoof_a.js delete mode 100644 build/scripts/penrose/TickEvent/namespoof/namespoof_b.js delete mode 100644 build/scripts/penrose/TickEvent/noperms/nopermission.js delete mode 100644 build/scripts/penrose/TickEvent/noperms/verifypermission.js delete mode 100644 build/scripts/penrose/TickEvent/oneplayersleep/oneplayersleep.js delete mode 100644 build/scripts/penrose/TickEvent/phase/phase_a.js delete mode 100644 build/scripts/penrose/TickEvent/speed/speed_a.js delete mode 100644 build/scripts/penrose/TickEvent/vanish/vanish.js delete mode 100644 build/scripts/penrose/TickEvent/worldborder/worldborder.js delete mode 100644 build/scripts/penrose/WorldInitializeAfterEvent/registry.js delete mode 100644 build/scripts/util.js delete mode 100644 build/scripts/version.js create mode 100644 manifest.json create mode 100644 package-lock.json diff --git a/.distignore b/.distignore new file mode 100644 index 0000000..0bb3806 --- /dev/null +++ b/.distignore @@ -0,0 +1,11 @@ +.github +.vscode +src +types +.distignore +.gitignore +.mcattributes +.prettierrc +dist.bat +sync.bat +tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d081d3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +scripts/ +types/ +build/ +# Ignore the main node_modules directory +node_modules/ + +# Exclude src/node_modules from being ignored +!src/node_modules/ \ No newline at end of file diff --git a/.mcattributes b/.mcattributes new file mode 100644 index 0000000..cf9a4e8 --- /dev/null +++ b/.mcattributes @@ -0,0 +1 @@ +diagnostic.enable=false diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..6a449a3 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,17 @@ +node_modules +.gitignore +.distignore +.mcattributes +.prettierrc +dist.bat +package-lock.json +package.json +sync_entities.sh +sync.bat +tsconfig.json +.github +.vs +.vscode +.git +.prettierignore +CHANGELOG.md \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..261888d --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "trailingComma": "es5", + "tabWidth": 4, + "useTabs": false, + "semi": true, + "printWidth": 250, + "endOfLine": "lf" +} diff --git a/build/CHANGELOG.md b/build/CHANGELOG.md deleted file mode 100644 index c66b92c..0000000 --- a/build/CHANGELOG.md +++ /dev/null @@ -1,456 +0,0 @@ -# Changelog -## [v日本語版paradox v3.3.4] Paradox v3.3.4-Beta Js▶︎Ts - -## [v日本語版paradox v3.3.4] Paradox v3.3.4-Beta Japanese version update!! - -## [v日本語版paradox v3.3.3] Paradox v3.3.4 Japanese version update!! - -## [v日本語版paradox v3.3.2] Paradox v3.3.3 Japanese version update!! - -## [v日本語版paradox v3.3.2] Paradox v3.3.3にアップデートしました!! - -## [Unreleased](https://github.com/Pete9xi/Paradox_AntiCheat/tree/HEAD) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.3.3...HEAD) - -**Merged pull requests:** - -- Apply fixes from CodeFactor [\#29](https://github.com/Pete9xi/Paradox_AntiCheat/pull/29) ([Visual1mpact](https://github.com/Visual1mpact)) - -## [v3.3.3](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.3.3) (2023-08-30) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.3.2...v3.3.3) - -## [v3.3.2](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.3.2) (2023-08-18) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.3.1...v3.3.2) - -## [v3.3.1](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.3.1) (2023-08-16) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.3.0...v3.3.1) - -## [v3.3.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.3.0) (2023-08-12) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.2.2...v3.3.0) - -## [v3.2.2](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.2.2) (2023-07-30) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.2.1...v3.2.2) - -## [v3.2.1](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.2.1) (2023-07-30) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.2.0...v3.2.1) - -## [v3.2.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.2.0) (2023-07-29) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.9...v3.2.0) - -## [v3.1.9](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.9) (2023-07-16) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.8...v3.1.9) - -## [v3.1.8](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.8) (2023-07-11) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.7...v3.1.8) - -## [v3.1.7](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.7) (2023-07-11) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.6...v3.1.7) - -## [v3.1.6](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.6) (2023-06-21) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.5...v3.1.6) - -## [v3.1.5](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.5) (2023-06-10) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.4...v3.1.5) - -## [v3.1.4](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.4) (2023-06-10) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.3...v3.1.4) - -## [v3.1.3](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.3) (2023-06-07) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.2...v3.1.3) - -## [v3.1.2](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.2) (2023-05-27) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.1...v3.1.2) - -## [v3.1.1](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.1) (2023-05-24) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.1.0...v3.1.1) - -## [v3.1.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.1.0) (2023-05-14) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.25...v3.1.0) - -**Closed issues:** - -- do yall still have the discord or another one? [\#25](https://github.com/Pete9xi/Paradox_AntiCheat/issues/25) - -## [v3.0.25](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.25) (2023-05-08) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.24...v3.0.25) - -## [v3.0.24](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.24) (2023-05-07) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.23...v3.0.24) - -## [v3.0.23](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.23) (2023-04-29) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.22...v3.0.23) - -## [v3.0.22](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.22) (2023-04-26) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.21...v3.0.22) - -## [v3.0.21](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.21) (2023-04-10) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.20...v3.0.21) - -## [v3.0.20](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.20) (2023-04-09) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.19...v3.0.20) - -## [v3.0.19](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.19) (2023-04-08) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.18...v3.0.19) - -## [v3.0.18](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.18) (2023-03-26) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.17...v3.0.18) - -## [v3.0.17](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.17) (2023-03-26) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.16...v3.0.17) - -## [v3.0.16](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.16) (2023-03-15) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.15...v3.0.16) - -**Merged pull requests:** - -- \[Part 2\] Update logic for hash \(dynamic properties\) [\#24](https://github.com/Pete9xi/Paradox_AntiCheat/pull/24) ([Visual1mpact](https://github.com/Visual1mpact)) - -## [v3.0.15](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.15) (2023-03-05) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.14...v3.0.15) - -## [v3.0.14](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.14) (2023-03-05) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.13...v3.0.14) - -**Merged pull requests:** - -- Call hashCode function from main script [\#23](https://github.com/Pete9xi/Paradox_AntiCheat/pull/23) ([Visual1mpact](https://github.com/Visual1mpact)) -- \[Part 1\] Update logic for hash \(dynamic properties\) [\#22](https://github.com/Pete9xi/Paradox_AntiCheat/pull/22) ([Visual1mpact](https://github.com/Visual1mpact)) -- Fix TypeError in tick event for worldborder [\#21](https://github.com/Pete9xi/Paradox_AntiCheat/pull/21) ([Visual1mpact](https://github.com/Visual1mpact)) -- Fix mismatch for dynamic properties [\#20](https://github.com/Pete9xi/Paradox_AntiCheat/pull/20) ([Visual1mpact](https://github.com/Visual1mpact)) -- Fix setScore functionality [\#19](https://github.com/Pete9xi/Paradox_AntiCheat/pull/19) ([Visual1mpact](https://github.com/Visual1mpact)) -- \[Part 3\] Update usage for dynamic properties [\#18](https://github.com/Pete9xi/Paradox_AntiCheat/pull/18) ([Visual1mpact](https://github.com/Visual1mpact)) -- \[Part 2\] Update usage for dynamic properties [\#17](https://github.com/Pete9xi/Paradox_AntiCheat/pull/17) ([Visual1mpact](https://github.com/Visual1mpact)) -- Modify code for Dynamic Property Registry [\#16](https://github.com/Pete9xi/Paradox_AntiCheat/pull/16) ([Visual1mpact](https://github.com/Visual1mpact)) -- \[Part 1\] Update usage for dynamic properties [\#15](https://github.com/Pete9xi/Paradox_AntiCheat/pull/15) ([Visual1mpact](https://github.com/Visual1mpact)) -- Update command handler for antifalla [\#14](https://github.com/Pete9xi/Paradox_AntiCheat/pull/14) ([Visual1mpact](https://github.com/Visual1mpact)) -- \[bug\] playerspawnevent [\#13](https://github.com/Pete9xi/Paradox_AntiCheat/pull/13) ([Visual1mpact](https://github.com/Visual1mpact)) -- Fix callback error for antifalla [\#12](https://github.com/Pete9xi/Paradox_AntiCheat/pull/12) ([Visual1mpact](https://github.com/Visual1mpact)) -- Update scripts for Windows [\#11](https://github.com/Pete9xi/Paradox_AntiCheat/pull/11) ([Visual1mpact](https://github.com/Visual1mpact)) -- Development [\#10](https://github.com/Pete9xi/Paradox_AntiCheat/pull/10) ([Visual1mpact](https://github.com/Visual1mpact)) -- Development [\#9](https://github.com/Pete9xi/Paradox_AntiCheat/pull/9) ([Visual1mpact](https://github.com/Visual1mpact)) -- Various changes and fix for OP Password [\#8](https://github.com/Pete9xi/Paradox_AntiCheat/pull/8) ([Visual1mpact](https://github.com/Visual1mpact)) -- Ignore init arg length check for Hotbar [\#7](https://github.com/Pete9xi/Paradox_AntiCheat/pull/7) ([Visual1mpact](https://github.com/Visual1mpact)) -- Modify the logic for Hotbar [\#6](https://github.com/Pete9xi/Paradox_AntiCheat/pull/6) ([Visual1mpact](https://github.com/Visual1mpact)) -- Remove Realm Bot Chat Relay [\#5](https://github.com/Pete9xi/Paradox_AntiCheat/pull/5) ([Visual1mpact](https://github.com/Visual1mpact)) -- Implement Async [\#4](https://github.com/Pete9xi/Paradox_AntiCheat/pull/4) ([Visual1mpact](https://github.com/Visual1mpact)) -- Update tick events [\#3](https://github.com/Pete9xi/Paradox_AntiCheat/pull/3) ([Visual1mpact](https://github.com/Visual1mpact)) -- Small optimization and bug fix [\#2](https://github.com/Pete9xi/Paradox_AntiCheat/pull/2) ([Visual1mpact](https://github.com/Visual1mpact)) -- Cleaning up project environment [\#1](https://github.com/Pete9xi/Paradox_AntiCheat/pull/1) ([Visual1mpact](https://github.com/Visual1mpact)) - -## [v3.0.13](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.13) (2023-02-18) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.12...v3.0.13) - -## [v3.0.12](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.12) (2023-02-13) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.11...v3.0.12) - -## [v3.0.11](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.11) (2022-12-13) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.10...v3.0.11) - -## [v3.0.10](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.10) (2022-12-02) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.5...v3.0.10) - -## [v3.0.5](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.5) (2022-08-28) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.4...v3.0.5) - -## [v3.0.4](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.4) (2022-07-11) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.3...v3.0.4) - -## [v3.0.3](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.3) (2022-07-10) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.2...v3.0.3) - -## [v3.0.2](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.2) (2022-07-09) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.1...v3.0.2) - -## [v3.0.1](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.1) (2022-07-04) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v3.0.0...v3.0.1) - -## [v3.0.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v3.0.0) (2022-07-04) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.19.54...v3.0.0) - -## [v2.19.54](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.19.54) (2022-06-26) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.19.53...v2.19.54) - -## [v2.19.53](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.19.53) (2022-06-25) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.18.52...v2.19.53) - -## [v2.18.52](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.18.52) (2022-06-22) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.17.51...v2.18.52) - -## [v2.17.51](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.17.51) (2022-06-10) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.17.50...v2.17.51) - -## [v2.17.50](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.17.50) (2022-06-10) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.17.49...v2.17.50) - -## [v2.17.49](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.17.49) (2022-06-10) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.16.48...v2.17.49) - -## [v2.16.48](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.16.48) (2022-06-03) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.15.47...v2.16.48) - -## [v2.15.47](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.15.47) (2022-05-24) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.15.46...v2.15.47) - -## [v2.15.46](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.15.46) (2022-05-24) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.15.45...v2.15.46) - -## [v2.15.45](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.15.45) (2022-05-23) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.15.44...v2.15.45) - -## [v2.15.44](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.15.44) (2022-05-23) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.14.43...v2.15.44) - -## [v2.14.43](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.14.43) (2022-05-17) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.14.42...v2.14.43) - -## [v2.14.42](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.14.42) (2022-05-16) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.13.41...v2.14.42) - -## [v2.13.41](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.13.41) (2022-05-02) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.13.40...v2.13.41) - -## [v2.13.40](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.13.40) (2022-05-01) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.12.39...v2.13.40) - -## [v2.12.39](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.12.39) (2022-04-25) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.12.38...v2.12.39) - -## [v2.12.38](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.12.38) (2022-04-25) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.12.37...v2.12.38) - -## [v2.12.37](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.12.37) (2022-04-24) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.11.36...v2.12.37) - -## [v2.11.36](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.11.36) (2022-04-23) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.11.35...v2.11.36) - -## [v2.11.35](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.11.35) (2022-04-23) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.10.34...v2.11.35) - -## [v2.10.34](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.10.34) (2022-04-18) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.9.33...v2.10.34) - -## [v2.9.33](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.9.33) (2022-04-10) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.8.32...v2.9.33) - -## [v2.8.32](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.8.32) (2022-04-04) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.7.31...v2.8.32) - -## [v2.7.31](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.7.31) (2022-03-27) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.6.30...v2.7.31) - -## [v2.6.30](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.6.30) (2022-03-19) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.6.29...v2.6.30) - -## [v2.6.29](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.6.29) (2022-03-18) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.6.28...v2.6.29) - -## [v2.6.28](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.6.28) (2022-03-14) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.6.27...v2.6.28) - -## [v2.6.27](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.6.27) (2022-03-13) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.6.26...v2.6.27) - -## [v2.6.26](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.6.26) (2022-03-13) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.5.25...v2.6.26) - -## [v2.5.25](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.5.25) (2022-03-08) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.5.24...v2.5.25) - -## [v2.5.24](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.5.24) (2022-03-06) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.4.23...v2.5.24) - -## [v2.4.23](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.4.23) (2022-02-27) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.4.22...v2.4.23) - -## [v2.4.22](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.4.22) (2022-02-26) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.3.21...v2.4.22) - -## [v2.3.21](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.3.21) (2022-02-24) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.3.20...v2.3.21) - -## [v2.3.20](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.3.20) (2022-02-20) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.3.19...v2.3.20) - -## [v2.3.19](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.3.19) (2022-02-19) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.3.18...v2.3.19) - -## [v2.3.18](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.3.18) (2022-02-18) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.2.15...v2.3.18) - -## [v2.2.15](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.2.15) (2022-02-09) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.2.14...v2.2.15) - -## [v2.2.14](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.2.14) (2022-02-08) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.2.13...v2.2.14) - -## [v2.2.13](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.2.13) (2022-02-08) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.2.12...v2.2.13) - -## [v2.2.12](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.2.12) (2022-02-08) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.1.11...v2.2.12) - -## [v2.1.11](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.1.11) (2022-02-05) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.1.10...v2.1.11) - -## [v2.1.10](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.1.10) (2022-02-04) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.0.0-beta9...v2.1.10) - -## [v2.0.0-beta9](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.0.0-beta9) (2022-01-16) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.0.0-beta8...v2.0.0-beta9) - -## [v2.0.0-beta8](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.0.0-beta8) (2021-12-30) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.0.0-beta7...v2.0.0-beta8) - -## [v2.0.0-beta7](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.0.0-beta7) (2021-12-16) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.0.0-beta6...v2.0.0-beta7) - -## [v2.0.0-beta6](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.0.0-beta6) (2021-12-02) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.0.0-beta5...v2.0.0-beta6) - -## [v2.0.0-beta5](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.0.0-beta5) (2021-11-15) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.0.0-beta4...v2.0.0-beta5) - -## [v2.0.0-beta4](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.0.0-beta4) (2021-10-31) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.0.0-beta3...v2.0.0-beta4) - -## [v2.0.0-beta3](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.0.0-beta3) (2021-10-15) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.0.0-beta2...v2.0.0-beta3) - -## [v2.0.0-beta2](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.0.0-beta2) (2021-10-10) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v2.0.0-beta1...v2.0.0-beta2) - -## [v2.0.0-beta1](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v2.0.0-beta1) (2021-10-03) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v1.4.0...v2.0.0-beta1) - -## [v1.4.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v1.4.0) (2021-09-30) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v1.3.0...v1.4.0) - -## [v1.3.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v1.3.0) (2021-09-27) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v1.2.0...v1.3.0) - -## [v1.2.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v1.2.0) (2021-09-23) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v1.1.0...v1.2.0) - -## [v1.1.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v1.1.0) (2021-09-13) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v1.0.0...v1.1.0) - -## [v1.0.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v1.0.0) (2021-09-09) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v0.4.0...v1.0.0) - -## [v0.4.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v0.4.0) (2021-08-28) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v0.3.0...v0.4.0) - -## [v0.3.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v0.3.0) (2021-08-19) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/v0.2.0...v0.3.0) - -## [v0.2.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/v0.2.0) (2021-08-18) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/0.1.0...v0.2.0) - -## [0.1.0](https://github.com/Pete9xi/Paradox_AntiCheat/tree/0.1.0) (2021-07-19) - -[Full Changelog](https://github.com/Pete9xi/Paradox_AntiCheat/compare/b174b2960af08a4dbfab838f818df6e75e631811...0.1.0) - - - -\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* diff --git a/build/LICENSE b/build/LICENSE deleted file mode 100644 index f288702..0000000 --- a/build/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/build/README.md b/build/README.md deleted file mode 100644 index 9ac0c22..0000000 --- a/build/README.md +++ /dev/null @@ -1,203 +0,0 @@ -
- Paradox AntiCheat Logo -

-
- Paradox japanese v.3.3.3 

originator => "https://github.com/Pete9xi/Paradox_AntiCheat/tree/main"

-
- Paradox AntiCheat is a fork of Scythe AntiCheat, which was released under the GPLv3 License. Paradox was created to fix some differences within Scythe and to provide a more reliable and effective anti-cheat solution for Minecraft Bedrock. All original commit history pertaining to Scythe still exists within this project and is free to review. -
-
-
-
-

About Paradox AntiCheat

-

Paradox AntiCheat is a powerful tool designed to combat cheating in Minecraft Bedrock worlds. The name "Paradox" was chosen because the concept of paradox perfectly represents the essence of what we do.

-

Paradox AntiCheat is a statement that contradicts itself. It is a tool that fights cheating by using advanced algorithms and techniques that are themselves paradoxical in nature.

-
-

Paradox: A statement or situation that contradicts itself, opposed to common sense and yet perhaps true.

-
-

Paradox AntiCheat offers a comprehensive solution for detecting and preventing cheating in Minecraft Bedrock. It uses detection methods to ensure that cheaters are caught and punished. In addition, Paradox AntiCheat is highly customizable, allowing game developers to tailor the tool to their specific needs and requirements.

-

If you're looking for a reliable and effective anti-cheat solution for your Minecraft Bedrock experience, look no further than Paradox AntiCheat. For more information, check out the wiki.

-
-
-
-

Get Support

-

Join the Paradox AntiCheat community on Discord for support. Our community is active and dedicated to providing help and assistance to game developers who use Paradox AntiCheat in their projects. We also welcome feedback and suggestions on how we can improve the tool.

-
- -
-

Project Status

- Grade - Downloads - Latest Downloads - Commits Per Month - Last Commit - License -
- -

-

Applying the Paradox AntiCheat Pack

-

When applying the pack to your world make sure the addon is at the top of the behavior pack list and Beta APIs is enabled. This is to ensure all checks and systems work properly. The versioning system for Paradox goes as follows:

-
    -
  • The first number denotes the pack version. This will rarely change unless there has been major changes to the code.
  • -
  • The second number denotes the major revision of the pack version. These particular changes mostly involve around features being added or removed.
  • -
  • The third number indicates the minor revision of the Pack. This evolves around bug fixes.
  • -
- -

-

Installing the Paradox AntiCheat Pack

-

To install this anticheat to your realm/world you need to:

-
    -
  1. Install the .mcpack
  2. -
  3. Apply it to your world
  4. -
  5. Enable Beta APIs
  6. -
-

Once you have done this the anticheat should be fully up and running. Education Edition is required for the command !fly <username> to work.

- -

Gaining Permission to Use Paradox

-

Follow these steps to grant yourself permission to use Paradox in your world:

-
    -
  1. If you're a Realm owner or prefer using a password: -
      -
    1. Edit the config.js file located at /scripts/data/config.js.
    2. -
    3. Scroll down to the encryption section.
    4. -
    5. Inside encryption, find password.
    6. -
    7. Enter your chosen password:
    8. -
    -
    encryption: {
    -    password: "mypassword",
    -}
    -
      -
    1. Keep your password safe and confidential.
    2. -
    -
  2. -
  3. For all users not using a password: -
      -
    1. Install the Anti Cheat and load your Minecraft world.
    2. -
    3. In the game's chat, enter <prefix>op. Replace <prefix> with your server's command prefix, e.g., !.
    4. -
    5. If you have necessary permissions, this grants you Paradox AntiCheat access.
    6. -
    7. Once granted, you'll have Paradox AntiCheat features.
    8. -
    9. To give Paradox-Op permissions to others, use <prefix>op <player>.
    10. -
    11. Learn more by entering <prefix>op help.
    12. -
    -
  4. -
-

Note: If you're using a password (Realm owners), use <prefix>op <password> for permission.

-

Remember, keep your password secure and share it cautiously.

- -

Important Notes

-
    -
  • Paradox will kick you out if you have any illegal items in your inventory so if you think Paradox may flag you after installing then it is highly suggested to drop your entire inventory prior to activating this Anti Cheat!!!
  • -
- - -

Paradox Contributing Logo

-

Development Environment Setup:

- -
    -
  1. Install Visual Studio Code (VSC) from the official website: https://code.visualstudio.com/
  2. -
  3. Install the latest Node.js version from the official website: https://nodejs.org/
  4. -
- - -

Contributing to the Project:

- -
    -
  1. Fork the project repository by clicking on the "Fork" button in the top-right corner of the repository page: https://github.com/Pete9xi/Paradox_AntiCheat
  2. -
  3. Clone the forked repository to your local machine using the built-in terminal of Visual Studio Code:
  4. -
- -
git clone https://github.com/<your-github-username>/Paradox_AntiCheat.git
-
- -
    -
  1. Navigate to the cloned project directory using the built-in terminal of Visual Studio Code:
  2. -
- -
cd Paradox_AntiCheat
-
- -
    -
  1. Install project dependencies using the built-in terminal of Visual Studio Code:
  2. -
- -
npm i
-
- - -

Building for Development:

- -
    -
  • To build the project for development on Linux, run the following command in the built-in terminal of Visual Studio Code:
  • -
- -
npm run build
-
- -
    -
  • To build the project for development on Windows, use the following command in the built-in terminal of Visual Studio Code:
  • -
- -
npm run build_win
-
- - -

Making and Committing Changes:

- -
    -
  1. Make changes to the project files using Visual Studio Code.
  2. -
  3. Save the files.
  4. -
- - -

Committing Changes to Git:

- -
    -
  1. Stage the changes to include all modifications in the built-in terminal of Visual Studio Code:
  2. -
- -
git add .
-
- -

(Alternatively, use git add <filename> to stage specific files.)

- -
    -
  1. Commit the changes with a meaningful commit message in the built-in terminal of Visual Studio Code:
  2. -
- -
git commit -m "Your commit message here"
-
- - -

Pushing Commits Upstream:

- -
    -
  1. Before pushing, pull any changes from the original repository to avoid conflicts in the built-in terminal of Visual Studio Code:
  2. -
- -
git pull origin main
-
- -

(This ensures your fork is up to date with the original repository.)

- -
    -
  1. Push the committed changes to your forked repository on GitHub in the built-in terminal of Visual Studio Code:
  2. -
- -
git push origin main
-
- - -

Creating a Pull Request:

- -
    -
  1. Go to your forked repository on GitHub: https://github.com/<your-github-username>/Paradox_AntiCheat
  2. -
  3. Click on the "Compare & pull request" button.
  4. -
  5. Review the changes in the pull request and provide a meaningful description of your changes.
  6. -
  7. Click on the "Create pull request" button to submit the pull request to the original repository.
  8. -
- -

Congratulations! You have successfully set up the development environment, cloned the project, built it for development, made changes, committed those changes, pushed them upstream, and created a pull request to contribute your changes back to the original repository.

- -

Please note that the project maintainers will review your pull request, and if they find it suitable, they will merge it into the main project. Keep an eye on your pull request for any feedback or updates from the maintainers.

- -

Happy contributing to the Paradox AntiCheat project! If you have any further questions or need additional assistance, feel free to ask.

\ No newline at end of file diff --git a/build/animation_controllers/detect_actions.json b/build/animation_controllers/detect_actions.json deleted file mode 100644 index 95236d2..0000000 --- a/build/animation_controllers/detect_actions.json +++ /dev/null @@ -1,3103 +0,0 @@ -{ - "format_version": "1.10.0", - "animation_controllers": { - "controller.animation.sprint": { - "states": { - "default": { - "transitions": [ - { - "sprint": "query.is_sprinting" - } - ], - "on_entry": ["/tag @s remove sprint", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6SPRINT§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=stop)\"}]}"] - }, - "sprint": { - "transitions": [ - { - "default": "!query.is_sprinting" - } - ], - "on_entry": ["/tag @s add sprint", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6SPRINT§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=start)\"}]}"] - } - } - }, - "controller.animation.levitate": { - "states": { - "default": { - "transitions": [ - { - "levitate": "query.is_levitating" - } - ], - "on_entry": ["/tag @s remove levitating", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6LEVITATE§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=stop)\"}]}"] - }, - "levitate": { - "transitions": [ - { - "default": "!query.is_levitating" - } - ], - "on_entry": ["/tag @s add levitating", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6LEVITATE§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=start)\"}]}"] - } - } - }, - "controller.animation.death": { - "states": { - "default": { - "transitions": [ - { - "dead": "!query.is_alive" - } - ], - "on_entry": ["/tag @s remove dead", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6DEATH§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=stop)\"}]}"] - }, - "dead": { - "transitions": [ - { - "default": "query.is_alive" - } - ], - "on_entry": [ - "/tag @s add dead", - "/tag @s remove moving", - "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6DEATH§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=start)\"}]}" - ] - } - } - }, - "controller.animation.ride": { - "states": { - "default": { - "transitions": [ - { - "ride": "query.is_riding" - } - ], - "on_entry": ["/tag @s remove riding", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6RIDE§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=stop)\"}]}"] - }, - "ride": { - "transitions": [ - { - "default": "!query.is_riding" - } - ], - "on_entry": ["/tag @s add riding", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6RIDE§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=start)\"}]}"] - } - } - }, - "controller.animation.sneak": { - "states": { - "default": { - "transitions": [ - { - "sneak": "query.is_sneaking" - } - ], - "on_entry": ["/tag @s remove sneak", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6SNEAK§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=stop)\"}]}"] - }, - "sneak": { - "transitions": [ - { - "default": "!query.is_sneaking" - } - ], - "on_entry": ["/tag @s add sneak", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6SNEAK§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=start)\"}]}"] - } - } - }, - "controller.animation.move": { - "states": { - "default": { - "transitions": [ - { - "move": "query.is_moving" - } - ], - "on_entry": ["/tag @s remove moving", "/tellraw @a[tag=packetlogger,tag=packetlogger2] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6MOVE§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=stop)\"}]}"] - }, - "move": { - "transitions": [ - { - "default": "!query.is_moving" - } - ], - "on_entry": ["/tag @s add moving", "/tellraw @a[tag=packetlogger,tag=packetlogger2] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6MOVE§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=start)\"}]}"] - } - } - }, - "controller.animation.enchanth": { - "states": { - "default": { - "transitions": [ - { - "unenchanth": "query.armor_material_slot(0) == 0 || query.armor_material_slot(0) == 2" - }, - { - "enchanth": "query.armor_material_slot(0) == 1 || query.armor_material_slot(0) == 3" - } - ] - }, - "unenchanth": { - "transitions": [ - { - "default": "(1.0)" - } - ], - "on_entry": ["/scoreboard players set @s ench_helmet 0"] - }, - "enchanth": { - "transitions": [ - { - "default": "(1.0)" - } - ], - "on_entry": ["/scoreboard players set @s ench_helmet 1"] - } - } - }, - "controller.animation.enchantc": { - "states": { - "default": { - "transitions": [ - { - "unenchantc": "query.armor_material_slot(1) == 0 || query.armor_material_slot(1) == 2" - }, - { - "enchantc": "query.armor_material_slot(1) == 1 || query.armor_material_slot(1) == 3" - } - ] - }, - "unenchantc": { - "transitions": [ - { - "default": "(1.0)" - } - ], - "on_entry": ["/scoreboard players set @s ench_chest 0"] - }, - "enchantc": { - "transitions": [ - { - "default": "(1.0)" - } - ], - "on_entry": ["/scoreboard players set @s ench_chest 1"] - } - } - }, - "controller.animation.enchantl": { - "states": { - "default": { - "transitions": [ - { - "unenchantl": "query.armor_material_slot(2) == 0 || query.armor_material_slot(2) == 2" - }, - { - "enchantl": "query.armor_material_slot(2) == 1 || query.armor_material_slot(2) == 3" - } - ] - }, - "unenchantl": { - "transitions": [ - { - "default": "(1.0)" - } - ], - "on_entry": ["/scoreboard players set @s ench_legs 0"] - }, - "enchantl": { - "transitions": [ - { - "default": "(1.0)" - } - ], - "on_entry": ["/scoreboard players set @s ench_legs 1"] - } - } - }, - "controller.animation.enchantb": { - "states": { - "default": { - "transitions": [ - { - "unenchantb": "query.armor_material_slot(3) == 0 || query.armor_material_slot(3) == 2" - }, - { - "enchantb": "query.armor_material_slot(3) == 1 || query.armor_material_slot(3) == 3" - } - ] - }, - "unenchantb": { - "transitions": [ - { - "default": "(1.0)" - } - ], - "on_entry": ["/scoreboard players set @s ench_boots 0"] - }, - "enchantb": { - "transitions": [ - { - "default": "(1.0)" - } - ], - "on_entry": ["/scoreboard players set @s ench_boots 1"] - } - } - }, - "controller.animation.helmet": { - "states": { - "default": { - "transitions": [ - { - "noh": "!(query.has_armor_slot(0))" - }, - { - "leatherh": "query.armor_texture_slot(0) == 0" - }, - { - "chainh": "query.armor_texture_slot(0) == 1" - }, - { - "ironh": "query.armor_texture_slot(0) == 2" - }, - { - "diamondh": "query.armor_texture_slot(0) == 3" - }, - { - "goldh": "query.armor_texture_slot(0) == 4" - }, - { - "netheriteh": "query.armor_texture_slot(0) == 7" - }, - { - "turtleh": "query.armor_texture_slot(0) == 6" - } - ] - }, - "noh": { - "transitions": [ - { - "netheriteh": "query.armor_texture_slot(0) == 7" - }, - { - "goldh": "query.armor_texture_slot(0) == 4" - }, - { - "diamondh": "query.armor_texture_slot(0) == 3" - }, - { - "ironh": "query.armor_texture_slot(0) == 2" - }, - { - "chainh": "query.armor_texture_slot(0) == 1" - }, - { - "leatherh": "query.armor_texture_slot(0) == 0" - }, - { - "turtleh": "query.armor_texture_slot(0) == 6" - } - ], - "on_entry": ["/scoreboard players set @s detect_helmet 0"] - }, - "leatherh": { - "transitions": [ - { - "goldh": "query.armor_texture_slot(0) == 4" - }, - { - "diamondh": "query.armor_texture_slot(0) == 3" - }, - { - "ironh": "query.armor_texture_slot(0) == 2" - }, - { - "chainh": "query.armor_texture_slot(0) == 1" - }, - { - "noh": "!(query.has_armor_slot(0))" - }, - { - "netheriteh": "query.armor_texture_slot(0) == 7" - }, - { - "turtleh": "query.armor_texture_slot(0) == 6" - } - ], - "on_entry": ["/scoreboard players set @s detect_helmet 1"] - }, - "chainh": { - "transitions": [ - { - "noh": "!(query.has_armor_slot(0))" - }, - { - "leatherh": "query.armor_texture_slot(0) == 0" - }, - { - "ironh": "query.armor_texture_slot(0) == 2" - }, - { - "diamondh": "query.armor_texture_slot(0) == 3" - }, - { - "goldh": "query.armor_texture_slot(0) == 4" - }, - { - "netheriteh": "query.armor_texture_slot(0) == 7" - }, - { - "turtleh": "query.armor_texture_slot(0) == 6" - } - ], - "on_entry": ["/scoreboard players set @s detect_helmet 2"] - }, - "ironh": { - "transitions": [ - { - "noh": "!(query.has_armor_slot(0))" - }, - { - "leatherh": "query.armor_texture_slot(0) == 0" - }, - { - "chainh": "query.armor_texture_slot(0) == 1" - }, - { - "diamondh": "query.armor_texture_slot(0) == 3" - }, - { - "goldh": "query.armor_texture_slot(0) == 4" - }, - { - "netheriteh": "query.armor_texture_slot(0) == 7" - }, - { - "turtleh": "query.armor_texture_slot(0) == 6" - } - ], - "on_entry": ["/scoreboard players set @s detect_helmet 3"] - }, - "diamondh": { - "transitions": [ - { - "noh": "!(query.has_armor_slot(0))" - }, - { - "leatherh": "query.armor_texture_slot(0) == 0" - }, - { - "chainh": "query.armor_texture_slot(0) == 1" - }, - { - "ironh": "query.armor_texture_slot(0) == 2" - }, - { - "goldh": "query.armor_texture_slot(0) == 4" - }, - { - "netheriteh": "query.armor_texture_slot(0) == 7" - }, - { - "turtleh": "query.armor_texture_slot(0) == 6" - } - ], - "on_entry": ["/scoreboard players set @s detect_helmet 5"] - }, - "goldh": { - "transitions": [ - { - "noh": "!(query.has_armor_slot(0))" - }, - { - "leatherh": "query.armor_texture_slot(0) == 0" - }, - { - "chainh": "query.armor_texture_slot(0) == 1" - }, - { - "ironh": "query.armor_texture_slot(0) == 2" - }, - { - "diamondh": "query.armor_texture_slot(0) == 3" - }, - { - "netheriteh": "query.armor_texture_slot(0) == 7" - }, - { - "turtleh": "query.armor_texture_slot(0) == 6" - } - ], - "on_entry": ["/scoreboard players set @s detect_helmet 4"] - }, - "netheriteh": { - "transitions": [ - { - "noh": "!(query.has_armor_slot(0))" - }, - { - "leatherh": "query.armor_texture_slot(0) == 0" - }, - { - "chainh": "query.armor_texture_slot(0) == 1" - }, - { - "ironh": "query.armor_texture_slot(0) == 2" - }, - { - "diamondh": "query.armor_texture_slot(0) == 3" - }, - { - "goldh": "query.armor_texture_slot(0) == 4" - }, - { - "turtleh": "query.armor_texture_slot(0) == 6" - } - ], - "on_entry": ["/scoreboard players set @s detect_helmet 6"] - }, - "turtleh": { - "transitions": [ - { - "noh": "!(query.has_armor_slot(0))" - }, - { - "leatherh": "query.armor_texture_slot(0) == 0" - }, - { - "chainh": "query.armor_texture_slot(0) == 1" - }, - { - "ironh": "query.armor_texture_slot(0) == 2" - }, - { - "diamondh": "query.armor_texture_slot(0) == 3" - }, - { - "goldh": "query.armor_texture_slot(0) == 4" - }, - { - "netheriteh": "query.armor_texture_slot(0) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_helmet 7"] - } - } - }, - "controller.animation.chest": { - "states": { - "default": { - "transitions": [ - { - "noc": "!(query.has_armor_slot(1))" - }, - { - "leatherc": "query.armor_texture_slot(1) == 0" - }, - { - "chainc": "query.armor_texture_slot(1) == 1" - }, - { - "ironc": "query.armor_texture_slot(1) == 2" - }, - { - "diamondc": "query.armor_texture_slot(1) == 3" - }, - { - "goldc": "query.armor_texture_slot(1) == 4" - }, - { - "netheritec": "query.armor_texture_slot(1) == 7" - }, - { - "elytrac": "query.armor_texture_slot(1) == 5" - } - ] - }, - "noc": { - "transitions": [ - { - "leatherc": "query.armor_texture_slot(1) == 0" - }, - { - "chainc": "query.armor_texture_slot(1) == 1" - }, - { - "ironc": "query.armor_texture_slot(1) == 2" - }, - { - "diamondc": "query.armor_texture_slot(1) == 3" - }, - { - "goldc": "query.armor_texture_slot(1) == 4" - }, - { - "netheritec": "query.armor_texture_slot(1) == 7" - }, - { - "elytrac": "query.armor_texture_slot(1) == 5" - } - ], - "on_entry": ["/scoreboard players set @s detect_chest 0"] - }, - "leatherc": { - "transitions": [ - { - "noc": "!(query.has_armor_slot(1))" - }, - { - "chainc": "query.armor_texture_slot(1) == 1" - }, - { - "ironc": "query.armor_texture_slot(1) == 2" - }, - { - "diamondc": "query.armor_texture_slot(1) == 3" - }, - { - "goldc": "query.armor_texture_slot(1) == 4" - }, - { - "netheritec": "query.armor_texture_slot(1) == 7" - }, - { - "elytrac": "query.armor_texture_slot(1) == 5" - } - ], - "on_entry": ["/scoreboard players set @s detect_chest 1"] - }, - "chainc": { - "transitions": [ - { - "noc": "!(query.has_armor_slot(1))" - }, - { - "leatherc": "query.armor_texture_slot(1) == 0" - }, - { - "ironc": "query.armor_texture_slot(1) == 2" - }, - { - "diamondc": "query.armor_texture_slot(1) == 3" - }, - { - "goldc": "query.armor_texture_slot(1) == 4" - }, - { - "netheritec": "query.armor_texture_slot(1) == 7" - }, - { - "elytrac": "query.armor_texture_slot(1) == 5" - } - ], - "on_entry": ["/scoreboard players set @s detect_chest 2"] - }, - "ironc": { - "transitions": [ - { - "noc": "!(query.has_armor_slot(1))" - }, - { - "leatherc": "query.armor_texture_slot(1) == 0" - }, - { - "chainc": "query.armor_texture_slot(1) == 1" - }, - { - "diamondc": "query.armor_texture_slot(1) == 3" - }, - { - "goldc": "query.armor_texture_slot(1) == 4" - }, - { - "netheritec": "query.armor_texture_slot(1) == 7" - }, - { - "elytrac": "query.armor_texture_slot(1) == 5" - } - ], - "on_entry": ["/scoreboard players set @s detect_chest 3"] - }, - "diamondc": { - "transitions": [ - { - "noc": "!(query.has_armor_slot(1))" - }, - { - "leatherc": "query.armor_texture_slot(1) == 0" - }, - { - "chainc": "query.armor_texture_slot(1) == 1" - }, - { - "ironc": "query.armor_texture_slot(1) == 2" - }, - { - "goldc": "query.armor_texture_slot(1) == 4" - }, - { - "netheritec": "query.armor_texture_slot(1) == 7" - }, - { - "elytrac": "query.armor_texture_slot(1) == 5" - } - ], - "on_entry": ["/scoreboard players set @s detect_chest 5"] - }, - "goldc": { - "transitions": [ - { - "noc": "!(query.has_armor_slot(1))" - }, - { - "leatherc": "query.armor_texture_slot(1) == 0" - }, - { - "chainc": "query.armor_texture_slot(1) == 1" - }, - { - "ironc": "query.armor_texture_slot(1) == 2" - }, - { - "diamondc": "query.armor_texture_slot(1) == 3" - }, - { - "netheritec": "query.armor_texture_slot(1) == 7" - }, - { - "elytrac": "query.armor_texture_slot(1) == 5" - } - ], - "on_entry": ["/scoreboard players set @s detect_chest 4"] - }, - "netheritec": { - "transitions": [ - { - "noc": "!(query.has_armor_slot(1))" - }, - { - "leatherc": "query.armor_texture_slot(1) == 0" - }, - { - "chainc": "query.armor_texture_slot(1) == 1" - }, - { - "ironc": "query.armor_texture_slot(1) == 2" - }, - { - "diamondc": "query.armor_texture_slot(1) == 3" - }, - { - "goldc": "query.armor_texture_slot(1) == 4" - }, - { - "elytrac": "query.armor_texture_slot(1) == 5" - } - ], - "on_entry": ["/scoreboard players set @s detect_chest 6"] - }, - "elytrac": { - "transitions": [ - { - "noc": "!(query.has_armor_slot(1))" - }, - { - "leatherc": "query.armor_texture_slot(1) == 0" - }, - { - "chainc": "query.armor_texture_slot(1) == 1" - }, - { - "ironc": "query.armor_texture_slot(1) == 2" - }, - { - "diamondc": "query.armor_texture_slot(1) == 3" - }, - { - "goldc": "query.armor_texture_slot(1) == 4" - }, - { - "netheritec": "query.armor_texture_slot(1) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_chest 7"] - } - } - }, - "controller.animation.leggings": { - "states": { - "default": { - "transitions": [ - { - "nol": "!(query.has_armor_slot(2))" - }, - { - "leatherl": "query.armor_texture_slot(2) == 0" - }, - { - "chainl": "query.armor_texture_slot(2) == 1" - }, - { - "ironl": "query.armor_texture_slot(2) == 2" - }, - { - "diamondl": "query.armor_texture_slot(2) == 3" - }, - { - "goldl": "query.armor_texture_slot(2) == 4" - }, - { - "netheritel": "query.armor_texture_slot(2) == 7" - } - ] - }, - "nol": { - "transitions": [ - { - "leatherl": "query.armor_texture_slot(2) == 0" - }, - { - "chainl": "query.armor_texture_slot(2) == 1" - }, - { - "ironl": "query.armor_texture_slot(2) == 2" - }, - { - "diamondl": "query.armor_texture_slot(2) == 3" - }, - { - "goldl": "query.armor_texture_slot(2) == 4" - }, - { - "netheritel": "query.armor_texture_slot(2) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_leggings 0"] - }, - "leatherl": { - "transitions": [ - { - "nol": "!(query.has_armor_slot(2))" - }, - { - "chainl": "query.armor_texture_slot(2) == 1" - }, - { - "ironl": "query.armor_texture_slot(2) == 2" - }, - { - "diamondl": "query.armor_texture_slot(2) == 3" - }, - { - "goldl": "query.armor_texture_slot(2) == 4" - }, - { - "netheritel": "query.armor_texture_slot(2) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_leggings 1"] - }, - "chainl": { - "transitions": [ - { - "nol": "!(query.has_armor_slot(2))" - }, - { - "leatherl": "query.armor_texture_slot(2) == 0" - }, - { - "ironl": "query.armor_texture_slot(2) == 2" - }, - { - "diamondl": "query.armor_texture_slot(2) == 3" - }, - { - "goldl": "query.armor_texture_slot(2) == 4" - }, - { - "netheritel": "query.armor_texture_slot(2) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_leggings 2"] - }, - "ironl": { - "transitions": [ - { - "nol": "!(query.has_armor_slot(2))" - }, - { - "leatherl": "query.armor_texture_slot(2) == 0" - }, - { - "chainl": "query.armor_texture_slot(2) == 1" - }, - { - "diamondl": "query.armor_texture_slot(2) == 3" - }, - { - "goldl": "query.armor_texture_slot(2) == 4" - }, - { - "netheritel": "query.armor_texture_slot(2) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_leggings 3"] - }, - "diamondl": { - "transitions": [ - { - "nol": "!(query.has_armor_slot(2))" - }, - { - "leatherl": "query.armor_texture_slot(2) == 0" - }, - { - "chainl": "query.armor_texture_slot(2) == 1" - }, - { - "ironl": "query.armor_texture_slot(2) == 2" - }, - { - "goldl": "query.armor_texture_slot(2) == 4" - }, - { - "netheritel": "query.armor_texture_slot(2) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_leggings 5"] - }, - "goldl": { - "transitions": [ - { - "nol": "!(query.has_armor_slot(2))" - }, - { - "leatherl": "query.armor_texture_slot(2) == 0" - }, - { - "chainl": "query.armor_texture_slot(2) == 1" - }, - { - "ironl": "query.armor_texture_slot(2) == 2" - }, - { - "diamondl": "query.armor_texture_slot(2) == 3" - }, - { - "netheritel": "query.armor_texture_slot(2) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_leggings 4"] - }, - "netheritel": { - "transitions": [ - { - "nol": "!(query.has_armor_slot(2))" - }, - { - "leatherl": "query.armor_texture_slot(2) == 0" - }, - { - "chainl": "query.armor_texture_slot(2) == 1" - }, - { - "ironl": "query.armor_texture_slot(2) == 2" - }, - { - "diamondl": "query.armor_texture_slot(2) == 3" - }, - { - "goldl": "query.armor_texture_slot(2) == 4" - } - ], - "on_entry": ["/scoreboard players set @s detect_leggings 6"] - } - } - }, - "controller.animation.boots": { - "states": { - "default": { - "transitions": [ - { - "nob": "!(query.has_armor_slot(3))" - }, - { - "leatherb": "query.armor_texture_slot(3) == 0" - }, - { - "chainb": "query.armor_texture_slot(3) == 1" - }, - { - "ironb": "query.armor_texture_slot(3) == 2" - }, - { - "diamondb": "query.armor_texture_slot(3) == 3" - }, - { - "goldb": "query.armor_texture_slot(3) == 4" - }, - { - "netheriteb": "query.armor_texture_slot(3) == 7" - } - ] - }, - "nob": { - "transitions": [ - { - "leatherb": "query.armor_texture_slot(3) == 0" - }, - { - "chainb": "query.armor_texture_slot(3) == 1" - }, - { - "ironb": "query.armor_texture_slot(3) == 2" - }, - { - "diamondb": "query.armor_texture_slot(3) == 3" - }, - { - "goldb": "query.armor_texture_slot(3) == 4" - }, - { - "netheriteb": "query.armor_texture_slot(3) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_boots 0"] - }, - "leatherb": { - "transitions": [ - { - "nob": "!(query.has_armor_slot(3))" - }, - { - "chainb": "query.armor_texture_slot(3) == 1" - }, - { - "ironb": "query.armor_texture_slot(3) == 2" - }, - { - "diamondb": "query.armor_texture_slot(3) == 3" - }, - { - "goldb": "query.armor_texture_slot(3) == 4" - }, - { - "netheriteb": "query.armor_texture_slot(3) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_boots 1"] - }, - "chainb": { - "transitions": [ - { - "nob": "!(query.has_armor_slot(3))" - }, - { - "leatherb": "query.armor_texture_slot(3) == 0" - }, - { - "ironb": "query.armor_texture_slot(3) == 2" - }, - { - "diamondb": "query.armor_texture_slot(3) == 3" - }, - { - "goldb": "query.armor_texture_slot(3) == 4" - }, - { - "netheriteb": "query.armor_texture_slot(3) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_boots 2"] - }, - "ironb": { - "transitions": [ - { - "nob": "!(query.has_armor_slot(3))" - }, - { - "leatherb": "query.armor_texture_slot(3) == 0" - }, - { - "chainb": "query.armor_texture_slot(3) == 1" - }, - { - "diamondb": "query.armor_texture_slot(3) == 3" - }, - { - "goldb": "query.armor_texture_slot(3) == 4" - }, - { - "netheriteb": "query.armor_texture_slot(3) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_boots 3"] - }, - "diamondb": { - "transitions": [ - { - "nob": "!(query.has_armor_slot(3))" - }, - { - "leatherb": "query.armor_texture_slot(3) == 0" - }, - { - "chainb": "query.armor_texture_slot(3) == 1" - }, - { - "ironb": "query.armor_texture_slot(3) == 2" - }, - { - "goldb": "query.armor_texture_slot(3) == 4" - }, - { - "netheriteb": "query.armor_texture_slot(3) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_boots 5"] - }, - "goldb": { - "transitions": [ - { - "nob": "!(query.has_armor_slot(3))" - }, - { - "leatherb": "query.armor_texture_slot(3) == 0" - }, - { - "chainb": "query.armor_texture_slot(3) == 1" - }, - { - "ironb": "query.armor_texture_slot(3) == 2" - }, - { - "diamondb": "query.armor_texture_slot(3) == 3" - }, - { - "netheriteb": "query.armor_texture_slot(3) == 7" - } - ], - "on_entry": ["/scoreboard players set @s detect_boots 4"] - }, - "netheriteb": { - "transitions": [ - { - "nob": "!(query.has_armor_slot(3))" - }, - { - "leatherb": "query.armor_texture_slot(3) == 0" - }, - { - "chainb": "query.armor_texture_slot(3) == 1" - }, - { - "ironb": "query.armor_texture_slot(3) == 2" - }, - { - "diamondb": "query.armor_texture_slot(3) == 3" - }, - { - "goldb": "query.armor_texture_slot(3) == 4" - } - ], - "on_entry": ["/scoreboard players set @s detect_boots 6"] - } - } - }, - "controller.animation.sleep": { - "states": { - "default": { - "transitions": [ - { - "sleep": "query.is_sleeping" - } - ], - "on_entry": ["/tag @s remove sleeping", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6SLEEP§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=stop)\"}]}"] - }, - "sleep": { - "transitions": [ - { - "default": "!query.is_sleeping" - } - ], - "on_entry": ["/tag @s add sleeping", "/tellraw @a[tag=packetlogger] {\"rawtext\":[{\"text\":\"§߈§f§4[§6Paradox§4]§f §bRecieved §6SLEEP§f packet from: §g\"},{\"selector\":\"@s\"},{\"text\":\" §7(type=start)\"}]}"] - } - } - }, - "controller.animation.facing_north": { - "initial_state": "is_not_facing", - "states": { - "is_facing": { - "transitions": [ - { - "is_not_facing": "query.cardinal_facing_2d != 2" - } - ], - "on_entry": ["/tag @s add North"] - }, - "is_not_facing": { - "transitions": [ - { - "is_facing": "query.cardinal_facing_2d == 2" - } - ], - "on_entry": ["/tag @s remove North"] - } - } - }, - "controller.animation.facing_south": { - "initial_state": "is_not_facing", - "states": { - "is_facing": { - "transitions": [ - { - "is_not_facing": "query.cardinal_facing_2d != 3" - } - ], - "on_entry": ["/tag @s add South"] - }, - "is_not_facing": { - "transitions": [ - { - "is_facing": "query.cardinal_facing_2d == 3" - } - ], - "on_entry": ["/tag @s remove South"] - } - } - }, - "controller.animation.facing_east": { - "initial_state": "is_not_facing", - "states": { - "is_facing": { - "transitions": [ - { - "is_not_facing": "query.cardinal_facing_2d != 5" - } - ], - "on_entry": ["/tag @s add East"] - }, - "is_not_facing": { - "transitions": [ - { - "is_facing": "query.cardinal_facing_2d == 5" - } - ], - "on_entry": ["/tag @s remove East"] - } - } - }, - "controller.animation.facing_west": { - "initial_state": "is_not_facing", - "states": { - "is_facing": { - "transitions": [ - { - "is_not_facing": "query.cardinal_facing_2d != 4" - } - ], - "on_entry": ["/tag @s add West"] - }, - "is_not_facing": { - "transitions": [ - { - "is_facing": "query.cardinal_facing_2d == 4" - } - ], - "on_entry": ["/tag @s remove West"] - } - } - }, - "controller.animation.basalt_deltas": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('basalt_deltas') == 1" - } - ], - "on_entry": ["/tag @s remove basalt_deltas"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('basalt_deltas') != 1" - } - ], - "on_entry": ["/tag @s add basalt_deltas"] - } - } - }, - "controller.animation.bamboo_jungle": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('bamboo') == 1 && query.biome_has_any_tag('hills') == 0" - } - ], - "on_entry": ["/tag @s remove bamboo_jungle"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('bamboo') != 1 || query.biome_has_any_tag('hills') == 1" - } - ], - "on_entry": ["/tag @s add bamboo_jungle"] - } - } - }, - "controller.animation.bamboo_jungle_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('bamboo') == 1 && query.biome_has_any_tag('hills') == 1" - } - ], - "on_entry": ["/tag @s remove bamboo_jungle_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('bamboo') != 1 || query.biome_has_any_tag('hills') != 1" - } - ], - "on_entry": ["/tag @s add bamboo_jungle_hills"] - } - } - }, - "controller.animation.beach": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('beach') == 1 && query.biome_has_any_tag('stone', 'cold') == 0" - } - ], - "on_entry": ["/tag @s remove beach"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('beach') != 1 || query.biome_has_any_tag('stone', 'cold') == 1" - } - ], - "on_entry": ["/tag @s add beach"] - } - } - }, - "controller.animation.birch_forest": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('birch') == 1 && query.biome_has_any_tag('hills', 'mutated') == 0" - } - ], - "on_entry": ["/tag @s remove birch_forest"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('birch') != 1 || query.biome_has_any_tag('hills', 'mutated') == 1" - } - ], - "on_entry": ["/tag @s add birch_forest"] - } - } - }, - "controller.animation.birch_forest_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('birch') == 1 && query.biome_has_all_tags('hills') == 1 && query.biome_has_any_tag('mutated') == 0" - } - ], - "on_entry": ["/tag @s remove birch_forest_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('birch') != 1 || query.biome_has_all_tags('hills') != 1 || query.biome_has_any_tag('mutated') == 1" - } - ], - "on_entry": ["/tag @s add birch_forest_hills"] - } - } - }, - "controller.animation.birch_forest_hills_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('birch') == 1 && query.biome_has_all_tags('hills') == 1 && query.biome_has_any_tag('mutated') == 1" - } - ], - "on_entry": ["/tag @s remove birch_forest_hills_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('birch') != 1 || query.biome_has_all_tags('hills') != 1 || query.biome_has_any_tag('mutated') != 1" - } - ], - "on_entry": ["/tag @s add birch_forest_hills_mutated"] - } - } - }, - "controller.animation.birch_forest_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('birch') == 1 && query.biome_has_any_tag('hills') == 0 && query.biome_has_any_tag('mutated') == 1" - } - ], - "on_entry": ["/tag @s remove birch_forest_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('birch') != 1 || query.biome_has_all_tags('mutated') != 1 || query.biome_has_any_tag('hills') == 1" - } - ], - "on_entry": ["/tag @s add birch_forest_mutated"] - } - } - }, - "controller.animation.cold_beach": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('beach') == 1 && query.biome_has_any_tag('cold') == 1" - } - ], - "on_entry": ["/tag @s remove cold_beach"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('beach') != 1 || query.biome_has_all_tags('cold') != 1" - } - ], - "on_entry": ["/tag @s add cold_beach"] - } - } - }, - "controller.animation.cold_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('cold') == 1 && query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s remove cold_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('cold') == 0 || query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s add cold_ocean"] - } - } - }, - "controller.animation.cold_taiga": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('taiga') == 1 && query.biome_has_all_tags('cold') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('hills') == 0" - } - ], - "on_entry": ["/tag @s remove cold_taiga"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('taiga') == 0 || query.biome_has_all_tags('cold') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('hills') == 1" - } - ], - "on_entry": ["/tag @s add cold_taiga"] - } - } - }, - "controller.animation.cold_taiga_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('taiga') == 1 && query.biome_has_all_tags('cold') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('hills') == 1" - } - ], - "on_entry": ["/tag @s remove cold_taiga_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('taiga') == 0 || query.biome_has_all_tags('cold') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('hills') == 0" - } - ], - "on_entry": ["/tag @s add cold_taiga_hills"] - } - } - }, - "controller.animation.cold_taiga_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('taiga') == 1 && query.biome_has_all_tags('cold') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('hills') == 0" - } - ], - "on_entry": ["/tag @s remove cold_taiga_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('taiga') == 0 || query.biome_has_all_tags('cold') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('hills') == 1" - } - ], - "on_entry": ["/tag @s add cold_taiga_mutated"] - } - } - }, - "controller.animation.crimson_forest": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('crimson_forest') == 1" - } - ], - "on_entry": ["/tag @s remove crimson_forest"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('crimson_forest') != 1" - } - ], - "on_entry": ["/tag @s add crimson_forest"] - } - } - }, - "controller.animation.deep_cold_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('cold') == 1 && query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s remove deep_cold_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('cold') == 0 || query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s add deep_cold_ocean"] - } - } - }, - "controller.animation.deep_frozen_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('frozen') == 1 && query.biome_has_all_tags('monster') == 1 && query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s remove deep_frozen_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('frozen') == 0 || query.biome_has_all_tags('monster') == 0 || query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s add deep_frozen_ocean"] - } - } - }, - "controller.animation.deep_lukewarm_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('lukewarm') == 1 && query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s remove deep_lukewarm_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('lukewarm') == 0 || query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s add deep_lukewarm_ocean"] - } - } - }, - "controller.animation.deep_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('lukewarm') == 0 && query.biome_has_all_tags('frozen') == 0 && query.biome_has_all_tags('cold') == 0 && query.biome_has_all_tags('warm') == 0 && query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s remove deep_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('lukewarm') == 1 || query.biome_has_all_tags('frozen') == 1 || query.biome_has_all_tags('cold') == 1 || query.biome_has_all_tags('warm') == 1 || query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s add deep_ocean"] - } - } - }, - "controller.animation.deep_warm_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('warm') == 1 && query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s remove deep_warm_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('warm') == 0 || query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s add deep_warm_ocean"] - } - } - }, - "controller.animation.desert": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('desert') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('hills') == 0" - } - ], - "on_entry": ["/tag @s remove desert"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('desert') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('hills') == 1" - } - ], - "on_entry": ["/tag @s add desert"] - } - } - }, - "controller.animation.desert_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('desert') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('hills') == 1" - } - ], - "on_entry": ["/tag @s remove desert_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('desert') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('hills') == 0" - } - ], - "on_entry": ["/tag @s add desert_hills"] - } - } - }, - "controller.animation.desert_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('desert') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('hills') == 0" - } - ], - "on_entry": ["/tag @s remove desert_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('desert') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('hills') == 1" - } - ], - "on_entry": ["/tag @s add desert_mutated"] - } - } - }, - "controller.animation.extreme_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('extreme_hills') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('forest') == 0 && query.biome_has_all_tags('edge') == 0" - } - ], - "on_entry": ["/tag @s remove extreme_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('extreme_hills') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('forest') == 1 || query.biome_has_all_tags('edge') == 1" - } - ], - "on_entry": ["/tag @s add extreme_hills"] - } - } - }, - "controller.animation.extreme_hills_edge": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('extreme_hills') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('forest') == 0 && query.biome_has_all_tags('edge') == 1" - } - ], - "on_entry": ["/tag @s remove extreme_hills_edge"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('extreme_hills') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('forest') == 1 || query.biome_has_all_tags('edge') == 0" - } - ], - "on_entry": ["/tag @s add extreme_hills_edge"] - } - } - }, - "controller.animation.extreme_hills_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('extreme_hills') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('forest') == 0 && query.biome_has_all_tags('edge') == 0" - } - ], - "on_entry": ["/tag @s remove extreme_hills_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('extreme_hills') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('forest') == 1 || query.biome_has_all_tags('edge') == 1" - } - ], - "on_entry": ["/tag @s add extreme_hills_mutated"] - } - } - }, - "controller.animation.extreme_hills_plus_trees": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('extreme_hills') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('forest') == 1 && query.biome_has_all_tags('edge') == 0" - } - ], - "on_entry": ["/tag @s remove extreme_hills_plus_trees"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('extreme_hills') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('forest') == 0 || query.biome_has_all_tags('edge') == 1" - } - ], - "on_entry": ["/tag @s add extreme_hills_plus_trees"] - } - } - }, - "controller.animation.extreme_hills_plus_trees_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('extreme_hills') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('forest') == 1 && query.biome_has_all_tags('edge') == 0" - } - ], - "on_entry": ["/tag @s remove extreme_hills_plus_trees_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('extreme_hills') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('forest') == 0 || query.biome_has_all_tags('edge') == 1" - } - ], - "on_entry": ["/tag @s add extreme_hills_plus_trees_mutated"] - } - } - }, - "controller.animation.flower_forest": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('flower_forest') == 1" - } - ], - "on_entry": ["/tag @s remove flower_forest"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('flower_forest') != 1" - } - ], - "on_entry": ["/tag @s add flower_forest"] - } - } - }, - "controller.animation.forest": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('forest') == 1 && query.biome_has_any_tag('birch', 'taiga', 'roofed', 'extreme_hills') == 0 && query.biome_has_any_tag('hills') == 0" - } - ], - "on_entry": ["/tag @s remove forest"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('forest') != 1 || query.biome_has_any_tag('birch', 'taiga', 'roofed', 'extreme_hills') == 1 || query.biome_has_any_tag('hills') == 1" - } - ], - "on_entry": ["/tag @s add forest"] - } - } - }, - "controller.animation.forest_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('forest') == 1 && query.biome_has_any_tag('birch', 'taiga', 'roofed', 'extreme_hills') == 0 && query.biome_has_any_tag('hills') == 1" - } - ], - "on_entry": ["/tag @s remove forest_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('forest') != 1 || query.biome_has_any_tag('birch', 'taiga', 'roofed', 'extreme_hills') == 1 || query.biome_has_any_tag('hills') == 0" - } - ], - "on_entry": ["/tag @s add forest_hills"] - } - } - }, - "controller.animation.frozen_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('frozen') == 1 && query.biome_has_all_tags('monster') == 1 && query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s remove frozen_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('frozen') == 0 || query.biome_has_all_tags('monster') == 0 || query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s add frozen_ocean"] - } - } - }, - "controller.animation.frozen_river": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('river') == 1 && query.biome_has_all_tags('frozen') == 1" - } - ], - "on_entry": ["/tag @s remove frozen_river"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('river') == 0 || query.biome_has_all_tags('frozen') == 0" - } - ], - "on_entry": ["/tag @s add frozen_river"] - } - } - }, - "controller.animation.ice_mountains": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ice') == 1 && query.biome_has_all_tags('mountain') == 1" - } - ], - "on_entry": ["/tag @s remove ice_mountains"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ice') == 0 || query.biome_has_all_tags('mountain') == 0" - } - ], - "on_entry": ["/tag @s add ice_mountains"] - } - } - }, - "controller.animation.ice_plains": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ice_plains') == 1 && query.biome_has_all_tags('mutated') == 0" - } - ], - "on_entry": ["/tag @s remove ice_plains"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ice_plains') == 0 || query.biome_has_all_tags('mutated') == 1" - } - ], - "on_entry": ["/tag @s add ice_plains"] - } - } - }, - "controller.animation.ice_plains_spikes": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ice_plains') == 1 && query.biome_has_all_tags('mutated') == 1" - } - ], - "on_entry": ["/tag @s remove ice_plains_spikes"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ice_plains') == 0 || query.biome_has_all_tags('mutated') == 0" - } - ], - "on_entry": ["/tag @s add ice_plains_spikes"] - } - } - }, - "controller.animation.jungle": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('jungle') == 1 && query.biome_has_all_tags('edge') == 0 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('hills') == 0 && query.biome_has_all_tags('bamboo') == 0" - } - ], - "on_entry": ["/tag @s remove jungle"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('jungle') == 0 || query.biome_has_all_tags('edge') == 1 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('hills') == 1 || query.biome_has_all_tags('bamboo') == 1" - } - ], - "on_entry": ["/tag @s add jungle"] - } - } - }, - "controller.animation.jungle_edge": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('jungle') == 1 && query.biome_has_all_tags('edge') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('hills') == 0 && query.biome_has_all_tags('bamboo') == 0" - } - ], - "on_entry": ["/tag @s remove jungle_edge"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('jungle') == 0 || query.biome_has_all_tags('edge') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('hills') == 1 || query.biome_has_all_tags('bamboo') == 1" - } - ], - "on_entry": ["/tag @s add jungle_edge"] - } - } - }, - "controller.animation.jungle_edge_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('jungle') == 1 && query.biome_has_all_tags('edge') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('hills') == 0 && query.biome_has_all_tags('bamboo') == 0" - } - ], - "on_entry": ["/tag @s remove jungle_edge_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('jungle') == 0 || query.biome_has_all_tags('edge') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('hills') == 1 || query.biome_has_all_tags('bamboo') == 1" - } - ], - "on_entry": ["/tag @s add jungle_edge_mutated"] - } - } - }, - "controller.animation.jungle_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('jungle') == 1 && query.biome_has_all_tags('edge') == 0 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('hills') == 1 && query.biome_has_all_tags('bamboo') == 0" - } - ], - "on_entry": ["/tag @s remove jungle_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('jungle') == 0 || query.biome_has_all_tags('edge') == 1 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('hills') == 0 || query.biome_has_all_tags('bamboo') == 1" - } - ], - "on_entry": ["/tag @s add jungle_hills"] - } - } - }, - "controller.animation.jungle_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('jungle') == 1 && query.biome_has_all_tags('edge') == 0 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('hills') == 0 && query.biome_has_all_tags('bamboo') == 0" - } - ], - "on_entry": ["/tag @s remove jungle_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('jungle') == 0 || query.biome_has_all_tags('edge') == 1 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('hills') == 1 || query.biome_has_all_tags('bamboo') == 1" - } - ], - "on_entry": ["/tag @s add jungle_mutated"] - } - } - }, - "controller.animation.legacy_frozen_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('frozen') == 1 && query.biome_has_all_tags('monster') == 0 && query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s remove legacy_frozen_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('frozen') == 0 || query.biome_has_all_tags('monster') == 1 || query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s add legacy_frozen_ocean"] - } - } - }, - "controller.animation.lofty_peaks": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('lofty_peaks') == 1" - } - ], - "on_entry": ["/tag @s remove lofty_peaks"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('lofty_peaks') == 0" - } - ], - "on_entry": ["/tag @s add lofty_peaks"] - } - } - }, - "controller.animation.lukewarm_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('lukewarm') == 1 && query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s remove lukewarm_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('lukewarm') == 0 || query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s add lukewarm_ocean"] - } - } - }, - "controller.animation.mega_spruce_taiga": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mega') == 1 && query.biome_has_all_tags('hills') == 0 && query.biome_has_all_tags('mutated') == 1" - } - ], - "on_entry": ["/tag @s remove mega_spruce_taiga"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mega') == 0 || query.biome_has_all_tags('hills') == 1 || query.biome_has_all_tags('mutated') == 0" - } - ], - "on_entry": ["/tag @s add mega_spruce_taiga"] - } - } - }, - "controller.animation.mega_spruce_taiga_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mega') == 1 && query.biome_has_all_tags('hills') == 1 && query.biome_has_all_tags('mutated') == 1" - } - ], - "on_entry": ["/tag @s remove mega_spruce_taiga_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mega') == 0 || query.biome_has_all_tags('hills') == 0 || query.biome_has_all_tags('mutated') == 0" - } - ], - "on_entry": ["/tag @s add mega_spruce_taiga_hills"] - } - } - }, - "controller.animation.mega_taiga": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mega') == 1 && query.biome_has_all_tags('hills') == 0 && query.biome_has_all_tags('mutated') == 0" - } - ], - "on_entry": ["/tag @s remove mega_taiga"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mega') == 0 || query.biome_has_all_tags('hills') == 1 || query.biome_has_all_tags('mutated') == 1" - } - ], - "on_entry": ["/tag @s add mega_taiga"] - } - } - }, - "controller.animation.mega_taiga_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mega') == 1 && query.biome_has_all_tags('hills') == 1 && query.biome_has_all_tags('mutated') == 0" - } - ], - "on_entry": ["/tag @s remove mega_taiga_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mega') == 0 || query.biome_has_all_tags('hills') == 0 || query.biome_has_all_tags('mutated') == 1" - } - ], - "on_entry": ["/tag @s add mega_taiga_hills"] - } - } - }, - "controller.animation.mesa": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mesa') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('plateau') == 0 && query.biome_has_all_tags('stone') == 0" - } - ], - "on_entry": ["/tag @s remove mesa"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mesa') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('plateau') == 1 || query.biome_has_all_tags('stone') == 1" - } - ], - "on_entry": ["/tag @s add mesa"] - } - } - }, - "controller.animation.mesa_bryce": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mesa') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('plateau') == 0 && query.biome_has_all_tags('stone') == 0" - } - ], - "on_entry": ["/tag @s remove mesa_bryce"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mesa') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('plateau') == 1 || query.biome_has_all_tags('stone') == 1" - } - ], - "on_entry": ["/tag @s add mesa_bryce"] - } - } - }, - "controller.animation.mesa_plateau": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mesa') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('plateau') == 1 && query.biome_has_all_tags('stone') == 0" - } - ], - "on_entry": ["/tag @s remove mesa_plateau"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mesa') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('plateau') == 0 || query.biome_has_all_tags('stone') == 1" - } - ], - "on_entry": ["/tag @s add mesa_plateau"] - } - } - }, - "controller.animation.mesa_plateau_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mesa') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('plateau') == 1 && query.biome_has_all_tags('stone') == 1" - } - ], - "on_entry": ["/tag @s remove mesa_plateau_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mesa') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('plateau') == 0 || query.biome_has_all_tags('stone') == 0" - } - ], - "on_entry": ["/tag @s add mesa_plateau_mutated"] - } - } - }, - "controller.animation.mesa_plateau_stone": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mesa') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('plateau') == 1 && query.biome_has_all_tags('stone') == 1" - } - ], - "on_entry": ["/tag @s remove mesa_plateau_stone"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mesa') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('plateau') == 0 || query.biome_has_all_tags('stone') == 0" - } - ], - "on_entry": ["/tag @s add mesa_plateau_stone"] - } - } - }, - "controller.animation.mesa_plateau_stone_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mesa') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('plateau') == 1 && query.biome_has_all_tags('stone') == 0" - } - ], - "on_entry": ["/tag @s remove mesa_plateau_stone_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mesa') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('plateau') == 0 || query.biome_has_all_tags('stone') == 1" - } - ], - "on_entry": ["/tag @s add mesa_plateau_stone_mutated"] - } - } - }, - "controller.animation.mountain_grove": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mountain_grove') == 1" - } - ], - "on_entry": ["/tag @s remove mountain_grove"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mountain_grove') == 0" - } - ], - "on_entry": ["/tag @s add mountain_grove"] - } - } - }, - "controller.animation.mountain_meadow": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mountain_meadow') == 1" - } - ], - "on_entry": ["/tag @s remove mountain_meadow"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mountain_meadow') == 0" - } - ], - "on_entry": ["/tag @s add mountain_meadow"] - } - } - }, - "controller.animation.mountain_peaks": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mountains') == 1 && query.biome_has_all_tags('mountain_grove') == 0 && query.biome_has_all_tags('mountain_meadow') == 0 && query.biome_has_all_tags('snowy_slopes') == 0" - } - ], - "on_entry": ["/tag @s remove mountain_peaks"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mountains') == 0 || query.biome_has_all_tags('mountain_grove') == 1 || query.biome_has_all_tags('mountain_meadow') == 1 || query.biome_has_all_tags('snowy_slopes') == 1" - } - ], - "on_entry": ["/tag @s add mountain_peaks"] - } - } - }, - "controller.animation.mushroom_island": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mooshroom_island') == 1 && query.biome_has_any_tag('shore') == 0" - } - ], - "on_entry": ["/tag @s remove mushroom_island"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mooshroom_island') == 0 || query.biome_has_any_tag('shore') == 1" - } - ], - "on_entry": ["/tag @s add mushroom_island"] - } - } - }, - "controller.animation.mushroom_island_shore": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mooshroom_island') == 1 && query.biome_has_any_tag('shore') == 1" - } - ], - "on_entry": ["/tag @s remove mushroom_island_shore"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mooshroom_island') == 0 || query.biome_has_any_tag('shore') == 0" - } - ], - "on_entry": ["/tag @s add mushroom_island_shore"] - } - } - }, - "controller.animation.nether_wastes": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('nether_wastes') == 1" - } - ], - "on_entry": ["/tag @s remove nether_wastes"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('nether_wastes') != 1" - } - ], - "on_entry": ["/tag @s add nether_wastes"] - } - } - }, - "controller.animation.ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_any_tag('deep', 'warm', 'frozen', 'lukewarm', 'cold') == 0" - } - ], - "on_entry": ["/tag @s remove ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') != 1 || query.biome_has_any_tag('deep', 'warm', 'frozen', 'lukewarm', 'cold') == 1" - } - ], - "on_entry": ["/tag @s add ocean"] - } - } - }, - "controller.animation.plains": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('plains') == 1 && query.biome_has_any_tag('mutated') == 0" - } - ], - "on_entry": ["/tag @s remove plains"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('plains') != 1 || query.biome_has_any_tag('mutated') == 1" - } - ], - "on_entry": ["/tag @s add plains"] - } - } - }, - "controller.animation.river": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('river') == 1 && query.biome_has_all_tags('frozen') == 0" - } - ], - "on_entry": ["/tag @s remove river"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('river') == 0 || query.biome_has_all_tags('frozen') == 1" - } - ], - "on_entry": ["/tag @s add river"] - } - } - }, - "controller.animation.roofed_forest_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('roofed') == 1 && query.biome_has_all_tags('mutated') == 1" - } - ], - "on_entry": ["/tag @s remove roofed_forest_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('roofed') == 0 || query.biome_has_all_tags('mutated') == 0" - } - ], - "on_entry": ["/tag @s add roofed_forest_mutated"] - } - } - }, - "controller.animation.savanna": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('savanna') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('plateau') == 0" - } - ], - "on_entry": ["/tag @s remove savanna"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('savanna') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('plateau') == 1" - } - ], - "on_entry": ["/tag @s add savanna"] - } - } - }, - "controller.animation.savanna_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('savanna') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('plateau') == 0" - } - ], - "on_entry": ["/tag @s remove savanna_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('savanna') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('plateau') == 1" - } - ], - "on_entry": ["/tag @s add savanna_mutated"] - } - } - }, - "controller.animation.savanna_plateau": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('savanna') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('plateau') == 1" - } - ], - "on_entry": ["/tag @s remove savanna_plateau"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('savanna') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('plateau') == 0" - } - ], - "on_entry": ["/tag @s add savanna_plateau"] - } - } - }, - "controller.animation.savanna_plateau_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('savanna') == 1 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('plateau') == 1" - } - ], - "on_entry": ["/tag @s remove savanna_plateau_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('savanna') == 0 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('plateau') == 0" - } - ], - "on_entry": ["/tag @s add savanna_plateau_mutated"] - } - } - }, - "controller.animation.snow_capped_peaks": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('snow_capped_peaks') == 1" - } - ], - "on_entry": ["/tag @s remove snow_capped_peaks"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('snow_capped_peaks') != 1" - } - ], - "on_entry": ["/tag @s add snow_capped_peaks"] - } - } - }, - "controller.animation.snowy_slopes": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('snowy_slopes') == 1" - } - ], - "on_entry": ["/tag @s remove snowy_slopes"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('snowy_slopes') != 1" - } - ], - "on_entry": ["/tag @s add snowy_slopes"] - } - } - }, - "controller.animation.soulsand_valley": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('soulsand_valley') == 1" - } - ], - "on_entry": ["/tag @s remove soulsand_valley"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('soulsand_valley') != 1" - } - ], - "on_entry": ["/tag @s add soulsand_valley"] - } - } - }, - "controller.animation.stone_beach": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('beach') == 1 && query.biome_has_any_tag('stone') == 1" - } - ], - "on_entry": ["/tag @s remove stone_beach"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('beach') != 1 || query.biome_has_all_tags('stone') != 1" - } - ], - "on_entry": ["/tag @s add stone_beach"] - } - } - }, - "controller.animation.sunflower_plains": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('plains') == 1 && query.biome_has_any_tag('mutated') == 1" - } - ], - "on_entry": ["/tag @s remove sunflower_plains"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('plains') != 1 || query.biome_has_any_tag('mutated') == 0" - } - ], - "on_entry": ["/tag @s add sunflower_plains"] - } - } - }, - "controller.animation.swamp": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('swamp') == 1 && query.biome_has_any_tag('mutated') == 0" - } - ], - "on_entry": ["/tag @s remove swamp"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('swamp') != 1 || query.biome_has_any_tag('mutated') == 1" - } - ], - "on_entry": ["/tag @s add swamp"] - } - } - }, - "controller.animation.swamp_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('swamp') == 1 && query.biome_has_any_tag('mutated') == 1" - } - ], - "on_entry": ["/tag @s remove swamp_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('swamp') != 1 || query.biome_has_any_tag('mutated') == 0" - } - ], - "on_entry": ["/tag @s add swamp_mutated"] - } - } - }, - "controller.animation.taiga": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('taiga') == 1 && query.biome_has_all_tags('hills') == 0 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('cold') == 0 && query.biome_has_all_tags('mega') == 0" - } - ], - "on_entry": ["/tag @s remove taiga"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('taiga') == 0 || query.biome_has_all_tags('hills') == 1 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('cold') == 1 || query.biome_has_all_tags('mega') == 1" - } - ], - "on_entry": ["/tag @s add taiga"] - } - } - }, - "controller.animation.taiga_hills": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('taiga') == 1 && query.biome_has_all_tags('hills') == 1 && query.biome_has_all_tags('mutated') == 0 && query.biome_has_all_tags('cold') == 0 && query.biome_has_all_tags('mega') == 0" - } - ], - "on_entry": ["/tag @s remove taiga_hills"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('taiga') == 0 || query.biome_has_all_tags('hills') == 0 || query.biome_has_all_tags('mutated') == 1 || query.biome_has_all_tags('cold') == 1 || query.biome_has_all_tags('mega') == 1" - } - ], - "on_entry": ["/tag @s add taiga_hills"] - } - } - }, - "controller.animation.taiga_mutated": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('taiga') == 1 && query.biome_has_all_tags('hills') == 0 && query.biome_has_all_tags('mutated') == 1 && query.biome_has_all_tags('cold') == 0 && query.biome_has_all_tags('mega') == 0" - } - ], - "on_entry": ["/tag @s remove taiga_mutated"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('taiga') == 0 || query.biome_has_all_tags('hills') == 1 || query.biome_has_all_tags('mutated') == 0 || query.biome_has_all_tags('cold') == 1 || query.biome_has_all_tags('mega') == 1" - } - ], - "on_entry": ["/tag @s add taiga_mutated"] - } - } - }, - "controller.animation.the_end": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('the_end') == 1" - } - ], - "on_entry": ["/tag @s remove the_end"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('the_end') != 1" - } - ], - "on_entry": ["/tag @s add the_end"] - } - } - }, - "controller.animation.warm_ocean": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('ocean') == 1 && query.biome_has_all_tags('warm') == 1 && query.biome_has_all_tags('deep') == 0" - } - ], - "on_entry": ["/tag @s remove warm_ocean"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('ocean') == 0 || query.biome_has_all_tags('warm') == 0 || query.biome_has_all_tags('deep') == 1" - } - ], - "on_entry": ["/tag @s add warm_ocean"] - } - } - }, - "controller.animation.warped_forest": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('warped_forest') == 1" - } - ], - "on_entry": ["/tag @s remove warped_forest"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('warped_forest') != 1" - } - ], - "on_entry": ["/tag @s add warped_forest"] - } - } - }, - "controller.animation.deep_dark": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('deep_dark') == 1" - } - ], - "on_entry": ["/tag @s remove deep_dark"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('deep_dark') != 1" - } - ], - "on_entry": ["/tag @s add deep_dark"] - } - } - }, - "controller.animation.lush_caves": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('lush_caves') == 1" - } - ], - "on_entry": ["/tag @s remove lush_caves"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('lush_caves') != 1" - } - ], - "on_entry": ["/tag @s add lush_caves"] - } - } - }, - "controller.animation.jagged_peaks": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('jagged_peaks') == 1" - } - ], - "on_entry": ["/tag @s remove jagged_peaks"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('jagged_peaks') != 1" - } - ], - "on_entry": ["/tag @s add jagged_peaks"] - } - } - }, - "controller.animation.dripstone_caves": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('dripstone_caves') == 1" - } - ], - "on_entry": ["/tag @s remove dripstone_caves"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('dripstone_caves') != 1" - } - ], - "on_entry": ["/tag @s add dripstone_caves"] - } - } - }, - "controller.animation.meadow": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('meadow') == 1" - } - ], - "on_entry": ["/tag @s remove meadow"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('meadow') != 1" - } - ], - "on_entry": ["/tag @s add meadow"] - } - } - }, - "controller.animation.mangrove_swamp": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('mangrove_swamp') == 1" - } - ], - "on_entry": ["/tag @s remove mangrove_swamp"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('mangrove_swamp') != 1" - } - ], - "on_entry": ["/tag @s add mangrove_swamp"] - } - } - }, - "controller.animation.cherry_grove": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('cherry_grove') == 1" - } - ], - "on_entry": ["/tag @s remove cherry_grove"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('cherry_grove') != 1" - } - ], - "on_entry": ["/tag @s add cherry_grove"] - } - } - }, - "controller.animation.roofed_forest": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('roofed') == 1 && query.biome_has_all_tags('mutated') == 0" - } - ], - "on_entry": ["/tag @s remove roofed_forest"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('roofed') == 0 || query.biome_has_all_tags('mutated') == 1" - } - ], - "on_entry": ["/tag @s add roofed_forest"] - } - } - }, - "controller.animation.grove": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('grove') == 1" - } - ], - "on_entry": ["/tag @s remove grove"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('grove') != 1" - } - ], - "on_entry": ["/tag @s add grove"] - } - } - }, - "controller.animation.stony_peaks": { - "initial_state": "not_in_biome", - "states": { - "not_in_biome": { - "transitions": [ - { - "in_biome": "query.biome_has_all_tags('stony_peaks') == 1" - } - ], - "on_entry": ["/tag @s remove stony_peaks"] - }, - "in_biome": { - "transitions": [ - { - "not_in_biome": "query.biome_has_all_tags('stony_peaks') == 0" - } - ], - "on_entry": ["/tag @s add stony_peaks"] - } - } - } - } -} diff --git a/build/animations/onTick.json b/build/animations/onTick.json deleted file mode 100644 index 527a012..0000000 --- a/build/animations/onTick.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "format_version": "1.10.0", - "animations": { - "animation.onTick": { - "timeline": { - "0.0": ["/gamerule functioncommandlimit 10000", "/function main"] - }, - "animation_length": 0.05, - "loop": true - } - } -} diff --git a/build/entities/agent.json b/build/entities/agent.json deleted file mode 100644 index 0e68781..0000000 --- a/build/entities/agent.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "format_version": "1.13.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "description": { - "identifier": "minecraft:agent", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - }, - "components": { - "minecraft:despawn": { - "remove_child_entities": true - } - } - } -} diff --git a/build/entities/allay.json b/build/entities/allay.json deleted file mode 100644 index cca131a..0000000 --- a/build/entities/allay.json +++ /dev/null @@ -1,266 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:allay", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "pickup_item_delay": { - "minecraft:timer": { - "looping": false, - "time": 3, - "time_down_event": { - "event": "pickup_item_delay_complete" - } - } - }, - "pickup_item": { - "minecraft:behavior.pickup_items": { - "priority": 2, - "max_dist": 32, - "search_height": 32, - "goal_radius": 2.2, - "speed_multiplier": 6, - "pickup_based_on_chance": false, - "can_pickup_any_item": false, - "can_pickup_to_hand_or_equipment": false, - "pickup_same_items_as_in_hand": true - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["allay", "mob"] - }, - "minecraft:collision_box": { - "width": 0.35, - "height": 0.6 - }, - "minecraft:balloonable": { - "mass": 0.5 - }, - "minecraft:breathable": { - "totalSupply": 15, - "suffocateTime": 0 - }, - "minecraft:nameable": {}, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:health": { - "value": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:damage_sensor": { - "triggers": [ - { - "on_damage": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_owner", - "subject": "other", - "value": true - } - ] - } - }, - "deals_damage": false - } - ] - }, - "minecraft:movement": { - "value": 0.1 - }, - "minecraft:flying_speed": { - "value": 0.1 - }, - "minecraft:navigation.hover": { - "can_path_over_water": true, - "can_sink": false, - "can_pass_doors": false, - "can_path_from_air": true, - "avoid_water": true, - "avoid_damage_blocks": true, - "avoid_sun": false - }, - "minecraft:movement.hover": {}, - "minecraft:follow_range": { - "value": 1024 - }, - "minecraft:ambient_sound_interval": { - "value": 5, - "range": 5, - "event_name": "ambient", - "event_names": [ - { - "event_name": "ambient.tame", - "condition": "query.is_using_item" - }, - { - "event_name": "ambient", - "condition": "!query.is_using_item" - } - ] - }, - "minecraft:jump.static": {}, - "minecraft:can_fly": {}, - "minecraft:physics": { - "has_gravity": false - }, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:vibration_listener": {}, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:game_event_movement_tracking": { - "emit_flap": true - }, - "minecraft:inventory": { - "inventory_size": 1 - }, - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneak_held", - "subject": "other", - "value": false - } - ] - } - }, - "give_item": true, - "take_item": true, - "interact_text": "action.interact.allay" - } - ] - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 2 - }, - "minecraft:behavior.go_and_give_items_to_noteblock": { - "priority": 3, - "run_speed": 8, - "throw_sound": "item_thrown", - "on_item_throw": [ - { - "event": "pickup_item_delay", - "target": "self" - } - ] - }, - "minecraft:behavior.go_and_give_items_to_owner": { - "priority": 4, - "run_speed": 8, - "throw_sound": "item_thrown", - "on_item_throw": [ - { - "event": "pickup_item_delay", - "target": "self" - } - ] - }, - "minecraft:behavior.stay_near_noteblock": { - "priority": 5, - "speed": 8, - "start_distance": 16, - "stop_distance": 4 - }, - "minecraft:behavior.follow_owner": { - "priority": 6, - "speed_multiplier": 8, - "start_distance": 16, - "stop_distance": 4, - "can_teleport": false, - "ignore_vibration": false - }, - "minecraft:behavior.float": { - "priority": 7 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "target_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:behavior.random_hover": { - "priority": 9, - "xz_dist": 8, - "y_dist": 8, - "y_offset": -1, - "interval": 1, - "hover_height": [1, 4] - } - }, - "events": { - "pickup_item_delay": { - "remove": { - "component_groups": ["pickup_item"] - }, - "add": { - "component_groups": ["pickup_item_delay"] - } - }, - "pickup_item_delay_complete": { - "remove": { - "component_groups": ["pickup_item_delay"] - }, - "add": { - "component_groups": ["pickup_item"] - } - }, - "minecraft:entity_spawned": { - "add": { - "component_groups": ["pickup_item"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/area_effect_cloud.json b/build/entities/area_effect_cloud.json deleted file mode 100644 index e72e37f..0000000 --- a/build/entities/area_effect_cloud.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "format_version": "1.8.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:area_effect_cloud", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:physics": { - "has_collision": false - }, - "minecraft:conditional_bandwidth_optimization": {} - } - } -} diff --git a/build/entities/armor_stand.json b/build/entities/armor_stand.json deleted file mode 100644 index def0beb..0000000 --- a/build/entities/armor_stand.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "format_version": "1.16.210", - "minecraft:entity": { - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:armor_stand", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:type_family": { - "family": ["armor_stand", "inanimate", "mob"] - }, - "minecraft:collision_box": { - "width": 0.5, - "height": 1.975 - }, - "minecraft:health": { - "value": 6, - "max": 6 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:knockback_resistance": { - "value": 1 - }, - "minecraft:loot": { - "table": "loot_tables/entities/armor_stand.json" - }, - "minecraft:nameable": {}, - "minecraft:persistent": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": false, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/arrow.json b/build/entities/arrow.json deleted file mode 100644 index e9902dc..0000000 --- a/build/entities/arrow.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "format_version": "1.13.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:arrow", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:hard_arrow": { - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": [1, 5], - "knockback": true, - "semi_random_diff_damage": false, - "destroy_on_hit": true - }, - "stick_in_ground": { - "shake_time": 0.35 - }, - "arrow_effect": {} - }, - "hit_sound": "bow.hit", - "power": 1.6, - "gravity": 0.05, - "uncertainty_base": 16, - "uncertainty_multiplier": 4, - "anchor": 1, - "should_bounce": true, - "offset": [0, -0.1, 0] - } - }, - "minecraft:player_arrow": { - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": 1, - "knockback": true, - "semi_random_diff_damage": true, - "destroy_on_hit": true, - "max_critical_damage": 10, - "min_critical_damage": 9, - "power_multiplier": 0.97 - }, - "stick_in_ground": { - "shake_time": 0.35 - }, - "arrow_effect": {} - }, - "hit_sound": "bow.hit", - "power": 5, - "gravity": 0.05, - "uncertainty_base": 1, - "uncertainty_multiplier": 0, - "anchor": 1, - "should_bounce": true, - "offset": [0, -0.1, 0] - } - }, - "minecraft:pillager_arrow": { - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": [3, 6], - "knockback": true, - "semi_random_diff_damage": false, - "destroy_on_hit": true - }, - "stick_in_ground": { - "shake_time": 0.35 - }, - "arrow_effect": {} - }, - "hit_sound": "bow.hit", - "power": 1.6, - "gravity": 0.05, - "uncertainty_base": 16, - "uncertainty_multiplier": 4, - "anchor": 1, - "should_bounce": true, - "offset": [0, -0.1, 0] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": [1, 4], - "knockback": true, - "semi_random_diff_damage": false, - "destroy_on_hit": true - }, - "stick_in_ground": { - "shake_time": 0.35 - }, - "arrow_effect": {} - }, - "hit_sound": "bow.hit", - "power": 1.6, - "gravity": 0.05, - "uncertainty_base": 16, - "uncertainty_multiplier": 4, - "anchor": 1, - "should_bounce": true, - "offset": [0, -0.1, 0] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": false, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "filters": { - "test": "is_difficulty", - "value": "hard" - }, - "add": { - "component_groups": ["minecraft:hard_arrow"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "add": { - "component_groups": ["minecraft:player_arrow"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "pillager" - }, - "add": { - "component_groups": ["minecraft:pillager_arrow"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/axolotl.json b/build/entities/axolotl.json deleted file mode 100644 index 58d9909..0000000 --- a/build/entities/axolotl.json +++ /dev/null @@ -1,480 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:axolotl", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "attack_cooldown": { - "minecraft:attack_cooldown": { - "attack_cooldown_time": 120, - "attack_cooldown_complete_event": { - "event": "attack_cooldown_complete_event", - "target": "self" - } - } - }, - "axolotl_lucy": { - "minecraft:variant": { - "value": 0 - } - }, - "axolotl_cyan": { - "minecraft:variant": { - "value": 1 - } - }, - "axolotl_gold": { - "minecraft:variant": { - "value": 2 - } - }, - "axolotl_wild": { - "minecraft:variant": { - "value": 3 - } - }, - "axolotl_blue": { - "minecraft:variant": { - "value": 4 - } - }, - "axolotl_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": "tropical_fish_bucket", - "transform_to_item": "water_bucket:0", - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 5, - "speed_multiplier": 1.1 - } - }, - "axolotl_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:behavior.breed": { - "priority": 1, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": false, - "breed_items": "tropical_fish_bucket", - "transform_to_item": "water_bucket:0", - "breeds_with": { - "mate_type": "minecraft:axolotl", - "baby_type": "minecraft:axolotl", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "mutation_factor": { - "variant": 0.00083 - } - } - }, - "axolotl_in_water": { - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "in_water", - "operator": "!=", - "value": true - }, - "event": "start_drying_out" - } - ] - } - }, - "axolotl_dried": { - "minecraft:damage_over_time": { - "damage_per_hurt": 1, - "time_between_hurt": 0 - } - }, - "axolotl_on_land": { - "minecraft:drying_out_timer": { - "total_time": 300, - "water_bottle_refill_time": 90, - "dried_out_event": { - "event": "dried_out" - }, - "stopped_drying_out_event": { - "event": "stop_drying_out" - }, - "recover_after_dried_out_event": { - "event": "recover_after_dried_out" - } - } - }, - "axolotl_on_land_in_rain": { - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "in_water_or_rain", - "operator": "!=", - "value": true - }, - "event": "start_drying_out" - }, - { - "filters": { - "test": "in_water", - "operator": "==", - "value": true - }, - "event": "enter_water" - } - ] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["axolotl", "mob"] - }, - "minecraft:collision_box": { - "width": 0.75, - "height": 0.42 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true, - "breathes_air": true, - "generates_bubbles": false - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 14 - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "lightning", - "deals_damage": true, - "damage_multiplier": 2000 - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": true, - "can_swim": true, - "can_walk": true, - "can_sink": false, - "avoid_damage_blocks": true - }, - "minecraft:movement.amphibious": { - "max_turn": 15 - }, - "minecraft:movement": { - "value": 0.1 - }, - "minecraft:underwater_movement": { - "value": 0.2 - }, - "minecraft:jump.static": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:attack": { - "damage": 2 - }, - "minecraft:combat_regeneration": {}, - "minecraft:behavior.play_dead": { - "priority": 0, - "duration": 10, - "force_below_health": 8, - "random_start_chance": 0.33, - "random_damage_range": [0, 2], - "damage_sources": ["contact", "entity_attack", "entity_explosion", "magic", "projectile", "thorns", "wither"], - "apply_regeneration": true, - "filters": { - "test": "in_water", - "operator": "==", - "value": true - } - }, - "minecraft:behavior.tempt": { - "priority": 2, - "speed_multiplier": 1.1, - "can_tempt_vertically": true, - "items": ["tropical_fish_bucket"] - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 3, - "must_see": true, - "reselect_targets": true, - "within_radius": 20, - "must_see_forget_duration": 17, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "in_water", - "subject": "other", - "value": true - }, - { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:attack_cooldown" - }, - { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "squid" - }, - { - "test": "is_family", - "subject": "other", - "value": "fish" - }, - { - "test": "is_family", - "subject": "other", - "value": "tadpole" - } - ] - } - ] - }, - "max_dist": 8 - }, - { - "filters": { - "all_of": [ - { - "test": "in_water", - "subject": "other", - "value": true - }, - { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "drowned" - }, - { - "test": "is_family", - "subject": "other", - "value": "guardian" - }, - { - "test": "is_family", - "subject": "other", - "value": "guardian_elder" - } - ] - } - ] - }, - "max_dist": 8 - } - ] - }, - "minecraft:behavior.melee_attack": { - "priority": 4, - "on_kill": { - "event": "killed_enemy_event", - "target": "self" - } - }, - "minecraft:behavior.move_to_water": { - "priority": 6, - "search_range": 16, - "search_height": 5, - "search_count": 1, - "goal_radius": 0.1 - }, - "minecraft:behavior.swim_idle": { - "priority": 7, - "idle_time": 5, - "success_rate": 0.05 - }, - "minecraft:behavior.random_swim": { - "priority": 8, - "interval": 0, - "xz_dist": 30, - "y_dist": 15 - }, - "minecraft:behavior.random_stroll": { - "priority": 9, - "interval": 100 - }, - "minecraft:behavior.look_at_player": { - "priority": 10, - "target_distance": 6, - "probability": 0.02 - } - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "add": { - "component_groups": ["axolotl_adult", "axolotl_in_water"] - } - }, - { - "randomize": [ - { - "weight": 25, - "add": { - "component_groups": ["axolotl_cyan"] - } - }, - { - "weight": 25, - "add": { - "component_groups": ["axolotl_gold"] - } - }, - { - "weight": 25, - "add": { - "component_groups": ["axolotl_lucy"] - } - }, - { - "weight": 25, - "add": { - "component_groups": ["axolotl_wild"] - } - } - ] - } - ] - }, - "attack_cooldown_complete_event": { - "remove": { - "component_groups": ["attack_cooldown"] - } - }, - "killed_enemy_event": { - "add": { - "component_groups": ["attack_cooldown"] - } - }, - "minecraft:entity_born": { - "sequence": [ - { - "remove": { - "component_groups": ["axolotl_adult"] - }, - "add": { - "component_groups": ["axolotl_baby", "axolotl_in_water"] - } - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "add": { - "component_groups": ["axolotl_blue"] - } - } - ] - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["axolotl_baby"] - }, - "add": { - "component_groups": ["axolotl_adult"] - } - }, - "stop_drying_out": { - "remove": { - "component_groups": ["axolotl_on_land", "axolotl_dried"] - }, - "add": { - "component_groups": ["axolotl_on_land_in_rain"] - } - }, - "start_drying_out": { - "remove": { - "component_groups": ["axolotl_on_land_in_rain", "axolotl_in_water"] - }, - "add": { - "component_groups": ["axolotl_on_land"] - } - }, - "dried_out": { - "add": { - "component_groups": ["axolotl_dried"] - } - }, - "recover_after_dried_out": { - "remove": { - "component_groups": ["axolotl_dried"] - } - }, - "enter_water": { - "remove": { - "component_groups": ["axolotl_on_land", "axolotl_on_land_in_rain", "axolotl_dried"] - }, - "add": { - "component_groups": ["axolotl_in_water"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/balloon.json b/build/entities/balloon.json deleted file mode 100644 index 9280962..0000000 --- a/build/entities/balloon.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "format_version": "1.8.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:balloon", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:despawn": { - "remove_child_entities": true - } - } - } -} diff --git a/build/entities/bat.json b/build/entities/bat.json deleted file mode 100644 index bfac9ee..0000000 --- a/build/entities/bat.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:bat", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["bat", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 0.5, - "height": 0.9 - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.1 - }, - "minecraft:navigation.float": { - "can_path_over_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.float_wander": { - "xz_dist": 10, - "y_dist": 7, - "y_offset": -2, - "random_reselect": true, - "float_duration": [0.1, 0.35] - }, - "minecraft:can_fly": {}, - "minecraft:health": { - "value": 6, - "max": 6 - }, - "minecraft:nameable": {}, - "minecraft:physics": {}, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:game_event_movement_tracking": { - "emit_flap": true - } - }, - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/bee.json b/build/entities/bee.json deleted file mode 100644 index b9b8e2f..0000000 --- a/build/entities/bee.json +++ /dev/null @@ -1,808 +0,0 @@ -{ - "format_version": "1.18.20", - "minecraft:entity": { - "description": { - "identifier": "minecraft:bee", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false, - "properties": { - "minecraft:has_nectar": { - "type": "bool", - "client_sync": true, - "default": "query.had_component_group('has_nectar')" - } - } - }, - "component_groups": { - "bee_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": [ - "minecraft:red_flower", - "minecraft:yellow_flower", - "minecraft:wither_rose", - "minecraft:double_plant:0", - "minecraft:double_plant:1", - "minecraft:double_plant:4", - "minecraft:double_plant:5", - "minecraft:flowering_azalea", - "minecraft:azalea_leaves_flowered", - "minecraft:mangrove_propagule", - "minecraft:pitcher_plant", - "minecraft:torchflower", - "minecraft:cherry_leaves", - "minecraft:pink_petals" - ], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 11, - "speed_multiplier": 1.1 - } - }, - "bee_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:behavior.breed": { - "priority": 4, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": false, - "breeds_with": { - "mate_type": "minecraft:bee", - "baby_type": "minecraft:bee", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "breed_items": [ - "minecraft:red_flower", - "minecraft:yellow_flower", - "minecraft:wither_rose", - "minecraft:double_plant:0", - "minecraft:double_plant:1", - "minecraft:double_plant:4", - "minecraft:double_plant:5", - "minecraft:flowering_azalea", - "minecraft:azalea_leaves_flowered", - "minecraft:mangrove_propagule", - "minecraft:pitcher_plant", - "minecraft:torchflower", - "minecraft:cherry_leaves", - "minecraft:pink_petals" - ] - } - }, - "track_attacker": { - "minecraft:behavior.hurt_by_target": { - "priority": 1 - } - }, - "angry_bee": { - "minecraft:angry": { - "duration": 25, - "broadcastAnger": true, - "broadcastRange": 20, - "broadcast_filters": { - "test": "is_family", - "operator": "!=", - "value": "pacified" - }, - "calm_event": { - "event": "calmed_down", - "target": "self" - } - }, - "minecraft:behavior.melee_attack": { - "priority": 2, - "attack_once": true, - "speed_multiplier": 1.4, - "on_attack": { - "event": "countdown_to_perish_event", - "target": "self" - } - } - }, - "escape_fire": { - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25, - "force": true - }, - "minecraft:timer": { - "looping": false, - "time": [20, 50], - "randomInterval": true, - "time_down_event": { - "event": "stop_panicking_after_fire", - "target": "self" - } - } - }, - "countdown_to_perish": { - "minecraft:mark_variant": { - "value": 1 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25, - "force": true - }, - "minecraft:timer": { - "looping": false, - "time": [10, 60], - "randomInterval": true, - "time_down_event": { - "event": "perish_event", - "target": "self" - } - }, - "minecraft:type_family": { - "family": ["bee", "mob", "arthropod", "pacified"] - } - }, - "perish": { - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "cause": "none", - "damage_per_tick": 999 - } - ] - } - }, - "take_nearest_target": { - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 10 - } - ] - }, - "minecraft:timer": { - "looping": true, - "time": 5, - "time_down_event": { - "event": "calmed_down", - "target": "self" - } - } - }, - "look_for_food": { - "minecraft:behavior.move_to_block": { - "priority": 10, - "tick_interval": 1, - "start_chance": 0.5, - "search_range": 6, - "search_height": 4, - "goal_radius": 1, - "stay_duration": 20, - "target_selection_method": "random", - "target_offset": [0, 0.25, 0], - "target_block_filters": { - "test": "is_waterlogged", - "subject": "block", - "operator": "==", - "value": false - }, - "target_blocks": [ - "minecraft:red_flower", - "minecraft:yellow_flower", - "minecraft:wither_rose", - "minecraft:double_plant:8", - "minecraft:double_plant:9", - "minecraft:double_plant:12", - "minecraft:double_plant:13", - "minecraft:flowering_azalea", - "minecraft:azalea_leaves_flowered", - "minecraft:mangrove_propagule", - "minecraft:pitcher_plant", - "minecraft:torchflower", - "minecraft:cherry_leaves", - "minecraft:pink_petals" - ], - "on_stay_completed": [ - { - "event": "collected_nectar", - "target": "self" - } - ] - }, - "minecraft:timer": { - "looping": true, - "time": 180, - "time_down_event": { - "event": "find_flower_timeout" - } - }, - "minecraft:ambient_sound_interval": { - "event_name": "ambient.pollinate", - "range": 3, - "value": 2 - } - }, - "has_nectar": { - "minecraft:grows_crop": { - "charges": 10, - "chance": 0.03 - } - }, - "return_to_home": { - "minecraft:behavior.go_home": { - "priority": 4, - "speed_multiplier": 1, - "interval": 1, - "goal_radius": 1.2, - "on_home": [ - { - "filters": { - "any_of": [ - { - "test": "is_block", - "subject": "block", - "value": "minecraft:bee_nest" - }, - { - "test": "is_block", - "subject": "block", - "value": "minecraft:beehive" - } - ] - }, - "event": "minecraft:bee_returned_to_hive", - "target": "block" - }, - { - "filters": { - "all_of": [ - { - "test": "is_block", - "subject": "block", - "operator": "!=", - "value": "minecraft:bee_nest" - }, - { - "test": "is_block", - "subject": "block", - "operator": "!=", - "value": "minecraft:beehive" - } - ] - }, - "event": "find_hive_event", - "target": "self" - } - ], - "on_failed": [ - { - "event": "find_hive_event", - "target": "self" - } - ] - } - }, - "find_hive": { - "minecraft:behavior.move_to_block": { - "priority": 10, - "search_range": 16, - "search_height": 10, - "tick_interval": 1, - "goal_radius": 0.633, - "target_blocks": ["bee_nest", "beehive"], - "on_reach": [ - { - "event": "minecraft:bee_returned_to_hive", - "target": "block" - } - ] - }, - "minecraft:timer": { - "looping": false, - "time": 180, - "time_down_event": { - "event": "find_hive_timeout", - "target": "self" - } - } - }, - "hive_full": { - "minecraft:timer": { - "looping": false, - "time": [5, 20], - "randomInterval": true, - "time_down_event": { - "event": "find_hive_event", - "target": "self" - } - } - }, - "shelter_detection": { - "minecraft:environment_sensor": { - "triggers": [ - { - "event": "seek_shelter", - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "is_daytime", - "value": false - }, - { - "test": "weather", - "operator": "==", - "value": "precipitation" - } - ] - }, - { - "test": "bool_property", - "domain": "minecraft:has_nectar", - "operator": "!=" - }, - { - "test": "has_biome_tag", - "value": "overworld" - } - ] - } - } - ] - } - }, - "abort_shelter_detection": { - "minecraft:environment_sensor": { - "triggers": [ - { - "event": "abort_sheltering", - "filters": { - "all_of": [ - { - "test": "weather", - "operator": "==", - "value": "clear" - }, - { - "test": "is_daytime", - "value": true - } - ] - } - } - ] - } - }, - "easy_attack": { - "minecraft:attack": { - "damage": 2 - } - }, - "normal_attack": { - "minecraft:attack": { - "damage": 2, - "effect_name": "poison", - "effect_duration": 10 - } - }, - "hard_attack": { - "minecraft:attack": { - "damage": 2, - "effect_name": "poison", - "effect_duration": 18 - } - }, - "default_sound": { - "minecraft:ambient_sound_interval": { - "event_name": "ambient", - "range": 0, - "value": 0 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 1.25, - "within_radius": 8, - "can_tempt_vertically": true, - "items": [ - "minecraft:red_flower", - "minecraft:yellow_flower", - "minecraft:wither_rose", - "minecraft:double_plant:0", - "minecraft:double_plant:1", - "minecraft:double_plant:4", - "minecraft:double_plant:5", - "minecraft:flowering_azalea", - "minecraft:azalea_leaves_flowered", - "minecraft:mangrove_propagule", - "minecraft:pitcher_plant", - "minecraft:torchflower", - "minecraft:cherry_leaves", - "minecraft:pink_petals" - ] - }, - "minecraft:behavior.move_towards_home_restriction": { - "priority": 9 - }, - "minecraft:behavior.random_hover": { - "priority": 12, - "xz_dist": 8, - "y_dist": 8, - "y_offset": -1, - "interval": 1, - "hover_height": [1, 4] - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 0.5 - }, - "minecraft:behavior.float": { - "priority": 19 - }, - "minecraft:type_family": { - "family": ["bee", "mob", "arthropod"] - }, - "minecraft:on_target_acquired": { - "event": "attacked", - "target": "self" - }, - "minecraft:breathable": { - "totalSupply": 15, - "suffocateTime": 0 - }, - "minecraft:collision_box": { - "width": 0.55, - "height": 0.5 - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:game_event_movement_tracking": { - "emit_flap": true - }, - "minecraft:home": { - "restriction_radius": 22, - "home_block_list": ["minecraft:bee_nest", "minecraft:beehive"] - }, - "minecraft:follow_range": { - "value": 1024 - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:flying_speed": { - "value": 0.15 - }, - "minecraft:navigation.hover": { - "can_path_over_water": true, - "can_sink": false, - "can_pass_doors": false, - "can_path_from_air": true, - "avoid_water": true, - "avoid_damage_blocks": true, - "avoid_sun": false - }, - "minecraft:movement.hover": {}, - "minecraft:jump.static": {}, - "minecraft:can_fly": {}, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:nameable": {}, - "minecraft:block_sensor": { - "sensor_radius": 16, - "sources": [ - { - "test": "has_silk_touch", - "subject": "other", - "value": false - } - ], - "on_break": [ - { - "block_list": ["minecraft:beehive", "minecraft:bee_nest"], - "on_block_broken": "hive_destroyed" - } - ] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - } - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 95, - "add": { - "component_groups": ["bee_adult"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["bee_baby"] - } - } - ] - }, - { - "add": { - "component_groups": ["track_attacker", "shelter_detection", "look_for_food"] - } - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["bee_baby", "shelter_detection", "track_attacker", "look_for_food"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["bee_baby"] - }, - "add": { - "component_groups": ["bee_adult"] - } - }, - "minecraft:exited_disturbed_hive": { - "add": { - "component_groups": ["take_nearest_target"] - }, - "remove": { - "component_groups": ["find_hive", "return_to_home", "has_nectar", "abort_shelter_detection", "shelter_detection", "escape_fire"] - }, - "set_property": { - "minecraft:has_nectar": false - } - }, - "hive_destroyed": { - "sequence": [ - { - "filters": { - "test": "is_family", - "subject": "self", - "operator": "!=", - "value": "pacified" - }, - "add": { - "component_groups": ["take_nearest_target"] - }, - "remove": { - "component_groups": ["escape_fire"] - } - } - ] - }, - "stop_panicking_after_fire": { - "remove": { - "component_groups": ["escape_fire"] - } - }, - "minecraft:exited_hive_on_fire": { - "add": { - "component_groups": ["escape_fire"] - } - }, - "minecraft:exited_hive": { - "add": { - "component_groups": ["look_for_food", "shelter_detection"] - }, - "remove": { - "component_groups": ["find_hive", "return_to_home", "has_nectar", "abort_shelter_detection"] - }, - "set_property": { - "minecraft:has_nectar": false - } - }, - "minecraft:hive_full": { - "add": { - "component_groups": ["hive_full"] - }, - "remove": { - "component_groups": ["find_hive", "return_to_home"] - } - }, - "attacked": { - "sequence": [ - { - "add": { - "component_groups": ["angry_bee"] - }, - "remove": { - "component_groups": ["take_nearest_target"] - } - }, - { - "filters": { - "test": "is_difficulty", - "value": "easy" - }, - "remove": { - "component_groups": ["normal_attack", "hard_attack"] - }, - "add": { - "component_groups": ["easy_attack"] - } - }, - { - "filters": { - "test": "is_difficulty", - "value": "normal" - }, - "remove": { - "component_groups": ["easy_attack", "hard_attack"] - }, - "add": { - "component_groups": ["normal_attack"] - } - }, - { - "filters": { - "test": "is_difficulty", - "value": "hard" - }, - "remove": { - "component_groups": ["easy_attack", "normal_attack"] - }, - "add": { - "component_groups": ["hard_attack"] - } - } - ] - }, - "calmed_down": { - "add": { - "component_groups": ["shelter_detection", "return_to_home"] - }, - "remove": { - "component_groups": ["angry_bee", "take_nearest_target"] - } - }, - "collected_nectar": { - "remove": { - "component_groups": ["look_for_food"] - }, - "add": { - "component_groups": ["return_to_home", "has_nectar", "default_sound"] - }, - "set_property": { - "minecraft:has_nectar": true - } - }, - "find_hive_event": { - "remove": { - "component_groups": ["return_to_home", "hive_full"] - }, - "add": { - "component_groups": ["find_hive"] - } - }, - "find_hive_timeout": { - "sequence": [ - { - "filters": { - "test": "bool_property", - "operator": "!=", - "domain": "minecraft:has_nectar" - }, - "remove": { - "component_groups": ["find_hive", "escape_fire"] - }, - "add": { - "component_groups": ["look_for_food"] - } - }, - { - "filters": { - "test": "bool_property", - "domain": "minecraft:has_nectar" - }, - "remove": { - "component_groups": ["find_hive"] - }, - "add": { - "component_groups": ["return_to_home"] - } - } - ] - }, - "find_flower_timeout": { - "remove": { - "component_groups": ["look_for_food"] - }, - "add": { - "component_groups": ["return_to_home"] - } - }, - "seek_shelter": { - "remove": { - "component_groups": ["look_for_food", "collect_nectar", "shelter_detection"] - }, - "add": { - "component_groups": ["default_sound", "return_to_home", "abort_shelter_detection"] - } - }, - "abort_sheltering": { - "remove": { - "component_groups": ["abort_shelter_detection", "return_to_home", "escape_fire"] - }, - "add": { - "component_groups": ["shelter_detection", "look_for_food"] - } - }, - "countdown_to_perish_event": { - "remove": { - "component_groups": ["collect_nectar", "track_attacker", "take_nearest_target", "look_for_food", "angry_bee", "hive_full", "find_hive", "escape_fire"] - }, - "add": { - "component_groups": ["countdown_to_perish"] - } - }, - "perish_event": { - "add": { - "component_groups": ["perish"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/blaze.json b/build/entities/blaze.json deleted file mode 100644 index 266ebb7..0000000 --- a/build/entities/blaze.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:blaze", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "mode_switcher": { - "minecraft:target_nearby_sensor": { - "inside_range": 2, - "outside_range": 3, - "must_see": true, - "on_inside_range": { - "event": "switch_to_melee", - "target": "self" - }, - "on_outside_range": { - "event": "switch_to_ranged", - "target": "self" - } - } - }, - "ranged_mode": { - "minecraft:shooter": { - "def": "minecraft:small_fireball" - }, - "minecraft:behavior.ranged_attack": { - "priority": 3, - "burst_shots": 3, - "burst_interval": 0.3, - "charge_charged_trigger": 0, - "charge_shoot_trigger": 4, - "attack_interval_min": 3, - "attack_interval_max": 5, - "attack_radius": 16 - } - }, - "melee_mode": { - "minecraft:attack": { - "damage": 6 - }, - "minecraft:behavior.melee_attack": { - "priority": 3 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 10 : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/blaze.json" - }, - "minecraft:collision_box": { - "width": 0.5, - "height": 1.8 - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:movement": { - "value": 0.23 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_contact_with_water", - "operator": "==", - "value": true - }, - "cause": "drowning", - "damage_per_tick": 1 - } - ] - }, - "minecraft:follow_range": { - "value": 48, - "max": 48 - }, - "minecraft:fire_immune": {}, - "minecraft:nameable": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 48 - } - ] - }, - "minecraft:behavior.random_stroll": { - "priority": 4, - "speed_multiplier": 1 - }, - "minecraft:behavior.random_look_around": { - "priority": 5 - }, - "minecraft:type_family": { - "family": ["blaze", "monster", "mob"] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:on_hurt": { - "event": "minecraft:on_hurt_event", - "target": "self" - }, - "minecraft:on_hurt_by_player": { - "event": "minecraft:on_hurt_event", - "target": "self" - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["mode_switcher"] - } - }, - "switch_to_melee": { - "remove": { - "component_groups": ["ranged_mode"] - }, - "add": { - "component_groups": ["melee_mode"] - } - }, - "switch_to_ranged": { - "remove": { - "component_groups": ["melee_mode"] - }, - "add": { - "component_groups": ["ranged_mode"] - } - }, - "minecraft:on_hurt_event": { - "add": { - "component_groups": ["mode_switcher"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/boat.json b/build/entities/boat.json deleted file mode 100644 index dd90cce..0000000 --- a/build/entities/boat.json +++ /dev/null @@ -1,317 +0,0 @@ -{ - "format_version": "1.19.80", - "minecraft:entity": { - "description": { - "identifier": "minecraft:boat", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:floating": { - "minecraft:buoyant": { - "base_buoyancy": 1, - "apply_gravity": true, - "simulate_waves": true, - "big_wave_probability": 0.03, - "big_wave_speed": 10, - "liquid_blocks": ["minecraft:water", "minecraft:flowing_water"] - } - }, - "minecraft:can_ride_default": { - "minecraft:rideable": { - "seat_count": 2, - "passenger_max_width": 1.375, - "interact_text": "action.interact.ride.boat", - "pull_in_entities": true, - "seats": [ - { - "position": [0, -0.2, 0], - "min_rider_count": 0, - "max_rider_count": 1, - "rotate_rider_by": -90, - "lock_rider_rotation": 90 - }, - { - "position": [0.2, -0.2, 0], - "min_rider_count": 2, - "max_rider_count": 2, - "rotate_rider_by": "query.has_any_family('blaze', 'creeper', 'enderman', 'illager', 'magmacube', 'piglin', 'player', 'skeleton', 'slime', 'villager', 'wandering_trader', 'witch', 'zombie', 'zombie_pigman') ? -90 : 0", - "lock_rider_rotation": 90 - }, - { - "position": [-0.6, -0.2, 0], - "min_rider_count": 2, - "max_rider_count": 2, - "rotate_rider_by": "query.has_any_family('blaze', 'creeper', 'enderman', 'illager', 'magmacube', 'piglin', 'player', 'skeleton', 'slime', 'villager', 'wandering_trader', 'witch', 'zombie', 'zombie_pigman') ? -90 : 0", - "lock_rider_rotation": 90 - } - ] - } - }, - "minecraft:can_ride_bamboo": { - "minecraft:rideable": { - "seat_count": 2, - "passenger_max_width": 1.375, - "interact_text": "action.interact.ride.boat", - "pull_in_entities": true, - "seats": [ - { - "position": [0, 0.1, 0], - "min_rider_count": 0, - "max_rider_count": 1, - "rotate_rider_by": -90, - "lock_rider_rotation": 90 - }, - { - "position": [0.2, 0.1, 0], - "min_rider_count": 2, - "max_rider_count": 2, - "rotate_rider_by": "query.has_any_family('blaze', 'creeper', 'enderman', 'illager', 'magmacube', 'piglin', 'player', 'skeleton', 'slime', 'villager', 'wandering_trader', 'witch', 'zombie', 'zombie_pigman') ? -90 : 0", - "lock_rider_rotation": 90 - }, - { - "position": [-0.6, 0.1, 0], - "min_rider_count": 2, - "max_rider_count": 2, - "rotate_rider_by": "query.has_any_family('blaze', 'creeper', 'enderman', 'illager', 'magmacube', 'piglin', 'player', 'skeleton', 'slime', 'villager', 'wandering_trader', 'witch', 'zombie', 'zombie_pigman') ? -90 : 0", - "lock_rider_rotation": 90 - } - ] - } - }, - "minecraft:above_bubble_column_down": { - "minecraft:buoyant": { - "base_buoyancy": 1, - "apply_gravity": true, - "simulate_waves": false, - "liquid_blocks": ["minecraft:water", "minecraft:flowing_water"], - "drag_down_on_buoyancy_removed": 0.7 - }, - "minecraft:timer": { - "looping": false, - "time": 3, - "time_down_event": { - "event": "minecraft:sink", - "target": "self" - } - }, - "minecraft:out_of_control": {} - }, - "minecraft:above_bubble_column_up": { - "minecraft:buoyant": { - "base_buoyancy": 1, - "apply_gravity": true, - "simulate_waves": false, - "liquid_blocks": ["minecraft:water", "minecraft:flowing_water"], - "drag_down_on_buoyancy_removed": 0.7 - }, - "minecraft:out_of_control": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:type_family": { - "family": ["boat", "inanimate"] - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 0.455 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/boat.json" - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:is_stackable": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:buoyant": { - "base_buoyancy": 1, - "apply_gravity": true, - "simulate_waves": true, - "big_wave_probability": 0.03, - "big_wave_speed": 10, - "liquid_blocks": ["minecraft:water", "minecraft:flowing_water"] - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 60, - "max_dropped_ticks": 20, - "use_motion_prediction_hints": true - }, - "conditional_values": [ - { - "max_optimized_distance": 0, - "max_dropped_ticks": 0, - "use_motion_prediction_hints": true, - "conditional_values": [ - { - "test": "is_moving", - "subject": "self", - "operator": "==", - "value": true - } - ] - } - ] - }, - "minecraft:inside_block_notifier": { - "block_list": [ - { - "block": { - "name": "minecraft:bubble_column", - "states": { - "drag_down": true - } - }, - "entered_block_event": { - "event": "minecraft:entered_bubble_column_down", - "target": "self" - }, - "exited_block_event": { - "event": "minecraft:exited_bubble_column", - "target": "self" - } - }, - { - "block": { - "name": "minecraft:bubble_column", - "states": { - "drag_down": false - } - }, - "entered_block_event": { - "event": "minecraft:entered_bubble_column_up", - "target": "self" - }, - "exited_block_event": { - "event": "minecraft:exited_bubble_column", - "target": "self" - } - } - ] - }, - "minecraft:rideable": { - "seat_count": 2, - "passenger_max_width": 1.375, - "interact_text": "action.interact.ride.boat", - "pull_in_entities": true, - "seats": [ - { - "position": [0, -0.2, 0], - "min_rider_count": 0, - "max_rider_count": 1, - "rotate_rider_by": -90, - "lock_rider_rotation": 90 - }, - { - "position": [0.2, -0.2, 0], - "min_rider_count": 2, - "max_rider_count": 2, - "rotate_rider_by": "query.has_any_family('blaze', 'creeper', 'enderman', 'illager', 'magmacube', 'piglin', 'player', 'skeleton', 'slime', 'villager', 'wandering_trader', 'witch', 'zombie', 'zombie_pigman') ? -90 : 0", - "lock_rider_rotation": 90 - }, - { - "position": [-0.6, -0.2, 0], - "min_rider_count": 2, - "max_rider_count": 2, - "rotate_rider_by": "query.has_any_family('blaze', 'creeper', 'enderman', 'illager', 'magmacube', 'piglin', 'player', 'skeleton', 'slime', 'villager', 'wandering_trader', 'witch', 'zombie', 'zombie_pigman') ? -90 : 0", - "lock_rider_rotation": 90 - } - ] - } - }, - "events": { - "minecraft:entity_spawned": { - "trigger": "minecraft:add_can_ride" - }, - "minecraft:add_can_ride": { - "sequence": [ - { - "filters": { - "test": "is_variant", - "subject": "self", - "operator": "!=", - "value": 7 - }, - "add": { - "component_groups": ["minecraft:can_ride_default"] - } - }, - { - "filters": { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 7 - }, - "add": { - "component_groups": ["minecraft:can_ride_bamboo"] - } - } - ] - }, - "minecraft:entered_bubble_column_down": { - "remove": { - "component_groups": ["minecraft:floating"] - }, - "add": { - "component_groups": ["minecraft:above_bubble_column_down"] - } - }, - "minecraft:entered_bubble_column_up": { - "remove": { - "component_groups": ["minecraft:floating"] - }, - "add": { - "component_groups": ["minecraft:above_bubble_column_up"] - } - }, - "minecraft:exited_bubble_column": { - "remove": { - "component_groups": ["minecraft:above_bubble_column_down", "minecraft:above_bubble_column_up"] - }, - "add": { - "component_groups": ["minecraft:floating"] - }, - "trigger": "minecraft:add_can_ride" - }, - "minecraft:sink": { - "remove": { - "component_groups": ["minecraft:floating", "minecraft:can_ride_default", "minecraft:can_ride_bamboo", "minecraft:above_bubble_column_down", "minecraft:above_bubble_column_up"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/camel.json b/build/entities/camel.json deleted file mode 100644 index 476d0e5..0000000 --- a/build/entities/camel.json +++ /dev/null @@ -1,330 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:camel", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:camel_saddled": { - "minecraft:is_saddled": {}, - "minecraft:input_ground_controlled": {}, - "minecraft:dash": { - "cooldown_time": 2.75, - "horizontal_momentum": 20, - "vertical_momentum": 0.6 - }, - "minecraft:behavior.player_ride_tamed": {} - }, - "minecraft:camel_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.45 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": "cactus", - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 5, - "speed_multiplier": 2.5 - } - }, - "minecraft:camel_adult": { - "minecraft:inventory": { - "container_type": "horse" - }, - "minecraft:equippable": { - "slots": [ - { - "slot": 0, - "item": "saddle", - "accepted_items": ["saddle"], - "on_equip": { - "event": "minecraft:camel_saddled" - }, - "on_unequip": { - "event": "minecraft:camel_unsaddled" - } - } - ] - }, - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "saddle", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "operator": "not", - "value": "saddle" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "saddle" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneak_held", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 0, - "interact_text": "action.interact.saddle" - } - ] - }, - "minecraft:behavior.breed": { - "priority": 2, - "speed_multiplier": 1 - }, - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:breedable": { - "require_tame": false, - "breeds_with": [ - { - "mate_type": "minecraft:camel", - "baby_type": "minecraft:camel", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - } - ], - "breed_items": ["cactus"] - }, - "minecraft:rideable": { - "seat_count": 2, - "crouching_skip_interact": true, - "pull_in_entities": true, - "family_types": ["player"], - "interact_text": "action.interact.ride.horse", - "seats": [ - { - "min_rider_count": 0, - "max_rider_count": 2, - "position": [0, 1.905, 0.5] - }, - { - "min_rider_count": 1, - "max_rider_count": 2, - "position": [0, 1.905, -0.5] - } - ] - } - }, - "minecraft:camel_standing": { - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:collision_box": { - "width": 1.7, - "height": 2.375 - } - }, - "minecraft:camel_sitting": { - "minecraft:persist_sit": {}, - "minecraft:pushable": { - "is_pushable": false, - "is_pushable_by_piston": true - }, - "minecraft:collision_box": { - "width": 1.7, - "height": 0.945 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_tamed": {}, - "minecraft:healable": { - "items": [ - { - "item": "cactus", - "heal_amount": 2 - } - ] - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:type_family": { - "family": ["camel", "mob"] - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 32 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:movement": { - "value": 0.09 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:physics": {}, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:behavior.float": { - "priority": 0, - "sink_with_passengers": true - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 4 - }, - "minecraft:behavior.tempt": { - "priority": 3, - "speed_multiplier": 2.5, - "can_tempt_vertically": true, - "items": ["cactus"] - }, - "minecraft:behavior.random_look_around_and_sit": { - "priority": 4, - "continue_if_leashed": true, - "min_look_count": 2, - "max_look_count": 5, - "min_look_time": 80, - "max_look_time": 100, - "min_angle_of_view_horizontal": -30, - "max_angle_of_view_horizontal": 30, - "random_look_around_cooldown": 5, - "probability": 0.001 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 2 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "target_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:variable_max_auto_step": { - "base_value": 1.5625, - "controlled_value": 1.5625, - "jump_prevented_value": 0.5625 - } - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "trigger": "minecraft:spawn_adult" - }, - { - "weight": 5, - "trigger": "minecraft:entity_born" - } - ] - }, - "minecraft:spawn_adult": { - "add": { - "component_groups": ["minecraft:camel_adult", "minecraft:camel_standing"] - } - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:camel_baby", "minecraft:camel_standing"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:camel_baby"] - }, - "add": { - "component_groups": ["minecraft:camel_adult"] - } - }, - "minecraft:camel_saddled": { - "add": { - "component_groups": ["minecraft:camel_saddled"] - } - }, - "minecraft:camel_unsaddled": { - "remove": { - "component_groups": ["minecraft:camel_saddled"] - } - }, - "minecraft:start_sitting": { - "add": { - "component_groups": ["minecraft:camel_sitting"] - }, - "remove": { - "component_groups": ["minecraft:camel_standing"] - } - }, - "minecraft:stop_sitting": { - "add": { - "component_groups": ["minecraft:camel_standing"] - }, - "remove": { - "component_groups": ["minecraft:camel_sitting"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/cat.json b/build/entities/cat.json deleted file mode 100644 index 6c0713d..0000000 --- a/build/entities/cat.json +++ /dev/null @@ -1,639 +0,0 @@ -{ - "format_version": "1.18.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:cat", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:cat_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.4 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["fish", "salmon"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - } - }, - "minecraft:cat_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/cat.json" - }, - "minecraft:scale": { - "value": 0.8 - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": true, - "require_full_health": true, - "allow_sitting": true, - "breeds_with": { - "mate_type": "minecraft:cat", - "baby_type": "minecraft:cat", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "breed_items": ["fish", "salmon"] - } - }, - "minecraft:cat_wild": { - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:tameable": { - "probability": 0.33, - "tame_items": ["fish", "salmon"], - "tame_event": { - "event": "minecraft:on_tame", - "target": "self" - } - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.35, 0] - } - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 1, - "reselect_targets": true, - "within_radius": 16, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "rabbit" - }, - "max_dist": 8 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 8 - } - ] - }, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 0.5, - "within_radius": 16, - "can_get_scared": true, - "items": ["fish", "salmon"] - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 6, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 10, - "walk_speed_multiplier": 0.8, - "sprint_speed_multiplier": 1.33 - } - ] - }, - "minecraft:behavior.move_towards_dwelling_restriction": { - "priority": 7 - } - }, - "minecraft:cat_tame": { - "minecraft:is_tamed": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:color": { - "value": 14 - }, - "minecraft:sittable": {}, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 0.5, - "within_radius": 16, - "items": ["fish", "salmon"] - }, - "minecraft:is_dyeable": { - "interact_text": "action.interact.dye" - }, - "minecraft:behavior.follow_owner": { - "priority": 4, - "speed_multiplier": 1, - "start_distance": 10, - "stop_distance": 2 - }, - "minecraft:behavior.stay_while_sitting": { - "priority": 3 - }, - "minecraft:behavior.ocelot_sit_on_block": { - "priority": 7, - "speed_multiplier": 1 - }, - "minecraft:behavior.pet_sleep_with_owner": { - "priority": 2, - "speed_multiplier": 1.2, - "search_radius": 10, - "search_height": 10, - "goal_radius": 1 - }, - "minecraft:on_wake_with_owner": { - "event": "minecraft:pet_slept_with_owner", - "target": "self" - } - }, - "minecraft:cat_gift_for_owner": { - "minecraft:behavior.drop_item_for": { - "priority": 1, - "seconds_before_pickup": 0, - "cooldown": 0.25, - "drop_item_chance": 0.7, - "offering_distance": 5, - "minimum_teleport_distance": 2, - "max_head_look_at_height": 10, - "target_range": [5, 5, 5], - "teleport_offset": [0, 1, 0], - "time_of_day_range": [0.74999, 0.8], - "speed_multiplier": 1, - "search_range": 5, - "search_height": 2, - "search_count": 0, - "goal_radius": 1, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 6 - } - ], - "loot_table": "loot_tables/entities/cat_gift.json", - "on_drop_attempt": { - "event": "minecraft:cat_gifted_owner", - "target": "self" - } - } - }, - "minecraft:cat_white": { - "minecraft:variant": { - "value": 0 - } - }, - "minecraft:cat_tuxedo": { - "minecraft:variant": { - "value": 1 - } - }, - "minecraft:cat_red": { - "minecraft:variant": { - "value": 2 - } - }, - "minecraft:cat_siamese": { - "minecraft:variant": { - "value": 3 - } - }, - "minecraft:cat_british": { - "minecraft:variant": { - "value": 4 - } - }, - "minecraft:cat_calico": { - "minecraft:variant": { - "value": 5 - } - }, - "minecraft:cat_persian": { - "minecraft:variant": { - "value": 6 - } - }, - "minecraft:cat_ragdoll": { - "minecraft:variant": { - "value": 7 - } - }, - "minecraft:cat_tabby": { - "minecraft:variant": { - "value": 8 - } - }, - "minecraft:cat_black": { - "minecraft:variant": { - "value": 9 - } - }, - "minecraft:cat_jellie": { - "minecraft:variant": { - "value": 10 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 0.6 - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:attack_damage": { - "value": 4 - }, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["cat", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 0.7 - }, - "minecraft:healable": { - "items": [ - { - "item": "fish", - "heal_amount": 2 - }, - { - "item": "salmon", - "heal_amount": 2 - } - ] - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:navigation.walk": { - "can_float": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "passive", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": false, - "can_migrate": true, - "first_founding_reward": 0 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25 - }, - "minecraft:behavior.mount_pathing": { - "priority": 1, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.leap_at_target": { - "priority": 3, - "target_dist": 0.3 - }, - "minecraft:behavior.ocelotattack": { - "priority": 4, - "cooldown_time": 1, - "x_max_rotation": 30, - "y_max_head_rotation": 30, - "max_distance": 15, - "max_sneak_range": 15, - "max_sprint_range": 4, - "reach_multiplier": 2, - "sneak_speed_multiplier": 0.6, - "sprint_speed_multiplier": 1.33, - "walk_speed_multiplier": 0.8 - }, - "minecraft:behavior.random_stroll": { - "priority": 8, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.look_at_player": { - "priority": 9 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 3, - "remove": {}, - "add": { - "component_groups": ["minecraft:cat_adult", "minecraft:cat_wild"] - } - }, - { - "weight": 1, - "remove": {}, - "add": { - "component_groups": ["minecraft:cat_baby", "minecraft:cat_wild"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_white"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_tuxedo"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_red"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_siamese"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_british"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_calico"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_persian"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_ragdoll"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_tabby"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_black"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_jellie"] - } - } - ] - } - ] - }, - "minecraft:spawn_from_village": { - "sequence": [ - { - "randomize": [ - { - "weight": 3, - "remove": {}, - "add": { - "component_groups": ["minecraft:cat_adult", "minecraft:cat_wild"] - } - }, - { - "weight": 1, - "remove": {}, - "add": { - "component_groups": ["minecraft:cat_baby", "minecraft:cat_wild"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_tuxedo"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_red"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_siamese"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_white"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_british"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_calico"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_persian"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_ragdoll"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_tabby"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["minecraft:cat_jellie"] - } - } - ] - } - ] - }, - "minecraft:spawn_midnight_cat": { - "sequence": [ - { - "add": { - "component_groups": ["minecraft:cat_adult", "minecraft:cat_wild", "minecraft:cat_black"] - } - } - ] - }, - "minecraft:entity_born": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "remove": {}, - "add": { - "component_groups": ["minecraft:cat_baby", "minecraft:cat_tame"] - } - } - ] - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:cat_baby"] - }, - "add": { - "component_groups": ["minecraft:cat_adult"] - } - }, - "minecraft:on_tame": { - "sequence": [ - { - "remove": { - "component_groups": ["minecraft:cat_wild"] - } - }, - { - "add": { - "component_groups": ["minecraft:cat_tame"] - } - } - ] - }, - "minecraft:pet_slept_with_owner": { - "add": { - "component_groups": ["minecraft:cat_gift_for_owner"] - } - }, - "minecraft:cat_gifted_owner": { - "remove": { - "component_groups": ["minecraft:cat_gift_for_owner"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/cave_spider.json b/build/entities/cave_spider.json deleted file mode 100644 index 70732bd..0000000 --- a/build/entities/cave_spider.json +++ /dev/null @@ -1,467 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:cave_spider", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:spider_jockey": { - "minecraft:addrider": { - "entity_type": "minecraft:skeleton" - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["skeleton"], - "seats": { - "position": [0, 0.3, -0.1] - } - } - }, - "minecraft:spider_stray_jockey": { - "minecraft:addrider": { - "entity_type": "minecraft:skeleton.stray" - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["skeleton"], - "seats": { - "position": [0, 0.3, -0.1] - } - } - }, - "minecraft:spider_wither_jockey": { - "minecraft:addrider": { - "entity_type": "minecraft:skeleton.wither" - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["skeleton"], - "seats": { - "position": [0, 0.25, -0.1] - } - } - }, - "minecraft:spider_neutral": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_brightness", - "operator": "<", - "value": 0.49 - }, - "event": "minecraft:become_hostile" - } - }, - "minecraft:on_target_acquired": { - "event": "minecraft:become_angry" - } - }, - "minecraft:spider_hostile": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_brightness", - "operator": ">", - "value": 0.49 - }, - "event": "minecraft:become_neutral" - } - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "attack_interval": 5, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.leap_at_target": { - "priority": 4, - "yd": 0.4, - "must_be_on_ground": false - }, - "minecraft:behavior.melee_attack": { - "priority": 3, - "track_target": true, - "random_stop_interval": 100, - "reach_multiplier": 0.8 - } - }, - "minecraft:spider_angry": { - "minecraft:angry": { - "duration": 10, - "duration_delta": 3, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "attack_interval": 10, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.leap_at_target": { - "priority": 4, - "yd": 0.4, - "must_be_on_ground": false - }, - "minecraft:behavior.melee_attack": { - "priority": 3, - "track_target": true, - "reach_multiplier": 1.4 - } - }, - "minecraft:spider_poison_easy": { - "minecraft:attack": { - "damage": 2, - "effect_name": "poison", - "effect_duration": 0 - } - }, - "minecraft:spider_poison_normal": { - "minecraft:attack": { - "damage": 2, - "effect_name": "poison", - "effect_duration": 7 - } - }, - "minecraft:spider_poison_hard": { - "minecraft:attack": { - "damage": 2, - "effect_name": "poison", - "effect_duration": 15 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:type_family": { - "family": ["cavespider", "monster", "arthropod", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:loot": { - "table": "loot_tables/entities/spider.json" - }, - "minecraft:collision_box": { - "width": 0.7, - "height": 0.5 - }, - "minecraft:health": { - "value": 12, - "max": 12 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:navigation.climb": { - "can_path_over_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 1 - }, - "minecraft:behavior.mount_pathing": { - "priority": 5, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 7 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.3, 0] - } - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 1, - "randomize": [ - { - "weight": 80, - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": false - }, - { - "test": "is_snow_covered", - "value": true - }, - { - "test": "is_underground", - "value": false - } - ] - }, - "remove": {}, - "add": { - "component_groups": ["minecraft:spider_stray_jockey", "minecraft:spider_neutral"] - } - }, - { - "weight": 80, - "filters": { - "test": "is_biome", - "value": "the_nether" - }, - "remove": {}, - "add": { - "component_groups": ["minecraft:spider_wither_jockey", "minecraft:spider_neutral"] - } - }, - { - "weight": 20, - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": false - }, - { - "test": "is_underground", - "value": true - } - ] - }, - "remove": {}, - "add": { - "component_groups": ["minecraft:spider_jockey", "minecraft:spider_neutral"] - } - } - ] - }, - { - "weight": 99, - "remove": {}, - "add": { - "component_groups": ["minecraft:spider_neutral"] - } - } - ] - }, - "minecraft:become_hostile": { - "sequence": [ - { - "remove": { - "component_groups": ["minecraft:spider_neutral"] - }, - "add": { - "component_groups": ["minecraft:spider_hostile"] - } - }, - { - "filters": { - "test": "is_difficulty", - "value": "easy" - }, - "remove": { - "component_groups": ["minecraft:spider_poison_hard", "minecraft:spider_poison_normal"] - }, - "add": { - "component_groups": ["minecraft:spider_poison_easy"] - } - }, - { - "filters": { - "test": "is_difficulty", - "value": "normal" - }, - "remove": { - "component_groups": ["minecraft:spider_poison_easy", "minecraft:spider_poison_hard"] - }, - "add": { - "component_groups": ["minecraft:spider_poison_normal"] - } - }, - { - "filters": { - "test": "is_difficulty", - "value": "hard" - }, - "remove": { - "component_groups": ["minecraft:spider_poison_easy", "minecraft:spider_poison_normal"] - }, - "add": { - "component_groups": ["minecraft:spider_poison_hard"] - } - } - ] - }, - "minecraft:become_neutral": { - "remove": { - "component_groups": ["minecraft:spider_hostile"] - }, - "add": { - "component_groups": ["minecraft:spider_neutral"] - } - }, - "minecraft:become_angry": { - "sequence": [ - { - "remove": { - "component_groups": ["minecraft:spider_neutral"] - }, - "add": { - "component_groups": ["minecraft:spider_angry"] - } - }, - { - "filters": { - "test": "is_difficulty", - "value": "easy" - }, - "remove": { - "component_groups": ["minecraft:spider_poison_hard", "minecraft:spider_poison_normal"] - }, - "add": { - "component_groups": ["minecraft:spider_poison_easy"] - } - }, - { - "filters": { - "test": "is_difficulty", - "value": "normal" - }, - "remove": { - "component_groups": ["minecraft:spider_poison_easy", "minecraft:spider_poison_hard"] - }, - "add": { - "component_groups": ["minecraft:spider_poison_normal"] - } - }, - { - "filters": { - "test": "is_difficulty", - "value": "hard" - }, - "remove": { - "component_groups": ["minecraft:spider_poison_easy", "minecraft:spider_poison_normal"] - }, - "add": { - "component_groups": ["minecraft:spider_poison_hard"] - } - } - ] - }, - "minecraft:on_calm": { - "remove": { - "component_groups": ["minecraft:spider_angry"] - }, - "add": { - "component_groups": ["minecraft:spider_neutral"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/chest_boat.json b/build/entities/chest_boat.json deleted file mode 100644 index 527f201..0000000 --- a/build/entities/chest_boat.json +++ /dev/null @@ -1,277 +0,0 @@ -{ - "format_version": "1.18.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:chest_boat", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:floating": { - "minecraft:buoyant": { - "base_buoyancy": 1, - "apply_gravity": true, - "simulate_waves": true, - "big_wave_probability": 0.03, - "big_wave_speed": 10, - "liquid_blocks": ["minecraft:water", "minecraft:flowing_water"] - } - }, - "minecraft:can_ride_default": { - "minecraft:rideable": { - "seat_count": 1, - "passenger_max_width": 1.375, - "interact_text": "action.interact.ride.boat", - "pull_in_entities": true, - "seats": [ - { - "position": [0.2, -0.2, 0], - "min_rider_count": 0, - "max_rider_count": 1, - "rotate_rider_by": "query.has_any_family('blaze', 'creeper', 'enderman', 'illager', 'magmacube', 'piglin', 'player', 'skeleton', 'slime', 'villager', 'wandering_trader', 'witch', 'zombie', 'zombie_pigman') ? -90 : 0", - "lock_rider_rotation": 90 - } - ] - } - }, - "minecraft:can_ride_bamboo": { - "minecraft:rideable": { - "seat_count": 1, - "passenger_max_width": 1.375, - "interact_text": "action.interact.ride.boat", - "pull_in_entities": true, - "seats": [ - { - "position": [0.2, 0.1, 0], - "min_rider_count": 0, - "max_rider_count": 1, - "rotate_rider_by": "query.has_any_family('blaze', 'creeper', 'enderman', 'illager', 'magmacube', 'piglin', 'player', 'skeleton', 'slime', 'villager', 'wandering_trader', 'witch', 'zombie', 'zombie_pigman') ? -90 : 0", - "lock_rider_rotation": 90 - } - ] - } - }, - "minecraft:above_bubble_column_down": { - "minecraft:buoyant": { - "base_buoyancy": 1, - "apply_gravity": true, - "simulate_waves": false, - "liquid_blocks": ["minecraft:water", "minecraft:flowing_water"], - "drag_down_on_buoyancy_removed": 0.7 - }, - "minecraft:timer": { - "looping": false, - "time": 3, - "time_down_event": { - "event": "minecraft:sink", - "target": "self" - } - }, - "minecraft:out_of_control": {} - }, - "minecraft:above_bubble_column_up": { - "minecraft:buoyant": { - "base_buoyancy": 1, - "apply_gravity": true, - "simulate_waves": false, - "liquid_blocks": ["minecraft:water", "minecraft:flowing_water"], - "drag_down_on_buoyancy_removed": 0.7 - }, - "minecraft:out_of_control": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:type_family": { - "family": ["boat", "inanimate"] - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 0.455 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:inventory": { - "container_type": "chest_boat", - "inventory_size": 27, - "can_be_siphoned_from": true - }, - "minecraft:is_stackable": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:buoyant": { - "base_buoyancy": 1, - "apply_gravity": true, - "simulate_waves": true, - "big_wave_probability": 0.03, - "big_wave_speed": 10, - "liquid_blocks": ["minecraft:water", "minecraft:flowing_water"] - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 60, - "max_dropped_ticks": 20, - "use_motion_prediction_hints": true - }, - "conditional_values": [ - { - "max_optimized_distance": 0, - "max_dropped_ticks": 0, - "use_motion_prediction_hints": true, - "conditional_values": [ - { - "test": "is_moving", - "subject": "self", - "operator": "==", - "value": true - } - ] - } - ] - }, - "minecraft:inside_block_notifier": { - "block_list": [ - { - "block": { - "name": "minecraft:bubble_column", - "states": { - "drag_down": true - } - }, - "entered_block_event": { - "event": "minecraft:entered_bubble_column_down", - "target": "self" - }, - "exited_block_event": { - "event": "minecraft:exited_bubble_column", - "target": "self" - } - }, - { - "block": { - "name": "minecraft:bubble_column", - "states": { - "drag_down": false - } - }, - "entered_block_event": { - "event": "minecraft:entered_bubble_column_up", - "target": "self" - }, - "exited_block_event": { - "event": "minecraft:exited_bubble_column", - "target": "self" - } - } - ] - }, - "minecraft:rideable": { - "seat_count": 1, - "passenger_max_width": 1.375, - "interact_text": "action.interact.ride.boat", - "pull_in_entities": true, - "seats": [ - { - "position": [0.2, -0.2, 0], - "min_rider_count": 0, - "max_rider_count": 1, - "rotate_rider_by": "query.has_any_family('blaze', 'creeper', 'enderman', 'illager', 'magmacube', 'piglin', 'player', 'skeleton', 'slime', 'villager', 'wandering_trader', 'witch', 'zombie', 'zombie_pigman') ? -90 : 0", - "lock_rider_rotation": 90 - } - ] - } - }, - "events": { - "minecraft:entity_spawned": { - "trigger": "minecraft:add_can_ride" - }, - "minecraft:add_can_ride": { - "sequence": [ - { - "filters": { - "test": "is_variant", - "subject": "self", - "operator": "!=", - "value": 7 - }, - "add": { - "component_groups": ["minecraft:can_ride_default"] - } - }, - { - "filters": { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 7 - }, - "add": { - "component_groups": ["minecraft:can_ride_bamboo"] - } - } - ] - }, - "minecraft:entered_bubble_column_down": { - "remove": { - "component_groups": ["minecraft:floating"] - }, - "add": { - "component_groups": ["minecraft:above_bubble_column_down"] - } - }, - "minecraft:entered_bubble_column_up": { - "remove": { - "component_groups": ["minecraft:floating"] - }, - "add": { - "component_groups": ["minecraft:above_bubble_column_up"] - } - }, - "minecraft:exited_bubble_column": { - "remove": { - "component_groups": ["minecraft:above_bubble_column_down", "minecraft:above_bubble_column_up"] - }, - "add": { - "component_groups": ["minecraft:floating"] - }, - "trigger": "minecraft:add_can_ride" - }, - "minecraft:sink": { - "remove": { - "component_groups": ["minecraft:floating", "minecraft:can_ride_default", "minecraft:can_ride_bamboo", "minecraft:above_bubble_column_down", "minecraft:above_bubble_column_up"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/chest_minecart.json b/build/entities/chest_minecart.json deleted file mode 100644 index b8981ae..0000000 --- a/build/entities/chest_minecart.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:chest_minecart", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:type_family": { - "family": ["minecart", "inanimate"] - }, - "minecraft:collision_box": { - "width": 0.98, - "height": 0.7 - }, - "minecraft:rail_movement": {}, - "minecraft:inventory": { - "container_type": "minecart_chest", - "inventory_size": 27, - "can_be_siphoned_from": true - }, - "minecraft:is_stackable": { - "value": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 60, - "max_dropped_ticks": 20, - "use_motion_prediction_hints": true - }, - "conditional_values": [ - { - "max_optimized_distance": 0, - "max_dropped_ticks": 0, - "conditional_values": [ - { - "test": "is_moving", - "subject": "self", - "operator": "==", - "value": true - } - ] - } - ] - } - } - } -} diff --git a/build/entities/chicken.json b/build/entities/chicken.json deleted file mode 100644 index 180dbd2..0000000 --- a/build/entities/chicken.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:chicken", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:chicken_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["wheat_seeds", "beetroot_seeds", "melon_seeds", "pumpkin_seeds", "pitcher_pod", "torchflower_seeds"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 5, - "speed_multiplier": 1.1 - } - }, - "minecraft:chicken_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/chicken.json" - }, - "minecraft:breedable": { - "require_tame": false, - "breeds_with": { - "mate_type": "minecraft:chicken", - "baby_type": "minecraft:chicken", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "breed_items": ["wheat_seeds", "beetroot_seeds", "melon_seeds", "pumpkin_seeds", "pitcher_pod", "torchflower_seeds"] - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.4, 0] - } - }, - "minecraft:spawn_entity": { - "entities": { - "min_wait_time": 300, - "max_wait_time": 600, - "spawn_sound": "plop", - "spawn_item": "egg", - "filters": { - "test": "rider_count", - "subject": "self", - "operator": "==", - "value": 0 - } - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["chicken", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 0.8 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 4, - "max": 4 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 0.5 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.5 - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.5, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.tempt": { - "priority": 4, - "speed_multiplier": 1, - "items": ["wheat_seeds", "beetroot_seeds", "melon_seeds", "pumpkin_seeds", "pitcher_pod", "torchflower_seeds"] - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:game_event_movement_tracking": { - "emit_flap": true - } - }, - "events": { - "from_egg": { - "add": { - "component_groups": ["minecraft:chicken_baby"] - } - }, - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "trigger": "minecraft:spawn_adult" - }, - { - "weight": 5, - "add": { - "component_groups": ["minecraft:chicken_baby"] - } - } - ] - }, - "minecraft:entity_born": { - "remove": {}, - "add": { - "component_groups": ["minecraft:chicken_baby"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:chicken_baby"] - }, - "add": { - "component_groups": ["minecraft:chicken_adult"] - } - }, - "minecraft:spawn_adult": { - "add": { - "component_groups": ["minecraft:chicken_adult"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/command_block_minecart.json b/build/entities/command_block_minecart.json deleted file mode 100644 index 1778b66..0000000 --- a/build/entities/command_block_minecart.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:command_block_minecart", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:command_block_active": { - "minecraft:rail_sensor": { - "check_block_types": true, - "eject_on_activate": false, - "eject_on_deactivate": false, - "tick_command_block_on_activate": true, - "tick_command_block_on_deactivate": false, - "on_deactivate": { - "event": "minecraft:command_block_deactivate" - } - } - }, - "minecraft:command_block_inactive": { - "minecraft:rail_sensor": { - "check_block_types": false, - "eject_on_activate": false, - "eject_on_deactivate": false, - "tick_command_block_on_activate": true, - "tick_command_block_on_deactivate": false, - "on_activate": { - "event": "minecraft:command_block_activate" - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:type_family": { - "family": ["minecart", "inanimate"] - }, - "minecraft:collision_box": { - "width": 0.98, - "height": 0.7 - }, - "minecraft:rail_movement": {}, - "minecraft:inventory": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 60, - "max_dropped_ticks": 20, - "use_motion_prediction_hints": true - }, - "conditional_values": [ - { - "max_optimized_distance": 0, - "max_dropped_ticks": 0, - "conditional_values": [ - { - "test": "is_moving", - "subject": "self", - "operator": "==", - "value": true - } - ] - } - ] - } - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:command_block_inactive"] - } - }, - "minecraft:command_block_activate": { - "remove": { - "component_groups": ["minecraft:command_block_inactive"] - }, - "add": { - "component_groups": ["minecraft:command_block_active"] - } - }, - "minecraft:command_block_deactivate": { - "remove": { - "component_groups": ["minecraft:command_block_active"] - }, - "add": { - "component_groups": ["minecraft:command_block_inactive"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/cow.json b/build/entities/cow.json deleted file mode 100644 index c68b96b..0000000 --- a/build/entities/cow.json +++ /dev/null @@ -1,237 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:cow", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:cow_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": "wheat", - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 6, - "speed_multiplier": 1.1 - } - }, - "minecraft:cow_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/cow.json" - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": false, - "breed_items": "wheat", - "breeds_with": { - "mate_type": "minecraft:cow", - "baby_type": "minecraft:cow", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - } - }, - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "bucket:0" - } - ] - } - }, - "use_item": true, - "transform_to_item": "bucket:1", - "play_sounds": "milk", - "interact_text": "action.interact.milk" - } - ] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["cow", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:collision_box": { - "width": 0.9, - "height": 1.3 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25 - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.5, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:behavior.tempt": { - "priority": 4, - "speed_multiplier": 1.25, - "items": ["wheat"] - }, - "minecraft:behavior.follow_parent": { - "priority": 5, - "speed_multiplier": 1.1 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 1.105, 0] - } - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "trigger": "minecraft:spawn_adult" - }, - { - "weight": 5, - "add": { - "component_groups": ["minecraft:cow_baby"] - } - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:cow_baby"] - } - }, - "minecraft:entity_transformed": { - "remove": {}, - "add": { - "component_groups": ["minecraft:cow_adult"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:cow_baby"] - }, - "add": { - "component_groups": ["minecraft:cow_adult"] - } - }, - "minecraft:spawn_adult": { - "add": { - "component_groups": ["minecraft:cow_adult"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/creeper.json b/build/entities/creeper.json deleted file mode 100644 index 4ff1a0a..0000000 --- a/build/entities/creeper.json +++ /dev/null @@ -1,319 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:creeper", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:exploding": { - "minecraft:explode": { - "fuse_length": 1.5, - "fuse_lit": true, - "power": 3, - "causes_fire": false, - "destroy_affected_by_griefing": true - } - }, - "minecraft:charged_creeper": { - "minecraft:is_charged": {} - }, - "minecraft:charged_exploding": { - "minecraft:explode": { - "fuse_length": 1.5, - "fuse_lit": true, - "power": 6, - "causes_fire": false, - "destroy_affected_by_griefing": true - } - }, - "minecraft:forced_exploding": { - "minecraft:target_nearby_sensor": {}, - "minecraft:explode": { - "fuse_length": 1.5, - "fuse_lit": true, - "power": 3, - "causes_fire": false, - "destroy_affected_by_griefing": true - }, - "minecraft:on_target_escape": {} - }, - "minecraft:forced_charged_exploding": { - "minecraft:target_nearby_sensor": {}, - "minecraft:explode": { - "fuse_length": 1.5, - "fuse_lit": true, - "power": 6, - "causes_fire": false, - "destroy_affected_by_griefing": true - }, - "minecraft:on_target_escape": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:type_family": { - "family": ["creeper", "monster", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.8 - }, - "minecraft:movement": { - "value": 0.2 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:loot": { - "table": "loot_tables/entities/creeper.json" - }, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:damage_sensor": { - "triggers": { - "on_damage": { - "filters": { - "test": "is_family", - "subject": "other", - "value": "lightning" - }, - "event": "minecraft:become_charged" - }, - "deals_damage": false - } - }, - "minecraft:target_nearby_sensor": { - "inside_range": 2.5, - "outside_range": 6, - "must_see": true, - "on_inside_range": { - "event": "minecraft:start_exploding", - "target": "self" - }, - "on_outside_range": { - "event": "minecraft:stop_exploding", - "target": "self" - }, - "on_vision_lost_inside_range": { - "event": "minecraft:stop_exploding", - "target": "self" - } - }, - "minecraft:interact": { - "interactions": { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "flint_and_steel" - }, - { - "test": "has_component", - "operator": "!=", - "value": "minecraft:explode" - } - ] - }, - "event": "minecraft:start_exploding_forced", - "target": "self" - }, - "hurt_item": 1, - "swing": true, - "play_sounds": "ignite", - "interact_text": "action.interact.creeper" - } - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.swell": { - "start_distance": 2.5, - "stop_distance": 6, - "priority": 2 - }, - "minecraft:behavior.melee_attack": { - "priority": 4, - "speed_multiplier": 1.25, - "track_target": false, - "reach_multiplier": 0 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 3, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "ocelot" - }, - { - "test": "is_family", - "subject": "other", - "value": "cat" - } - ] - }, - "max_dist": 6, - "sprint_speed_multiplier": 1.2 - } - ] - }, - "minecraft:behavior.random_stroll": { - "priority": 5, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 6, - "look_distance": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 6 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 1, - "must_see": true, - "must_see_forget_duration": 3, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.hurt_by_target": { - "priority": 2 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:on_target_escape": { - "event": "minecraft:stop_exploding", - "target": "self" - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:start_exploding_forced": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:is_charged" - }, - "add": { - "component_groups": ["minecraft:forced_exploding"] - } - }, - { - "filters": { - "test": "has_component", - "value": "minecraft:is_charged" - }, - "add": { - "component_groups": ["minecraft:forced_charged_exploding"] - } - } - ] - }, - "minecraft:start_exploding": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:is_charged" - }, - "add": { - "component_groups": ["minecraft:exploding"] - } - }, - { - "filters": { - "test": "has_component", - "value": "minecraft:is_charged" - }, - "add": { - "component_groups": ["minecraft:charged_exploding"] - } - } - ] - }, - "minecraft:stop_exploding": { - "remove": { - "component_groups": ["minecraft:exploding"] - } - }, - "minecraft:become_charged": { - "remove": { - "component_groups": ["minecraft:exploding"] - }, - "add": { - "component_groups": ["minecraft:charged_creeper"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/dolphin.json b/build/entities/dolphin.json deleted file mode 100644 index bf8f7bd..0000000 --- a/build/entities/dolphin.json +++ /dev/null @@ -1,421 +0,0 @@ -{ - "format_version": "1.18.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:dolphin", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "dolphin_adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/dolphin.json" - }, - "minecraft:bribeable": { - "bribe_items": ["fish", "salmon"] - }, - "minecraft:behavior.melee_attack": { - "priority": 2, - "track_target": true - } - }, - "dolphin_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.65 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["fish", "salmon"], - "grow_up": { - "event": "ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 4, - "speed_multiplier": 1.1 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25 - } - }, - "dolphin_angry": { - "minecraft:angry": { - "duration": 25, - "broadcast_anger": true, - "broadcast_range": 16, - "calm_event": { - "event": "on_calm", - "target": "self" - } - }, - "minecraft:on_target_acquired": {} - }, - "dolphin_dried": { - "minecraft:damage_over_time": { - "damage_per_hurt": 1, - "time_between_hurt": 0 - } - }, - "dolphin_swimming_navigation": { - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6 - }, - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": false, - "can_swim": true, - "can_walk": false, - "can_breach": true, - "can_sink": false - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "all_of": [ - { - "test": "on_ground", - "operator": "==", - "value": true - }, - { - "test": "in_water", - "operator": "!=", - "value": true - } - ] - }, - "event": "navigation_on_land" - } - ] - } - }, - "dolphin_on_land": { - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": true, - "can_swim": true, - "can_walk": true, - "can_breach": false, - "can_jump": false - }, - "minecraft:drying_out_timer": { - "total_time": 120, - "water_bottle_refill_time": 0, - "dried_out_event": { - "event": "dried_out" - }, - "stopped_drying_out_event": { - "event": "stop_dryingout" - }, - "recover_after_dried_out_event": { - "event": "recover_after_dried_out" - } - } - }, - "dolphin_on_land_in_rain": { - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": true, - "can_swim": true, - "can_walk": true, - "can_breach": false, - "can_jump": false - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "in_water", - "operator": "==", - "value": true - }, - "event": "navigation_off_land" - }, - { - "filters": { - "test": "in_water_or_rain", - "operator": "!=", - "value": true - }, - "event": "start_dryingout" - } - ] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["dolphin", "mob"] - }, - "minecraft:collision_box": { - "width": 0.9, - "height": 0.6 - }, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:follow_range": { - "value": 48, - "max": 48 - }, - "minecraft:breathable": { - "total_supply": 240, - "suffocate_time": 0, - "breathes_air": true, - "breathes_water": false, - "generates_bubbles": false - }, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:movement": { - "value": 0.1 - }, - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": true, - "can_swim": true, - "can_walk": false, - "can_breach": true, - "can_sink": false - }, - "minecraft:underwater_movement": { - "value": 0.15 - }, - "minecraft:jump.static": { - "jump_power": 0.6 - }, - "minecraft:can_climb": {}, - "minecraft:behavior.swim_with_entity": { - "priority": 4, - "success_rate": 0.1, - "chance_to_stop": 0.0333, - "state_check_interval": 0.5, - "catch_up_threshold": 12, - "match_direction_threshold": 2, - "catch_up_multiplier": 2.5, - "speed_multiplier": 1.5, - "search_range": 20, - "stop_distance": 5, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - } - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.random_swim": { - "priority": 5, - "interval": 0, - "xz_dist": 20 - }, - "minecraft:behavior.random_breach": { - "priority": 6, - "interval": 50, - "xz_dist": 6, - "cooldown_time": 2 - }, - "minecraft:behavior.random_look_around": { - "priority": 7 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 2, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "guardian_elder" - }, - { - "test": "is_family", - "subject": "other", - "value": "guardian" - } - ] - }, - "max_dist": 8, - "walk_speed_multiplier": 1, - "sprint_speed_multiplier": 1 - } - ], - "probability_per_strength": 0.14 - }, - "minecraft:behavior.find_underwater_treasure": { - "priority": 2, - "speed_multiplier": 2, - "search_range": 30, - "stop_distance": 50 - }, - "minecraft:behavior.move_to_water": { - "priority": 1, - "search_range": 15, - "search_height": 5 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:flocking": { - "in_water": false, - "match_variants": false, - "use_center_of_mass": false, - "low_flock_limit": 4, - "high_flock_limit": 8, - "goal_weight": 2, - "loner_chance": 0.1, - "influence_radius": 6, - "breach_influence": 0, - "separation_weight": 1.75, - "separation_threshold": 3, - "cohesion_weight": 1.85, - "cohesion_threshold": 6.5, - "innner_cohesion_threshold": 3.5, - "min_height": 4, - "max_height": 4, - "block_distance": 1, - "block_weight": 0 - }, - "minecraft:on_target_acquired": { - "event": "become_angry", - "target": "self" - }, - "minecraft:on_target_escape": { - "target": "self" - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 90, - "add": { - "component_groups": ["dolphin_adult", "dolphin_swimming_navigation"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["dolphin_baby", "dolphin_swimming_navigation"] - } - } - ] - }, - "ageable_grow_up": { - "remove": { - "component_groups": ["dolphin_baby"] - }, - "add": { - "component_groups": ["dolphin_adult"] - } - }, - "become_angry": { - "add": { - "component_groups": ["dolphin_angry"] - } - }, - "on_calm": { - "remove": { - "component_groups": ["dolphin_angry"] - } - }, - "stop_dryingout": { - "remove": { - "component_groups": ["dolphin_on_land", "dolphin_dried"] - }, - "add": { - "component_groups": ["dolphin_on_land_in_rain"] - } - }, - "start_dryingout": { - "remove": { - "component_groups": ["dolphin_on_land_in_rain"] - }, - "add": { - "component_groups": ["dolphin_on_land"] - } - }, - "dried_out": { - "add": { - "component_groups": ["dolphin_dried"] - } - }, - "recover_after_dried_out": { - "remove": { - "component_groups": ["dolphin_dried"] - } - }, - "navigation_on_land": { - "add": { - "component_groups": ["dolphin_on_land"] - }, - "remove": { - "component_groups": ["dolphin_swimming_navigation"] - } - }, - "navigation_off_land": { - "add": { - "component_groups": ["dolphin_swimming_navigation"] - }, - "remove": { - "component_groups": ["dolphin_on_land_in_rain", "dolphin_on_land", "dolphin_dried"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/donkey.json b/build/entities/donkey.json deleted file mode 100644 index c477ba1..0000000 --- a/build/entities/donkey.json +++ /dev/null @@ -1,545 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:donkey", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:donkey_baby": { - "minecraft:is_baby": {}, - "minecraft:scale_by_age": { - "start_scale": 0.5, - "end_scale": 1 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": [ - { - "item": "wheat", - "growth": 0.016667 - }, - { - "item": "sugar", - "growth": 0.025 - }, - { - "item": "hay_block", - "growth": 0.15 - }, - { - "item": "apple", - "growth": 0.05 - }, - { - "item": "golden_carrot", - "growth": 0.05 - }, - { - "item": "golden_apple", - "growth": 0.2 - }, - { - "item": "appleEnchanted", - "growth": 0.2 - } - ], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 4, - "speed_multiplier": 1 - } - }, - "minecraft:donkey_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/horse.json" - }, - "minecraft:behavior.run_around_like_crazy": { - "priority": 1, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.breed": { - "priority": 2, - "speed_multiplier": 1 - } - }, - "minecraft:donkey_wild": { - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["player", "zombie"], - "interact_text": "action.interact.mount", - "seats": { - "position": [0, 0.925, -0.2] - } - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.5, - "target_dist": 0, - "track_target": true - }, - "minecraft:tamemount": { - "min_temper": 0, - "max_temper": 100, - "feed_text": "action.interact.feed", - "ride_text": "action.interact.mount", - "feed_items": [ - { - "item": "wheat", - "temper_mod": 3 - }, - { - "item": "sugar", - "temper_mod": 3 - }, - { - "item": "apple", - "temper_mod": 3 - }, - { - "item": "golden_carrot", - "temper_mod": 5 - }, - { - "item": "golden_apple", - "temper_mod": 10 - }, - { - "item": "appleEnchanted", - "temper_mod": 10 - } - ], - "auto_reject_items": [ - { - "item": "horsearmorleather" - }, - { - "item": "horsearmoriron" - }, - { - "item": "horsearmorgold" - }, - { - "item": "horsearmordiamond" - }, - { - "item": "saddle" - } - ], - "tame_event": { - "event": "minecraft:on_tame", - "target": "self" - } - } - }, - "minecraft:donkey_tamed": { - "minecraft:is_tamed": {}, - "minecraft:equippable": { - "slots": [ - { - "slot": 0, - "item": "saddle", - "accepted_items": ["saddle"], - "on_equip": { - "event": "minecraft:donkey_saddled" - }, - "on_unequip": { - "event": "minecraft:donkey_unsaddled" - } - } - ] - }, - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "operator": "not", - "value": "saddle" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "saddle" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 0, - "interact_text": "action.interact.equip" - } - ] - }, - "minecraft:rideable": { - "seat_count": 1, - "crouching_skip_interact": true, - "family_types": ["player"], - "interact_text": "action.interact.ride.horse", - "seats": { - "position": [0, 0.925, -0.2] - } - }, - "minecraft:behavior.player_ride_tamed": {}, - "minecraft:inventory": { - "inventory_size": 16, - "container_type": "horse" - }, - "minecraft:breedable": { - "parent_centric_attribute_blending": ["minecraft:health"], - "require_tame": true, - "inherit_tamed": false, - "breeds_with": [ - { - "mate_type": "minecraft:donkey", - "baby_type": "minecraft:donkey", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - { - "mate_type": "minecraft:horse", - "baby_type": "minecraft:mule", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - } - ], - "breed_items": ["golden_carrot", "golden_apple", "appleEnchanted"] - }, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 1.2, - "items": ["apple", "carrot", "golden_apple", "appleEnchanted", "golden_carrot", "carrotOnAStick", "hay_block", "sugar", "bread", "wheat"] - } - }, - "minecraft:donkey_unchested": { - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "operator": "not", - "value": "saddle" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "saddle" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 0, - "interact_text": "action.interact.saddle" - }, - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - }, - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "chest" - } - ] - }, - "event": "minecraft:on_chest", - "target": "self" - }, - "use_item": true, - "interact_text": "action.interact.attachchest" - } - ] - } - }, - "minecraft:donkey_chested": { - "minecraft:is_chested": {}, - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "operator": "not", - "value": "saddle" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "saddle" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 0, - "interact_text": "action.interact.saddle" - } - ] - } - }, - "minecraft:donkey_saddled": { - "minecraft:is_saddled": {}, - "minecraft:input_ground_controlled": {}, - "minecraft:can_power_jump": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["donkey", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 1.6 - }, - "minecraft:health": { - "value": { - "range_min": 15, - "range_max": 30 - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.175 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:nameable": {}, - "minecraft:horse.jump_strength": { - "value": 0.5 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:healable": { - "items": [ - { - "item": "wheat", - "heal_amount": 2 - }, - { - "item": "sugar", - "heal_amount": 1 - }, - { - "item": "hay_block", - "heal_amount": 20 - }, - { - "item": "apple", - "heal_amount": 3 - }, - { - "item": "golden_carrot", - "heal_amount": 4 - }, - { - "item": "golden_apple", - "heal_amount": 10 - }, - { - "item": "appleEnchanted", - "heal_amount": 10 - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.7 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 80, - "add": { - "component_groups": ["minecraft:donkey_adult", "minecraft:donkey_wild"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["minecraft:donkey_baby"] - } - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:donkey_baby"] - } - }, - "minecraft:on_tame": { - "remove": { - "component_groups": ["minecraft:donkey_wild"] - }, - "add": { - "component_groups": ["minecraft:donkey_tamed", "minecraft:donkey_unchested"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:donkey_baby"] - }, - "add": { - "component_groups": ["minecraft:donkey_adult", "minecraft:donkey_wild"] - } - }, - "minecraft:on_chest": { - "remove": { - "component_groups": ["minecraft:donkey_unchested"] - }, - "add": { - "component_groups": ["minecraft:donkey_chested"] - } - }, - "minecraft:donkey_saddled": { - "add": { - "component_groups": ["minecraft:donkey_saddled"] - } - }, - "minecraft:donkey_unsaddled": { - "remove": { - "component_groups": ["minecraft:donkey_saddled"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/dragon_fireball.json b/build/entities/dragon_fireball.json deleted file mode 100644 index 3f26730..0000000 --- a/build/entities/dragon_fireball.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:dragon_fireball", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.31, - "height": 0.31 - }, - "minecraft:projectile": { - "on_hit": { - "spawn_aoe_cloud": { - "radius": 6, - "radius_on_use": 0, - "potion": 23, - "particle": "dragonbreath", - "duration": 120, - "color": [220, 0, 239], - "affect_owner": false, - "reapplication_delay": 20 - }, - "remove_on_hit": {} - }, - "power": 1.3, - "gravity": 0, - "inertia": 1, - "anchor": 2, - "offset": [0, 0.5, 0], - "semi_random_diff_damage": true, - "uncertainty_base": 10, - "reflect_on_hurt": true, - "hit_sound": "explode" - } - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - } -} diff --git a/build/entities/drowned.json b/build/entities/drowned.json deleted file mode 100644 index ce7ff03..0000000 --- a/build/entities/drowned.json +++ /dev/null @@ -1,656 +0,0 @@ -{ - "format_version": "1.20.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:drowned", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:baby_drowned": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:underwater_movement": { - "value": 0.08 - } - }, - "minecraft:adult_drowned": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/drowned.json" - } - }, - "minecraft:mode_switcher": { - "minecraft:target_nearby_sensor": { - "inside_range": 3, - "outside_range": 5, - "on_inside_range": { - "event": "minecraft:switch_to_melee", - "target": "self" - }, - "on_outside_range": { - "event": "minecraft:switch_to_ranged", - "target": "self" - } - } - }, - "minecraft:ranged_mode": { - "minecraft:shooter": { - "def": "minecraft:thrown_trident" - }, - "minecraft:behavior.ranged_attack": { - "priority": 3, - "attack_interval_min": 1, - "attack_interval_max": 3, - "attack_radius": 10, - "swing": true - } - }, - "minecraft:ranged_equipment": { - "minecraft:equipment": { - "table": "loot_tables/entities/drowned_ranged_equipment.json", - "slot_drop_chance": [ - { - "slot": "slot.weapon.offhand", - "drop_chance": 1 - } - ] - } - }, - "minecraft:melee_mode": { - "minecraft:attack": { - "damage": 3 - }, - "minecraft:behavior.melee_attack": { - "priority": 3, - "speed_multiplier": 1, - "track_target": false, - "require_complete_path": true - } - }, - "minecraft:melee_equipment": { - "minecraft:equipment": { - "table": "loot_tables/entities/drowned_equipment.json", - "slot_drop_chance": [ - { - "slot": "slot.weapon.offhand", - "drop_chance": 1 - } - ] - } - }, - "minecraft:hunter_mode": { - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": false, - "can_break_doors": true, - "can_swim": true, - "can_walk": true, - "avoid_sun": true - } - }, - "minecraft:wander_mode": { - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": false, - "can_break_doors": true, - "can_swim": false, - "can_walk": true, - "avoid_sun": true - } - }, - "minecraft:can_break_doors": { - "minecraft:annotation.break_door": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["drowned", "zombie", "undead", "monster", "mob"] - }, - "minecraft:equip_item": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:underwater_movement": { - "value": 0.06 - }, - "minecraft:movement.generic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.23 - }, - "minecraft:burns_in_daylight": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_air": true, - "breathes_water": true - }, - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": false, - "can_break_doors": true, - "can_swim": false, - "can_walk": true, - "avoid_sun": true - }, - "minecraft:shareables": { - "singular_pickup": true, - "items": [ - { - "item": "minecraft:nautilus_shell", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:trident", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:netherite_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:diamond_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:iron_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:stone_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:golden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:wooden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.flee_sun": { - "priority": 2, - "speed_multiplier": 1 - }, - "minecraft:behavior.equip_item": { - "priority": 3 - }, - "minecraft:behavior.stomp_turtle_egg": { - "priority": 4, - "speed_multiplier": 1, - "search_range": 10, - "search_height": 2, - "goal_radius": 1.14, - "interval": 20 - }, - "minecraft:behavior.pickup_items": { - "priority": 6, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1, - "pickup_based_on_chance": true, - "can_pickup_any_item": true, - "excluded_items": ["minecraft:glow_ink_sac"] - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "reselect_targets": true, - "must_see": true, - "within_radius": 12, - "must_see_forget_duration": 17, - "persist_time": 0.5, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "axolotl" - } - ] - }, - { - "any_of": [ - { - "test": "in_water", - "subject": "other", - "value": true - }, - { - "test": "is_daytime", - "value": false - } - ] - } - ] - }, - "max_dist": 20 - }, - { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - { - "any_of": [ - { - "test": "in_water", - "subject": "other", - "value": true - }, - { - "test": "is_daytime", - "value": false - } - ] - } - ] - }, - "max_dist": 20, - "must_see": false - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 20 - } - ] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:on_target_acquired": { - "event": "minecraft:has_target", - "target": "self" - }, - "minecraft:on_target_escape": { - "event": "minecraft:lost_target", - "target": "self" - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 15, - "remove": {}, - "add": { - "component_groups": ["minecraft:mode_switcher", "minecraft:ranged_equipment", "minecraft:ranged_mode", "minecraft:adult_drowned"] - } - }, - { - "weight": 85, - "randomize": [ - { - "weight": 95, - "remove": {}, - "add": { - "component_groups": ["minecraft:melee_equipment", "minecraft:melee_mode", "minecraft:adult_drowned"] - } - }, - { - "weight": 5, - "remove": {}, - "add": { - "component_groups": ["minecraft:melee_equipment", "minecraft:melee_mode", "minecraft:baby_drowned"] - } - } - ] - } - ] - }, - { - "randomize": [ - { - "weight": 10, - "add": { - "component_groups": ["minecraft:can_break_doors"] - } - }, - { - "weight": 90 - } - ] - } - ] - }, - "minecraft:as_baby": { - "add": { - "component_groups": ["minecraft:melee_equipment", "minecraft:melee_mode", "minecraft:baby_drowned"] - } - }, - "minecraft:as_adult": { - "add": { - "component_groups": ["minecraft:melee_equipment", "minecraft:melee_mode", "minecraft:adult_drowned"] - } - }, - "minecraft:switch_to_melee": { - "remove": { - "component_groups": ["minecraft:ranged_mode"] - }, - "add": { - "component_groups": ["minecraft:melee_mode"] - } - }, - "minecraft:switch_to_ranged": { - "remove": { - "component_groups": ["minecraft:melee_mode"] - }, - "add": { - "component_groups": ["minecraft:ranged_mode"] - } - }, - "minecraft:has_target": { - "remove": { - "component_groups": ["minecraft:wander_mode"] - }, - "add": { - "component_groups": ["minecraft:hunter_mode"] - } - }, - "minecraft:lost_target": { - "remove": { - "component_groups": ["minecraft:hunter_mode"] - }, - "add": { - "component_groups": ["minecraft:wander_mode"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/egg.json b/build/entities/egg.json deleted file mode 100644 index 255ead2..0000000 --- a/build/entities/egg.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:egg", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": 0, - "knockback": true, - "destroy_on_hit": true - }, - "spawn_chance": { - "first_spawn_chance": 8, - "second_spawn_chance": 32, - "first_spawn_count": 1, - "second_spawn_count": 4, - "spawn_definition": "minecraft:chicken", - "spawn_baby": true - }, - "remove_on_hit": {}, - "particle_on_hit": { - "particle_type": "iconcrack", - "num_particles": 6, - "on_entity_hit": true, - "on_other_hit": true - } - }, - "power": 1.5, - "gravity": 0.03, - "angle_offset": 0 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/elder_guardian.json b/build/entities/elder_guardian.json deleted file mode 100644 index 00233b2..0000000 --- a/build/entities/elder_guardian.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:elder_guardian", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 10 : 0" - }, - "minecraft:collision_box": { - "width": 1.99, - "height": 1.99 - }, - "minecraft:nameable": {}, - "minecraft:loot": { - "table": "loot_tables/entities/elder_guardian.json" - }, - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": false, - "can_swim": true, - "can_walk": false, - "can_breach": true - }, - "minecraft:movement.sway": {}, - "minecraft:jump.static": {}, - "minecraft:health": { - "value": 80, - "max": 80 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:underwater_movement": { - "value": 0.3 - }, - "minecraft:attack": { - "damage": 5 - }, - "minecraft:follow_range": { - "value": 16, - "max": 16 - }, - "minecraft:breathable": { - "breathes_water": true - }, - "minecraft:home": { - "restriction_radius": 16 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 1, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "squid" - }, - { - "test": "is_family", - "subject": "other", - "value": "axolotl" - } - ] - }, - "max_dist": 16 - } - ], - "attack_interval_min": 1, - "must_see": true - }, - "minecraft:behavior.guardian_attack": { - "priority": 4 - }, - "minecraft:behavior.move_towards_home_restriction": { - "priority": 5, - "speed_multiplier": 1 - }, - "minecraft:behavior.random_swim": { - "priority": 7, - "speed_multiplier": 0.5, - "avoid_surface": false - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 12, - "probability": 0.01 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:type_family": { - "family": ["guardian_elder", "monster", "mob"] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - } - } -} diff --git a/build/entities/ender_crystal.json b/build/entities/ender_crystal.json deleted file mode 100644 index a2a5d11..0000000 --- a/build/entities/ender_crystal.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:ender_crystal", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "crystal_exploding": { - "minecraft:explode": { - "fuse_length": 0, - "fuse_lit": true, - "power": 6, - "causes_fire": false, - "destroy_affected_by_griefing": true - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:collision_box": { - "width": 2, - "height": 2 - }, - "minecraft:health": { - "value": 1, - "max": 1 - }, - "minecraft:fire_immune": true, - "minecraft:on_hurt": { - "event": "minecraft:crystal_explode", - "target": "self" - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:crystal_explode": { - "remove": {}, - "add": { - "component_groups": ["crystal_exploding"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/ender_dragon.json b/build/entities/ender_dragon.json deleted file mode 100644 index 53548a8..0000000 --- a/build/entities/ender_dragon.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "format_version": "1.13.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:ender_dragon", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "dragon_sitting": { - "minecraft:behavior.dragonlanding": { - "priority": 0 - }, - "minecraft:behavior.dragonflaming": { - "priority": 1 - }, - "minecraft:behavior.dragonscanning": { - "priority": 2 - } - }, - "dragon_flying": { - "minecraft:behavior.dragontakeoff": { - "priority": 0 - }, - "minecraft:behavior.dragonchargeplayer": { - "priority": 1 - }, - "minecraft:behavior.dragonstrafeplayer": { - "priority": 2 - }, - "minecraft:behavior.dragonholdingpattern": { - "priority": 3 - }, - "minecraft:shooter": { - "type": "dragonfireball", - "def": "minecraft:dragon_fireball" - } - }, - "dragon_death": { - "minecraft:behavior.dragondeath": { - "priority": 0 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["dragon", "mob"] - }, - "minecraft:health": { - "value": 200, - "max": 200 - }, - "minecraft:boss": { - "should_darken_sky": false, - "hud_range": 125 - }, - "minecraft:collision_box": { - "width": 13, - "height": 4 - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:fire_immune": true, - "minecraft:knockback_resistance": { - "value": 100, - "max": 100 - }, - "minecraft:flying_speed": { - "value": 0.6 - }, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:on_start_landing": { - "event": "minecraft:start_land", - "target": "self" - }, - "minecraft:on_start_takeoff": { - "event": "minecraft:start_fly", - "target": "self" - }, - "minecraft:on_death": { - "event": "minecraft:start_death", - "target": "self" - }, - "minecraft:persistent": {}, - "minecraft:physics": { - "has_gravity": false, - "has_collision": false - }, - "minecraft:game_event_movement_tracking": { - "emit_flap": true - } - }, - "events": { - "minecraft:entity_spawned": { - "remove": {}, - "add": { - "component_groups": ["dragon_flying"] - } - }, - "minecraft:start_land": { - "remove": { - "component_groups": ["dragon_flying"] - }, - "add": { - "component_groups": ["dragon_sitting"] - } - }, - "minecraft:start_fly": { - "remove": { - "component_groups": ["dragon_sitting"] - }, - "add": { - "component_groups": ["dragon_flying"] - } - }, - "minecraft:start_death": { - "remove": { - "component_groups": ["dragon_sitting", "dragon_flying"] - }, - "add": { - "component_groups": ["dragon_death"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/ender_pearl.json b/build/entities/ender_pearl.json deleted file mode 100644 index ae7389f..0000000 --- a/build/entities/ender_pearl.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:ender_pearl", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:no_spawn": { - "minecraft:projectile": { - "on_hit": { - "teleport_owner": {}, - "remove_on_hit": {} - }, - "power": 1.5, - "gravity": 0.025, - "angle_offset": 0, - "inertia": 1, - "liquid_inertia": 1 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:projectile": { - "on_hit": { - "teleport_owner": {}, - "spawn_chance": { - "first_spawn_percent_chance": 5, - "first_spawn_count": 1, - "spawn_definition": "minecraft:endermite" - }, - "remove_on_hit": {} - }, - "power": 1.5, - "gravity": 0.025, - "angle_offset": 0, - "inertia": 1, - "liquid_inertia": 1 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "filters": { - "test": "is_game_rule", - "domain": "domobspawning", - "value": false - }, - "add": { - "component_groups": ["minecraft:no_spawn"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/enderman.json b/build/entities/enderman.json deleted file mode 100644 index 7ff527e..0000000 --- a/build/entities/enderman.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:enderman", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:enderman_calm": { - "minecraft:on_target_acquired": { - "event": "minecraft:become_angry", - "target": "self" - }, - "minecraft:movement": { - "value": 0.3 - } - }, - "minecraft:enderman_angry": { - "minecraft:angry": { - "duration": 25, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:movement": { - "value": 0.45 - }, - "minecraft:behavior.melee_attack": { - "priority": 2 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:type_family": { - "family": ["enderman", "monster", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:loot": { - "table": "loot_tables/entities/enderman.json" - }, - "minecraft:health": { - "value": 40, - "max": 40 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - }, - { - "filters": { - "test": "in_contact_with_water", - "operator": "==", - "value": true - }, - "cause": "drowning", - "damage_per_tick": 1 - } - ] - }, - "minecraft:attack": { - "damage": 7 - }, - "minecraft:follow_range": { - "value": 64, - "max": 64 - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 2.9 - }, - "minecraft:teleport": { - "random_teleports": true, - "max_random_teleport_time": 30, - "random_teleport_cube": [32, 32, 32], - "target_distance": 16, - "target_teleport_chance": 0.05, - "light_teleport_chance": 0.05 - }, - "minecraft:lookat": { - "search_radius": 64, - "set_target": true, - "look_cooldown": 5, - "filters": { - "all_of": [ - { - "subject": "other", - "test": "is_family", - "value": "player" - }, - { - "test": "has_equipment", - "domain": "head", - "subject": "other", - "operator": "not", - "value": "carved_pumpkin" - } - ] - } - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 5, - "must_see": true, - "attack_interval": 10, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "endermite" - }, - "max_dist": 64 - } - ] - }, - "minecraft:navigation.walk": { - "can_path_over_water": false, - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 8, - "probability": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 3 - }, - "minecraft:behavior.enderman_leave_block": { - "priority": 10 - }, - "minecraft:behavior.enderman_take_block": { - "priority": 11 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 10, - "use_motion_prediction_hints": true - } - }, - "minecraft:variable_max_auto_step": { - "base_value": 1.0625, - "jump_prevented_value": 0.5625 - } - }, - "events": { - "minecraft:entity_spawned": { - "remove": {}, - "add": { - "component_groups": ["minecraft:enderman_calm"] - } - }, - "minecraft:become_angry": { - "remove": { - "component_groups": ["minecraft:enderman_calm"] - }, - "add": { - "component_groups": ["minecraft:enderman_angry"] - } - }, - "minecraft:on_calm": { - "remove": { - "component_groups": ["minecraft:enderman_angry"] - }, - "add": { - "component_groups": ["minecraft:enderman_calm"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/endermite.json b/build/entities/endermite.json deleted file mode 100644 index 443f457..0000000 --- a/build/entities/endermite.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "format_version": "1.17.10", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:endermite", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 3 : 0" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["endermite", "arthropod", "monster", "lightweight", "mob"] - }, - "minecraft:collision_box": { - "width": 0.4, - "height": 0.3 - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:health": { - "value": 8, - "max": 8 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:attack": { - "damage": 2 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.melee_attack": { - "priority": 3, - "track_target": true - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 5, - "must_see": true, - "within_radius": 16, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "enderman" - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 1 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:block_climber": {} - } - } -} diff --git a/build/entities/evocation_illager.json b/build/entities/evocation_illager.json deleted file mode 100644 index c59fc53..0000000 --- a/build/entities/evocation_illager.json +++ /dev/null @@ -1,375 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:evocation_illager", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:celebrate": { - "minecraft:behavior.celebrate": { - "priority": 5, - "celebration_sound": "celebrate", - "sound_interval": { - "range_min": 2, - "range_max": 7 - }, - "jump_interval": { - "range_min": 1, - "range_max": 3.5 - }, - "duration": 30, - "on_celebration_end_event": { - "event": "minecraft:stop_celebrating", - "target": "self" - } - } - }, - "minecraft:raid_configuration": { - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "hostile", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": false, - "can_migrate": true, - "first_founding_reward": 0 - }, - "minecraft:behavior.move_to_village": { - "priority": 6, - "speed_multiplier": 0.7 - }, - "minecraft:ambient_sound_interval": { - "value": 2, - "range": 4, - "event_name": "ambient.in.raid" - } - }, - "minecraft:raid_persistence": { - "minecraft:persistent": {} - }, - "minecraft:raid_despawn": { - "minecraft:despawn": { - "despawn_from_distance": {} - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "10" - }, - "minecraft:type_family": { - "family": ["evocation_illager", "monster", "illager", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:loot": { - "table": "loot_tables/entities/evocation_illager.json" - }, - "minecraft:health": { - "value": 24, - "max": 24 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:movement": { - "value": 0.5 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "can_pass_doors": true, - "can_open_doors": true, - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.summon_entity": { - "priority": 2, - "summon_choices": [ - { - "min_activation_range": 0, - "max_activation_range": 3, - "cooldown_time": 5, - "weight": 3, - "cast_duration": 2, - "particle_color": "#FF664D59", - "start_sound_event": "cast.spell", - "sequence": [ - { - "shape": "circle", - "target": "self", - "base_delay": 1, - "delay_per_summon": 0, - "num_entities_spawned": 5, - "entity_type": "minecraft:evocation_fang", - "size": 1.5, - "entity_lifespan": 1.1, - "sound_event": "prepare.attack" - }, - { - "shape": "circle", - "target": "self", - "base_delay": 0.15, - "delay_per_summon": 0, - "num_entities_spawned": 8, - "entity_type": "minecraft:evocation_fang", - "size": 2.5, - "entity_lifespan": 1.1 - } - ] - }, - { - "min_activation_range": 3, - "weight": 3, - "cooldown_time": 5, - "cast_duration": 2, - "particle_color": "#FF664D59", - "start_sound_event": "cast.spell", - "sequence": [ - { - "shape": "line", - "target": "self", - "base_delay": 1, - "delay_per_summon": 0.05, - "num_entities_spawned": 16, - "entity_type": "minecraft:evocation_fang", - "size": 20, - "entity_lifespan": 1.1 - } - ] - }, - { - "weight": 1, - "cooldown_time": 17, - "cast_duration": 5, - "particle_color": "#FFB3B3CC", - "sequence": [ - { - "shape": "circle", - "target": "self", - "base_delay": 5, - "num_entities_spawned": 3, - "entity_type": "minecraft:vex", - "summon_cap": 8, - "summon_cap_radius": 16, - "size": 1, - "sound_event": "prepare.summon" - } - ] - } - ] - }, - "minecraft:behavior.send_event": { - "priority": 3, - "event_choices": [ - { - "min_activation_range": 0, - "max_activation_range": 16, - "cooldown_time": 5, - "cast_duration": 3, - "particle_color": "#FFB38033", - "weight": 3, - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "sheep" - }, - { - "test": "is_color", - "subject": "other", - "value": "blue" - } - ] - }, - "start_sound_event": "cast.spell", - "sequence": [ - { - "base_delay": 2, - "event": "wololo", - "sound_event": "prepare.wololo" - } - ] - } - ] - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 5, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 8, - "walk_speed_multiplier": 0.6, - "sprint_speed_multiplier": 1 - } - ] - }, - "minecraft:behavior.random_stroll": { - "priority": 8, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - "max_dist": 20 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - } - ] - }, - "max_dist": 20 - } - ], - "must_see": true - }, - "minecraft:behavior.look_at_player": { - "priority": 9, - "look_distance": 3, - "probability": 1 - }, - "minecraft:behavior.look_at_entity": { - "priority": 10, - "look_distance": 8, - "filters": { - "test": "is_family", - "subject": "other", - "value": "mob" - } - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:persistent": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:follow_range": { - "value": 64 - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:spawn_for_raid": { - "add": { - "component_groups": ["minecraft:raid_configuration", "minecraft:raid_despawn", "minecraft:raid_persistence"] - } - }, - "minecraft:start_celebrating": { - "sequence": [ - { - "add": { - "component_groups": ["minecraft:celebrate"] - } - }, - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "minecraft:stop_celebrating": { - "remove": { - "component_groups": ["minecraft:celebrate"] - } - }, - "minecraft:raid_expired": { - "sequence": [ - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/eye_of_ender_signal.json b/build/entities/eye_of_ender_signal.json deleted file mode 100644 index e9b3778..0000000 --- a/build/entities/eye_of_ender_signal.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:eye_of_ender_signal", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 10, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/fireball.json b/build/entities/fireball.json deleted file mode 100644 index 629fb16..0000000 --- a/build/entities/fireball.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:fireball", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:exploding": { - "minecraft:explode": { - "fuse_length": 0, - "fuse_lit": true, - "power": 1, - "causes_fire": true, - "fire_affected_by_griefing": true, - "destroy_affected_by_griefing": true - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:collision_box": { - "width": 1, - "height": 1 - }, - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": 6, - "knockback": false, - "semi_random_diff_damage": false - }, - "definition_event": { - "affect_projectile": true, - "event_trigger": { - "event": "minecraft:explode", - "target": "self" - } - } - }, - "power": 1.6, - "gravity": 0, - "inertia": 1, - "liquid_inertia": 1, - "uncertainty_base": 0, - "uncertainty_multiplier": 0, - "anchor": 2, - "offset": [0, -1.5, 0], - "reflect_on_hurt": true, - "catch_fire": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - }, - "events": { - "minecraft:explode": { - "add": { - "component_groups": ["minecraft:exploding"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/fireworks_rocket.json b/build/entities/fireworks_rocket.json deleted file mode 100644 index b3345af..0000000 --- a/build/entities/fireworks_rocket.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:fireworks_rocket", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 10, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/fish.json b/build/entities/fish.json deleted file mode 100644 index d875701..0000000 --- a/build/entities/fish.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:cod", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:type_family": { - "family": ["cod", "fish"] - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 0.3 - }, - "minecraft:health": { - "value": 3, - "max": 3 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/fish.json" - }, - "minecraft:scale": { - "value": 1 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_air": false, - "breathes_water": true - }, - "minecraft:movement": { - "value": 0.1 - }, - "minecraft:underwater_movement": { - "value": 0.1 - }, - "minecraft:navigation.generic": { - "is_amphibious": false, - "can_path_over_water": false, - "can_swim": true, - "can_walk": false, - "can_breach": false, - "can_sink": false - }, - "minecraft:physics": { - "has_gravity": false - }, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:movement.sway": { - "sway_amplitude": 0 - }, - "minecraft:despawn": { - "despawn_from_distance": { - "min_distance": 32, - "max_distance": 40 - } - }, - "minecraft:behavior.swim_idle": { - "priority": 5, - "idle_time": 5, - "success_rate": 0.1 - }, - "minecraft:behavior.random_swim": { - "priority": 3, - "speed_multiplier": 1, - "xz_dist": 16, - "y_dist": 4, - "interval": 0 - }, - "minecraft:behavior.swim_wander": { - "priority": 4, - "interval": 0.1, - "look_ahead": 2, - "speed_multiplier": 1, - "wander_time": 5 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 1, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "axolotl" - } - ] - }, - "max_dist": 6, - "walk_speed_multiplier": 1.5, - "sprint_speed_multiplier": 2 - } - ] - }, - "minecraft:flocking": { - "in_water": true, - "match_variants": false, - "use_center_of_mass": true, - "low_flock_limit": 4, - "high_flock_limit": 8, - "goal_weight": 2, - "loner_chance": 0.1, - "influence_radius": 3, - "breach_influence": 7, - "separation_weight": 1.75, - "separation_threshold": 0.95, - "cohesion_weight": 2, - "cohesion_threshold": 1.95, - "innner_cohesion_threshold": 1.25, - "min_height": 1.5, - "max_height": 6, - "block_distance": 2, - "block_weight": 0.85 - }, - "minecraft:nameable": {}, - "minecraft:conditional_bandwidth_optimization": {} - } - } -} diff --git a/build/entities/fishing_hook.json b/build/entities/fishing_hook.json deleted file mode 100644 index 5227159..0000000 --- a/build/entities/fishing_hook.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:fishing_hook", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "loot_jungle": { - "minecraft:loot": { - "table": "loot_tables/gameplay/jungle_fishing.json" - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:collision_box": { - "width": 0.15, - "height": 0.15 - }, - "minecraft:projectile": { - "on_hit": { - "stick_in_ground": {} - } - }, - "minecraft:loot": { - "table": "loot_tables/gameplay/fishing.json" - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": false, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "filters": { - "test": "is_biome", - "value": "jungle" - }, - "add": { - "component_groups": ["loot_jungle"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/fox.json b/build/entities/fox.json deleted file mode 100644 index 2d0792e..0000000 --- a/build/entities/fox.json +++ /dev/null @@ -1,1046 +0,0 @@ -{ - "format_version": "1.17.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:fox", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:fox_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["sweet_berries", "glow_berries"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 9, - "speed_multiplier": 1.1 - } - }, - "minecraft:fox_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/fox.json" - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": false, - "breed_items": ["sweet_berries", "glow_berries"], - "breeds_with": { - "mate_type": "minecraft:fox", - "baby_type": "minecraft:fox", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - } - } - }, - "minecraft:fox_with_item": { - "minecraft:equipment": { - "table": "loot_tables/entities/fox_equipment.json", - "slot_drop_chance": [ - { - "slot": "slot.weapon.mainhand", - "drop_chance": 1 - } - ] - } - }, - "minecraft:trusting_fox": { - "minecraft:trust": {}, - "minecraft:behavior.defend_trusted_target": { - "priority": 0, - "within_radius": 25, - "must_see": false, - "aggro_sound": "mad", - "sound_chance": 0.05, - "on_defend_start": { - "event": "minecraft:fox_configure_defending", - "target": "self" - } - } - }, - "minecraft:docile_fox": { - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25 - }, - "minecraft:behavior.melee_attack": { - "priority": 10, - "track_target": true, - "require_complete_path": true, - "reach_multiplier": 1.5 - } - }, - "minecraft:defending_fox": { - "minecraft:behavior.melee_attack": { - "priority": 1, - "track_target": true, - "require_complete_path": true, - "reach_multiplier": 1.5 - }, - "minecraft:behavior.panic": { - "priority": 2, - "speed_multiplier": 1.25 - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": true - }, - { - "test": "has_target", - "operator": "==", - "value": false - } - ] - }, - "event": "minecraft:fox_configure_docile_day" - }, - { - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": false - }, - { - "test": "has_target", - "operator": "==", - "value": false - } - ] - }, - "event": "minecraft:fox_configure_docile_night" - } - ] - } - }, - "minecraft:fox_red": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:behavior.nearest_prioritized_attackable_target": { - "priority": 6, - "attack_interval": 2, - "reselect_targets": true, - "target_search_height": 5, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "rabbit" - }, - "max_dist": 12, - "priority": 0 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "chicken" - }, - "max_dist": 12, - "priority": 0 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cod" - }, - "max_dist": 12, - "priority": 1 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "salmon" - }, - "max_dist": 12, - "priority": 1 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "tropicalfish" - }, - "max_dist": 12, - "priority": 1 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 12, - "priority": 0 - } - ] - } - }, - "minecraft:fox_arctic": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:behavior.nearest_prioritized_attackable_target": { - "priority": 6, - "attack_interval": 2, - "reselect_targets": true, - "target_search_height": 5, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "rabbit" - }, - "max_dist": 12, - "priority": 1 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "chicken" - }, - "max_dist": 12, - "priority": 1 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cod" - }, - "max_dist": 12, - "priority": 0 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "salmon" - }, - "max_dist": 12, - "priority": 0 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "tropicalfish" - }, - "max_dist": 12, - "priority": 0 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 12, - "priority": 1 - } - ] - } - }, - "minecraft:fox_thunderstorm": { - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "all_of": [ - { - "test": "weather_at_position", - "operator": "!=", - "value": "thunderstorm" - }, - { - "test": "is_daytime", - "value": true - } - ] - }, - "event": "minecraft:fox_configure_day" - }, - { - "filters": { - "all_of": [ - { - "test": "weather_at_position", - "operator": "!=", - "value": "thunderstorm" - }, - { - "test": "is_daytime", - "value": false - } - ] - }, - "event": "minecraft:fox_configure_night" - } - ] - }, - "minecraft:behavior.find_cover": { - "priority": 0, - "speed_multiplier": 1, - "cooldown_time": 0 - } - }, - "minecraft:fox_day": { - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "weather_at_position", - "value": "thunderstorm" - }, - "event": "minecraft:fox_configure_thunderstorm" - }, - { - "filters": { - "test": "is_daytime", - "value": false - }, - "event": "minecraft:fox_configure_night" - } - ] - }, - "minecraft:behavior.nap": { - "priority": 8, - "cooldown_min": 2, - "cooldown_max": 7, - "mob_detect_dist": 12, - "mob_detect_height": 6, - "can_nap_filters": { - "all_of": [ - { - "test": "in_water", - "subject": "self", - "operator": "==", - "value": false - }, - { - "test": "on_ground", - "subject": "self", - "operator": "==", - "value": true - }, - { - "test": "is_underground", - "subject": "self", - "operator": "==", - "value": true - }, - { - "test": "weather_at_position", - "subject": "self", - "operator": "!=", - "value": "thunderstorm" - } - ] - }, - "wake_mob_exceptions": { - "any_of": [ - { - "test": "trusts", - "subject": "other", - "operator": "==", - "value": true - }, - { - "test": "is_family", - "subject": "other", - "operator": "==", - "value": "fox" - }, - { - "test": "is_sneaking", - "subject": "other", - "operator": "==", - "value": true - } - ] - } - }, - "minecraft:behavior.find_cover": { - "priority": 9, - "speed_multiplier": 1, - "cooldown_time": 5 - } - }, - "minecraft:fox_night": { - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "weather_at_position", - "value": "thunderstorm" - }, - "event": "minecraft:fox_configure_thunderstorm" - }, - { - "filters": { - "test": "is_daytime", - "value": true - }, - "event": "minecraft:fox_configure_day" - } - ] - }, - "minecraft:behavior.stroll_towards_village": { - "priority": 11, - "speed_multiplier": 1, - "goal_radius": 3, - "cooldown_time": 10, - "search_range": 32, - "start_chance": 0.005 - } - }, - "minecraft:fox_ambient_normal": { - "minecraft:ambient_sound_interval": { - "event_name": "ambient" - } - }, - "minecraft:fox_ambient_sleep": { - "minecraft:ambient_sound_interval": { - "event_name": "sleep" - } - }, - "minecraft:fox_ambient_night": { - "minecraft:ambient_sound_interval": { - "event_name": "screech", - "value": 80, - "range": 160 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["fox", "lightweight", "mob"] - }, - "minecraft:breathable": { - "totalSupply": 15, - "suffocateTime": 0 - }, - "minecraft:equip_item": {}, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 0.7 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:attack": { - "damage": 2 - }, - "minecraft:shareables": { - "all_items": true, - "all_items_max_amount": 1, - "items": [ - { - "item": "minecraft:apple", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:appleEnchanted", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:baked_potato", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:beef", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:beetroot", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:beetroot_soup", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:bread", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:carrot", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:chicken", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:chorus_fruit", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:clownfish", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:cooked_beef", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:cooked_chicken", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:cooked_fish", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:cooked_porkchop", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:cooked_rabbit", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:cooked_salmon", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:cookie", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:dried_kelp", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:fish", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:golden_apple", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:golden_carrot", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:melon", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:mushroom_stew", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:muttonCooked", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:muttonRaw", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:poisonous_potato", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:porkchop", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:potato", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:pufferfish", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:pumpkin_pie", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:rabbit", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:rabbit_stew", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:rotten_flesh", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:salmon", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:spider_eye", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:sweet_berries", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:glow_berries", - "priority": 0, - "max_amount": 1 - }, - { - "item": "minecraft:suspicious_stew", - "priority": 0, - "max_amount": 1 - } - ] - }, - "minecraft:damage_sensor": { - "triggers": [ - { - "on_damage": { - "filters": { - "test": "is_block", - "subject": "block", - "value": "minecraft:sweet_berry_bush" - } - }, - "deals_damage": false - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.equip_item": { - "priority": 2 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 5, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "trusts", - "subject": "other", - "operator": "!=", - "value": true - }, - { - "test": "is_sneaking", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - { - "test": "is_family", - "subject": "other", - "value": "polarbear" - }, - { - "test": "is_family", - "subject": "other", - "value": "wolf" - } - ] - }, - "max_dist": 10, - "walk_speed_multiplier": 1, - "sprint_speed_multiplier": 1.5 - } - ] - }, - "minecraft:behavior.tempt": { - "priority": 3, - "speed_multiplier": 0.5, - "within_radius": 16, - "can_get_scared": true, - "items": ["sweet_berries", "glow_berries"] - }, - "minecraft:behavior.stalk_and_pounce_on_target": { - "priority": 7, - "stalk_speed": 1.2, - "max_stalk_dist": 12, - "leap_height": 0.9, - "leap_dist": 0.8, - "pounce_max_dist": 5, - "interest_time": 2, - "stuck_time": 2, - "strike_dist": 2, - "stuck_blocks": { - "test": "is_block", - "subject": "block", - "operator": "==", - "value": "snow_layer" - } - }, - "minecraft:behavior.pickup_items": { - "priority": 11, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 0.5 - }, - "minecraft:behavior.eat_carried_item": { - "priority": 12, - "delay_before_eating": 28 - }, - "minecraft:behavior.random_look_around_and_sit": { - "priority": 12, - "min_look_count": 2, - "max_look_count": 5, - "min_look_time": 80, - "max_look_time": 100, - "probability": 0.001 - }, - "minecraft:behavior.raid_garden": { - "priority": 12, - "blocks": ["minecraft:sweet_berry_bush", "minecraft:cave_vines_head_with_berries", "minecraft:cave_vines_body_with_berries"], - "speed_multiplier": 1.2, - "search_range": 12, - "search_height": 2, - "goal_radius": 0.8, - "max_to_eat": 0, - "initial_eat_delay": 2 - }, - "minecraft:behavior.random_stroll": { - "priority": 13, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.look_at_player": { - "priority": 14, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 15 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 0.6 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:scheduler": { - "min_delay_secs": 0, - "max_delay_secs": 0, - "scheduled_events": [ - { - "filters": [ - { - "test": "is_sleeping", - "value": true - } - ], - "event": "minecraft:ambient_sleep" - }, - { - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": false - }, - { - "test": "distance_to_nearest_player", - "operator": ">", - "value": 16 - } - ] - }, - "event": "minecraft:ambient_night" - }, - { - "filters": { - "all_of": [ - { - "test": "is_sleeping", - "value": false - }, - { - "any_of": [ - { - "test": "is_daytime", - "value": true - }, - { - "test": "distance_to_nearest_player", - "operator": "<=", - "value": 16 - } - ] - } - ] - }, - "event": "minecraft:ambient_normal" - } - ] - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "is_daytime", - "value": false - }, - "event": "minecraft:fox_configure_night" - }, - { - "filters": { - "test": "is_daytime", - "value": true - }, - "event": "minecraft:fox_configure_day" - } - ] - }, - "minecraft:block_climber": {} - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 95, - "add": { - "component_groups": ["minecraft:fox_adult", "minecraft:fox_with_item", "minecraft:docile_fox"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["minecraft:fox_baby", "minecraft:docile_fox"] - } - } - ] - }, - { - "filters": { - "test": "is_snow_covered", - "value": true - }, - "add": { - "component_groups": ["minecraft:fox_arctic"] - } - }, - { - "filters": { - "test": "is_snow_covered", - "value": false - }, - "add": { - "component_groups": ["minecraft:fox_red"] - } - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:fox_baby", "minecraft:trusting_fox", "minecraft:docile_fox"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:fox_baby"] - }, - "add": { - "component_groups": ["minecraft:fox_adult"] - } - }, - "minecraft:fox_configure_thunderstorm": { - "remove": { - "component_groups": ["minecraft:fox_night", "minecraft:fox_day"] - }, - "add": { - "component_groups": ["minecraft:fox_thunderstorm"] - } - }, - "minecraft:fox_configure_day": { - "remove": { - "component_groups": ["minecraft:fox_night", "minecraft:fox_thunderstorm"] - }, - "add": { - "component_groups": ["minecraft:fox_day"] - } - }, - "minecraft:fox_configure_night": { - "remove": { - "component_groups": ["minecraft:fox_day", "minecraft:fox_thunderstorm"] - }, - "add": { - "component_groups": ["minecraft:fox_night"] - } - }, - "minecraft:ambient_normal": { - "add": { - "component_groups": ["minecraft:fox_ambient_normal"] - } - }, - "minecraft:ambient_sleep": { - "add": { - "component_groups": ["minecraft:fox_ambient_sleep"] - } - }, - "minecraft:ambient_night": { - "add": { - "component_groups": ["minecraft:fox_ambient_night"] - } - }, - "minecraft:fox_configure_defending": { - "remove": { - "component_groups": ["minecraft:docile_fox", "minecraft:fox_day", "minecraft:fox_night"] - }, - "add": { - "component_groups": ["minecraft:defending_fox"] - } - }, - "minecraft:fox_configure_docile_day": { - "remove": { - "component_groups": ["minecraft:defending_fox", "minecraft:fox_night"] - }, - "add": { - "component_groups": ["minecraft:docile_fox", "minecraft:fox_day"] - } - }, - "minecraft:fox_configure_docile_night": { - "remove": { - "component_groups": ["minecraft:defending_fox", "minecraft:fox_day"] - }, - "add": { - "component_groups": ["minecraft:docile_fox", "minecraft:fox_night"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/frog.json b/build/entities/frog.json deleted file mode 100644 index 2498bce..0000000 --- a/build/entities/frog.json +++ /dev/null @@ -1,525 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:frog", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "temperate_frog": { - "minecraft:variant": { - "value": 0 - } - }, - "cold_frog": { - "minecraft:variant": { - "value": 1 - } - }, - "warm_frog": { - "minecraft:variant": { - "value": 2 - } - }, - "pregnant": { - "minecraft:behavior.lay_egg": { - "priority": 2, - "speed_multiplier": 1, - "search_range": 10, - "search_height": 3, - "goal_radius": 1.7, - "target_blocks": ["minecraft:water"], - "target_materials_above_block": ["Air"], - "allow_laying_from_below": true, - "use_default_animation": false, - "lay_seconds": 2, - "egg_type": "minecraft:frog_spawn", - "lay_egg_sound": "lay_spawn", - "on_lay": { - "event": "laid_egg", - "target": "self" - } - }, - "minecraft:behavior.move_to_water": { - "priority": 3, - "search_range": 20, - "search_height": 5, - "goal_radius": 1.5 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["frog", "mob"] - }, - "minecraft:collision_box": { - "width": 0.5, - "height": 0.55 - }, - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true, - "breathes_air": true, - "generates_bubbles": false - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 10 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": true, - "damage_modifier": -5 - } - }, - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": true, - "can_swim": true, - "can_walk": true, - "can_sink": false, - "avoid_damage_blocks": true - }, - "minecraft:movement.amphibious": {}, - "minecraft:movement": { - "value": 0.1 - }, - "minecraft:underwater_movement": { - "value": 0.15 - }, - "minecraft:jump.static": {}, - "minecraft:physics": {}, - "minecraft:pushable": {}, - "minecraft:leashable": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:breedable": { - "require_tame": false, - "causes_pregnancy": true, - "breeds_with": { - "mate_type": "minecraft:frog", - "baby_type": "minecraft:tadpole", - "breed_event": { - "event": "become_pregnant" - } - }, - "breed_items": ["slime_ball"] - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 2 - }, - "minecraft:behavior.breed": { - "priority": 4 - }, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 1.25, - "can_tempt_vertically": true, - "items": ["slime_ball"] - }, - "minecraft:behavior.move_to_land": { - "priority": 6, - "search_range": 30, - "search_height": 8, - "search_count": 80, - "goal_radius": 2 - }, - "minecraft:behavior.eat_mob": { - "priority": 7, - "run_speed": 2, - "eat_animation_time": 0.3, - "pull_in_force": 0.75, - "reach_mob_distance": 1.75, - "eat_mob_sound": "tongue", - "loot_table": "loot_tables/entities/frog.json" - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 8, - "within_radius": 16, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "slime" - }, - { - "test": "is_variant", - "subject": "other", - "operator": "==", - "value": 1 - } - ] - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "magmacube" - }, - { - "test": "is_variant", - "subject": "other", - "operator": "==", - "value": 1 - } - ] - }, - "max_dist": 16 - } - ], - "must_see": true - }, - "minecraft:behavior.croak": { - "priority": 9, - "interval": [10, 20], - "duration": 4.5, - "filters": { - "all_of": [ - { - "test": "in_water", - "value": false - }, - { - "test": "in_lava", - "value": false - } - ] - } - }, - "minecraft:behavior.jump_to_block": { - "priority": 10, - "search_width": 8, - "search_height": 4, - "minimum_path_length": 2, - "minimum_distance": 1, - "scale_factor": 0.6, - "max_velocity": 1, - "cooldown_range": [5, 7], - "preferred_blocks": ["minecraft:waterlily", "minecraft:big_dripleaf"], - "preferred_blocks_chance": 0.5, - "forbidden_blocks": ["minecraft:water"] - }, - "minecraft:behavior.random_stroll": { - "priority": 11 - }, - "minecraft:behavior.look_at_player": { - "priority": 12, - "target_distance": 6, - "probability": 0.02 - } - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "add": { - "component_groups": ["temperate_frog"] - } - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "desert" - }, - { - "test": "has_biome_tag", - "value": "jungle" - }, - { - "test": "has_biome_tag", - "value": "savanna" - }, - { - "test": "has_biome_tag", - "value": "mesa" - }, - { - "test": "has_biome_tag", - "value": "nether" - }, - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "warm" - }, - { - "test": "has_biome_tag", - "value": "ocean" - } - ] - }, - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "lukewarm" - }, - { - "test": "has_biome_tag", - "value": "ocean" - } - ] - }, - { - "test": "has_biome_tag", - "value": "mangrove_swamp" - } - ] - }, - "add": { - "component_groups": ["warm_frog"] - } - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "mountain" - }, - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "mountains" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "meadow" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "cherry_grove" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "stony_peaks" - } - ] - }, - { - "test": "has_biome_tag", - "value": "ice" - }, - { - "test": "has_biome_tag", - "value": "cold" - }, - { - "test": "has_biome_tag", - "value": "frozen" - }, - { - "test": "has_biome_tag", - "value": "the_end" - }, - { - "test": "has_biome_tag", - "value": "deep_dark" - } - ] - }, - "add": { - "component_groups": ["cold_frog"] - } - } - ] - }, - "spawn_temperate": { - "add": { - "component_groups": ["temperate_frog"] - } - }, - "spawn_cold": { - "add": { - "component_groups": ["cold_frog"] - } - }, - "spawn_warm": { - "add": { - "component_groups": ["warm_frog"] - } - }, - "minecraft:entity_transformed": { - "sequence": [ - { - "add": { - "component_groups": ["temperate_frog"] - } - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "desert" - }, - { - "test": "has_biome_tag", - "value": "jungle" - }, - { - "test": "has_biome_tag", - "value": "savanna" - }, - { - "test": "has_biome_tag", - "value": "mesa" - }, - { - "test": "has_biome_tag", - "value": "nether" - }, - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "warm" - }, - { - "test": "has_biome_tag", - "value": "ocean" - } - ] - }, - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "lukewarm" - }, - { - "test": "has_biome_tag", - "value": "ocean" - } - ] - }, - { - "test": "has_biome_tag", - "value": "mangrove_swamp" - } - ] - }, - "add": { - "component_groups": ["warm_frog"] - } - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "mountain" - }, - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "mountains" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "meadow" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "cherry_grove" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "stony_peaks" - } - ] - }, - { - "test": "has_biome_tag", - "value": "ice" - }, - { - "test": "has_biome_tag", - "value": "cold" - }, - { - "test": "has_biome_tag", - "value": "frozen" - }, - { - "test": "has_biome_tag", - "value": "the_end" - }, - { - "test": "has_biome_tag", - "value": "deep_dark" - } - ] - }, - "add": { - "component_groups": ["cold_frog"] - } - } - ] - }, - "become_pregnant": { - "add": { - "component_groups": ["pregnant"] - } - }, - "laid_egg": { - "remove": { - "component_groups": ["pregnant"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/ghast.json b/build/entities/ghast.json deleted file mode 100644 index 00c4df9..0000000 --- a/build/entities/ghast.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:ghast", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:fire_immune": {}, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:collision_box": { - "width": 4.02, - "height": 4 - }, - "minecraft:movement": { - "value": 0.03 - }, - "minecraft:navigation.float": { - "can_path_over_water": true - }, - "minecraft:behavior.float_wander": { - "priority": 2, - "must_reach": true - }, - "minecraft:can_fly": {}, - "minecraft:loot": { - "table": "loot_tables/entities/ghast.json" - }, - "minecraft:shooter": { - "def": "minecraft:fireball" - }, - "minecraft:type_family": { - "family": ["ghast", "monster", "mob"] - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:jump.static": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.ranged_attack": { - "priority": 1, - "attack_radius": 64, - "charge_shoot_trigger": 2, - "charge_charged_trigger": 1 - }, - "minecraft:follow_range": { - "value": 64, - "max": 64 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 28 - } - ], - "must_see": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - } - } -} diff --git a/build/entities/glow_squid.json b/build/entities/glow_squid.json deleted file mode 100644 index 974410e..0000000 --- a/build/entities/glow_squid.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "format_version": "1.18.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:glow_squid", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:squid_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "!query.is_baby && query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["squid", "mob"] - }, - "minecraft:collision_box": { - "width": 0.95, - "height": 0.95 - }, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/glow_squid.json" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_air": false, - "breathes_water": true - }, - "minecraft:movement": { - "value": 0.2 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "can_sink": false - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 0.5 - }, - "minecraft:behavior.squid_move_away_from_ground": { - "priority": 1 - }, - "minecraft:behavior.squid_flee": { - "priority": 2 - }, - "minecraft:behavior.squid_idle": { - "priority": 2 - }, - "minecraft:behavior.squid_dive": { - "priority": 2 - }, - "minecraft:behavior.squid_out_of_water": { - "priority": 2 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - } - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "remove": {}, - "add": {} - }, - { - "weight": 5, - "remove": {}, - "add": { - "component_groups": ["minecraft:squid_baby"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/goat.json b/build/entities/goat.json deleted file mode 100644 index b1fe3f8..0000000 --- a/build/entities/goat.json +++ /dev/null @@ -1,419 +0,0 @@ -{ - "format_version": "1.18.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:goat", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "goat_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:behavior.follow_parent": { - "priority": 6, - "speed_multiplier": 1 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": "wheat", - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:attack": { - "damage": 1 - } - }, - "goat_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/goat.json" - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 0.6 - }, - "minecraft:breedable": { - "require_tame": false, - "breed_items": "wheat", - "breeds_with": { - "mate_type": "minecraft:goat", - "baby_type": "minecraft:goat", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "mutation_factor": { - "variant": 0 - } - }, - "minecraft:attack": { - "damage": 2 - } - }, - "goat_default": { - "minecraft:variant": { - "value": 0 - } - }, - "goat_screamer": { - "minecraft:variant": { - "value": 1 - } - }, - "interact_default": { - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:is_baby" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "bucket:0" - } - ] - } - }, - "use_item": true, - "transform_to_item": "bucket:1", - "play_sounds": "milk_suspiciously", - "interact_text": "action.interact.milk" - } - ] - } - }, - "interact_screamer": { - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:is_baby" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "bucket:0" - } - ] - } - }, - "use_item": true, - "transform_to_item": "bucket:1", - "play_sounds": "milk.screamer", - "interact_text": "action.interact.milk" - } - ] - } - }, - "ram_default": { - "minecraft:behavior.ram_attack": { - "priority": 5, - "run_speed": 0.7, - "ram_speed": 1.8, - "min_ram_distance": 4, - "ram_distance": 7, - "knockback_force": 2.5, - "knockback_height": 0.04, - "pre_ram_sound": "pre_ram", - "ram_impact_sound": "ram_impact", - "cooldown_range": [30, 300], - "on_start": [ - { - "event": "start_event", - "target": "self" - } - ] - } - }, - "ram_screamer": { - "minecraft:behavior.ram_attack": { - "priority": 5, - "run_speed": 0.7, - "ram_speed": 1.8, - "min_ram_distance": 4, - "ram_distance": 7, - "knockback_force": 2.5, - "knockback_height": 0.04, - "pre_ram_sound": "pre_ram.screamer", - "ram_impact_sound": "ram_impact.screamer", - "cooldown_range": [5, 15], - "on_start": [ - { - "event": "start_event", - "target": "self" - } - ] - } - }, - "attack_cooldown": { - "minecraft:attack_cooldown": { - "attack_cooldown_time": [30, 40], - "attack_cooldown_complete_event": { - "event": "attack_cooldown_complete_event", - "target": "self" - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:behavior.jump_to_block": { - "priority": 8, - "search_width": 10, - "search_height": 10, - "minimum_path_length": 8, - "minimum_distance": 1, - "scale_factor": 0.6, - "cooldown_range": [30, 60] - }, - "minecraft:genetics": { - "mutation_rate": 0.02, - "genes": [ - { - "name": "goat_variant", - "use_simplified_breeding": true, - "allele_range": { - "range_min": 1, - "range_max": 100 - }, - "genetic_variants": [ - { - "main_allele": { - "range_min": 1, - "range_max": 2 - }, - "birth_event": { - "event": "minecraft:born_screamer", - "target": "self" - } - }, - { - "main_allele": { - "range_min": 3, - "range_max": 100 - }, - "birth_event": { - "event": "minecraft:born_default", - "target": "self" - } - } - ] - } - ] - }, - "minecraft:type_family": { - "family": ["goat", "animal"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true, - "blocks_to_avoid": [ - { - "name": "minecraft:powder_snow" - } - ] - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:collision_box": { - "width": 0.9, - "height": 1.3 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.4 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1 - }, - "minecraft:behavior.tempt": { - "priority": 4, - "speed_multiplier": 0.75, - "items": ["wheat"] - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 6, - "within_radius": 16, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "goat" - }, - { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:attack_cooldown" - } - ] - }, - "max_dist": 16 - } - ], - "must_see": true - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": true, - "damage_modifier": -10 - } - }, - "minecraft:behavior.random_stroll": { - "priority": 9, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.look_at_player": { - "priority": 10, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 11 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - } - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "add": { - "component_groups": ["goat_adult"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["goat_baby"] - } - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["goat_baby"] - } - }, - "minecraft:born_default": { - "add": { - "component_groups": ["goat_default", "ram_default", "interact_default"] - } - }, - "minecraft:born_screamer": { - "add": { - "component_groups": ["goat_screamer", "ram_screamer", "interact_screamer"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["goat_baby"] - }, - "add": { - "component_groups": ["goat_adult"] - } - }, - "start_event": { - "add": { - "component_groups": ["attack_cooldown"] - } - }, - "attack_cooldown_complete_event": { - "remove": { - "component_groups": ["attack_cooldown"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/guardian.json b/build/entities/guardian.json deleted file mode 100644 index d074ac4..0000000 --- a/build/entities/guardian.json +++ /dev/null @@ -1,238 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:guardian", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:guardian_aggressive": { - "minecraft:behavior.nearest_attackable_target": { - "priority": 1, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "squid" - }, - { - "test": "is_family", - "subject": "other", - "value": "axolotl" - } - ] - }, - "max_dist": 16 - } - ], - "attack_interval_min": 1, - "must_see": true - }, - "minecraft:target_nearby_sensor": { - "inside_range": 3, - "outside_range": 4, - "on_inside_range": { - "event": "minecraft:target_too_close", - "target": "self" - } - }, - "minecraft:behavior.guardian_attack": { - "priority": 4 - } - }, - "minecraft:guardian_passive": { - "minecraft:timer": { - "time": [1, 3], - "looping": false, - "time_down_event": { - "event": "minecraft:target_far_enough", - "target": "self" - } - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 1, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 8, - "walk_speed_multiplier": 1, - "sprint_speed_multiplier": 1 - } - ] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 10 : 0" - }, - "minecraft:nameable": {}, - "minecraft:collision_box": { - "width": 0.85, - "height": 0.85 - }, - "minecraft:health": { - "value": 30, - "max": 30 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.12 - }, - "minecraft:underwater_movement": { - "value": 0.12 - }, - "minecraft:attack": { - "damage": 5 - }, - "minecraft:follow_range": { - "value": 16, - "max": 16 - }, - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": false, - "can_swim": true, - "can_walk": false, - "can_breach": true - }, - "minecraft:movement.sway": {}, - "minecraft:jump.static": {}, - "minecraft:breathable": { - "breathes_water": true - }, - "minecraft:loot": { - "table": "loot_tables/entities/guardian.json" - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:home": { - "restriction_radius": 16 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 1, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "squid" - }, - { - "test": "is_family", - "subject": "other", - "value": "axolotl" - } - ] - }, - "max_dist": 16 - } - ], - "attack_interval_min": 1, - "must_see": true - }, - "minecraft:target_nearby_sensor": { - "inside_range": 3, - "outside_range": 4, - "on_inside_range": { - "event": "minecraft:target_too_close", - "target": "self" - } - }, - "minecraft:behavior.guardian_attack": { - "priority": 4 - }, - "minecraft:behavior.move_towards_home_restriction": { - "priority": 5, - "speed_multiplier": 1 - }, - "minecraft:behavior.random_swim": { - "priority": 7, - "speed_multiplier": 1, - "interval": 80, - "avoid_surface": false - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 12, - "probability": 0.01 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:type_family": { - "family": ["guardian", "monster", "mob"] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:target_too_close": { - "remove": { - "component_groups": ["minecraft:guardian_aggressive"] - }, - "add": { - "component_groups": ["minecraft:guardian_passive"] - } - }, - "minecraft:target_far_enough": { - "remove": { - "component_groups": ["minecraft:guardian_passive"] - }, - "add": { - "component_groups": ["minecraft:guardian_aggressive"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/hoglin.json b/build/entities/hoglin.json deleted file mode 100644 index 55cda06..0000000 --- a/build/entities/hoglin.json +++ /dev/null @@ -1,472 +0,0 @@ -{ - "format_version": "1.18.30", - "minecraft:entity": { - "description": { - "identifier": "minecraft:hoglin", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "zombification_sensor": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "in_nether", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "start_zombification_event" - } - } - }, - "start_zombification": { - "minecraft:is_shaking": {}, - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "in_nether", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "stop_zombification_event" - } - }, - "minecraft:timer": { - "looping": false, - "time": 15, - "time_down_event": { - "event": "become_zombie_event" - } - } - }, - "become_zombie": { - "minecraft:transformation": { - "into": "minecraft:zoglin", - "transformation_sound": "converted_to_zombified", - "keep_level": true - } - }, - "angry_hoglin": { - "minecraft:angry": { - "duration": 10, - "broadcast_anger": true, - "broadcast_range": 16, - "calm_event": { - "event": "become_calm_event", - "target": "self" - }, - "angry_sound": "angry", - "sound_interval": { - "range_min": 2, - "range_max": 5 - } - } - }, - "attack_cooldown": { - "minecraft:attack_cooldown": { - "attack_cooldown_time": [10, 15], - "attack_cooldown_complete_event": { - "event": "attack_cooldown_complete_event", - "target": "self" - } - } - }, - "minecraft:hoglin_baby": { - "minecraft:type_family": { - "family": ["hoglin", "hoglin_baby", "mob"] - }, - "minecraft:is_baby": {}, - "minecraft:movement": { - "value": 0.36 - }, - "minecraft:behavior.melee_attack": { - "priority": 4, - "speed_multiplier": 1, - "track_target": true, - "reach_multiplier": 1, - "cooldown_time": 0.75 - }, - "minecraft:attack": { - "damage": 1 - }, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:collision_box": { - "width": 0.85, - "height": 0.85 - }, - "minecraft:custom_hit_test": { - "hitboxes": [ - { - "width": 1, - "height": 0.85, - "pivot": [0, 0.5, 0] - } - ] - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["crimson_fungus"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 6, - "speed_multiplier": 1 - }, - "minecraft:rideable": { - "seat_count": 3, - "family_types": ["piglin"], - "seats": [ - { - "position": [0, 0.9, -0.3], - "lock_rider_rotation": 0 - }, - { - "position": [0, 2.4, -0.3], - "lock_rider_rotation": 0 - }, - { - "position": [0, 3.9, -0.3], - "lock_rider_rotation": 0 - } - ] - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1 - } - }, - "minecraft:hoglin_adult": { - "minecraft:collision_box": { - "width": 1.4, - "height": 1.4 - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:custom_hit_test": { - "hitboxes": [ - { - "width": 2, - "height": 1.75, - "pivot": [0, 1, 0] - } - ] - }, - "minecraft:group_size": { - "radius": 32, - "filters": { - "all_of": [ - { - "test": "has_component", - "operator": "!=", - "value": "minecraft:is_baby" - }, - { - "test": "is_family", - "value": "hoglin" - } - ] - } - }, - "minecraft:behavior.hurt_by_target": { - "priority": 2 - }, - "minecraft:on_target_acquired": { - "event": "become_angry_event", - "target": "self" - }, - "minecraft:loot": { - "table": "loot_tables/entities/hoglin.json" - }, - "minecraft:behavior.melee_attack": { - "priority": 4, - "speed_multiplier": 1, - "track_target": true, - "reach_multiplier": 2.15, - "cooldown_time": 2 - }, - "minecraft:attack": { - "damage": [3, 9] - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 0.6 - }, - "minecraft:breedable": { - "require_tame": false, - "love_filters": { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:attack_cooldown" - }, - "breeds_with": { - "mate_type": "minecraft:hoglin", - "baby_type": "minecraft:hoglin", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "breed_items": ["crimson_fungus"] - } - }, - "unhuntable_adult": { - "minecraft:type_family": { - "family": ["hoglin", "hoglin_adult", "mob"] - } - }, - "huntable_adult": { - "minecraft:type_family": { - "family": ["hoglin", "hoglin_adult", "hoglin_huntable", "mob"] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 40, - "max": 40 - }, - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:knockback_resistance": { - "value": 0.6 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 4, - "within_radius": 16, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:attack_cooldown" - } - ] - }, - "max_dist": 16 - } - ], - "must_see": true - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 0, - "remove_target": true, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "has_target", - "subject": "other", - "value": true - }, - { - "test": "is_family", - "subject": "other", - "value": "piglin" - } - ] - }, - "check_if_outnumbered": true, - "max_dist": 10, - "sprint_speed_multiplier": 1.2 - } - ], - "avoid_mob_sound": "retreat", - "sound_interval": { - "range_min": 2, - "range_max": 5 - } - }, - "minecraft:behavior.avoid_block": { - "priority": 1, - "tick_interval": 5, - "search_range": 8, - "search_height": 4, - "walk_speed_modifier": 1, - "sprint_speed_modifier": 1, - "avoid_block_sound": "retreat", - "sound_interval": { - "range_min": 2, - "range_max": 5 - }, - "target_selection_method": "nearest", - "target_blocks": ["minecraft:warped_fungus", "minecraft:portal", "minecraft:respawn_anchor"], - "on_escape": [ - { - "event": "escaped_event", - "target": "self" - } - ] - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 0.4 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:balloonable": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "trigger": "spawn_adult" - }, - { - "weight": 5, - "trigger": "spawn_baby" - } - ] - }, - "minecraft:entity_born": { - "trigger": "spawn_baby" - }, - "spawn_adult": { - "add": { - "component_groups": ["minecraft:hoglin_adult", "huntable_adult", "zombification_sensor"] - } - }, - "spawn_baby": { - "add": { - "component_groups": ["minecraft:hoglin_baby", "zombification_sensor"] - } - }, - "stop_zombification_event": { - "add": { - "component_groups": ["zombification_sensor"] - }, - "remove": { - "component_groups": ["start_zombification"] - } - }, - "become_zombie_event": { - "add": { - "component_groups": ["become_zombie"] - } - }, - "start_zombification_event": { - "add": { - "component_groups": ["start_zombification"] - }, - "remove": { - "component_groups": ["zombification_sensor"] - } - }, - "spawn_adult_unhuntable": { - "add": { - "component_groups": ["minecraft:hoglin_adult", "unhuntable_adult", "zombification_sensor"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:hoglin_baby"] - }, - "add": { - "component_groups": ["minecraft:hoglin_adult", "huntable_adult"] - } - }, - "become_angry_event": { - "add": { - "component_groups": ["angry_hoglin"] - } - }, - "become_calm_event": { - "remove": { - "component_groups": ["angry_hoglin"] - } - }, - "escaped_event": { - "add": { - "component_groups": ["attack_cooldown"] - }, - "remove": { - "component_groups": ["angry_hoglin"] - } - }, - "attack_cooldown_complete_event": { - "remove": { - "component_groups": ["attack_cooldown"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/hopper_minecart.json b/build/entities/hopper_minecart.json deleted file mode 100644 index 291b21d..0000000 --- a/build/entities/hopper_minecart.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:hopper_minecart", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:hopper_active": { - "minecraft:item_hopper": {}, - "minecraft:rail_sensor": { - "on_activate": { - "event": "minecraft:hopper_deactivate" - } - } - }, - "minecraft:hopper_inactive": { - "minecraft:rail_sensor": { - "on_deactivate": { - "event": "minecraft:hopper_activate" - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:type_family": { - "family": ["minecart", "inanimate"] - }, - "minecraft:collision_box": { - "width": 0.98, - "height": 0.7 - }, - "minecraft:rail_movement": {}, - "minecraft:inventory": { - "container_type": "minecart_hopper", - "inventory_size": 5, - "can_be_siphoned_from": true - }, - "minecraft:is_stackable": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 60, - "max_dropped_ticks": 20, - "use_motion_prediction_hints": true - }, - "conditional_values": [ - { - "max_optimized_distance": 0, - "max_dropped_ticks": 0, - "conditional_values": [ - { - "test": "is_moving", - "subject": "self", - "operator": "==", - "value": true - } - ] - } - ] - } - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:hopper_active"] - } - }, - "minecraft:hopper_activate": { - "remove": { - "component_groups": ["minecraft:hopper_inactive"] - }, - "add": { - "component_groups": ["minecraft:hopper_active"] - } - }, - "minecraft:hopper_deactivate": { - "remove": { - "component_groups": ["minecraft:hopper_active"] - }, - "add": { - "component_groups": ["minecraft:hopper_inactive"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/horse.json b/build/entities/horse.json deleted file mode 100644 index 0c639cc..0000000 --- a/build/entities/horse.json +++ /dev/null @@ -1,705 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:horse", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:horse_baby": { - "minecraft:is_baby": {}, - "minecraft:scale_by_age": { - "start_scale": 0.5, - "end_scale": 1 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": [ - { - "item": "wheat", - "growth": 0.016667 - }, - { - "item": "sugar", - "growth": 0.025 - }, - { - "item": "hay_block", - "growth": 0.15 - }, - { - "item": "apple", - "growth": 0.05 - }, - { - "item": "golden_carrot", - "growth": 0.05 - }, - { - "item": "golden_apple", - "growth": 0.2 - }, - { - "item": "appleEnchanted", - "growth": 0.2 - } - ], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 4, - "speed_multiplier": 1 - } - }, - "minecraft:horse_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/horse.json" - }, - "minecraft:behavior.run_around_like_crazy": { - "priority": 1, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.breed": { - "priority": 2, - "speed_multiplier": 1 - } - }, - "minecraft:horse_wild": { - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["player", "zombie"], - "interact_text": "action.interact.mount", - "seats": { - "position": [0, 1.1, -0.2] - } - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.5, - "target_dist": 0, - "track_target": true - }, - "minecraft:tamemount": { - "min_temper": 0, - "max_temper": 100, - "feed_text": "action.interact.feed", - "ride_text": "action.interact.mount", - "feed_items": [ - { - "item": "wheat", - "temper_mod": 3 - }, - { - "item": "sugar", - "temper_mod": 3 - }, - { - "item": "apple", - "temper_mod": 3 - }, - { - "item": "golden_carrot", - "temper_mod": 5 - }, - { - "item": "golden_apple", - "temper_mod": 10 - }, - { - "item": "appleEnchanted", - "temper_mod": 10 - } - ], - "auto_reject_items": [ - { - "item": "horsearmorleather" - }, - { - "item": "horsearmoriron" - }, - { - "item": "horsearmorgold" - }, - { - "item": "horsearmordiamond" - }, - { - "item": "saddle" - } - ], - "tame_event": { - "event": "minecraft:on_tame", - "target": "self" - } - } - }, - "minecraft:horse_tamed": { - "minecraft:is_tamed": {}, - "minecraft:rideable": { - "seat_count": 1, - "crouching_skip_interact": true, - "family_types": ["player"], - "interact_text": "action.interact.ride.horse", - "seats": { - "position": [0, 1.1, -0.2] - } - }, - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "none_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "value": "leather_horse_armor" - }, - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "value": "iron_horse_armor" - }, - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "value": "golden_horse_armor" - }, - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "value": "diamond_horse_armor" - } - ] - }, - { - "any_of": [ - { - "test": "has_equipment", - "subject": "player", - "domain": "hand", - "value": "leather_horse_armor" - }, - { - "test": "has_equipment", - "subject": "player", - "domain": "hand", - "value": "iron_horse_armor" - }, - { - "test": "has_equipment", - "subject": "player", - "domain": "hand", - "value": "golden_horse_armor" - }, - { - "test": "has_equipment", - "subject": "player", - "domain": "hand", - "value": "diamond_horse_armor" - } - ] - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 1, - "interact_text": "action.interact.equiphorsearmor" - }, - { - "play_sounds": "saddle", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "operator": "not", - "value": "saddle" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "saddle" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 0, - "interact_text": "action.interact.saddle" - } - ] - }, - "minecraft:inventory": { - "inventory_size": 2, - "container_type": "horse" - }, - "minecraft:breedable": { - "parent_centric_attribute_blending": ["minecraft:health", "minecraft:movement", "minecraft:horse.jump_strength"], - "require_tame": true, - "inherit_tamed": false, - "breeds_with": [ - { - "mate_type": "minecraft:horse", - "baby_type": "minecraft:horse", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - { - "mate_type": "minecraft:donkey", - "baby_type": "minecraft:mule", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - } - ], - "breed_items": ["golden_carrot", "golden_apple", "appleEnchanted"], - "mutation_factor": { - "extra_variant": 0.2, - "variant": 0.111 - }, - "mutation_strategy": "random", - "random_variant_mutation_interval": [0, 7], - "random_extra_variant_mutation_interval": [0, 5] - }, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 1.2, - "items": ["golden_apple", "appleEnchanted", "golden_carrot"] - } - }, - "minecraft:horse_saddled": { - "minecraft:is_saddled": {}, - "minecraft:input_ground_controlled": {}, - "minecraft:can_power_jump": {}, - "minecraft:behavior.player_ride_tamed": {} - }, - "minecraft:base_white": { - "minecraft:variant": { - "value": 0 - } - }, - "minecraft:base_creamy": { - "minecraft:variant": { - "value": 1 - } - }, - "minecraft:base_chestnut": { - "minecraft:variant": { - "value": 2 - } - }, - "minecraft:base_brown": { - "minecraft:variant": { - "value": 3 - } - }, - "minecraft:base_black": { - "minecraft:variant": { - "value": 4 - } - }, - "minecraft:base_gray": { - "minecraft:variant": { - "value": 5 - } - }, - "minecraft:base_darkbrown": { - "minecraft:variant": { - "value": 6 - } - }, - "minecraft:markings_none": { - "minecraft:mark_variant": { - "value": 0 - } - }, - "minecraft:markings_white_details": { - "minecraft:mark_variant": { - "value": 1 - } - }, - "minecraft:markings_white_fields": { - "minecraft:mark_variant": { - "value": 2 - } - }, - "minecraft:markings_white_dots": { - "minecraft:mark_variant": { - "value": 3 - } - }, - "minecraft:markings_black_dots": { - "minecraft:mark_variant": { - "value": 4 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:equippable": { - "slots": [ - { - "slot": 0, - "item": "saddle", - "accepted_items": ["saddle"], - "on_equip": { - "event": "minecraft:horse_saddled" - }, - "on_unequip": { - "event": "minecraft:horse_unsaddled" - } - }, - { - "slot": 1, - "item": "horsearmoriron", - "accepted_items": ["horsearmorleather", "horsearmoriron", "horsearmorgold", "horsearmordiamond"] - } - ] - }, - "minecraft:type_family": { - "family": ["horse", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 1.6 - }, - "minecraft:health": { - "value": { - "range_min": 15, - "range_max": 30 - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": { - "range_min": 0.1125, - "range_max": 0.3375 - } - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:nameable": {}, - "minecraft:horse.jump_strength": { - "value": { - "range_min": 0.4, - "range_max": 1 - } - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:healable": { - "items": [ - { - "item": "wheat", - "heal_amount": 2 - }, - { - "item": "sugar", - "heal_amount": 1 - }, - { - "item": "hay_block", - "heal_amount": 20 - }, - { - "item": "apple", - "heal_amount": 3 - }, - { - "item": "golden_carrot", - "heal_amount": 4 - }, - { - "item": "golden_apple", - "heal_amount": 10 - }, - { - "item": "appleEnchanted", - "heal_amount": 10 - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 3, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.7 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 36, - "add": { - "component_groups": ["minecraft:horse_adult", "minecraft:horse_wild"] - } - }, - { - "weight": 9, - "add": { - "component_groups": ["minecraft:horse_baby"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["minecraft:base_white"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:base_creamy"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:base_chestnut"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:base_brown"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:base_black"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:base_gray"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:base_darkbrown"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["minecraft:markings_none"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:markings_white_details"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:markings_white_fields"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:markings_white_dots"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:markings_black_dots"] - } - } - ] - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:horse_baby"] - } - }, - "minecraft:spawn_adult": { - "add": { - "component_groups": ["minecraft:horse_adult", "minecraft:horse_wild"] - } - }, - "minecraft:on_tame": { - "remove": { - "component_groups": ["minecraft:horse_wild"] - }, - "add": { - "component_groups": ["minecraft:horse_tamed"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:horse_baby"] - }, - "add": { - "component_groups": ["minecraft:horse_adult", "minecraft:horse_wild"] - } - }, - "minecraft:horse_saddled": { - "add": { - "component_groups": ["minecraft:horse_saddled"] - } - }, - "minecraft:horse_unsaddled": { - "remove": { - "component_groups": ["minecraft:horse_saddled"] - } - }, - "minecraft:make_white": { - "add": { - "component_groups": ["minecraft:base_white"] - } - }, - "minecraft:make_creamy": { - "add": { - "component_groups": ["minecraft:base_creamy"] - } - }, - "minecraft:make_chestnut": { - "add": { - "component_groups": ["minecraft:base_chestnut"] - } - }, - "minecraft:make_brown": { - "add": { - "component_groups": ["minecraft:base_brown"] - } - }, - "minecraft:make_black": { - "add": { - "component_groups": ["minecraft:base_black"] - } - }, - "minecraft:make_gray": { - "add": { - "component_groups": ["minecraft:base_gray"] - } - }, - "minecraft:make_darkbrown": { - "add": { - "component_groups": ["minecraft:base_darkbrown"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/husk.json b/build/entities/husk.json deleted file mode 100644 index 46b4c17..0000000 --- a/build/entities/husk.json +++ /dev/null @@ -1,603 +0,0 @@ -{ - "format_version": "1.20.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:husk", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:look_to_start_zombie_transformation": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "minecraft:start_transforming" - } - } - }, - "minecraft:start_zombie_transformation": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "minecraft:stop_transforming" - } - }, - "minecraft:timer": { - "looping": false, - "time": 30, - "time_down_event": { - "event": "minecraft:convert_to_zombie" - } - } - }, - "minecraft:convert_to_zombie": { - "minecraft:transformation": { - "into": "minecraft:zombie", - "transformation_sound": "convert_to_drowned", - "drop_equipment": true, - "delay": { - "value": 15 - } - }, - "minecraft:is_shaking": {} - }, - "minecraft:convert_to_baby_zombie": { - "minecraft:transformation": { - "into": "minecraft:zombie", - "transformation_sound": "convert_to_drowned", - "drop_equipment": true, - "delay": { - "value": 15 - } - }, - "minecraft:is_shaking": {} - }, - "minecraft:zombie_husk_baby": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:movement": { - "value": 0.35 - } - }, - "minecraft:zombie_husk_adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:movement": { - "value": 0.23 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 1.1, -0.35], - "lock_rider_rotation": 0 - } - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - } - }, - "minecraft:zombie_husk_jockey": { - "minecraft:behavior.find_mount": { - "priority": 1, - "within_radius": 16 - } - }, - "minecraft:can_break_doors": { - "minecraft:annotation.break_door": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:equip_item": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["husk", "zombie", "undead", "monster", "mob"] - }, - "minecraft:loot": { - "table": "loot_tables/entities/zombie.json" - }, - "minecraft:equipment": { - "table": "loot_tables/entities/zombie_equipment.json" - }, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:attack": { - "damage": 3, - "effect_name": "hunger", - "effect_duration": 30 - }, - "minecraft:variant": { - "value": 2 - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:navigation.walk": { - "is_amphibious": true, - "can_pass_doors": true, - "can_break_doors": true, - "avoid_portals": false - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:shareables": { - "singular_pickup": true, - "items": [ - { - "item": "minecraft:netherite_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:golden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:stone_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:wooden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - } - ] - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "minecraft:start_transforming" - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.equip_item": { - "priority": 2 - }, - "minecraft:behavior.melee_attack": { - "priority": 3 - }, - "minecraft:behavior.stomp_turtle_egg": { - "priority": 4, - "speed_multiplier": 1, - "search_range": 10, - "search_height": 2, - "goal_radius": 1.14, - "interval": 20 - }, - "minecraft:behavior.pickup_items": { - "priority": 6, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1, - "pickup_based_on_chance": true, - "can_pickup_any_item": true, - "excluded_items": ["minecraft:glow_ink_sac"] - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "reselect_targets": true, - "within_radius": 25, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 35 - }, - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - "max_dist": 35, - "must_see": false - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 35 - } - ] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - } - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 9500, - "remove": {}, - "add": { - "component_groups": ["minecraft:zombie_husk_adult"] - } - }, - { - "weight": 425, - "remove": {}, - "add": { - "component_groups": ["minecraft:zombie_husk_baby"] - } - }, - { - "weight": 75, - "remove": {}, - "add": { - "component_groups": ["minecraft:zombie_husk_baby", "minecraft:zombie_husk_jockey"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 10, - "add": { - "component_groups": ["minecraft:can_break_doors"] - } - }, - { - "weight": 90 - } - ] - } - ] - }, - "minecraft:start_transforming": { - "add": { - "component_groups": ["minecraft:start_zombie_transformation"] - }, - "remove": { - "component_groups": ["minecraft:look_to_start_zombie_transformation"] - } - }, - "minecraft:stop_transforming": { - "add": { - "component_groups": ["minecraft:look_to_start_zombie_transformation"] - }, - "remove": { - "component_groups": ["minecraft:start_zombie_transformation"] - } - }, - "minecraft:convert_to_zombie": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["minecraft:convert_to_zombie"] - }, - "remove": { - "component_groups": ["minecraft:start_zombie_transformation"] - } - }, - { - "filters": { - "test": "has_component", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["minecraft:convert_to_baby_zombie"] - }, - "remove": { - "component_groups": ["minecraft:start_zombie_transformation"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/ice_bomb.json b/build/entities/ice_bomb.json deleted file mode 100644 index 540de21..0000000 --- a/build/entities/ice_bomb.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "format_version": "1.10.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:ice_bomb", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:despawn": { - "remove_child_entities": true - } - } - } -} diff --git a/build/entities/iron_golem.json b/build/entities/iron_golem.json deleted file mode 100644 index 86fa79d..0000000 --- a/build/entities/iron_golem.json +++ /dev/null @@ -1,398 +0,0 @@ -{ - "format_version": "1.19.50", - "minecraft:entity": { - "description": { - "identifier": "minecraft:iron_golem", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:player_created": { - "minecraft:behavior.hurt_by_target": { - "priority": 2, - "entity_types": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "creeper" - } - ] - } - } - } - }, - "minecraft:village_created": { - "minecraft:behavior.defend_village_target": { - "priority": 1, - "must_reach": true, - "attack_chance": 0.05, - "entity_types": { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "mob" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - } - ] - } - } - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "defender", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": false, - "can_migrate": true, - "first_founding_reward": 0 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["irongolem", "mob"] - }, - "minecraft:nameable": {}, - "minecraft:collision_box": { - "width": 1.4, - "height": 2.9 - }, - "minecraft:loot": { - "table": "loot_tables/entities/iron_golem.json" - }, - "minecraft:health": { - "value": 100, - "max": 100 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": false, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "iron_ingot" - }, - { - "test": "is_missing_health", - "value": true - } - ] - } - }, - "use_item": true, - "health_amount": 25, - "play_sounds": "irongolem.repair", - "interact_text": "action.interact.repair" - } - ] - }, - "minecraft:attack": { - "damage": { - "range_min": 7, - "range_max": 21 - } - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:knockback_resistance": { - "value": 1 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 2 - }, - "minecraft:preferred_path": { - "max_fall_blocks": 1, - "jump_cost": 5, - "default_block_cost": 1.5, - "preferred_path_blocks": [ - { - "cost": 0, - "blocks": ["grass_path"] - }, - { - "cost": 1, - "blocks": [ - "cobblestone", - "stone", - "stonebrick", - "sandstone", - "mossy_cobblestone", - "stone_slab", - "stone_slab2", - "stone_slab3", - "stone_slab4", - "double_stone_slab", - "double_stone_slab2", - "double_stone_slab3", - "double_stone_slab4", - "wooden_slab", - "double_wooden_slab", - "planks", - "brick_block", - "nether_brick", - "red_nether_brick", - "end_bricks", - "red_sandstone", - "stained_glass", - "glass", - "glowstone", - "prismarine", - "emerald_block", - "diamond_block", - "lapis_block", - "gold_block", - "redstone_block", - "purple_glazed_terracotta", - "white_glazed_terracotta", - "orange_glazed_terracotta", - "magenta_glazed_terracotta", - "light_blue_glazed_terracotta", - "yellow_glazed_terracotta", - "lime_glazed_terracotta", - "pink_glazed_terracotta", - "gray_glazed_terracotta", - "silver_glazed_terracotta", - "cyan_glazed_terracotta", - "blue_glazed_terracotta", - "brown_glazed_terracotta", - "green_glazed_terracotta", - "red_glazed_terracotta", - "black_glazed_terracotta" - ] - }, - { - "cost": 50, - "blocks": ["bed", "lectern", "composter", "grindstone", "blast_furnace", "smoker", "fletching_table", "cartography_table", "brewing_stand", "smithing_table", "cauldron", "barrel", "loom", "stonecutter"] - } - ] - }, - "minecraft:behavior.target_when_pushed": { - "priority": 1, - "percent_chance": 5, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "monster" - }, - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "creeper" - } - ] - } - } - ] - }, - "minecraft:behavior.melee_attack": { - "priority": 1, - "track_target": true - }, - "minecraft:behavior.move_towards_target": { - "priority": 2, - "speed_multiplier": 0.9, - "within_radius": 32 - }, - "minecraft:behavior.move_through_village": { - "priority": 3, - "speed_multiplier": 0.6, - "only_at_night": true - }, - "minecraft:behavior.move_towards_dwelling_restriction": { - "priority": 4, - "speed_multiplier": 1 - }, - "minecraft:behavior.offer_flower": { - "priority": 5, - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": true - } - ] - } - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.6, - "xz_dist": 16 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 3, - "must_reach": true, - "must_see": true, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "monster" - }, - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "creeper" - } - ] - }, - "within_default": 10 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "hoglin" - }, - { - "test": "is_difficulty", - "operator": "!=", - "value": "peaceful" - } - ] - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "zoglin" - }, - { - "test": "is_difficulty", - "operator": "!=", - "value": "peaceful" - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.hurt_by_target": { - "priority": 2, - "entity_types": { - "filters": { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "creeper" - } - } - }, - "minecraft:persistent": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:follow_range": { - "value": 64 - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:from_player": { - "add": { - "component_groups": ["minecraft:player_created"] - } - }, - "minecraft:from_village": { - "add": { - "component_groups": ["minecraft:village_created"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/lightning_bolt.json b/build/entities/lightning_bolt.json deleted file mode 100644 index 0a06acd..0000000 --- a/build/entities/lightning_bolt.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "format_version": "1.8.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:lightning_bolt", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:type_family": { - "family": ["lightning"] - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 10, - "use_motion_prediction_hints": true - } - } - }, - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/lingering_potion.json b/build/entities/lingering_potion.json deleted file mode 100644 index 066f5f3..0000000 --- a/build/entities/lingering_potion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:lingering_potion", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:projectile": { - "on_hit": { - "douse_fire": {}, - "spawn_aoe_cloud": { - "radius": 3, - "radius_on_use": -0.5, - "duration": 30, - "reapplication_delay": 40 - }, - "remove_on_hit": {} - }, - "power": 0.5, - "gravity": 0.05, - "angle_offset": -20, - "hit_sound": "glass" - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 5, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/llama.json b/build/entities/llama.json deleted file mode 100644 index 677518e..0000000 --- a/build/entities/llama.json +++ /dev/null @@ -1,689 +0,0 @@ -{ - "format_version": "1.19.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:llama", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:llama_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": [ - { - "item": "wheat", - "growth": 0.1 - }, - { - "item": "hay_block", - "growth": 0.9 - } - ], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 5, - "speed_multiplier": 1 - } - }, - "minecraft:llama_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/llama.json" - }, - "minecraft:behavior.breed": { - "priority": 4, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "parent_centric_attribute_blending": ["minecraft:health"], - "require_tame": true, - "inherit_tamed": false, - "breeds_with": { - "mate_type": "minecraft:llama", - "baby_type": "minecraft:llama", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "breed_items": ["hay_block"] - } - }, - "minecraft:strength_1": { - "minecraft:strength": { - "value": 1, - "max": 5 - } - }, - "minecraft:strength_2": { - "minecraft:strength": { - "value": 2, - "max": 5 - } - }, - "minecraft:strength_3": { - "minecraft:strength": { - "value": 3, - "max": 5 - } - }, - "minecraft:strength_4": { - "minecraft:strength": { - "value": 4, - "max": 5 - } - }, - "minecraft:strength_5": { - "minecraft:strength": { - "value": 5, - "max": 5 - } - }, - "minecraft:llama_creamy": { - "minecraft:variant": { - "value": 0 - } - }, - "minecraft:llama_white": { - "minecraft:variant": { - "value": 1 - } - }, - "minecraft:llama_brown": { - "minecraft:variant": { - "value": 2 - } - }, - "minecraft:llama_gray": { - "minecraft:variant": { - "value": 3 - } - }, - "minecraft:llama_wild": { - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["player"], - "interact_text": "action.interact.mount", - "seats": { - "position": [0, 1.17, -0.3] - } - }, - "minecraft:tamemount": { - "min_temper": 0, - "max_temper": 30, - "feed_text": "action.interact.feed", - "ride_text": "action.interact.mount", - "feed_items": [ - { - "item": "wheat", - "temper_mod": 3 - }, - { - "item": "hay_block", - "temper_mod": 6 - } - ], - "tame_event": { - "event": "minecraft:on_tame", - "target": "self" - } - } - }, - "minecraft:llama_tamed": { - "minecraft:is_tamed": {}, - "minecraft:rideable": { - "seat_count": 1, - "crouching_skip_interact": true, - "family_types": ["player"], - "interact_text": "action.interact.ride.horse", - "seats": { - "position": [0, 1.17, -0.3] - } - }, - "minecraft:inventory": { - "inventory_size": 16, - "container_type": "horse", - "additional_slots_per_strength": 3 - }, - "minecraft:equippable": { - "slots": [ - { - "slot": 1, - "item": "carpet", - "accepted_items": ["carpet"] - } - ] - } - }, - "minecraft:llama_unchested": { - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - }, - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "chest" - } - ] - }, - "event": "minecraft:on_chest", - "target": "self" - }, - "use_item": true, - "interact_text": "action.interact.attachchest" - }, - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "operator": "not", - "value": "carpet" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "carpet" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 0, - "interact_text": "action.interact.equipcarpet" - } - ] - } - }, - "minecraft:llama_chested": { - "minecraft:is_chested": {}, - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "operator": "not", - "value": "carpet" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "carpet" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 0, - "interact_text": "action.interact.equipcarpet" - } - ] - } - }, - "minecraft:llama_angry": { - "minecraft:angry": { - "duration": 4, - "broadcast_anger": false, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:behavior.ranged_attack": { - "priority": 2, - "attack_radius": 64, - "charge_shoot_trigger": 2, - "charge_charged_trigger": 1 - } - }, - "minecraft:llama_angry_wolf": { - "minecraft:angry": { - "duration": -1, - "broadcast_anger": false, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:behavior.ranged_attack": { - "priority": 2, - "attack_radius": 64, - "charge_shoot_trigger": 2, - "charge_charged_trigger": 1 - } - }, - "minecraft:in_caravan": { - "minecraft:damage_sensor": { - "triggers": { - "cause": "all", - "deals_damage": true - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["llama", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:mark_variant": { - "value": 0 - }, - "minecraft:health": { - "value": { - "range_min": 15, - "range_max": 30 - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:follow_range": { - "value": 40, - "max": 40 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10, - "can_be_stolen": true - }, - "minecraft:balloonable": {}, - "minecraft:healable": { - "items": [ - { - "item": "wheat", - "heal_amount": 2 - }, - { - "item": "hay_block", - "heal_amount": 10 - } - ] - }, - "minecraft:shooter": { - "def": "minecraft:llama_spit" - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.run_around_like_crazy": { - "priority": 1, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.follow_caravan": { - "priority": 3, - "speed_multiplier": 2.1, - "entity_count": 10, - "entity_types": { - "filters": { - "test": "is_family", - "subject": "other", - "value": "llama" - } - } - }, - "minecraft:behavior.panic": { - "priority": 4, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.7 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:behavior.mount_pathing": { - "priority": 1, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1, - "hurt_owner": true - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:damage_sensor": { - "triggers": { - "cause": "all", - "deals_damage": true, - "on_damage": { - "filters": { - "test": "in_caravan", - "value": false - }, - "event": "minecraft:become_angry" - } - } - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "attack_interval": 16, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "wolf" - }, - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_tamed" - } - ] - }, - "max_dist": 10 - } - ], - "must_see": false, - "must_reach": true - }, - "minecraft:on_target_acquired": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "target", - "value": "wolf" - }, - { - "test": "has_component", - "subject": "target", - "operator": "!=", - "value": "minecraft:is_tamed" - } - ] - }, - "event": "minecraft:mad_at_wolf", - "target": "self" - }, - "minecraft:on_target_escape": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "target", - "value": "wolf" - }, - { - "test": "has_component", - "subject": "target", - "operator": "!=", - "value": "minecraft:is_tamed" - } - ] - }, - "event": "minecraft:on_calm", - "target": "self" - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:collision_box": { - "width": 0.9, - "height": 1.87 - } - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 90, - "trigger": "minecraft:spawn_adult" - }, - { - "weight": 10, - "trigger": "minecraft:spawn_baby" - } - ] - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:llama_baby"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:llama_baby"] - }, - "add": { - "component_groups": ["minecraft:llama_adult", "minecraft:llama_wild"] - } - }, - "minecraft:on_tame": { - "remove": { - "component_groups": ["minecraft:llama_wild"] - }, - "add": { - "component_groups": ["minecraft:llama_tamed", "minecraft:llama_unchested"] - } - }, - "minecraft:join_caravan": { - "add": { - "component_groups": ["minecraft:in_caravan"] - } - }, - "minecraft:leave_caravan": { - "remove": { - "component_groups": ["minecraft:in_caravan"] - } - }, - "minecraft:mad_at_wolf": { - "add": { - "component_groups": ["minecraft:llama_angry_wolf"] - } - }, - "minecraft:become_angry": { - "add": { - "component_groups": ["minecraft:llama_angry"] - } - }, - "minecraft:on_calm": { - "remove": { - "component_groups": ["minecraft:llama_angry", "minecraft:llama_angry_wolf"] - } - }, - "minecraft:on_chest": { - "remove": { - "component_groups": ["minecraft:llama_unchested"] - }, - "add": { - "component_groups": ["minecraft:llama_chested"] - } - }, - "minecraft:add_attributes": { - "sequence": [ - { - "randomize": [ - { - "weight": 32, - "add": { - "component_groups": ["minecraft:strength_1"] - } - }, - { - "weight": 32, - "add": { - "component_groups": ["minecraft:strength_2"] - } - }, - { - "weight": 32, - "add": { - "component_groups": ["minecraft:strength_3"] - } - }, - { - "weight": 2, - "add": { - "component_groups": ["minecraft:strength_4"] - } - }, - { - "weight": 2, - "add": { - "component_groups": ["minecraft:strength_5"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 25, - "add": { - "component_groups": ["minecraft:llama_creamy"] - } - }, - { - "weight": 25, - "add": { - "component_groups": ["minecraft:llama_white"] - } - }, - { - "weight": 25, - "add": { - "component_groups": ["minecraft:llama_brown"] - } - }, - { - "weight": 25, - "add": { - "component_groups": ["minecraft:llama_gray"] - } - } - ] - } - ] - }, - "minecraft:spawn_baby": { - "add": { - "component_groups": ["minecraft:llama_baby"] - }, - "trigger": "minecraft:add_attributes" - }, - "minecraft:spawn_adult": { - "add": { - "component_groups": ["minecraft:llama_adult", "minecraft:llama_wild"] - }, - "trigger": "minecraft:add_attributes" - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/llama_spit.json b/build/entities/llama_spit.json deleted file mode 100644 index edfe49b..0000000 --- a/build/entities/llama_spit.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:llama_spit", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.31, - "height": 0.31 - }, - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": 1, - "knockback": false - }, - "remove_on_hit": {} - }, - "power": 1.5, - "gravity": 0.06, - "inertia": 1, - "uncertainty_base": 10, - "uncertainty_multiplier": 4, - "anchor": 1, - "offset": [0, -0.1, 0], - "reflect_on_hurt": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/magma_cube.json b/build/entities/magma_cube.json deleted file mode 100644 index 540b41c..0000000 --- a/build/entities/magma_cube.json +++ /dev/null @@ -1,293 +0,0 @@ -{ - "format_version": "1.19.50", - "minecraft:entity": { - "description": { - "identifier": "minecraft:magma_cube", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:slime_large": { - "minecraft:variant": { - "value": 4 - }, - "minecraft:collision_box": { - "width": 2.08, - "height": 2.08 - }, - "minecraft:health": { - "value": 16, - "max": 16 - }, - "minecraft:movement": { - "value": 0.75 - }, - "minecraft:attack": { - "damage": 6 - }, - "minecraft:area_attack": { - "damage_range": 0.15, - "damage_per_tick": 6, - "damage_cooldown": 0.5, - "cause": "entity_attack", - "entity_filter": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - } - }, - "minecraft:loot": { - "table": "loot_tables/entities/magma_cube.json" - } - }, - "minecraft:slime_medium": { - "minecraft:variant": { - "value": 2 - }, - "minecraft:collision_box": { - "width": 1.04, - "height": 1.02 - }, - "minecraft:health": { - "value": 4, - "max": 4 - }, - "minecraft:movement": { - "value": 0.66 - }, - "minecraft:attack": { - "damage": 4 - }, - "minecraft:area_attack": { - "damage_range": 0.15, - "damage_per_tick": 4, - "damage_cooldown": 0.5, - "cause": "entity_attack", - "entity_filter": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - } - }, - "minecraft:loot": { - "table": "loot_tables/entities/magma_cube.json" - } - }, - "minecraft:slime_small": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:collision_box": { - "width": 0.52, - "height": 0.52 - }, - "minecraft:health": { - "value": 1, - "max": 1 - }, - "minecraft:movement": { - "value": 0.6 - }, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:area_attack": { - "damage_range": 0.15, - "damage_per_tick": 3, - "damage_cooldown": 0.5, - "cause": "entity_attack", - "entity_filter": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - } - } - }, - "minecraft:slime_calm": { - "minecraft:movement.jump": { - "jump_delay": [2, 6] - } - }, - "minecraft:slime_aggressive": { - "minecraft:movement.jump": { - "jump_delay": [0.667, 2] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:collision_box": { - "width": 2.08, - "height": 2.08 - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? query.variant : 0" - }, - "minecraft:type_family": { - "family": ["magmacube", "monster", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_lava": true - }, - "minecraft:nameable": {}, - "minecraft:fire_immune": {}, - "minecraft:burns_in_daylight": false, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true - }, - "minecraft:jump.static": {}, - "minecraft:movement.jump": { - "jump_delay": [2, 6] - }, - "minecraft:can_climb": {}, - "minecraft:on_target_acquired": { - "event": "minecraft:become_aggressive", - "target": "self" - }, - "minecraft:on_target_escape": { - "event": "minecraft:become_calm", - "target": "self" - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.slime_float": { - "priority": 1, - "jump_chance_percentage": 0.8, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.slime_attack": { - "priority": 3 - }, - "minecraft:behavior.slime_random_direction": { - "priority": 4, - "add_random_time_range": 3, - "turn_range": 360, - "min_change_direction_time": 2 - }, - "minecraft:behavior.slime_keep_on_jumping": { - "priority": 5, - "speed_multiplier": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 16 - } - ], - "must_see": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 1, - "trigger": "spawn_small" - }, - { - "weight": 1, - "trigger": "spawn_medium" - }, - { - "weight": 1, - "trigger": "spawn_large" - } - ] - }, - "spawn_small": { - "add": { - "component_groups": ["minecraft:slime_small", "minecraft:slime_calm"] - } - }, - "spawn_medium": { - "add": { - "component_groups": ["minecraft:slime_medium", "minecraft:slime_calm"] - } - }, - "spawn_large": { - "add": { - "component_groups": ["minecraft:slime_large", "minecraft:slime_calm"] - } - }, - "minecraft:become_calm": { - "add": { - "component_groups": ["minecraft:slime_calm"] - } - }, - "minecraft:become_aggressive": { - "add": { - "component_groups": ["minecraft:slime_aggressive"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/minecart.json b/build/entities/minecart.json deleted file mode 100644 index 9e4e774..0000000 --- a/build/entities/minecart.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:minecart", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:is_stackable": {}, - "minecraft:type_family": { - "family": ["minecart", "inanimate"] - }, - "minecraft:collision_box": { - "width": 0.98, - "height": 0.7 - }, - "minecraft:rail_movement": {}, - "minecraft:rideable": { - "seat_count": 1, - "interact_text": "action.interact.ride.minecart", - "pull_in_entities": true, - "seats": { - "position": [0, -0.2, 0] - } - }, - "minecraft:rail_sensor": { - "eject_on_activate": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 60, - "max_dropped_ticks": 20, - "use_motion_prediction_hints": true - }, - "conditional_values": [ - { - "max_optimized_distance": 0, - "max_dropped_ticks": 0, - "conditional_values": [ - { - "test": "is_moving", - "subject": "self", - "operator": "==", - "value": true - } - ] - } - ] - } - } - } -} diff --git a/build/entities/mooshroom.json b/build/entities/mooshroom.json deleted file mode 100644 index 58bdc9e..0000000 --- a/build/entities/mooshroom.json +++ /dev/null @@ -1,1043 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:mooshroom", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:mooshroom_become_cow": { - "minecraft:transformation": { - "into": "minecraft:cow" - } - }, - "minecraft:cow_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": "wheat", - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 6, - "speed_multiplier": 1.1 - } - }, - "minecraft:cow_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/mooshroom.json" - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": false, - "breed_items": "wheat", - "breeds_with": { - "mate_type": "minecraft:mooshroom", - "baby_type": "minecraft:mooshroom", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "deny_parents_variant": { - "chance": 0.00098, - "min_variant": 0, - "max_variant": 1 - } - }, - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "bowl" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_component", - "operator": "!=", - "value": "minecraft:transformation" - } - ] - }, - "event": "minecraft:flowerless", - "target": "self" - }, - "add_items": { - "table": "loot_tables/gameplay/entities/mooshroom_milking.json" - }, - "use_item": true, - "play_sounds": "milk_suspiciously", - "interact_text": "action.interact.moostew" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:2" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 7 - } - ] - }, - "event": "minecraft:ate_allium", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:3" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 3 - } - ] - }, - "event": "minecraft:ate_bluet", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:1" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 6 - } - ] - }, - "event": "minecraft:ate_orchid", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:9" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 1 - } - ] - }, - "event": "minecraft:ate_cornflower", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "yellow_flower" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 5 - } - ] - }, - "event": "minecraft:ate_dandelion", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:10" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 4 - } - ] - }, - "event": "minecraft:ate_lily", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:8" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 8 - } - ] - }, - "event": "minecraft:ate_daisy", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:0" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 0 - } - ] - }, - "event": "minecraft:ate_poppy", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "any_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:4" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:5" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:6" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "red_flower:7" - } - ], - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 2 - } - ] - }, - "event": "minecraft:ate_tulip", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "wither_rose" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 9 - } - ] - }, - "event": "minecraft:ate_rose", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "torchflower" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - }, - { - "test": "is_mark_variant", - "subject": "self", - "operator": "!=", - "value": 10 - } - ] - }, - "event": "minecraft:ate_torchflower", - "target": "self" - }, - "use_item": true, - "play_sounds": "eat", - "particle_on_start": { - "particle_type": "smoke", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.feed" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "shears" - }, - { - "test": "has_component", - "operator": "!=", - "value": "minecraft:transformation" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 0 - } - ] - }, - "event": "become_cow", - "target": "self" - }, - "use_item": false, - "hurt_item": 1, - "play_sounds": "shear", - "spawn_items": { - "table": "loot_tables/entities/mooshroom_shear.json" - }, - "particle_on_start": { - "particle_type": "largeexplode", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.mooshear", - "vibration": "shear" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "shears" - }, - { - "test": "has_component", - "operator": "!=", - "value": "minecraft:transformation" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - } - ] - }, - "event": "become_cow", - "target": "self" - }, - "use_item": false, - "hurt_item": 1, - "play_sounds": "shear", - "spawn_items": { - "table": "loot_tables/entities/brown_mooshroom_shear.json" - }, - "particle_on_start": { - "particle_type": "largeexplode", - "particle_y_offset": 0.25, - "particle_offset_towards_interactor": true - }, - "interact_text": "action.interact.mooshear", - "vibration": "shear" - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "bucket:0" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - } - ] - } - }, - "use_item": true, - "transform_to_item": "bucket:1", - "play_sounds": "milk", - "interact_text": "action.interact.milk" - } - ] - } - }, - "minecraft:mooshroom_fed_nothing": { - "minecraft:mark_variant": { - "value": -1 - } - }, - "minecraft:mooshroom_brown_fed_poppy": { - "minecraft:mark_variant": { - "value": 0 - } - }, - "minecraft:mooshroom_brown_fed_cornflower": { - "minecraft:mark_variant": { - "value": 1 - } - }, - "minecraft:mooshroom_brown_fed_tulips": { - "minecraft:mark_variant": { - "value": 2 - } - }, - "minecraft:mooshroom_brown_fed_azure_bluet": { - "minecraft:mark_variant": { - "value": 3 - } - }, - "minecraft:mooshroom_brown_fed_lily_of_the_valley": { - "minecraft:mark_variant": { - "value": 4 - } - }, - "minecraft:mooshroom_brown_fed_dandelion": { - "minecraft:mark_variant": { - "value": 5 - } - }, - "minecraft:mooshroom_brown_fed_blue_orchid": { - "minecraft:mark_variant": { - "value": 6 - } - }, - "minecraft:mooshroom_brown_fed_allium": { - "minecraft:mark_variant": { - "value": 7 - } - }, - "minecraft:mooshroom_brown_fed_oxeye_daisy": { - "minecraft:mark_variant": { - "value": 8 - } - }, - "minecraft:mooshroom_brown_fed_wither_rose": { - "minecraft:mark_variant": { - "value": 9 - } - }, - "minecraft:mooshroom_brown_fed_torchflower": { - "minecraft:mark_variant": { - "value": 10 - } - }, - "minecraft:mooshroom_red": { - "minecraft:variant": { - "value": 0 - } - }, - "minecraft:mooshroom_brown": { - "minecraft:variant": { - "value": 1 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["mushroomcow", "mob"] - }, - "minecraft:mark_variant": { - "value": -1 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 0.9, - "height": 1.3 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 1.105, 0] - } - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25 - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.5, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:behavior.tempt": { - "priority": 4, - "speed_multiplier": 1.25, - "items": ["wheat"] - }, - "minecraft:behavior.follow_parent": { - "priority": 5, - "speed_multiplier": 1.1 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:damage_sensor": { - "triggers": [ - { - "on_damage": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "lightning" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 0 - } - ] - }, - "event": "minecraft:become_brown" - }, - "deals_damage": false, - "on_damage_sound_event": "convert_mooshroom" - }, - { - "on_damage": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "lightning" - }, - { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 1 - } - ] - }, - "event": "minecraft:become_red" - }, - "deals_damage": false, - "on_damage_sound_event": "convert_mooshroom" - } - ] - } - }, - "events": { - "become_cow": { - "remove": {}, - "add": { - "component_groups": ["minecraft:mooshroom_become_cow"] - } - }, - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "remove": {}, - "add": { - "component_groups": ["minecraft:cow_adult", "minecraft:mooshroom_red"] - } - }, - { - "weight": 5, - "remove": {}, - "add": { - "component_groups": ["minecraft:cow_baby", "minecraft:mooshroom_red"] - } - } - ] - }, - "minecraft:entity_born": { - "remove": {}, - "add": { - "component_groups": ["minecraft:cow_baby"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:cow_baby"] - }, - "add": { - "component_groups": ["minecraft:cow_adult"] - } - }, - "minecraft:flowerless": { - "add": { - "component_groups": ["minecraft:mooshroom_fed_nothing"] - } - }, - "minecraft:ate_allium": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_allium"] - } - }, - "minecraft:ate_cornflower": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_cornflower"] - } - }, - "minecraft:ate_lily": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_lily_of_the_valley"] - } - }, - "minecraft:ate_rose": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_wither_rose"] - } - }, - "minecraft:ate_torchflower": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_torchflower"] - } - }, - "minecraft:ate_orchid": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_blue_orchid"] - } - }, - "minecraft:ate_daisy": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_oxeye_daisy"] - } - }, - "minecraft:ate_tulip": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_tulips"] - } - }, - "minecraft:ate_bluet": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_azure_bluet"] - } - }, - "minecraft:ate_poppy": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_poppy"] - } - }, - "minecraft:ate_dandelion": { - "add": { - "component_groups": ["minecraft:mooshroom_brown_fed_dandelion"] - } - }, - "minecraft:become_red": { - "remove": { - "component_groups": ["minecraft:mooshroom_brown"] - }, - "add": { - "component_groups": ["minecraft:mooshroom_red", "minecraft:mooshroom_fed_nothing"] - } - }, - "minecraft:become_brown": { - "remove": { - "component_groups": ["minecraft:mooshroom_red"] - }, - "add": { - "component_groups": ["minecraft:mooshroom_brown", "minecraft:mooshroom_fed_nothing"] - } - }, - "minecraft:become_brown_adult": { - "remove": { - "component_groups": ["minecraft:mooshroom_red"] - }, - "add": { - "component_groups": ["minecraft:mooshroom_brown", "minecraft:cow_adult", "minecraft:mooshroom_fed_nothing"] - } - }, - "minecraft:become_red_adult": { - "remove": { - "component_groups": ["minecraft:mooshroom_brown", "minecraft:cow_baby"] - }, - "add": { - "component_groups": ["minecraft:mooshroom_red", "minecraft:cow_adult"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/mule.json b/build/entities/mule.json deleted file mode 100644 index eded6f1..0000000 --- a/build/entities/mule.json +++ /dev/null @@ -1,477 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:mule", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:mule_baby": { - "minecraft:is_baby": {}, - "minecraft:scale_by_age": { - "start_scale": 0.5, - "end_scale": 1 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": [ - { - "item": "wheat", - "growth": 0.016667 - }, - { - "item": "sugar", - "growth": 0.025 - }, - { - "item": "hay_block", - "growth": 0.15 - }, - { - "item": "apple", - "growth": 0.05 - }, - { - "item": "golden_carrot", - "growth": 0.05 - }, - { - "item": "golden_apple", - "growth": 0.2 - }, - { - "item": "appleEnchanted", - "growth": 0.2 - } - ], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 4, - "speed_multiplier": 1 - } - }, - "minecraft:mule_adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/horse.json" - }, - "minecraft:behavior.run_around_like_crazy": { - "priority": 1, - "speed_multiplier": 1.2 - } - }, - "minecraft:mule_wild": { - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["player", "zombie"], - "interact_text": "action.interact.mount", - "seats": { - "position": [0, 0.975, -0.2] - } - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.5, - "target_dist": 0, - "track_target": true - }, - "minecraft:tamemount": { - "min_temper": 0, - "max_temper": 100, - "feed_text": "action.interact.feed", - "ride_text": "action.interact.mount", - "feed_items": [ - { - "item": "wheat", - "temper_mod": 3 - }, - { - "item": "sugar", - "temper_mod": 3 - }, - { - "item": "apple", - "temper_mod": 3 - }, - { - "item": "golden_carrot", - "temper_mod": 5 - }, - { - "item": "golden_apple", - "temper_mod": 10 - }, - { - "item": "appleEnchanted", - "temper_mod": 10 - } - ], - "auto_reject_items": [ - { - "item": "horsearmorleather" - }, - { - "item": "horsearmoriron" - }, - { - "item": "horsearmorgold" - }, - { - "item": "horsearmordiamond" - }, - { - "item": "saddle" - } - ], - "tame_event": { - "event": "minecraft:on_tame", - "target": "self" - } - } - }, - "minecraft:mule_tamed": { - "minecraft:is_tamed": {}, - "minecraft:equippable": { - "slots": [ - { - "slot": 0, - "item": "saddle", - "accepted_items": ["saddle"], - "on_equip": { - "event": "minecraft:mule_saddled" - }, - "on_unequip": { - "event": "minecraft:mule_unsaddled" - } - } - ] - }, - "minecraft:rideable": { - "seat_count": 1, - "crouching_skip_interact": true, - "family_types": ["player"], - "interact_text": "action.interact.ride.horse", - "seats": { - "position": [0, 0.975, -0.2] - } - }, - "minecraft:inventory": { - "inventory_size": 16, - "container_type": "horse" - }, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 1.2, - "items": ["apple", "carrot", "golden_apple", "appleEnchanted", "golden_carrot", "carrotOnAStick", "hay_block", "sugar", "bread", "wheat"] - } - }, - "minecraft:mule_unchested": { - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "chest" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "event": "minecraft:on_chest", - "target": "self" - }, - "use_item": true, - "interact_text": "action.interact.attachchest" - }, - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "operator": "not", - "value": "saddle" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "saddle" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 0, - "interact_text": "action.interact.saddle" - } - ] - } - }, - "minecraft:mule_chested": { - "minecraft:is_chested": {}, - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "self", - "domain": "inventory", - "operator": "not", - "value": "saddle" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "saddle" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_sneaking", - "subject": "other", - "value": false - } - ] - }, - "target": "self" - }, - "equip_item_slot": 0, - "interact_text": "action.interact.saddle" - } - ] - } - }, - "minecraft:mule_saddled": { - "minecraft:is_saddled": {}, - "minecraft:input_ground_controlled": {}, - "minecraft:can_power_jump": {}, - "minecraft:behavior.player_ride_tamed": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["mule", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 1.6 - }, - "minecraft:health": { - "value": { - "range_min": 15, - "range_max": 30 - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.175 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:nameable": {}, - "minecraft:horse.jump_strength": { - "value": 0.5 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:healable": { - "items": [ - { - "item": "wheat", - "heal_amount": 2 - }, - { - "item": "sugar", - "heal_amount": 1 - }, - { - "item": "hay_block", - "heal_amount": 20 - }, - { - "item": "apple", - "heal_amount": 3 - }, - { - "item": "golden_carrot", - "heal_amount": 4 - }, - { - "item": "golden_apple", - "heal_amount": 10 - }, - { - "item": "appleEnchanted", - "heal_amount": 10 - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.7 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 80, - "add": { - "component_groups": ["minecraft:mule_adult", "minecraft:mule_wild"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["minecraft:mule_baby"] - } - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:mule_baby"] - } - }, - "minecraft:on_tame": { - "remove": { - "component_groups": ["minecraft:mule_wild"] - }, - "add": { - "component_groups": ["minecraft:mule_tamed", "minecraft:mule_unchested"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:mule_baby"] - }, - "add": { - "component_groups": ["minecraft:mule_adult", "minecraft:mule_wild"] - } - }, - "minecraft:on_chest": { - "remove": { - "component_groups": ["minecraft:mule_unchested"] - }, - "add": { - "component_groups": ["minecraft:mule_chested"] - } - }, - "minecraft:mule_saddled": { - "add": { - "component_groups": ["minecraft:mule_saddled"] - } - }, - "minecraft:mule_unsaddled": { - "remove": { - "component_groups": ["minecraft:mule_saddled"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/npc.json b/build/entities/npc.json deleted file mode 100644 index 13c27cc..0000000 --- a/build/entities/npc.json +++ /dev/null @@ -1,252 +0,0 @@ -{ - "format_version": "1.19.30", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:npc", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:damage_sensor": { - "triggers": { - "cause": "all", - "deals_damage": false - } - }, - "minecraft:type_family": { - "family": ["npc", "mob"] - }, - "minecraft:fire_immune": true, - "minecraft:movement": { - "value": 0.5 - }, - "minecraft:loot": { - "table": "loot_tables/empty.json" - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 2.1 - }, - "minecraft:behavior.look_at_player": { - "priority": 0, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:persistent": {}, - "minecraft:npc": { - "npc_data": { - "portrait_offsets": { - "translate": [-7, 50, 0], - "scale": [1.75, 1.75, 1.75] - }, - "picker_offsets": { - "translate": [0, 20, 0], - "scale": [1.7, 1.7, 1.7] - }, - "skin_list": [ - { - "variant": 0 - }, - { - "variant": 1 - }, - { - "variant": 2 - }, - { - "variant": 3 - }, - { - "variant": 4 - }, - { - "variant": 5 - }, - { - "variant": 6 - }, - { - "variant": 7 - }, - { - "variant": 8 - }, - { - "variant": 9 - }, - { - "variant": 10 - }, - { - "variant": 11 - }, - { - "variant": 12 - }, - { - "variant": 13 - }, - { - "variant": 14 - }, - { - "variant": 15 - }, - { - "variant": 16 - }, - { - "variant": 17 - }, - { - "variant": 18 - }, - { - "variant": 19 - }, - { - "variant": 25 - }, - { - "variant": 26 - }, - { - "variant": 27 - }, - { - "variant": 28 - }, - { - "variant": 29 - }, - { - "variant": 30 - }, - { - "variant": 31 - }, - { - "variant": 32 - }, - { - "variant": 33 - }, - { - "variant": 34 - }, - { - "variant": 20 - }, - { - "variant": 21 - }, - { - "variant": 22 - }, - { - "variant": 23 - }, - { - "variant": 24 - }, - { - "variant": 35 - }, - { - "variant": 36 - }, - { - "variant": 37 - }, - { - "variant": 38 - }, - { - "variant": 39 - }, - { - "variant": 40 - }, - { - "variant": 41 - }, - { - "variant": 42 - }, - { - "variant": 43 - }, - { - "variant": 44 - }, - { - "variant": 50 - }, - { - "variant": 51 - }, - { - "variant": 52 - }, - { - "variant": 53 - }, - { - "variant": 54 - }, - { - "variant": 45 - }, - { - "variant": 46 - }, - { - "variant": 47 - }, - { - "variant": 48 - }, - { - "variant": 49 - }, - { - "variant": 55 - }, - { - "variant": 56 - }, - { - "variant": 57 - }, - { - "variant": 58 - }, - { - "variant": 59 - } - ] - } - }, - "minecraft:nameable": { - "always_show": false, - "allow_name_tag_renaming": false - }, - "minecraft:physics": {} - } - } -} diff --git a/build/entities/ocelot.json b/build/entities/ocelot.json deleted file mode 100644 index 63d4f95..0000000 --- a/build/entities/ocelot.json +++ /dev/null @@ -1,374 +0,0 @@ -{ - "format_version": "1.18.20", - "minecraft:entity": { - "description": { - "identifier": "minecraft:ocelot", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:ocelot_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["fish", "salmon"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - } - }, - "minecraft:ocelot_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/ocelot.json" - }, - "minecraft:scale": { - "value": 1 - } - }, - "minecraft:wild_child_ocelot_spawn": { - "minecraft:spawn_entity": { - "entities": { - "filters": [ - { - "test": "random_chance", - "value": 7 - } - ], - "min_wait_time": 0, - "max_wait_time": 0, - "num_to_spawn": 2, - "single_use": true, - "spawn_entity": "minecraft:ocelot", - "spawn_event": "minecraft:entity_born", - "spawn_method": "born", - "spawn_sound": "" - } - } - }, - "minecraft:ocelot_wild": { - "minecraft:trusting": { - "probability": 0.33, - "trust_items": ["fish", "salmon"], - "trust_event": { - "event": "minecraft:on_trust", - "target": "self" - } - }, - "minecraft:behavior.tempt": { - "priority": 4, - "speed_multiplier": 0.5, - "within_radius": 16, - "can_get_scared": true, - "items": ["fish", "salmon"] - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 5, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 10, - "walk_speed_multiplier": 0.8, - "sprint_speed_multiplier": 1.33 - } - ] - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.35, 0] - } - } - }, - "minecraft:ocelot_trusting": { - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:behavior.tempt": { - "priority": 4, - "speed_multiplier": 0.5, - "within_radius": 16, - "items": ["fish", "salmon"] - }, - "minecraft:breedable": { - "require_tame": false, - "breeds_with": { - "mate_type": "minecraft:ocelot", - "baby_type": "minecraft:ocelot", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "breed_items": ["fish", "salmon"] - } - }, - "minecraft:ocelot_tame": { - "minecraft:is_tamed": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:sittable": {}, - "minecraft:behavior.follow_owner": { - "priority": 4, - "speed_multiplier": 1, - "start_distance": 10, - "stop_distance": 2 - }, - "minecraft:behavior.stay_while_sitting": { - "priority": 3 - }, - "minecraft:behavior.ocelot_sit_on_block": { - "priority": 6, - "speed_multiplier": 1 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:attack_damage": { - "value": 3 - }, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["ocelot", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 0.7 - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 1, - "reselect_targets": true, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "chicken" - }, - "max_dist": 8 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 8 - } - ] - }, - "minecraft:behavior.mount_pathing": { - "priority": 1, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.leap_at_target": { - "priority": 3, - "target_dist": 0.3 - }, - "minecraft:behavior.ocelotattack": { - "priority": 4, - "cooldown_time": 1, - "x_max_rotation": 30, - "y_max_head_rotation": 30, - "max_distance": 15, - "max_sneak_range": 15, - "max_sprint_range": 4, - "reach_multiplier": 2, - "sneak_speed_multiplier": 0.6, - "sprint_speed_multiplier": 1.33, - "walk_speed_multiplier": 0.8 - }, - "minecraft:behavior.random_stroll": { - "priority": 8, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.look_at_player": { - "priority": 9 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10, - "on_leash": { - "event": "minecraft:on_leash", - "target": "self" - }, - "on_unleash": { - "event": "minecraft:on_unleash", - "target": "self" - } - }, - "minecraft:balloonable": { - "mass": 0.7 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 3, - "remove": {}, - "add": { - "component_groups": ["minecraft:ocelot_adult", "minecraft:ocelot_wild", "minecraft:wild_child_ocelot_spawn"] - } - }, - { - "weight": 1, - "remove": {}, - "add": { - "component_groups": ["minecraft:ocelot_baby", "minecraft:ocelot_wild"] - } - } - ] - } - ] - }, - "minecraft:entity_born": { - "sequence": [ - { - "remove": {}, - "add": { - "component_groups": ["minecraft:ocelot_baby", "minecraft:ocelot_trusting"] - } - } - ] - }, - "minecraft:entity_born_wild": { - "remove": { - "component_groups": ["minecraft:ocelot_trusting"] - }, - "add": { - "component_groups": ["minecraft:ocelot_baby", "minecraft:ocelot_wild"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:ocelot_baby"] - }, - "add": { - "component_groups": ["minecraft:ocelot_adult"] - } - }, - "minecraft:on_trust": { - "sequence": [ - { - "remove": { - "component_groups": ["minecraft:ocelot_wild"] - } - }, - { - "add": { - "component_groups": ["minecraft:ocelot_trusting"] - } - } - ] - }, - "minecraft:on_leash": { - "add": { - "component_groups": ["minecraft:ocelot_leashed"] - } - }, - "minecraft:on_unleash": { - "remove": { - "component_groups": ["minecraft:ocelot_leashed"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/panda.json b/build/entities/panda.json deleted file mode 100644 index 9ec5198..0000000 --- a/build/entities/panda.json +++ /dev/null @@ -1,644 +0,0 @@ -{ - "format_version": "1.18.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:panda", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:panda_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.4 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": "bamboo", - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.roll": { - "priority": 12, - "probability": 0.0016 - }, - "minecraft:behavior.follow_parent": { - "priority": 13, - "speed_multiplier": 1.1 - }, - "minecraft:on_target_acquired": { - "event": "minecraft:on_scared", - "target": "self" - }, - "minecraft:behavior.sneeze": { - "priority": 7, - "probability": 0.0001666, - "cooldown_time": 1, - "within_radius": 10, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - { - "test": "is_family", - "subject": "other", - "value": "panda" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - }, - { - "test": "on_ground", - "operator": "==", - "value": true - } - ] - }, - "max_dist": 10 - } - ], - "drop_item_chance": 0.001, - "loot_table": "loot_tables/entities/panda_sneeze.json", - "prepare_sound": "presneeze", - "prepare_time": 1, - "sound": "sneeze" - } - }, - "minecraft:panda_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/panda.json" - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": false, - "blend_attributes": false, - "environment_requirements": { - "blocks": "bamboo", - "count": 8, - "radius": 5 - }, - "breed_items": "bamboo", - "breeds_with": { - "mate_type": "minecraft:panda", - "baby_type": "minecraft:panda", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "mutation_factor": { - "variant": 1 - } - }, - "minecraft:on_target_acquired": { - "event": "minecraft:become_angry", - "target": "self" - }, - "minecraft:on_target_escape": { - "event": "minecraft:on_calm", - "target": "self" - }, - "minecraft:attack": { - "damage": 2 - }, - "minecraft:behavior.melee_attack": { - "priority": 2, - "attack_once": true, - "track_target": true, - "reach_multiplier": 1 - } - }, - "minecraft:panda_lazy": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:behavior.lay_down": { - "priority": 5, - "interval": 400, - "random_stop_interval": 2000 - }, - "minecraft:behavior.random_sitting": { - "priority": 6, - "start_chance": 0.02, - "stop_chance": 0.2, - "cooldown": 25, - "min_sit_time": 15 - }, - "minecraft:behavior.snacking": { - "priority": 3, - "snacking_cooldown": 17.5, - "snacking_cooldown_min": 10, - "snacking_stop_chance": 0.0011, - "items": ["bamboo", "cake"] - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 2.5 - }, - "minecraft:movement": { - "value": 0.07 - } - }, - "minecraft:panda_worried": { - "minecraft:variant": { - "value": 2 - }, - "minecraft:behavior.scared": { - "priority": 1, - "sound_interval": 20 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 5, - "max_dist": 16, - "max_flee": 20, - "entity_types": [ - { - "filters": { - "test": "is_family", - "operator": "!=", - "subject": "other", - "value": "panda" - }, - "max_dist": 16, - "sprint_speed_multiplier": 1.5 - } - ] - } - }, - "minecraft:panda_playful": { - "minecraft:variant": { - "value": 3 - }, - "minecraft:behavior.roll": { - "priority": 12, - "probability": 0.013 - } - }, - "minecraft:panda_brown": { - "minecraft:variant": { - "value": 4 - } - }, - "minecraft:panda_weak": { - "minecraft:variant": { - "value": 5 - }, - "minecraft:health": { - "value": 10, - "max": 10 - } - }, - "minecraft:panda_sneezing": { - "minecraft:behavior.sneeze": { - "priority": 7, - "probability": 0.002, - "cooldown_time": 1, - "within_radius": 10, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - { - "test": "is_family", - "subject": "other", - "value": "panda" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - }, - { - "test": "on_ground", - "operator": "==", - "value": true - } - ] - }, - "max_dist": 10 - } - ], - "drop_item_chance": 0.001, - "loot_table": "loot_tables/entities/panda_sneeze.json", - "prepare_sound": "presneeze", - "prepare_time": 1, - "sound": "sneeze" - } - }, - "minecraft:panda_aggressive": { - "minecraft:type_family": { - "family": ["panda", "panda_aggressive", "mob"] - }, - "minecraft:variant": { - "value": 6 - }, - "minecraft:attack": { - "damage": 6 - }, - "minecraft:behavior.melee_attack": { - "priority": 2, - "track_target": true, - "reach_multiplier": 1 - }, - "minecraft:on_friendly_anger": { - "event": "minecraft:on_anger", - "target": "self" - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25, - "ignore_mob_damage": true - } - }, - "minecraft:panda_angry": { - "minecraft:angry": { - "duration": 500, - "broadcast_anger": true, - "broadcast_range": 41, - "broadcast_filters": { - "test": "is_family", - "operator": "==", - "value": "panda_aggressive" - }, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:on_target_acquired": {} - }, - "minecraft:baby_scared": { - "minecraft:angry": { - "duration": 1, - "broadcast_anger": true, - "broadcast_range": 41, - "broadcast_filters": { - "test": "is_family", - "operator": "==", - "value": "panda_aggressive" - }, - "calm_event": { - "event": "minecraft:baby_on_calm", - "target": "self" - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["panda"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:navigation.walk": { - "can_float": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:scale": { - "value": 1 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:giveable": { - "triggers": { - "cooldown": 3, - "items": ["bamboo", "cake"], - "on_give": { - "event": "minecraft:on_calm", - "target": "self" - } - } - }, - "minecraft:inventory": { - "inventory_size": 1, - "private": true - }, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:collision_box": { - "width": 1.3, - "height": 1.25 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.15 - }, - "minecraft:water_movement": { - "drag_factor": 0.98 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.random_sitting": { - "priority": 5, - "start_chance": 0.01, - "stop_chance": 0.3, - "cooldown": 30, - "min_sit_time": 10 - }, - "minecraft:behavior.snacking": { - "priority": 2, - "snacking_cooldown": 22.5, - "snacking_cooldown_min": 20, - "snacking_stop_chance": 0.001334, - "items": ["bamboo", "cake"] - }, - "minecraft:behavior.mount_pathing": { - "priority": 5, - "speed_multiplier": 1.5, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:behavior.tempt": { - "priority": 4, - "speed_multiplier": 1.25, - "items": ["bamboo"] - }, - "minecraft:behavior.random_stroll": { - "priority": 14, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25 - }, - "minecraft:balloonable": {}, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 1.105, 0] - } - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:variant": { - "value": 0 - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:genetics": { - "mutation_rate": 0.03125, - "genes": [ - { - "name": "panda_variant", - "allele_range": { - "range_min": 0, - "range_max": 15 - }, - "genetic_variants": [ - { - "main_allele": 0, - "birth_event": { - "event": "minecraft:panda_lazy", - "target": "self" - } - }, - { - "main_allele": 1, - "birth_event": { - "event": "minecraft:panda_worried", - "target": "self" - } - }, - { - "main_allele": 2, - "birth_event": { - "event": "minecraft:panda_playful", - "target": "self" - } - }, - { - "main_allele": 3, - "birth_event": { - "event": "minecraft:panda_aggressive", - "target": "self" - } - }, - { - "both_allele": { - "range_min": 4, - "range_max": 7 - }, - "birth_event": { - "event": "minecraft:panda_weak", - "target": "self" - } - }, - { - "both_allele": { - "range_min": 8, - "range_max": 9 - }, - "birth_event": { - "event": "minecraft:panda_brown", - "target": "self" - } - } - ] - } - ] - } - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "add": { - "component_groups": ["minecraft:panda_adult"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["minecraft:panda_baby"] - } - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:panda_baby"] - } - }, - "minecraft:ageable_grow_up": { - "sequence": [ - { - "remove": { - "component_groups": ["minecraft:panda_baby"] - } - }, - { - "add": { - "component_groups": ["minecraft:panda_adult"] - } - }, - { - "filters": { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 3 - }, - "add": { - "component_groups": ["minecraft:panda_playful"] - } - }, - { - "filters": { - "test": "is_variant", - "subject": "self", - "operator": "==", - "value": 6 - }, - "add": { - "component_groups": ["minecraft:panda_aggressive"] - } - } - ] - }, - "minecraft:panda_lazy": { - "add": { - "component_groups": ["minecraft:panda_lazy"] - } - }, - "minecraft:panda_worried": { - "add": { - "component_groups": ["minecraft:panda_worried"] - } - }, - "minecraft:panda_playful": { - "add": { - "component_groups": ["minecraft:panda_playful"] - } - }, - "minecraft:panda_brown": { - "add": { - "component_groups": ["minecraft:panda_brown"] - } - }, - "minecraft:panda_weak": { - "sequence": [ - { - "add": { - "component_groups": ["minecraft:panda_weak"] - } - }, - { - "filters": { - "test": "has_component", - "operator": "==", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["minecraft:panda_sneezing"] - } - } - ] - }, - "minecraft:panda_aggressive": { - "add": { - "component_groups": ["minecraft:panda_aggressive"] - } - }, - "minecraft:on_scared": { - "add": { - "component_groups": ["minecraft:baby_scared"] - } - }, - "minecraft:baby_on_calm": { - "remove": { - "component_groups": ["minecraft:baby_scared"] - } - }, - "minecraft:become_angry": { - "add": { - "component_groups": ["minecraft:panda_angry"] - } - }, - "minecraft:on_calm": { - "remove": { - "component_groups": ["minecraft:panda_angry"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/parrot.json b/build/entities/parrot.json deleted file mode 100644 index edd53b6..0000000 --- a/build/entities/parrot.json +++ /dev/null @@ -1,311 +0,0 @@ -{ - "format_version": "1.19.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:parrot", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:parrot_red": { - "minecraft:variant": { - "value": 0 - } - }, - "minecraft:parrot_blue": { - "minecraft:variant": { - "value": 1 - } - }, - "minecraft:parrot_green": { - "minecraft:variant": { - "value": 2 - } - }, - "minecraft:parrot_cyan": { - "minecraft:variant": { - "value": 3 - } - }, - "minecraft:parrot_silver": { - "minecraft:variant": { - "value": 4 - } - }, - "minecraft:parrot_adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/parrot.json" - } - }, - "minecraft:parrot_wild": { - "minecraft:type_family": { - "family": ["parrot_wild", "mob"] - }, - "minecraft:tameable": { - "probability": 0.33, - "tame_items": ["wheat_seeds", "pumpkin_seeds", "melon_seeds", "beetroot_seeds", "pitcher_pod", "torchflower_seeds"], - "tame_event": { - "event": "minecraft:on_tame", - "target": "self" - } - }, - "minecraft:behavior.random_fly": { - "priority": 2, - "xz_dist": 15, - "y_dist": 1, - "y_offset": 0, - "speed_multiplier": 1, - "can_land_on_trees": true, - "avoid_damage_blocks": true - }, - "minecraft:behavior.follow_mob": { - "priority": 3, - "speed_multiplier": 1, - "stop_distance": 3, - "search_range": 20 - } - }, - "minecraft:parrot_tame": { - "minecraft:type_family": { - "family": ["parrot_tame", "mob"] - }, - "minecraft:is_tamed": {}, - "minecraft:behavior.follow_owner": { - "priority": 2, - "speed_multiplier": 1, - "start_distance": 5, - "stop_distance": 1 - }, - "minecraft:sittable": {}, - "minecraft:behavior.stay_while_sitting": { - "priority": 1 - }, - "minecraft:behavior.find_mount": { - "priority": 3, - "within_radius": 16, - "avoid_water": true, - "start_delay": 100, - "target_needed": false, - "mount_distance": 2 - } - }, - "minecraft:parrot_not_riding_player": { - "minecraft:entity_sensor": { - "sensor_range": 2, - "relative_range": false, - "event_filters": { - "all_of": [ - { - "test": "is_riding", - "subject": "self", - "operator": "equals", - "value": true - }, - { - "test": "has_component", - "subject": "self", - "operator": "equals", - "value": "minecraft:behavior.look_at_player" - } - ] - }, - "event": "minecraft:on_riding_player" - }, - "minecraft:behavior.look_at_player": { - "priority": 1, - "look_distance": 8 - } - }, - "minecraft:parrot_riding_player": { - "minecraft:entity_sensor": { - "sensor_range": 2, - "relative_range": false, - "event_filters": { - "all_of": [ - { - "test": "is_riding", - "subject": "self", - "operator": "equals", - "value": false - }, - { - "test": "has_component", - "subject": "self", - "operator": "not", - "value": "minecraft:behavior.look_at_player" - } - ] - }, - "event": "minecraft:on_not_riding_player" - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 0.5, - "height": 1 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 6, - "max": 6 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.4 - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:jump.static": {}, - "minecraft:can_fly": {}, - "minecraft:navigation.fly": { - "can_path_over_water": true, - "can_path_from_air": true - }, - "minecraft:movement.fly": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 0, - "speed_multiplier": 1.25 - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:game_event_movement_tracking": { - "emit_flap": true - }, - "minecraft:healable": { - "force_use": true, - "filters": { - "test": "is_riding", - "operator": "!=", - "value": true - }, - "items": [ - { - "item": "cookie", - "heal_amount": 0, - "effects": [ - { - "name": "fatal_poison", - "chance": 1, - "duration": 1000, - "amplifier": 0 - } - ] - } - ] - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 20, - "add": { - "component_groups": ["minecraft:parrot_red", "minecraft:parrot_adult", "minecraft:parrot_wild", "minecraft:parrot_not_riding_player"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["minecraft:parrot_blue", "minecraft:parrot_adult", "minecraft:parrot_wild", "minecraft:parrot_not_riding_player"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["minecraft:parrot_green", "minecraft:parrot_adult", "minecraft:parrot_wild", "minecraft:parrot_not_riding_player"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["minecraft:parrot_cyan", "minecraft:parrot_adult", "minecraft:parrot_wild", "minecraft:parrot_not_riding_player"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["minecraft:parrot_silver", "minecraft:parrot_adult", "minecraft:parrot_wild", "minecraft:parrot_not_riding_player"] - } - } - ] - }, - "minecraft:on_tame": { - "remove": { - "component_groups": ["minecraft:parrot_wild"] - }, - "add": { - "component_groups": ["minecraft:parrot_tame"] - } - }, - "minecraft:on_riding_player": { - "remove": { - "component_groups": ["minecraft:parrot_not_riding_player"] - }, - "add": { - "component_groups": ["minecraft:parrot_riding_player"] - } - }, - "minecraft:on_not_riding_player": { - "remove": { - "component_groups": ["minecraft:parrot_riding_player"] - }, - "add": { - "component_groups": ["minecraft:parrot_not_riding_player"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/phantom.json b/build/entities/phantom.json deleted file mode 100644 index 5ccc2a4..0000000 --- a/build/entities/phantom.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "description": { - "identifier": "minecraft:phantom", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:type_family": { - "family": ["phantom", "undead", "monster", "mob"] - }, - "minecraft:loot": { - "table": "loot_tables/entities/phantom.json" - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:physics": { - "has_gravity": false - }, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:game_event_movement_tracking": { - "emit_flap": true - }, - "minecraft:attack": { - "damage": 6 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_air": true, - "breathes_water": false - }, - "minecraft:collision_box": { - "width": 0.9, - "height": 0.5 - }, - "minecraft:movement": { - "value": 1.8 - }, - "minecraft:movement.glide": { - "start_speed": 0.1, - "speed_when_turning": 0.2 - }, - "minecraft:burns_in_daylight": {}, - "minecraft:follow_range": { - "value": 64, - "max": 64 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 0, - "max_dist": 16, - "ignore_visibility": true, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "ocelot" - }, - { - "test": "is_family", - "subject": "other", - "value": "cat" - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 1, - "reselect_targets": true, - "scan_interval": 20, - "within_radius": 64, - "must_see_forget_duration": 0.5, - "target_search_height": 80, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 64 - } - ] - }, - "minecraft:behavior.swoop_attack": { - "priority": 2, - "damage_reach": 0.2, - "speed_multiplier": 1, - "delay_range": [10, 20] - }, - "minecraft:behavior.circle_around_anchor": { - "priority": 3, - "radius_change": 1, - "radius_adjustment_chance": 0.004, - "height_adjustment_chance": 0.002857, - "goal_radius": 1, - "angle_change": 15, - "radius_range": [5, 15], - "height_offset_range": [-4, 5], - "height_above_target_range": [20, 40] - } - } - } -} diff --git a/build/entities/pig.json b/build/entities/pig.json deleted file mode 100644 index 941cd6c..0000000 --- a/build/entities/pig.json +++ /dev/null @@ -1,291 +0,0 @@ -{ - "format_version": "1.20.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:pig", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:pig_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["carrot", "beetroot", "potato"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 6, - "speed_multiplier": 1.1 - } - }, - "minecraft:pig_transform": { - "minecraft:transformation": { - "into": "minecraft:pig_zombie", - "delay": 0.5 - } - }, - "minecraft:pig_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/pig.json" - }, - "minecraft:behavior.breed": { - "priority": 4, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": false, - "breeds_with": { - "mate_type": "minecraft:pig", - "baby_type": "minecraft:pig", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "breed_items": ["carrot", "beetroot", "potato"] - } - }, - "minecraft:pig_unsaddled": { - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "saddle" - }, - "event": "minecraft:on_saddled" - }, - "use_item": true, - "play_sounds": "saddle", - "interact_text": "action.interact.saddle" - } - ] - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.63, 0] - } - } - }, - "minecraft:pig_saddled": { - "minecraft:is_saddled": {}, - "minecraft:loot": { - "table": "loot_tables/entities/pig_saddled.json" - }, - "minecraft:boostable": { - "speed_multiplier": 1.35, - "duration": 3, - "boost_items": [ - { - "item": "carrotOnAStick", - "damage": 2, - "replace_item": "fishing_rod" - } - ] - }, - "minecraft:rideable": { - "seat_count": 1, - "interact_text": "action.interact.ride.horse", - "family_types": ["player"], - "seats": { - "position": [0, 0.63, 0] - } - }, - "minecraft:item_controllable": { - "control_items": "carrotOnAStick" - }, - "minecraft:behavior.controlled_by_player": { - "priority": 0 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:damage_sensor": { - "triggers": { - "on_damage": { - "filters": [ - { - "test": "is_family", - "subject": "other", - "value": "lightning" - }, - { - "test": "is_difficulty", - "operator": "!=", - "value": "peaceful" - } - ], - "event": "become_zombie" - }, - "deals_damage": false - } - }, - "minecraft:type_family": { - "family": ["pig", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:collision_box": { - "width": 0.9, - "height": 0.9 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 0.9 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.mount_pathing": { - "priority": 1, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.float": { - "priority": 2 - }, - "minecraft:behavior.panic": { - "priority": 3, - "speed_multiplier": 1.25 - }, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 1.2, - "items": ["potato", "carrot", "beetroot", "carrotOnAStick"] - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "become_zombie": { - "remove": {}, - "add": { - "component_groups": ["minecraft:pig_transform"] - } - }, - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "trigger": "minecraft:spawn_adult" - }, - { - "weight": 5, - "remove": {}, - "add": { - "component_groups": ["minecraft:pig_baby"] - } - } - ] - }, - "minecraft:entity_born": { - "remove": {}, - "add": { - "component_groups": ["minecraft:pig_baby"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:pig_baby"] - }, - "add": { - "component_groups": ["minecraft:pig_adult", "minecraft:pig_unsaddled"] - } - }, - "minecraft:on_saddled": { - "remove": { - "component_groups": ["minecraft:pig_unsaddled"] - }, - "add": { - "component_groups": ["minecraft:pig_saddled"] - } - }, - "minecraft:spawn_adult": { - "add": { - "component_groups": ["minecraft:pig_adult", "minecraft:pig_unsaddled"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/piglin.json b/build/entities/piglin.json deleted file mode 100644 index 7e3d7fa..0000000 --- a/build/entities/piglin.json +++ /dev/null @@ -1,1085 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:piglin", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "zombification_sensor": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "in_nether", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "start_zombification_event" - } - } - }, - "start_zombification": { - "minecraft:is_shaking": {}, - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "in_nether", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "stop_zombification_event" - } - }, - "minecraft:timer": { - "looping": false, - "time": 15, - "time_down_event": { - "event": "become_zombie_event" - } - } - }, - "become_zombie": { - "minecraft:transformation": { - "into": "minecraft:zombie_pigman", - "transformation_sound": "converted_to_zombified", - "keep_level": true, - "drop_inventory": true, - "preserve_equipment": true - } - }, - "ranged_unit": { - "minecraft:behavior.ranged_attack": { - "priority": 8, - "attack_interval_min": 1, - "attack_interval_max": 1, - "attack_radius": 8, - "attack_radius_min": 4, - "speed_multiplier": 1, - "target_in_sight_time": 0.1 - }, - "minecraft:shooter": { - "def": "minecraft:arrow" - }, - "minecraft:behavior.charge_held_item": { - "priority": 3, - "items": ["minecraft:arrow"] - }, - "minecraft:equipment": { - "table": "loot_tables/entities/piglin_gear_ranged.json" - }, - "minecraft:variant": { - "value": 0 - } - }, - "melee_unit": { - "minecraft:behavior.melee_attack": { - "priority": 8, - "speed_multiplier": 1, - "track_target": true - }, - "minecraft:attack": { - "damage": 5 - }, - "minecraft:equipment": { - "table": "loot_tables/entities/piglin_gear_melee.json" - }, - "minecraft:variant": { - "value": 1 - } - }, - "angry": { - "minecraft:angry": { - "duration": 30, - "broadcast_anger": true, - "broadcast_anger_on_attack": true, - "broadcast_anger_on_being_attacked": true, - "broadcast_range": 16, - "broadcast_targets": ["piglin"], - "calm_event": { - "event": "become_calm_event", - "target": "self" - }, - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "piglin" - }, - { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:attack_cooldown" - } - ] - }, - "angry_sound": "angry", - "sound_interval": { - "range_min": 2, - "range_max": 5 - } - } - }, - "attack_cooldown": { - "minecraft:attack_cooldown": { - "attack_cooldown_time": [30, 120], - "attack_cooldown_complete_event": { - "event": "attack_cooldown_complete_event", - "target": "self" - } - } - }, - "piglin_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:movement": { - "value": 0.42 - }, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 1 + (query.equipment_count * Math.Random(1,2)) : 0" - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.1 - } - }, - "piglin_adult": { - "minecraft:group_size": { - "radius": 32, - "filters": { - "all_of": [ - { - "test": "has_component", - "operator": "!=", - "value": "minecraft:is_baby" - }, - { - "test": "is_family", - "value": "piglin" - } - ] - } - }, - "minecraft:movement": { - "value": 0.35 - }, - "minecraft:barter": { - "barter_table": "loot_tables/entities/piglin_barter.json", - "cooldown_after_being_attacked": 20 - }, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:celebrate_hunt": { - "celebration_targets": { - "all_of": [ - { - "test": "is_family", - "value": "hoglin" - } - ] - }, - "broadcast": true, - "duration": 10, - "celebrate_sound": "celebrate", - "sound_interval": { - "range_min": 2, - "range_max": 5 - }, - "radius": 16 - }, - "minecraft:block_sensor": { - "sensor_radius": 16, - "on_break": [ - { - "block_list": [ - "minecraft:gold_block", - "minecraft:gilded_blackstone", - "minecraft:nether_gold_ore", - "minecraft:deepslate_gold_ore", - "minecraft:raw_gold_block", - "minecraft:gold_ore", - "minecraft:chest", - "minecraft:trapped_chest", - "minecraft:ender_chest", - "minecraft:barrel", - "minecraft:shulker_box", - "minecraft:undyed_shulker_box" - ], - "on_block_broken": "important_block_destroyed_event" - } - ] - } - }, - "interactable_piglin": { - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "gold_ingot" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:is_baby" - } - ] - } - }, - "barter": true, - "admire": true, - "use_item": true, - "cooldown_after_being_attacked": 20, - "interact_text": "action.interact.barter" - } - ] - } - }, - "hunter": { - "minecraft:type_family": { - "family": ["piglin", "piglin_hunter", "monster"] - } - }, - "not_hunter": { - "minecraft:type_family": { - "family": ["piglin", "monster"] - } - }, - "alert_for_attack_targets": { - "minecraft:behavior.nearest_attackable_target": { - "priority": 7, - "within_radius": 16, - "persist_time": 0, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "wither" - } - ] - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "self", - "value": "piglin_hunter" - }, - { - "test": "is_family", - "subject": "other", - "value": "hoglin_huntable" - }, - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:attack_cooldown" - } - ] - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "head", - "operator": "!=", - "value": "golden_helmet" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "torso", - "operator": "!=", - "value": "golden_chestplate" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "leg", - "operator": "!=", - "value": "golden_leggings" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "feet", - "operator": "!=", - "value": "golden_boots" - } - ] - }, - "max_dist": 16, - "reevaluate_description": true - }, - { - "filters": { - "any_of": [ - { - "test": "has_container_open", - "subject": "other", - "operator": "==", - "value": true - } - ] - }, - "max_dist": 16 - } - ], - "must_see": true - } - }, - "take_target_as_response_to_block_break": { - "minecraft:behavior.nearest_attackable_target": { - "priority": 7, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 16 - } - ] - } - }, - "piglin_jockey": { - "minecraft:behavior.find_mount": { - "priority": 1, - "within_radius": 16, - "start_delay": 15, - "max_failed_attempts": 20 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:equip_item": {}, - "minecraft:admire_item": { - "duration": 8, - "cooldown_after_being_attacked": 20 - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:on_target_acquired": { - "event": "become_angry_event", - "target": "self" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:health": { - "value": 16, - "max": 16 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/piglin.json" - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "can_open_doors": true - }, - "minecraft:annotation.open_door": {}, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:nameable": {}, - "minecraft:inventory": { - "inventory_size": 8 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.admire_item": { - "priority": 2, - "admire_item_sound": "admire", - "sound_interval": { - "range_min": 2, - "range_max": 5 - }, - "on_admire_item_start": { - "event": "admire_item_started_event", - "target": "self" - }, - "on_admire_item_stop": { - "event": "admire_item_stopped_event", - "target": "self" - } - }, - "minecraft:behavior.barter": { - "priority": 3 - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:behavior.avoid_mob_type": { - "priority": 4, - "remove_target": true, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "zombie_pigman" - } - ] - }, - "max_dist": 6 - }, - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "zoglin" - } - ] - }, - "max_dist": 6 - }, - { - "filters": { - "all_of": [ - { - "test": "has_target", - "subject": "other", - "value": true - }, - { - "test": "is_family", - "subject": "other", - "value": "hoglin" - } - ] - }, - "sprint_speed_multiplier": 1.2, - "check_if_outnumbered": true - } - ], - "on_escape_event": { - "event": "become_calm_event", - "target": "self" - }, - "avoid_mob_sound": "retreat", - "sound_interval": { - "range_min": 2, - "range_max": 5 - } - }, - "minecraft:behavior.equip_item": { - "priority": 5 - }, - "minecraft:behavior.pickup_items": { - "priority": 6, - "max_dist": 10, - "goal_radius": 2, - "speed_multiplier": 0.8, - "pickup_based_on_chance": false, - "can_pickup_any_item": false, - "cooldown_after_being_attacked": 20 - }, - "minecraft:behavior.avoid_block": { - "priority": 9, - "tick_interval": 5, - "search_range": 8, - "search_height": 4, - "sprint_speed_modifier": 1.1, - "target_selection_method": "nearest", - "target_blocks": ["minecraft:soul_fire", "minecraft:soul_lantern", "minecraft:soul_torch", "minecraft:item.soul_campfire"], - "avoid_block_sound": "retreat", - "sound_interval": { - "range_min": 2, - "range_max": 5 - } - }, - "minecraft:behavior.random_stroll": { - "priority": 10, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.look_at_player": { - "priority": 11, - "look_distance": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 12 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:follow_range": { - "value": 64 - }, - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:golden_sword", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_axe", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_hoe", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_pickaxe", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_shovel", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_rail", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_helmet", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_chestplate", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_leggings", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_boots", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_apple", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:appleEnchanted", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:golden_carrot", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:gold_block", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:gold_nugget", - "priority": 2, - "stored_in_inventory": true - }, - { - "item": "minecraft:raw_gold", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:gold_ore", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:nether_gold_ore", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:deepslate_gold_ore", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:raw_gold_block", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:gilded_blackstone", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:horsearmorgold", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:crossbow", - "priority": 2 - }, - { - "item": "minecraft:porkchop", - "consume_item": true, - "priority": 3, - "max_amount": 64 - }, - { - "item": "minecraft:cooked_porkchop", - "consume_item": true, - "priority": 3, - "max_amount": 64 - }, - { - "item": "minecraft:netherite_helmet", - "priority": 3 - }, - { - "item": "minecraft:diamond_helmet", - "priority": 4 - }, - { - "item": "minecraft:iron_helmet", - "priority": 5 - }, - { - "item": "minecraft:chainmail_helmet", - "priority": 6 - }, - { - "item": "minecraft:leather_helmet", - "priority": 7 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 8 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 8 - }, - { - "item": "minecraft:skull:2", - "want_amount": 1, - "surplus_amount": 1, - "priority": 8 - }, - { - "item": "minecraft:skull:3", - "want_amount": 1, - "surplus_amount": 1, - "priority": 8 - }, - { - "item": "minecraft:skull:4", - "want_amount": 1, - "surplus_amount": 1, - "priority": 8 - }, - { - "item": "minecraft:skull:5", - "want_amount": 1, - "surplus_amount": 1, - "priority": 8 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 8 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 8 - }, - { - "item": "minecraft:netherite_chestplate", - "priority": 3 - }, - { - "item": "minecraft:diamond_chestplate", - "priority": 4 - }, - { - "item": "minecraft:iron_chestplate", - "priority": 5 - }, - { - "item": "minecraft:chainmail_chestplate", - "priority": 6 - }, - { - "item": "minecraft:leather_chestplate", - "priority": 7 - }, - { - "item": "minecraft:elytra", - "priority": 7 - }, - { - "item": "minecraft:netherite_leggings", - "priority": 3 - }, - { - "item": "minecraft:diamond_leggings", - "priority": 4 - }, - { - "item": "minecraft:iron_leggings", - "priority": 5 - }, - { - "item": "minecraft:chainmail_leggings", - "priority": 6 - }, - { - "item": "minecraft:leather_leggings", - "priority": 7 - }, - { - "item": "minecraft:netherite_boots", - "priority": 3 - }, - { - "item": "minecraft:diamond_boots", - "priority": 4 - }, - { - "item": "minecraft:iron_boots", - "priority": 5 - }, - { - "item": "minecraft:chainmail_boots", - "priority": 6 - }, - { - "item": "minecraft:bell", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:clock", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:speckled_melon", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:light_weighted_pressure_plate", - "priority": 2, - "admire": true, - "pickup_limit": 1, - "stored_in_inventory": true - }, - { - "item": "minecraft:leather_boots", - "priority": 7 - }, - { - "item": "minecraft:netherite_sword", - "priority": 3 - }, - { - "item": "minecraft:diamond_sword", - "priority": 4 - }, - { - "item": "minecraft:iron_sword", - "priority": 5 - }, - { - "item": "minecraft:stone_sword", - "priority": 6 - }, - { - "item": "minecraft:wooden_sword", - "priority": 7 - }, - { - "item": "minecraft:shield", - "priority": 7 - }, - { - "item": "minecraft:gold_ingot", - "priority": 1, - "pickup_limit": 1, - "admire": true, - "barter": true - } - ] - } - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 5, - "trigger": "spawn_baby" - }, - { - "weight": 95, - "trigger": "spawn_adult" - } - ] - }, - "minecraft:entity_born": { - "trigger": "spawn_baby" - }, - "spawn_adult_no_hunting": { - "randomize": [ - { - "weight": 1, - "trigger": "spawn_adult_ranged_no_hunting" - }, - { - "weight": 1, - "trigger": "spawn_adult_melee_no_hunting" - } - ] - }, - "spawn_adult": { - "randomize": [ - { - "weight": 1, - "trigger": "spawn_adult_ranged" - }, - { - "weight": 1, - "trigger": "spawn_adult_melee" - } - ] - }, - "spawn_adult_ranged": { - "add": { - "component_groups": ["piglin_adult", "zombification_sensor", "alert_for_attack_targets", "ranged_unit", "attack_cooldown", "hunter", "interactable_piglin"] - } - }, - "spawn_adult_ranged_no_hunting": { - "add": { - "component_groups": ["piglin_adult", "zombification_sensor", "alert_for_attack_targets", "ranged_unit", "attack_cooldown", "not_hunter", "interactable_piglin"] - } - }, - "spawn_adult_melee": { - "add": { - "component_groups": ["piglin_adult", "zombification_sensor", "alert_for_attack_targets", "melee_unit", "attack_cooldown", "hunter", "interactable_piglin"] - } - }, - "spawn_adult_melee_no_hunting": { - "add": { - "component_groups": ["piglin_adult", "zombification_sensor", "alert_for_attack_targets", "melee_unit", "attack_cooldown", "not_hunter", "interactable_piglin"] - } - }, - "spawn_baby": { - "randomize": [ - { - "weight": 9, - "add": { - "component_groups": ["piglin_baby", "zombification_sensor", "not_hunter"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["piglin_baby", "zombification_sensor", "piglin_jockey", "not_hunter"] - } - } - ] - }, - "stop_zombification_event": { - "add": { - "component_groups": ["zombification_sensor"] - }, - "remove": { - "component_groups": ["start_zombification"] - } - }, - "start_zombification_event": { - "add": { - "component_groups": ["start_zombification"] - }, - "remove": { - "component_groups": ["zombification_sensor"] - } - }, - "become_angry_event": { - "add": { - "component_groups": ["angry"] - } - }, - "become_calm_event": { - "remove": { - "component_groups": ["angry", "take_target_as_response_to_block_break"] - }, - "add": { - "component_groups": ["alert_for_attack_targets", "attack_cooldown"] - } - }, - "attack_cooldown_complete_event": { - "remove": { - "component_groups": ["attack_cooldown"] - } - }, - "become_zombie_event": { - "add": { - "component_groups": ["become_zombie"] - } - }, - "important_block_destroyed_event": { - "remove": { - "component_groups": ["alert_for_attack_targets"] - }, - "add": { - "component_groups": ["take_target_as_response_to_block_break"] - } - }, - "admire_item_started_event": { - "remove": { - "component_groups": ["interactable_piglin"] - } - }, - "admire_item_stopped_event": { - "add": { - "component_groups": ["interactable_piglin"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/piglin_brute.json b/build/entities/piglin_brute.json deleted file mode 100644 index dedb0ef..0000000 --- a/build/entities/piglin_brute.json +++ /dev/null @@ -1,339 +0,0 @@ -{ - "format_version": "1.18.20", - "minecraft:entity": { - "description": { - "identifier": "minecraft:piglin_brute", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "zombification_sensor": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "in_nether", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "start_zombification_event" - } - } - }, - "start_zombification": { - "minecraft:is_shaking": {}, - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "in_nether", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "stop_zombification_event" - } - }, - "minecraft:timer": { - "looping": false, - "time": 15, - "time_down_event": { - "event": "become_zombie_event" - } - } - }, - "become_zombie": { - "minecraft:transformation": { - "into": "minecraft:zombie_pigman", - "transformation_sound": "converted_to_zombified", - "keep_level": true, - "preserve_equipment": true - } - }, - "melee_unit": { - "minecraft:behavior.melee_attack": { - "priority": 4, - "speed_multiplier": 1, - "track_target": true - }, - "minecraft:attack": { - "damage": 7 - }, - "minecraft:equipment": { - "table": "loot_tables/entities/piglin_brute_gear.json" - }, - "minecraft:variant": { - "value": 1 - } - }, - "angry": { - "minecraft:angry": { - "duration": 30, - "broadcast_anger": false, - "broadcast_anger_on_attack": false, - "broadcast_anger_on_being_attacked": true, - "broadcast_range": 16, - "broadcast_targets": ["piglin"], - "calm_event": { - "event": "become_calm_event", - "target": "self" - }, - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "piglin" - } - ] - }, - "angry_sound": "angry", - "sound_interval": { - "range_min": 2, - "range_max": 5 - } - } - }, - "alert_for_attack_targets": { - "minecraft:behavior.nearest_prioritized_attackable_target": { - "priority": 3, - "within_radius": 12, - "persist_time": 2, - "must_see": true, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 12, - "priority": 0 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "wither" - }, - "max_dist": 12, - "priority": 1 - } - ] - } - }, - "take_target_as_response_to_block_break": { - "minecraft:behavior.nearest_attackable_target": { - "priority": 3, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 16 - } - ] - } - }, - "go_back_to_spawn": { - "minecraft:behavior.go_home": { - "priority": 6, - "interval": 200, - "speed_multiplier": 0.6, - "goal_radius": 4, - "on_failed": [ - { - "event": "go_back_to_spawn_failed", - "target": "self" - } - ] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:type_family": { - "family": ["piglin", "adult_piglin", "piglin_brute", "monster"] - }, - "minecraft:home": {}, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 20 : 0" - }, - "minecraft:on_target_acquired": { - "event": "become_angry_event", - "target": "self" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:health": { - "value": 50, - "max": 50 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/piglin.json" - }, - "minecraft:movement": { - "value": 0.35 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "can_open_doors": true - }, - "minecraft:annotation.open_door": {}, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:nameable": {}, - "minecraft:despawn": { - "filters": { - "any_of": [ - { - "all_of": [ - { - "test": "is_persistent", - "value": false - }, - { - "test": "distance_to_nearest_player", - "operator": ">", - "value": 54 - } - ] - }, - { - "all_of": [ - { - "test": "is_persistent", - "value": false - }, - { - "test": "inactivity_timer", - "subject": "self", - "value": 30 - }, - { - "test": "random_chance", - "value": 800 - }, - { - "test": "distance_to_nearest_player", - "operator": ">", - "value": 32 - } - ] - } - ] - } - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:follow_range": { - "value": 64 - } - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["zombification_sensor", "alert_for_attack_targets", "melee_unit", "go_back_to_spawn"] - } - }, - "stop_zombification_event": { - "add": { - "component_groups": ["zombification_sensor"] - }, - "remove": { - "component_groups": ["start_zombification"] - } - }, - "start_zombification_event": { - "add": { - "component_groups": ["start_zombification"] - }, - "remove": { - "component_groups": ["zombification_sensor"] - } - }, - "become_angry_event": { - "add": { - "component_groups": ["angry"] - } - }, - "become_calm_event": { - "remove": { - "component_groups": ["angry"] - }, - "add": { - "component_groups": ["alert_for_attack_targets"] - } - }, - "become_zombie_event": { - "add": { - "component_groups": ["become_zombie"] - } - }, - "important_block_destroyed_event": { - "remove": { - "component_groups": ["alert_for_attack_targets"] - }, - "add": { - "component_groups": ["take_target_as_response_to_block_break"] - } - }, - "go_back_to_spawn_failed": { - "remove": { - "component_groups": ["go_back_to_spawn"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/pillager.json b/build/entities/pillager.json deleted file mode 100644 index b859e42..0000000 --- a/build/entities/pillager.json +++ /dev/null @@ -1,507 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:pillager", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:celebrate": { - "minecraft:behavior.celebrate": { - "priority": 5, - "celebration_sound": "celebrate", - "sound_interval": { - "range_min": 2, - "range_max": 7 - }, - "jump_interval": { - "range_min": 1, - "range_max": 3.5 - }, - "duration": 30, - "on_celebration_end_event": { - "event": "minecraft:stop_celebrating", - "target": "self" - } - } - }, - "minecraft:ranged_attack": { - "minecraft:behavior.ranged_attack": { - "priority": 4, - "attack_interval_min": 1, - "attack_interval_max": 1, - "attack_radius": 8 - }, - "minecraft:shooter": { - "def": "minecraft:arrow" - }, - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "minecraft:melee_mode" - } - } - }, - "minecraft:melee_attack": { - "minecraft:behavior.melee_attack": { - "priority": 4, - "track_target": true - }, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "in_water", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "minecraft:ranged_mode" - } - } - }, - "minecraft:raid_configuration": { - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "hostile", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": false, - "can_migrate": true, - "first_founding_reward": 0 - }, - "minecraft:behavior.move_to_village": { - "priority": 5, - "speed_multiplier": 1, - "goal_radius": 2 - }, - "minecraft:loot": { - "table": "loot_tables/entities/pillager_raid.json" - }, - "minecraft:ambient_sound_interval": { - "value": 2, - "range": 4, - "event_name": "ambient.in.raid" - } - }, - "minecraft:raid_persistence": { - "minecraft:persistent": {} - }, - "minecraft:illager_squad_captain": { - "minecraft:is_illager_captain": {}, - "minecraft:variant": { - "value": 1 - }, - "minecraft:equipment": { - "table": "loot_tables/entities/pillager_captain_equipment.json", - "slot_drop_chance": [ - { - "slot": "slot.armor.chest", - "drop_chance": 1 - } - ] - }, - "minecraft:damage_sensor": { - "triggers": { - "on_damage": { - "filters": { - "all_of": [ - { - "test": "has_damage", - "value": "fatal" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - } - ] - }, - "event": "minecraft:gain_bad_omen", - "target": "other" - } - } - }, - "minecraft:on_hurt": { - "event": "minecraft:ranged_mode", - "target": "self" - }, - "minecraft:on_hurt_by_player": { - "event": "minecraft:ranged_mode", - "target": "self" - } - }, - "minecraft:patrol_captain": { - "minecraft:is_illager_captain": {}, - "minecraft:variant": { - "value": 1 - }, - "minecraft:equipment": { - "table": "loot_tables/entities/pillager_captain_equipment.json", - "slot_drop_chance": [ - { - "slot": "slot.armor.chest", - "drop_chance": 1 - } - ] - }, - "minecraft:damage_sensor": { - "triggers": { - "on_damage": { - "filters": { - "all_of": [ - { - "test": "has_damage", - "value": "fatal" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - } - ] - }, - "event": "minecraft:gain_bad_omen", - "target": "other" - } - } - }, - "minecraft:on_hurt": { - "event": "minecraft:ranged_mode", - "target": "self" - }, - "minecraft:on_hurt_by_player": { - "event": "minecraft:ranged_mode", - "target": "self" - }, - "minecraft:on_target_escape": { - "event": "minecraft:calm", - "target": "self" - }, - "minecraft:behavior.hold_ground": { - "priority": 5, - "min_radius": 10, - "broadcast": true, - "broadcast_range": 8, - "within_radius_event": { - "event": "minecraft:ranged_mode", - "target": "self" - } - }, - "minecraft:behavior.move_to_random_block": { - "priority": 6, - "speed_multiplier": 0.55, - "within_radius": 8, - "block_distance": 512 - } - }, - "minecraft:patrol_follower": { - "minecraft:behavior.follow_target_captain": { - "priority": 5, - "speed_multiplier": 0.8, - "within_radius": 64, - "follow_distance": 5 - }, - "minecraft:behavior.hold_ground": { - "priority": 6, - "min_radius": 10, - "broadcast": true, - "broadcast_range": 8, - "within_radius_event": { - "event": "minecraft:ranged_mode", - "target": "self" - } - }, - "minecraft:on_hurt": { - "event": "minecraft:ranged_mode", - "target": "self" - }, - "minecraft:on_hurt_by_player": { - "event": "minecraft:ranged_mode", - "target": "self" - }, - "minecraft:on_target_escape": { - "event": "minecraft:calm", - "target": "self" - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? (query.is_baby ? 12 : 5) + (Math.die_roll(query.equipment_count,1,3)) : 0" - }, - "minecraft:equip_item": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:type_family": { - "family": ["pillager", "monster", "illager", "mob"] - }, - "minecraft:variant": { - "value": 0 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:health": { - "value": 24, - "max": 24 - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/pillager.json" - }, - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:banner:15", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - } - ] - }, - "minecraft:movement": { - "value": 0.35 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:nameable": {}, - "minecraft:equipment": { - "table": "loot_tables/entities/pillager_gear.json" - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1, - "entity_types": { - "filters": { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "illager" - }, - "max_dist": 64 - } - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "reselect_targets": true, - "within_radius": 16, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.equip_item": { - "priority": 3 - }, - "minecraft:behavior.pickup_items": { - "priority": 7, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1 - }, - "minecraft:behavior.random_stroll": { - "priority": 8, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 9, - "look_distance": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 10 - }, - "minecraft:behavior.charge_held_item": { - "priority": 3, - "items": ["minecraft:arrow"] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:follow_range": { - "value": 64 - } - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:ranged_attack"] - } - }, - "minecraft:spawn_for_raid": { - "add": { - "component_groups": ["minecraft:ranged_attack", "minecraft:raid_configuration", "minecraft:raid_persistence"] - } - }, - "minecraft:spawn_as_patrol_follower": { - "add": { - "component_groups": ["minecraft:ranged_attack", "minecraft:patrol_follower"] - } - }, - "minecraft:spawn_as_illager_captain": { - "add": { - "component_groups": ["minecraft:ranged_attack", "minecraft:illager_squad_captain"] - } - }, - "minecraft:promote_to_illager_captain": { - "add": { - "component_groups": ["minecraft:ranged_attack", "minecraft:illager_squad_captain"] - }, - "remove": { - "component_groups": ["minecraft:patrol_follower"] - } - }, - "minecraft:promote_to_patrol_captain": { - "add": { - "component_groups": ["minecraft:ranged_attack", "minecraft:patrol_captain"] - }, - "remove": { - "component_groups": ["minecraft:patrol_follower"] - } - }, - "minecraft:melee_mode": { - "remove": { - "component_groups": ["minecraft:ranged_attack"] - }, - "add": { - "component_groups": ["minecraft:melee_attack"] - } - }, - "minecraft:ranged_mode": { - "remove": { - "component_groups": ["minecraft:melee_attack"] - }, - "add": { - "component_groups": ["minecraft:ranged_attack"] - } - }, - "minecraft:start_celebrating": { - "sequence": [ - { - "add": { - "component_groups": ["minecraft:celebrate"] - } - }, - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "minecraft:stop_celebrating": { - "remove": { - "component_groups": ["minecraft:celebrate"] - } - }, - "minecraft:raid_expired": { - "sequence": [ - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "minecraft:calm": { - "remove": { - "component_groups": ["minecraft:melee_attack", "minecraft:ranged_attack"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/player.json b/build/entities/player.json deleted file mode 100644 index 7942211..0000000 --- a/build/entities/player.json +++ /dev/null @@ -1,541 +0,0 @@ -{ - "format_version": "1.18.20", - "minecraft:entity": { - "description": { - "identifier": "minecraft:player", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false, - "scripts": { - "animate": [ - "onTick", - "levitate", - "death", - "ride", - "sneak", - "move", - "sprint", - "enchanth", - "enchantc", - "enchantl", - "enchantb", - "helmet", - "chest", - "leggings", - "boots", - "sleep", - "north", - "east", - "south", - "west", - "basalt_deltas", - "bamboo_jungle", - "bamboo_jungle_hills", - "beach", - "birch_forest", - "birch_forest_hills", - "birch_forest_hills_mutated", - "birch_forest_mutated", - "cold_beach", - "cold_ocean", - "cold_taiga", - "cold_taiga_hills", - "cold_taiga_mutated", - "crimson_forest", - "deep_cold_ocean", - "deep_frozen_ocean", - "deep_lukewarm_ocean", - "deep_ocean", - "deep_warm_ocean", - "desert", - "desert_hills", - "desert_mutated", - "extreme_hills", - "extreme_hills_edge", - "extreme_hills_mutated", - "extreme_hills_plus_trees", - "extreme_hills_plus_trees_mutated", - "flower_forest", - "forest", - "forest_hills", - "frozen_ocean", - "frozen_river", - "ice_mountains", - "ice_plains", - "ice_plains_spikes", - "jungle", - "jungle_edge", - "jungle_edge_mutated", - "jungle_hills", - "jungle_mutated", - "legacy_frozen_ocean", - "lofty_peaks", - "lukewarm_ocean", - "mega_spruce_taiga", - "mega_spruce_taiga_hills", - "mega_taiga", - "mega_taiga_hills", - "mesa", - "mesa_bryce", - "mesa_plateau", - "mesa_plateau_mutated", - "mesa_plateau_stone", - "mesa_plateau_stone_mutated", - "mountain_grove", - "mountain_meadow", - "mushroom_island", - "mushroom_island_shore", - "nether_wastes", - "ocean", - "plains", - "river", - "roofed_forest", - "roofed_forest_mutated", - "savanna", - "savanna_mutated", - "savanna_plateau", - "savanna_plateau_mutated", - "snow_capped_peaks", - "snowy_slopes", - "soulsand_valley", - "stone_beach", - "sunflower_plains", - "swamp", - "swamp_mutated", - "taiga", - "taiga_hills", - "taiga_mutated", - "the_end", - "warm_ocean", - "warped_forest", - "deep_dark", - "lush_caves", - "jagged_peaks", - "dripstone_caves", - "meadow", - "mangrove_swamp", - "cherry_grove", - "grove", - "stony_peaks" - ] - }, - "animations": { - "onTick": "animation.onTick", - "levitate": "controller.animation.levitate", - "death": "controller.animation.death", - "ride": "controller.animation.ride", - "sneak": "controller.animation.sneak", - "move": "controller.animation.move", - "sprint": "controller.animation.sprint", - "enchanth": "controller.animation.enchanth", - "enchantc": "controller.animation.enchantc", - "enchantl": "controller.animation.enchantl", - "enchantb": "controller.animation.enchantb", - "helmet": "controller.animation.helmet", - "chest": "controller.animation.chest", - "leggings": "controller.animation.leggings", - "boots": "controller.animation.boots", - "sleep": "controller.animation.sleep", - "north": "controller.animation.facing_north", - "east": "controller.animation.facing_east", - "south": "controller.animation.facing_south", - "west": "controller.animation.facing_west", - "basalt_deltas": "controller.animation.basalt_deltas", - "bamboo_jungle": "controller.animation.bamboo_jungle", - "bamboo_jungle_hills": "controller.animation.bamboo_jungle_hills", - "beach": "controller.animation.beach", - "birch_forest": "controller.animation.birch_forest", - "birch_forest_hills": "controller.animation.birch_forest_hills", - "birch_forest_hills_mutated": "controller.animation.birch_forest_hills_mutated", - "birch_forest_mutated": "controller.animation.birch_forest_mutated", - "cold_beach": "controller.animation.cold_beach", - "cold_ocean": "controller.animation.cold_ocean", - "cold_taiga": "controller.animation.cold_taiga", - "cold_taiga_hills": "controller.animation.cold_taiga_hills", - "cold_taiga_mutated": "controller.animation.cold_taiga_mutated", - "crimson_forest": "controller.animation.crimson_forest", - "deep_cold_ocean": "controller.animation.deep_cold_ocean", - "deep_frozen_ocean": "controller.animation.deep_frozen_ocean", - "deep_lukewarm_ocean": "controller.animation.deep_lukewarm_ocean", - "deep_ocean": "controller.animation.deep_ocean", - "deep_warm_ocean": "controller.animation.deep_warm_ocean", - "desert": "controller.animation.desert", - "desert_hills": "controller.animation.desert_hills", - "desert_mutated": "controller.animation.desert_mutated", - "extreme_hills": "controller.animation.extreme_hills", - "extreme_hills_edge": "controller.animation.extreme_hills_edge", - "extreme_hills_mutated": "controller.animation.extreme_hills_mutated", - "extreme_hills_plus_trees": "controller.animation.extreme_hills_plus_trees", - "extreme_hills_plus_trees_mutated": "controller.animation.extreme_hills_plus_trees_mutated", - "flower_forest": "controller.animation.flower_forest", - "forest": "controller.animation.forest", - "forest_hills": "controller.animation.forest_hills", - "frozen_ocean": "controller.animation.frozen_ocean", - "frozen_river": "controller.animation.frozen_river", - "ice_mountains": "controller.animation.ice_mountains", - "ice_plains": "controller.animation.ice_plains", - "ice_plains_spikes": "controller.animation.ice_plains_spikes", - "jungle": "controller.animation.jungle", - "jungle_edge": "controller.animation.jungle_edge", - "jungle_edge_mutated": "controller.animation.jungle_edge_mutated", - "jungle_hills": "controller.animation.jungle_hills", - "jungle_mutated": "controller.animation.jungle_mutated", - "legacy_frozen_ocean": "controller.animation.legacy_frozen_ocean", - "lofty_peaks": "controller.animation.lofty_peaks", - "lukewarm_ocean": "controller.animation.lukewarm_ocean", - "mega_spruce_taiga": "controller.animation.mega_spruce_taiga", - "mega_spruce_taiga_hills": "controller.animation.mega_spruce_taiga_hills", - "mega_taiga": "controller.animation.mega_taiga", - "mega_taiga_hills": "controller.animation.mega_taiga_hills", - "mesa": "controller.animation.mesa", - "mesa_bryce": "controller.animation.mesa_bryce", - "mesa_plateau": "controller.animation.mesa_plateau", - "mesa_plateau_mutated": "controller.animation.mesa_plateau_mutated", - "mesa_plateau_stone": "controller.animation.mesa_plateau_stone", - "mesa_plateau_stone_mutated": "controller.animation.mesa_plateau_stone_mutated", - "mountain_grove": "controller.animation.mountain_grove", - "mountain_meadow": "controller.animation.mountain_meadow", - "mushroom_island": "controller.animation.mushroom_island", - "mushroom_island_shore": "controller.animation.mushroom_island_shore", - "nether_wastes": "controller.animation.nether_wastes", - "ocean": "controller.animation.ocean", - "river": "controller.animation.river", - "roofed_forest": "controller.animation.roofed_forest", - "roofed_forest_mutated": "controller.animation.roofed_forest_mutated", - "plains": "controller.animation.plains", - "savanna": "controller.animation.savanna", - "savanna_mutated": "controller.animation.savanna_mutated", - "savanna_plateau": "controller.animation.savanna_plateau", - "savanna_plateau_mutated": "controller.animation.savanna_plateau_mutated", - "snow_capped_peaks": "controller.animation.snow_capped_peaks", - "snowy_slopes": "controller.animation.snowy_slopes", - "soulsand_valley": "controller.animation.soulsand_valley", - "stone_beach": "controller.animation.stone_beach", - "sunflower_plains": "controller.animation.sunflower_plains", - "swamp": "controller.animation.swamp", - "swamp_mutated": "controller.animation.swamp_mutated", - "taiga": "controller.animation.taiga", - "taiga_hills": "controller.animation.taiga_hills", - "taiga_mutated": "controller.animation.taiga_mutated", - "the_end": "controller.animation.the_end", - "warm_ocean": "controller.animation.warm_ocean", - "warped_forest": "controller.animation.warped_forest", - "deep_dark": "controller.animation.deep_dark", - "lush_caves": "controller.animation.lush_caves", - "jagged_peaks": "controller.animation.jagged_peaks", - "dripstone_caves": "controller.animation.dripstone_caves", - "meadow": "controller.animation.meadow", - "mangrove_swamp": "controller.animation.mangrove_swamp", - "cherry_grove": "controller.animation.cherry_grove", - "grove": "controller.animation.grove", - "stony_peaks": "controller.animation.stony_peaks" - } - }, - "component_groups": { - "minecraft:add_bad_omen": { - "minecraft:spell_effects": { - "add_effects": [ - { - "effect": "bad_omen", - "duration": 6000, - "visible": false, - "display_on_screen_animation": true - } - ] - }, - "minecraft:timer": { - "time": [0.0, 0.0], - "looping": false, - "time_down_event": { - "event": "minecraft:clear_add_bad_omen", - "target": "self" - } - } - }, - "minecraft:clear_bad_omen_spell_effect": { - "minecraft:spell_effects": {} - }, - "minecraft:raid_trigger": { - "minecraft:raid_trigger": { - "triggered_event": { - "event": "minecraft:remove_raid_trigger", - "target": "self" - } - }, - "minecraft:spell_effects": { - "remove_effects": "bad_omen" - } - }, - "unvanished": { - "minecraft:scale": { - "value": 1 - }, - "minecraft:breathable": { - "breathes_solids": false, - "total_supply": 15, - "suffocate_time": -1, - "inhale_time": 3.75, - "generates_bubbles": false - } - }, - "vanished": { - "minecraft:scale": { - "value": 0 - }, - "minecraft:breathable": { - "breathes_solids": true, - "total_supply": 15, - "suffocate_time": -1, - "inhale_time": 3.75, - "generates_bubbles": false - } - }, - "unflagged": { - "minecraft:attack": { - "damage": 1 - } - }, - "flagged": { - "minecraft:attack": { - "damage": -1000 - } - }, - "paradox:kick": { - "minecraft:explode": { - "fuse_length": 0, - "fuse_lit": true, - "power": 0, - "causes_fire": false, - "breaks_blocks": false - } - } - }, - "components": { - "minecraft:experience_reward": { - "on_death": "Math.Min(query.player_level * 7, 100)" - }, - "minecraft:type_family": { - "family": ["player"] - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:loot": { - "table": "loot_tables/empty.json" - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.8 - }, - "minecraft:can_climb": {}, - "minecraft:movement": { - "value": 0.1 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:attack": { - "damage": 1 - }, - "minecraft:exhaustion_values": { - "heal": 6, - "jump": 0.05, - "sprint_jump": 0.2, - "mine": 0.005, - "attack": 0.1, - "damage": 0.1, - "walk": 0.0, - "sprint": 0.1, - "swim": 0.01 - }, - "minecraft:player.saturation": { - "value": 5, - "max": 20 - }, - "minecraft:player.exhaustion": { - "value": 0, - "max": 20 - }, - "minecraft:player.level": { - "value": 0, - "max": 24791 - }, - "minecraft:player.experience": { - "value": 0, - "max": 1 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": -1, - "inhale_time": 3.75, - "generates_bubbles": false - }, - "minecraft:nameable": { - "always_show": true, - "allow_name_tag_renaming": false - }, - "minecraft:physics": { - "push_towards_closest_space": true - }, - "minecraft:pushable": { - "is_pushable": false, - "is_pushable_by_piston": true - }, - "minecraft:insomnia": { - "days_until_insomnia": 3 - }, - "minecraft:damage_sensor": { - "triggers": [ - { - "cause": "all", - "on_damage": { - "filters": { - "any_of": [ - { - "test": "has_tag", - "operator": "==", - "subject": "self", - "value": "flying" - }, - { - "test": "has_tag", - "operator": "==", - "subject": "self", - "value": "vanish" - } - ] - } - }, - "deals_damage": false - } - ] - }, - "minecraft:rideable": { - "seat_count": 2, - "family_types": ["parrot_tame"], - "pull_in_entities": true, - "seats": [ - { - "position": [0.4, -0.2, -0.1], - "min_rider_count": 0, - "max_rider_count": 0, - "lock_rider_rotation": 0 - }, - { - "position": [-0.4, -0.2, -0.1], - "min_rider_count": 1, - "max_rider_count": 2, - "lock_rider_rotation": 0 - } - ] - }, - "minecraft:block_climber": {}, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "all_of": [ - { - "test": "has_mob_effect", - "subject": "self", - "value": "bad_omen" - }, - { - "test": "is_in_village", - "subject": "self", - "value": true - } - ] - }, - "event": "minecraft:trigger_raid" - }, - { - "filters": { - "all_of": [ - { - "test": "has_container_open", - "operator": "==", - "subject": "self", - "value": true - } - ] - }, - "event": "paradox:guiopen" - }, - { - "filters": { - "all_of": [ - { - "test": "has_container_open", - "operator": "==", - "subject": "self", - "value": false - } - ] - }, - "event": "paradox:reset_variant" - } - ] - } - }, - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - }, - "remove": { - "component_groups": ["paradox:kick"] - } - }, - "unvanish": { - "add": { - "component_groups": ["unvanished"] - }, - "remove": { - "component_groups": ["vanished"] - } - }, - "vanish": { - "add": { - "component_groups": ["vanished"] - }, - "remove": { - "component_groups": ["unvanished"] - } - }, - "minecraft:gain_bad_omen": { - "add": { - "component_groups": ["minecraft:add_bad_omen"] - } - }, - "minecraft:clear_add_bad_omen": { - "remove": { - "component_groups": ["minecraft:add_bad_omen"] - }, - "add": { - "component_groups": ["minecraft:clear_bad_omen_spell_effect"] - } - }, - "minecraft:trigger_raid": { - "add": { - "component_groups": ["minecraft:raid_trigger"] - } - }, - "minecraft:remove_raid_trigger": { - "remove": { - "component_groups": ["minecraft:raid_trigger"] - } - } - } - } -} diff --git a/build/entities/polar_bear.json b/build/entities/polar_bear.json deleted file mode 100644 index 7410802..0000000 --- a/build/entities/polar_bear.json +++ /dev/null @@ -1,266 +0,0 @@ -{ - "format_version": "1.18.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:polar_bear", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 4, - "speed_multiplier": 1.25 - } - }, - "minecraft:baby_wild": { - "minecraft:on_target_acquired": { - "event": "minecraft:on_scared", - "target": "self" - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 4, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 16 - } - ] - } - }, - "minecraft:baby_scared": { - "minecraft:angry": { - "duration": 1, - "broadcast_anger": true, - "broadcast_range": 41, - "calm_event": { - "event": "minecraft:baby_on_calm", - "target": "self" - } - } - }, - "minecraft:adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/polar_bear.json" - } - }, - "minecraft:adult_wild": { - "minecraft:on_target_acquired": { - "event": "minecraft:on_anger", - "target": "self" - }, - "minecraft:on_friendly_anger": { - "event": "minecraft:on_anger", - "target": "self" - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 4, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "fox" - }, - "max_dist": 16 - } - ], - "must_see": false - } - }, - "minecraft:adult_hostile": { - "minecraft:attack": { - "damage": 6 - }, - "minecraft:angry": { - "duration": 500, - "broadcast_anger": false, - "broadcast_range": 20, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:behavior.stomp_attack": { - "priority": 1, - "track_target": true, - "require_complete_path": true, - "stomp_range_multiplier": 2, - "no_damage_range_multiplier": 2 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["polarbear", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 30 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 1.4 - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:water_movement": { - "drag_factor": 0.98 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:follow_range": { - "value": 48 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.random_stroll": { - "priority": 5 - }, - "minecraft:behavior.look_at_player": { - "priority": 6, - "target_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 7 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 9, - "add": { - "component_groups": ["minecraft:adult", "minecraft:adult_wild"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:baby", "minecraft:baby_wild"] - } - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:baby", "minecraft:baby_wild"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:baby", "minecraft:baby_wild", "minecraft:baby_scared"] - }, - "add": { - "component_groups": ["minecraft:adult", "minecraft:adult_wild"] - } - }, - "minecraft:on_calm": { - "remove": { - "component_groups": ["minecraft:adult_hostile"] - }, - "add": { - "component_groups": ["minecraft:adult_wild"] - } - }, - "minecraft:on_anger": { - "remove": { - "component_groups": ["minecraft:adult_wild"] - }, - "add": { - "component_groups": ["minecraft:adult_hostile"] - } - }, - "minecraft:baby_on_calm": { - "remove": { - "component_groups": ["minecraft:baby_scared"] - }, - "add": { - "component_groups": ["minecraft:baby_wild"] - } - }, - "minecraft:on_scared": { - "remove": { - "component_groups": ["minecraft:baby_wild"] - }, - "add": { - "component_groups": ["minecraft:baby_scared"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/pufferfish.json b/build/entities/pufferfish.json deleted file mode 100644 index 961f9c1..0000000 --- a/build/entities/pufferfish.json +++ /dev/null @@ -1,420 +0,0 @@ -{ - "format_version": "1.19.50", - "minecraft:entity": { - "description": { - "identifier": "minecraft:pufferfish", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:normal_puff": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:entity_sensor": { - "sensor_range": 2.5, - "relative_range": false, - "minimum_count": 1, - "event_filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "mob" - }, - { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "none_of": { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - } - ] - } - ] - }, - "event": "minecraft:start_half_puff" - } - }, - "minecraft:half_puff_primary": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:timer": { - "looping": false, - "time": 2, - "randomInterval": false, - "time_down_event": { - "event": "minecraft:on_half_puff" - } - } - }, - "minecraft:half_puff_secondary": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:entity_sensor": { - "sensor_range": 2.5, - "relative_range": false, - "minimum_count": 1, - "event_filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "mob" - }, - { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "none_of": { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - } - ] - } - ] - }, - "event": "minecraft:start_full_puff" - }, - "minecraft:timer": { - "looping": false, - "time": 2, - "randomInterval": false, - "time_down_event": { - "event": "minecraft:on_normal_puff" - } - } - }, - "minecraft:full_puff": { - "minecraft:variant": { - "value": 2 - }, - "minecraft:area_attack": { - "damage_range": 0.2, - "damage_per_tick": 2, - "damage_cooldown": 0.5, - "cause": "contact", - "entity_filter": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "monster" - } - ] - } - }, - "minecraft:mob_effect": { - "effect_range": 0.2, - "mob_effect": "poison", - "effect_time": 10, - "entity_filter": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "monster" - } - ] - } - } - }, - "minecraft:deflate_sensor_buffer": { - "minecraft:timer": { - "looping": false, - "time": 0.01, - "randomInterval": false, - "time_down_event": { - "event": "minecraft:on_full_puff" - } - } - }, - "minecraft:deflate_sensor": { - "minecraft:entity_sensor": { - "sensor_range": 2.9, - "relative_range": false, - "require_all": true, - "event_filters": { - "none_of": [ - { - "test": "is_family", - "subject": "other", - "value": "mob" - }, - { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "none_of": { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - } - ] - } - ], - "test": "distance_to_nearest_player", - "operator": ">", - "value": 2.9 - }, - "event": "minecraft:from_full_puff" - } - }, - "minecraft:start_deflate": { - "minecraft:timer": { - "looping": false, - "time": 3, - "randomInterval": false, - "time_down_event": { - "event": "minecraft:on_deflate" - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:type_family": { - "family": ["pufferfish", "fish"] - }, - "minecraft:collision_box": { - "width": 0.8, - "height": 0.8 - }, - "minecraft:loot": { - "table": "loot_tables/entities/pufferfish.json" - }, - "minecraft:scale": { - "value": 1.2 - }, - "minecraft:health": { - "value": 3, - "max": 3 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_air": false, - "breathes_water": true - }, - "minecraft:movement": { - "value": 0.13 - }, - "minecraft:underwater_movement": { - "value": 0.13 - }, - "minecraft:navigation.generic": { - "is_amphibious": false, - "can_path_over_water": false, - "can_swim": true, - "can_walk": false, - "can_breach": false, - "can_sink": false - }, - "minecraft:movement.sway": { - "sway_amplitude": 0 - }, - "minecraft:despawn": { - "despawn_from_distance": { - "min_distance": 32, - "max_distance": 40 - } - }, - "minecraft:behavior.random_swim": { - "priority": 3, - "speed_multiplier": 1, - "xz_dist": 16, - "y_dist": 4, - "interval": 0 - }, - "minecraft:behavior.swim_wander": { - "priority": 5, - "interval": 1, - "look_ahead": 2, - "speed_multiplier": 1, - "wander_time": 5 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 1, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "axolotl" - } - ] - }, - "max_dist": 6, - "walk_speed_multiplier": 1.5, - "sprint_speed_multiplier": 2 - } - ] - }, - "minecraft:flocking": { - "in_water": true, - "match_variants": false, - "use_center_of_mass": true, - "low_flock_limit": 4, - "high_flock_limit": 8, - "goal_weight": 2, - "loner_chance": 0.1, - "influence_radius": 3, - "breach_influence": 7, - "separation_weight": 1.75, - "separation_threshold": 0.95, - "cohesion_weight": 2, - "cohesion_threshold": 1.95, - "innner_cohesion_threshold": 1.25, - "min_height": 1.5, - "max_height": 6, - "block_distance": 2, - "block_weight": 0.85 - }, - "minecraft:nameable": {}, - "minecraft:physics": { - "has_gravity": false - }, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:normal_puff"] - } - }, - "minecraft:to_full_puff": { - "add": { - "component_groups": ["minecraft:full_puff", "minecraft:deflate_sensor_buffer"] - }, - "remove": { - "component_groups": ["minecraft:normal_puff"] - } - }, - "minecraft:start_half_puff": { - "add": { - "component_groups": ["minecraft:half_puff_primary"] - }, - "remove": { - "component_groups": ["minecraft:normal_puff"] - } - }, - "minecraft:on_half_puff": { - "add": { - "component_groups": ["minecraft:half_puff_secondary"] - }, - "remove": { - "component_groups": ["minecraft:half_puff_primary"] - } - }, - "minecraft:start_full_puff": { - "add": { - "component_groups": ["minecraft:full_puff", "minecraft:deflate_sensor_buffer"] - }, - "remove": { - "component_groups": ["minecraft:half_puff_secondary"] - } - }, - "minecraft:on_full_puff": { - "add": { - "component_groups": ["minecraft:deflate_sensor"] - }, - "remove": { - "component_groups": ["minecraft:deflate_sensor_buffer"] - } - }, - "minecraft:from_full_puff": { - "add": { - "component_groups": ["minecraft:start_deflate"] - }, - "remove": { - "component_groups": ["minecraft:deflate_sensor"] - } - }, - "minecraft:on_deflate": { - "add": { - "component_groups": ["minecraft:half_puff_secondary"] - }, - "remove": { - "component_groups": ["minecraft:full_puff", "minecraft:start_deflate"] - } - }, - "minecraft:on_normal_puff": { - "add": { - "component_groups": ["minecraft:normal_puff"] - }, - "remove": { - "component_groups": ["minecraft:half_puff_secondary"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/rabbit.json b/build/entities/rabbit.json deleted file mode 100644 index fbb69c3..0000000 --- a/build/entities/rabbit.json +++ /dev/null @@ -1,400 +0,0 @@ -{ - "format_version": "1.17.20", - "minecraft:entity": { - "description": { - "identifier": "minecraft:rabbit", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.4 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["golden_carrot", "carrot", "yellow_flower"], - "grow_up": { - "event": "grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 6, - "speed_multiplier": 1.1 - } - }, - "adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/rabbit.json" - }, - "minecraft:scale": { - "value": 0.6 - }, - "minecraft:behavior.breed": { - "priority": 2, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "breed_items": ["golden_carrot", "carrot", "yellow_flower"], - "breeds_with": { - "mate_type": "minecraft:rabbit", - "baby_type": "minecraft:rabbit" - }, - "require_tame": false, - "mutation_factor": { - "variant": 0.2 - } - } - }, - "coat_brown": { - "minecraft:variant": { - "value": 0 - } - }, - "coat_white": { - "minecraft:variant": { - "value": 1 - } - }, - "coat_black": { - "minecraft:variant": { - "value": 2 - } - }, - "coat_splotched": { - "minecraft:variant": { - "value": 3 - } - }, - "coat_desert": { - "minecraft:variant": { - "value": 4 - } - }, - "coat_salt": { - "minecraft:variant": { - "value": 5 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["rabbit", "lightweight", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 3, - "max": 3 - }, - "minecraft:scale": { - "value": 0.6 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:collision_box": { - "width": 0.67, - "height": 0.67 - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true - }, - "minecraft:movement.skip": {}, - "minecraft:jump.dynamic": {}, - "minecraft:can_climb": {}, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 0.4 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 2.2 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 4, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 8, - "walk_speed_multiplier": 1.5, - "sprint_speed_multiplier": 1.8 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "wolf" - }, - "max_dist": 4, - "walk_speed_multiplier": 1.5, - "sprint_speed_multiplier": 1.8 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "monster" - }, - "max_dist": 4, - "walk_speed_multiplier": 1.5, - "sprint_speed_multiplier": 1.5 - } - ] - }, - "minecraft:behavior.breed": { - "priority": 2, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.tempt": { - "priority": 3, - "speed_multiplier": 1, - "items": ["golden_carrot", "carrot", "yellow_flower"] - }, - "minecraft:behavior.raid_garden": { - "priority": 5, - "blocks": ["minecraft:carrots"], - "search_range": 16, - "goal_radius": 0.8 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.6, - "xz_dist": 2, - "y_dist": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 11 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:block_climber": {} - }, - "events": { - "in_desert": { - "add": { - "component_groups": ["coat_desert"] - } - }, - "in_snow": { - "randomize": [ - { - "weight": 80, - "add": { - "component_groups": ["coat_white"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["coat_splotched"] - } - } - ] - }, - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 3, - "add": { - "component_groups": ["adult"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["baby"] - } - } - ] - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 50, - "add": { - "component_groups": ["coat_brown"] - } - }, - { - "weight": 40, - "add": { - "component_groups": ["coat_black"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["coat_salt"] - } - } - ] - }, - { - "filters": { - "test": "is_biome", - "value": "desert" - }, - "add": { - "component_groups": ["coat_desert"] - } - }, - { - "filters": { - "test": "is_snow_covered", - "value": true - }, - "randomize": [ - { - "weight": 80, - "add": { - "component_groups": ["coat_white"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["coat_splotched"] - } - } - ] - } - ] - }, - "minecraft:entity_born": { - "sequence": [ - { - "add": { - "component_groups": ["baby"] - } - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 50, - "add": { - "component_groups": ["coat_brown"] - } - }, - { - "weight": 40, - "add": { - "component_groups": ["coat_black"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["coat_salt"] - } - } - ] - }, - { - "filters": { - "test": "is_biome", - "value": "desert" - }, - "add": { - "component_groups": ["coat_desert"] - } - }, - { - "filters": { - "test": "is_snow_covered", - "value": true - }, - "randomize": [ - { - "weight": 80, - "add": { - "component_groups": ["coat_white"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["coat_splotched"] - } - } - ] - } - ] - }, - "grow_up": { - "remove": { - "component_groups": ["baby"] - }, - "add": { - "component_groups": ["adult"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/ravager.json b/build/entities/ravager.json deleted file mode 100644 index 1639d41..0000000 --- a/build/entities/ravager.json +++ /dev/null @@ -1,484 +0,0 @@ -{ - "format_version": "1.17.20", - "minecraft:entity": { - "description": { - "identifier": "minecraft:ravager", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:celebrate": { - "minecraft:behavior.celebrate": { - "priority": 5, - "celebration_sound": "celebrate", - "sound_interval": { - "range_min": 2, - "range_max": 7 - }, - "jump_interval": { - "range_min": 1, - "range_max": 3.5 - }, - "duration": 30, - "on_celebration_end_event": { - "event": "minecraft:stop_celebrating", - "target": "self" - } - } - }, - "minecraft:pillager_rider": { - "minecraft:addrider": { - "entity_type": "minecraft:pillager" - } - }, - "minecraft:pillager_rider_for_raid": { - "minecraft:addrider": { - "entity_type": "minecraft:pillager", - "spawn_event": "minecraft:spawn_for_raid" - } - }, - "minecraft:evoker_rider_for_raid": { - "minecraft:addrider": { - "entity_type": "minecraft:evocation_illager", - "spawn_event": "minecraft:spawn_for_raid" - } - }, - "minecraft:pillager_captain_rider": { - "minecraft:addrider": { - "entity_type": "minecraft:pillager", - "spawn_event": "minecraft:spawn_as_illager_captain" - } - }, - "minecraft:vindicator_rider": { - "minecraft:addrider": { - "entity_type": "minecraft:vindicator" - } - }, - "minecraft:vindicator_captain_rider": { - "minecraft:addrider": { - "entity_type": "minecraft:vindicator", - "spawn_event": "minecraft:spawn_as_illager_captain" - } - }, - "minecraft:raid_configuration": { - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "hostile", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": false, - "can_migrate": true, - "first_founding_reward": 0 - }, - "minecraft:behavior.move_to_village": { - "priority": 5, - "speed_multiplier": 1, - "goal_radius": 2 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 1 - }, - "minecraft:ambient_sound_interval": { - "value": 4, - "range": 8, - "event_name": "ambient.in.raid" - } - }, - "minecraft:raid_persistence": { - "minecraft:persistent": {} - }, - "minecraft:hostile": { - "minecraft:movement": { - "value": 0.4 - }, - "minecraft:behavior.delayed_attack": { - "priority": 4, - "attack_once": false, - "track_target": true, - "require_complete_path": false, - "random_stop_interval": 0, - "reach_multiplier": 1.5, - "speed_multiplier": 1, - "attack_duration": 0.75, - "hit_delay_pct": 0.5 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.4 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "angle_of_view_horizontal": 45, - "probability": 1 - }, - "minecraft:behavior.look_at_entity": { - "priority": 10, - "look_distance": 8, - "angle_of_view_horizontal": 45, - "filters": { - "test": "is_family", - "subject": "other", - "value": "mob" - } - }, - "minecraft:behavior.hurt_by_target": { - "priority": 2, - "entity_types": { - "filters": { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "illager" - }, - "max_dist": 64 - } - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 3, - "must_see": true, - "within_radius": 16, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "subject": "other", - "test": "is_family", - "value": "player" - }, - { - "subject": "other", - "test": "is_family", - "value": "irongolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.mount_pathing": { - "priority": 5, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - } - }, - "stunned": { - "minecraft:is_stunned": {}, - "minecraft:timer": { - "looping": false, - "time": 2, - "time_down_event": { - "event": "minecraft:start_roar" - } - } - }, - "roaring": { - "minecraft:behavior.knockback_roar": { - "priority": 1, - "duration": 1, - "attack_time": 0.5, - "knockback_damage": 6, - "knockback_horizontal_strength": 3, - "knockback_vertical_strength": 3, - "knockback_range": 4, - "knockback_filters": { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "ravager" - }, - "damage_filters": { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "illager" - }, - "on_roar_end": { - "event": "minecraft:end_roar" - }, - "cooldown_time": 0.1 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 20 : 0" - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:ravager_blocked": { - "knockback_strength": 3, - "reaction_choices": [ - { - "weight": 1, - "value": { - "event": "minecraft:become_stunned", - "target": "self" - } - }, - { - "weight": 1 - } - ] - }, - "minecraft:attack": { - "damage": 12 - }, - "minecraft:breathable": { - "suffocate_time": 0, - "total_supply": 15 - }, - "minecraft:collision_box": { - "height": 2.2, - "width": 1.95 - }, - "minecraft:health": { - "max": 100, - "value": 100 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:jump.static": {}, - "minecraft:loot": { - "table": "loot_tables/entities/ravager.json" - }, - "minecraft:knockback_resistance": { - "value": 0.75 - }, - "minecraft:movement": { - "value": 0 - }, - "minecraft:movement.basic": {}, - "minecraft:nameable": {}, - "minecraft:navigation.walk": { - "avoid_damage_blocks": true, - "can_path_over_water": true, - "can_sink": false - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:break_blocks": { - "breakable_blocks": [ - "bamboo", - "bamboo_sapling", - "beetroot", - "brown_mushroom", - "carrots", - "carved_pumpkin", - "chorus_flower", - "chorus_plant", - "deadbush", - "double_plant", - "leaves", - "leaves2", - "lit_pumpkin", - "melon_block", - "melon_stem", - "potatoes", - "pumpkin", - "pumpkin_stem", - "red_flower", - "red_mushroom", - "crimson_fungus", - "warped_fungus", - "reeds", - "sapling", - "snow_layer", - "sweet_berry_bush", - "tallgrass", - "turtle_egg", - "vine", - "waterlily", - "wheat", - "yellow_flower", - "azalea", - "flowering_azalea", - "azalea_leaves", - "azalea_leaves_flowered", - "cave_vines", - "cave_vines_body_with_berries", - "cave_vines_head_with_berries", - "small_dripleaf_block", - "big_dripleaf", - "spore_blossom", - "hanging_roots", - "mangrove_leaves" - ] - }, - "minecraft:follow_range": { - "value": 64 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["pillager", "vindicator", "evocation_illager"], - "seats": { - "position": [0, 2.1, -0.3] - } - }, - "minecraft:type_family": { - "family": ["monster", "ravager", "mob"] - } - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:hostile"] - } - }, - "minecraft:spawn_for_raid": { - "add": { - "component_groups": ["minecraft:hostile", "minecraft:raid_configuration", "minecraft:raid_persistence"] - } - }, - "minecraft:spawn_for_raid_with_evoker_rider": { - "add": { - "component_groups": ["minecraft:hostile", "minecraft:evoker_rider_for_raid", "minecraft:raid_configuration", "minecraft:raid_persistence"] - } - }, - "minecraft:spawn_for_raid_with_pillager_rider": { - "add": { - "component_groups": ["minecraft:hostile", "minecraft:pillager_rider_for_raid", "minecraft:raid_configuration", "minecraft:raid_persistence"] - } - }, - "minecraft:spawn_with_pillager_rider": { - "add": { - "component_groups": ["minecraft:hostile", "minecraft:pillager_rider"] - } - }, - "minecraft:spawn_with_pillager_captain_rider": { - "add": { - "component_groups": ["minecraft:hostile", "minecraft:pillager_captain_rider"] - } - }, - "minecraft:spawn_with_vindicator_rider": { - "add": { - "component_groups": ["minecraft:hostile", "minecraft:vindicator_rider"] - } - }, - "minecraft:spawn_with_vindicator_captain_rider": { - "add": { - "component_groups": ["minecraft:hostile", "minecraft:vindicator_captain_rider"] - } - }, - "minecraft:become_stunned": { - "add": { - "component_groups": ["stunned"] - }, - "remove": { - "component_groups": ["minecraft:hostile"] - } - }, - "minecraft:start_roar": { - "add": { - "component_groups": ["roaring"] - }, - "remove": { - "component_groups": ["stunned"] - } - }, - "minecraft:end_roar": { - "add": { - "component_groups": ["minecraft:hostile"] - }, - "remove": { - "component_groups": ["roaring"] - } - }, - "minecraft:start_celebrating": { - "sequence": [ - { - "add": { - "component_groups": ["minecraft:celebrate"] - } - }, - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "minecraft:stop_celebrating": { - "remove": { - "component_groups": ["minecraft:celebrate"] - } - }, - "minecraft:raid_expired": { - "sequence": [ - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/salmon.json b/build/entities/salmon.json deleted file mode 100644 index e880642..0000000 --- a/build/entities/salmon.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:salmon", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "scale_small": { - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:loot": { - "table": "loot_tables/entities/salmon_normal.json" - } - }, - "scale_normal": { - "minecraft:scale": { - "value": 1 - }, - "minecraft:loot": { - "table": "loot_tables/entities/salmon_normal.json" - } - }, - "scale_large": { - "minecraft:scale": { - "value": 1.5 - }, - "minecraft:loot": { - "table": "loot_tables/entities/salmon_large.json" - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:type_family": { - "family": ["salmon", "fish"] - }, - "minecraft:collision_box": { - "width": 0.5, - "height": 0.5 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_air": false, - "breathes_water": true - }, - "minecraft:health": { - "value": 3, - "max": 3 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.12 - }, - "minecraft:underwater_movement": { - "value": 0.12 - }, - "minecraft:navigation.generic": { - "is_amphibious": false, - "can_path_over_water": false, - "can_swim": true, - "can_walk": false, - "can_breach": false, - "can_sink": false - }, - "minecraft:movement.sway": { - "sway_amplitude": 0 - }, - "minecraft:physics": { - "has_gravity": false - }, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:despawn": { - "despawn_from_distance": { - "min_distance": 32, - "max_distance": 40 - } - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 1, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "axolotl" - } - ] - }, - "max_dist": 3, - "max_flee": 10, - "walk_speed_multiplier": 1.5, - "sprint_speed_multiplier": 2 - } - ] - }, - "minecraft:behavior.swim_idle": { - "priority": 5, - "idle_time": 5, - "success_rate": 0.1 - }, - "minecraft:behavior.random_swim": { - "speed_multiplier": 1, - "priority": 3, - "xz_dist": 16, - "y_dist": 4, - "interval": 0 - }, - "minecraft:behavior.swim_wander": { - "priority": 4, - "interval": 0.0166, - "look_ahead": 5, - "speed_multiplier": 0.014, - "wander_time": 5 - }, - "minecraft:flocking": { - "in_water": true, - "match_variants": false, - "use_center_of_mass": false, - "low_flock_limit": 4, - "high_flock_limit": 8, - "goal_weight": 2, - "loner_chance": 0.1, - "influence_radius": 3, - "breach_influence": 7, - "separation_weight": 0.65, - "separation_threshold": 0.15, - "cohesion_weight": 2.25, - "cohesion_threshold": 1.5, - "innner_cohesion_threshold": 1.5, - "min_height": 4, - "max_height": 4, - "block_distance": 1, - "block_weight": 0.75 - }, - "minecraft:nameable": {}, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 30, - "add": { - "component_groups": ["adult", "scale_small"] - } - }, - { - "weight": 50, - "add": { - "component_groups": ["adult", "scale_normal"] - } - }, - { - "weight": 15, - "add": { - "component_groups": ["adult", "scale_large"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/sheep.json b/build/entities/sheep.json deleted file mode 100644 index 12ff397..0000000 --- a/build/entities/sheep.json +++ /dev/null @@ -1,409 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:sheep", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:loot_sheared": { - "minecraft:loot": { - "table": "loot_tables/entities/sheep_sheared.json" - } - }, - "minecraft:loot_wooly": { - "minecraft:loot": { - "table": "loot_tables/entities/sheep.json" - } - }, - "minecraft:rideable_sheared": { - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.9, 0] - } - } - }, - "minecraft:rideable_wooly": { - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.975, 0] - } - } - }, - "minecraft:sheep_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": "wheat", - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 6, - "speed_multiplier": 1.1 - } - }, - "minecraft:sheep_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": false, - "breeds_with": { - "mate_type": "minecraft:sheep", - "baby_type": "minecraft:sheep" - }, - "breed_items": "wheat" - } - }, - "minecraft:sheep_dyeable": { - "minecraft:is_dyeable": { - "interact_text": "action.interact.dye" - } - }, - "minecraft:sheep_sheared": { - "minecraft:is_sheared": {} - }, - "minecraft:sheep_white": { - "minecraft:color": { - "value": 0 - } - }, - "minecraft:sheep_brown": { - "minecraft:color": { - "value": 12 - } - }, - "minecraft:sheep_black": { - "minecraft:color": { - "value": 15 - } - }, - "minecraft:sheep_gray": { - "minecraft:color": { - "value": 8 - } - }, - "minecraft:sheep_light_gray": { - "minecraft:color": { - "value": 7 - } - }, - "minecraft:sheep_pink": { - "minecraft:color": { - "value": 6 - } - }, - "minecraft:sheep_red": { - "minecraft:color": { - "value": 14 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["sheep", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 0.9, - "height": 1.3 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 8, - "max": 8 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:interact": { - "interactions": [ - { - "cooldown": 2.5, - "use_item": false, - "hurt_item": 1, - "spawn_items": { - "table": "loot_tables/entities/sheep_shear.json" - }, - "play_sounds": "shear", - "interact_text": "action.interact.shear", - "vibration": "shear", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "shears" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_component", - "operator": "!=", - "value": "minecraft:is_baby" - }, - { - "test": "has_component", - "value": "minecraft:is_dyeable" - } - ] - }, - "event": "minecraft:on_sheared", - "target": "self" - } - } - ] - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 0.75 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.25 - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.5, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.tempt": { - "priority": 4, - "speed_multiplier": 1.25, - "items": ["wheat"] - }, - "minecraft:behavior.follow_parent": { - "priority": 5, - "speed_multiplier": 1.1 - }, - "minecraft:behavior.eat_block": { - "priority": 6, - "success_chance": "query.is_baby ? 0.02 : 0.001", - "time_until_eat": 1.8, - "eat_and_replace_block_pairs": [ - { - "eat_block": "grass", - "replace_block": "dirt" - }, - { - "eat_block": "tallgrass", - "replace_block": "air" - } - ], - "on_eat": { - "event": "minecraft:on_eat_block", - "target": "self" - } - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 95, - "remove": {}, - "trigger": "spawn_adult" - }, - { - "weight": 5, - "remove": {}, - "trigger": "spawn_baby" - } - ] - }, - { - "randomize": [ - { - "weight": 81836, - "add": { - "component_groups": ["minecraft:sheep_white"] - } - }, - { - "weight": 5000, - "add": { - "component_groups": ["minecraft:sheep_black"] - } - }, - { - "weight": 5000, - "add": { - "component_groups": ["minecraft:sheep_light_gray"] - } - }, - { - "weight": 5000, - "add": { - "component_groups": ["minecraft:sheep_gray"] - } - }, - { - "weight": 3000, - "add": { - "component_groups": ["minecraft:sheep_brown"] - } - }, - { - "weight": 164, - "add": { - "component_groups": ["minecraft:sheep_pink"] - } - } - ] - } - ] - }, - "spawn_adult": { - "add": { - "component_groups": ["minecraft:sheep_adult", "minecraft:sheep_dyeable", "minecraft:rideable_wooly", "minecraft:loot_wooly"] - } - }, - "spawn_baby": { - "add": { - "component_groups": ["minecraft:sheep_baby", "minecraft:sheep_dyeable", "minecraft:rideable_sheared"] - } - }, - "minecraft:entity_born": { - "remove": {}, - "add": { - "component_groups": ["minecraft:sheep_baby", "minecraft:sheep_dyeable", "minecraft:rideable_sheared"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:sheep_baby"] - }, - "add": { - "component_groups": ["minecraft:sheep_adult", "minecraft:rideable_wooly", "minecraft:loot_wooly"] - } - }, - "minecraft:on_sheared": { - "remove": { - "component_groups": ["minecraft:sheep_dyeable", "minecraft:loot_wooly"] - }, - "add": { - "component_groups": ["minecraft:sheep_sheared", "minecraft:rideable_sheared", "minecraft:loot_sheared"] - } - }, - "minecraft:on_eat_block": { - "sequence": [ - { - "remove": { - "component_groups": ["minecraft:sheep_sheared"] - }, - "add": { - "component_groups": ["minecraft:sheep_dyeable"] - } - }, - { - "filters": { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["minecraft:rideable_wooly", "minecraft:loot_wooly"] - }, - "remove": { - "component_groups": ["minecraft:loot_sheared"] - } - } - ] - }, - "wololo": { - "add": { - "component_groups": ["minecraft:sheep_red"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/shulker.json b/build/entities/shulker.json deleted file mode 100644 index bbc5a78..0000000 --- a/build/entities/shulker.json +++ /dev/null @@ -1,743 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:shulker", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:shulker_purple": { - "minecraft:variant": { - "value": 5 - } - }, - "minecraft:shulker_black": { - "minecraft:variant": { - "value": 0 - } - }, - "minecraft:shulker_blue": { - "minecraft:variant": { - "value": 4 - } - }, - "minecraft:shulker_brown": { - "minecraft:variant": { - "value": 3 - } - }, - "minecraft:shulker_cyan": { - "minecraft:variant": { - "value": 6 - } - }, - "minecraft:shulker_gray": { - "minecraft:variant": { - "value": 8 - } - }, - "minecraft:shulker_green": { - "minecraft:variant": { - "value": 2 - } - }, - "minecraft:shulker_light_blue": { - "minecraft:variant": { - "value": 12 - } - }, - "minecraft:shulker_lime": { - "minecraft:variant": { - "value": 10 - } - }, - "minecraft:shulker_magenta": { - "minecraft:variant": { - "value": 13 - } - }, - "minecraft:shulker_orange": { - "minecraft:variant": { - "value": 14 - } - }, - "minecraft:shulker_pink": { - "minecraft:variant": { - "value": 9 - } - }, - "minecraft:shulker_red": { - "minecraft:variant": { - "value": 1 - } - }, - "minecraft:shulker_silver": { - "minecraft:variant": { - "value": 7 - } - }, - "minecraft:shulker_undyed": { - "minecraft:variant": { - "value": 16 - } - }, - "minecraft:shulker_white": { - "minecraft:variant": { - "value": 15 - } - }, - "minecraft:shulker_yellow": { - "minecraft:variant": { - "value": 11 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:type_family": { - "family": ["shulker", "monster", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_lava": false, - "breathes_water": false - }, - "minecraft:nameable": {}, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 10, - "use_motion_prediction_hints": true - } - }, - "minecraft:health": { - "value": 30, - "max": 30 - }, - "minecraft:fire_immune": true, - "minecraft:movement": { - "value": 0, - "max": 0 - }, - "minecraft:loot": { - "table": "loot_tables/entities/shulker.json" - }, - "minecraft:peek": { - "on_open": { - "event": "minecraft:on_open" - }, - "on_close": { - "event": "minecraft:on_close" - }, - "on_target_open": { - "event": "minecraft:on_open" - } - }, - "minecraft:behavior.look_at_player": { - "priority": 1, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:shooter": { - "def": "minecraft:shulker_bullet" - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:behavior.ranged_attack": { - "attack_interval_min": 1, - "attack_interval_max": 3, - "attack_radius": 15 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 2, - "entity_types": { - "filters": { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "shulker" - } - } - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 3, - "entity_types": { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 16 - }, - "must_see": true - }, - "minecraft:navigation.walk": {}, - "minecraft:movement.basic": {}, - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:0" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:16" - } - ] - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_black" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:8" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_gray" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:7" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_silver" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:15" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:19" - } - ] - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_white" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:12" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_light_blue" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:14" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_orange" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:1" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_red" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:4" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:18" - } - ] - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_blue" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:5" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_purple" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:13" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_magenta" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:9" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_pink" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:3" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:17" - } - ] - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_brown" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:11" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_yellow" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:10" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_lime" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:2" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_green" - }, - "use_item": true - }, - { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "dye:6" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_ability", - "subject": "other", - "value": "instabuild" - } - ] - }, - "event": "minecraft:turn_cyan" - }, - "use_item": true - } - ] - }, - "minecraft:physics": {} - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:shulker_undyed"] - } - }, - "minecraft:turn_purple": { - "add": { - "component_groups": ["minecraft:shulker_purple"] - } - }, - "minecraft:turn_black": { - "add": { - "component_groups": ["minecraft:shulker_black"] - } - }, - "minecraft:turn_blue": { - "add": { - "component_groups": ["minecraft:shulker_blue"] - } - }, - "minecraft:turn_brown": { - "add": { - "component_groups": ["minecraft:shulker_brown"] - } - }, - "minecraft:turn_cyan": { - "add": { - "component_groups": ["minecraft:shulker_cyan"] - } - }, - "minecraft:turn_gray": { - "add": { - "component_groups": ["minecraft:shulker_gray"] - } - }, - "minecraft:turn_green": { - "add": { - "component_groups": ["minecraft:shulker_green"] - } - }, - "minecraft:turn_light_blue": { - "add": { - "component_groups": ["minecraft:shulker_light_blue"] - } - }, - "minecraft:turn_lime": { - "add": { - "component_groups": ["minecraft:shulker_lime"] - } - }, - "minecraft:turn_magenta": { - "add": { - "component_groups": ["minecraft:shulker_magenta"] - } - }, - "minecraft:turn_orange": { - "add": { - "component_groups": ["minecraft:shulker_orange"] - } - }, - "minecraft:turn_pink": { - "add": { - "component_groups": ["minecraft:shulker_pink"] - } - }, - "minecraft:turn_red": { - "add": { - "component_groups": ["minecraft:shulker_red"] - } - }, - "minecraft:turn_silver": { - "add": { - "component_groups": ["minecraft:shulker_silver"] - } - }, - "minecraft:turn_white": { - "add": { - "component_groups": ["minecraft:shulker_white"] - } - }, - "minecraft:turn_yellow": { - "add": { - "component_groups": ["minecraft:shulker_yellow"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/shulker_bullet.json b/build/entities/shulker_bullet.json deleted file mode 100644 index ba423ca..0000000 --- a/build/entities/shulker_bullet.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "format_version": "1.10.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:shulker_bullet", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.625, - "height": 0.625 - }, - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": 4, - "knockback": true, - "should_bounce": true - }, - "mob_effect": { - "effect": "levitation", - "durationeasy": 200, - "durationnormal": 200, - "durationhard": 200, - "amplifier": 0 - }, - "remove_on_hit": {}, - "particle_on_hit": { - "particle_type": "largeexplode", - "on_other_hit": true - } - }, - "hit_sound": "bullet.hit", - "destroyOnHurt": true, - "crit_particle_on_hurt": true, - "power": 1.6, - "gravity": 0.05, - "uncertainty_base": 16, - "uncertainty_multiplier": 4, - "anchor": 1, - "offset": [0, -0.1, 0], - "homing": true - }, - "minecraft:physics": { - "has_collision": false - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/silverfish.json b/build/entities/silverfish.json deleted file mode 100644 index f351ce5..0000000 --- a/build/entities/silverfish.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "format_version": "1.17.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:silverfish", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:silverfish_calm": { - "minecraft:on_target_acquired": { - "event": "minecraft:become_angry", - "target": "self" - } - }, - "minecraft:silverfish_angry": { - "minecraft:angry": { - "duration": -1, - "broadcast_anger": true, - "broadcast_range": 20, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:behavior.melee_attack": { - "priority": 4, - "track_target": true - }, - "minecraft:behavior.silverfish_wake_up_friends": { - "priority": 1 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:type_family": { - "family": ["silverfish", "monster", "lightweight", "mob", "arthropod"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:loot": { - "table": "loot_tables/entities/silverfish.json" - }, - "minecraft:health": { - "value": 8, - "max": 8 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:attack": { - "damage": 1 - }, - "minecraft:collision_box": { - "width": 0.4, - "height": 0.3 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 1 - }, - "minecraft:behavior.silverfish_merge_with_stone": { - "priority": 5 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "attack_interval": 10, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 8 - } - ] - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1, - "alert_same_type": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:block_climber": {} - }, - "events": { - "minecraft:entity_spawned": { - "remove": {}, - "add": { - "component_groups": ["minecraft:silverfish_calm"] - } - }, - "minecraft:become_angry": { - "remove": { - "minecraft:silverfish_calm": {} - }, - "add": { - "component_groups": ["minecraft:silverfish_angry"] - } - }, - "minecraft:on_calm": { - "remove": { - "minecraft:silverfish_angry": {} - }, - "add": { - "component_groups": ["minecraft:silverfish_calm"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/skeleton.json b/build/entities/skeleton.json deleted file mode 100644 index 881b5b9..0000000 --- a/build/entities/skeleton.json +++ /dev/null @@ -1,644 +0,0 @@ -{ - "format_version": "1.18.20", - "minecraft:entity": { - "description": { - "identifier": "minecraft:skeleton", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "in_powder_snow": { - "minecraft:is_shaking": {}, - "minecraft:timer": { - "looping": false, - "time": 20, - "time_down_event": { - "event": "become_stray_event" - } - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "in_block", - "subject": "self", - "operator": "!=", - "value": "minecraft:powder_snow" - }, - "event": "got_out_of_powder_snow" - } - ] - } - }, - "got_out_of_powder_snow_environment_sensor": { - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "minecraft:melee_mode" - }, - { - "filters": { - "test": "has_ranged_weapon", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "minecraft:melee_mode" - }, - { - "filters": { - "all_of": [ - { - "test": "in_water", - "subject": "self", - "operator": "==", - "value": false - }, - { - "test": "has_ranged_weapon", - "subject": "self", - "operator": "==", - "value": true - } - ] - }, - "event": "minecraft:ranged_mode" - } - ] - } - }, - "minecraft:lightning_immune": { - "minecraft:damage_sensor": { - "triggers": { - "on_damage": { - "filters": { - "other_with_families": "lightning" - } - }, - "deals_damage": false - } - } - }, - "become_stray": { - "minecraft:transformation": { - "into": "minecraft:stray", - "transformation_sound": "convert_to_stray", - "keep_level": true, - "drop_inventory": true, - "preserve_equipment": true - } - }, - "minecraft:ranged_attack": { - "minecraft:behavior.ranged_attack": { - "priority": 0, - "attack_interval_min": 1, - "attack_interval_max": 3, - "attack_radius": 15 - }, - "minecraft:shooter": { - "def": "minecraft:arrow" - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "minecraft:melee_mode" - }, - { - "filters": { - "test": "has_ranged_weapon", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "minecraft:melee_mode" - }, - { - "filters": { - "test": "in_block", - "subject": "self", - "operator": "==", - "value": "minecraft:powder_snow" - }, - "event": "got_in_powder_snow" - } - ] - } - }, - "minecraft:melee_attack": { - "minecraft:behavior.melee_attack": { - "priority": 4, - "track_target": true, - "speed_multiplier": 1.25 - }, - "minecraft:attack": { - "damage": 2 - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "all_of": [ - { - "test": "in_water", - "subject": "self", - "operator": "==", - "value": false - }, - { - "test": "has_ranged_weapon", - "subject": "self", - "operator": "==", - "value": true - } - ] - }, - "event": "minecraft:ranged_mode" - }, - { - "filters": { - "test": "in_block", - "subject": "self", - "operator": "==", - "value": "minecraft:powder_snow" - }, - "event": "got_in_powder_snow" - } - ] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:equip_item": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:type_family": { - "family": ["skeleton", "undead", "monster", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:burns_in_daylight": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/skeleton.json" - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "is_amphibious": true, - "avoid_sun": true, - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:nameable": {}, - "minecraft:equipment": { - "table": "loot_tables/entities/skeleton_gear.json" - }, - "minecraft:shooter": { - "def": "minecraft:arrow" - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "minecraft:melee_mode" - }, - { - "filters": { - "test": "has_ranged_weapon", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "minecraft:melee_mode" - }, - { - "filters": { - "test": "in_block", - "subject": "self", - "operator": "==", - "value": "minecraft:powder_snow" - }, - "event": "got_in_powder_snow" - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:netherite_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:stone_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:wooden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:bow", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:netherite_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - } - ] - }, - "minecraft:behavior.ranged_attack": { - "priority": 0, - "attack_interval_min": 1, - "attack_interval_max": 3, - "attack_radius": 15 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "reselect_targets": true, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 16 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.flee_sun": { - "priority": 2, - "speed_multiplier": 1 - }, - "minecraft:behavior.equip_item": { - "priority": 3 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 4, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "wolf" - }, - "max_dist": 6, - "walk_speed_multiplier": 1.2, - "sprint_speed_multiplier": 1.2 - } - ] - }, - "minecraft:behavior.pickup_items": { - "priority": 5, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1, - "pickup_based_on_chance": true, - "can_pickup_any_item": true - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:ranged_attack"] - } - }, - "become_stray_event": { - "add": { - "component_groups": ["become_stray"] - } - }, - "got_in_powder_snow": { - "add": { - "component_groups": ["in_powder_snow"] - } - }, - "got_out_of_powder_snow": { - "remove": { - "component_groups": ["in_powder_snow"] - }, - "add": { - "component_groups": ["got_out_of_powder_snow_environment_sensor"] - } - }, - "minecraft:spring_trap": { - "add": { - "component_groups": ["minecraft:lightning_immune"] - } - }, - "minecraft:melee_mode": { - "remove": { - "component_groups": ["minecraft:ranged_attack", "got_out_of_powder_snow_environment_sensor"] - }, - "add": { - "component_groups": ["minecraft:melee_attack"] - } - }, - "minecraft:ranged_mode": { - "remove": { - "component_groups": ["minecraft:melee_attack", "got_out_of_powder_snow_environment_sensor"] - }, - "add": { - "component_groups": ["minecraft:ranged_attack"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/skeleton_horse.json b/build/entities/skeleton_horse.json deleted file mode 100644 index 418c8f5..0000000 --- a/build/entities/skeleton_horse.json +++ /dev/null @@ -1,213 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:skeleton_horse", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:skeleton_horse_r5_upgrade": { - "minecraft:rideable": {} - }, - "minecraft:skeleton_horse_baby": { - "minecraft:is_baby": {}, - "minecraft:scale_by_age": { - "start_scale": 0.5, - "end_scale": 1 - }, - "minecraft:ageable": { - "duration": 1200, - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 4, - "speed_multiplier": 1 - } - }, - "minecraft:skeleton_horse_adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/skeleton_horse.json" - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 1.6 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["player", "skeleton", "zombie"], - "interact_text": "action.interact.ride.horse", - "seats": { - "position": [0, 1.2, -0.2] - } - } - }, - "minecraft:skeleton_trap": { - "minecraft:behavior.skeleton_horse_trap": { - "within_radius": 10, - "duration": 900, - "priority": 2 - } - }, - "minecraft:lightning_immune": { - "minecraft:damage_sensor": { - "triggers": { - "on_damage": { - "filters": { - "test": "is_family", - "subject": "other", - "value": "lightning" - } - }, - "deals_damage": false - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["skeletonhorse", "undead", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:health": { - "value": 15, - "max": 15 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.2 - }, - "minecraft:underwater_movement": { - "value": 0.08 - }, - "minecraft:navigation.walk": { - "is_amphibious": true, - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:nameable": {}, - "minecraft:horse.jump_strength": { - "value": { - "range_min": 0.4, - "range_max": 1 - } - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["player", "skeleton", "zombie"], - "interact_text": "action.interact.ride.horse", - "seats": { - "position": [0, 1.2, -0.2] - } - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.5, - "target_dist": 4, - "track_target": true - }, - "minecraft:behavior.player_ride_tamed": {}, - "minecraft:input_ground_controlled": {}, - "minecraft:can_power_jump": {}, - "minecraft:balloonable": {}, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.7 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:is_tamed": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 36, - "add": { - "component_groups": ["minecraft:skeleton_horse_adult"] - } - }, - { - "weight": 9, - "remove": { - "component_groups": ["minecraft:skeleton_horse_r5_upgrade"] - }, - "add": { - "component_groups": ["minecraft:skeleton_horse_baby"] - } - } - ] - }, - "minecraft:set_trap": { - "add": { - "component_groups": ["minecraft:skeleton_trap", "minecraft:lightning_immune"] - } - }, - "minecraft:spring_trap": { - "add": { - "component_groups": ["minecraft:skeleton_horse_adult", "minecraft:lightning_immune"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/slime.json b/build/entities/slime.json deleted file mode 100644 index a206abe..0000000 --- a/build/entities/slime.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "format_version": "1.19.50", - "minecraft:entity": { - "description": { - "identifier": "minecraft:slime", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:slime_large": { - "minecraft:variant": { - "value": 4 - }, - "minecraft:collision_box": { - "width": 2.08, - "height": 2.08 - }, - "minecraft:health": { - "value": 16, - "max": 16 - }, - "minecraft:movement": { - "value": 0.6 - }, - "minecraft:attack": { - "damage": 4 - }, - "minecraft:area_attack": { - "damage_range": 0.15, - "damage_per_tick": 4, - "damage_cooldown": 0.5, - "cause": "entity_attack", - "entity_filter": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - } - ] - } - } - }, - "minecraft:slime_medium": { - "minecraft:variant": { - "value": 2 - }, - "minecraft:collision_box": { - "width": 1.04, - "height": 1.04 - }, - "minecraft:health": { - "value": 4, - "max": 4 - }, - "minecraft:movement": { - "value": 0.4 - }, - "minecraft:attack": { - "damage": 2 - }, - "minecraft:area_attack": { - "damage_range": 0.15, - "damage_per_tick": 2, - "damage_cooldown": 0.5, - "cause": "entity_attack", - "entity_filter": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - } - ] - } - } - }, - "minecraft:slime_small": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:collision_box": { - "width": 0.52, - "height": 0.52 - }, - "minecraft:health": { - "value": 1, - "max": 1 - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:attack": { - "damage": 0 - }, - "minecraft:loot": { - "table": "loot_tables/entities/slime.json" - } - }, - "minecraft:slime_calm": { - "minecraft:movement.jump": { - "jump_delay": [0.5, 1.5] - } - }, - "minecraft:slime_aggressive": { - "minecraft:movement.jump": { - "jump_delay": [0.16, 0.5] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:collision_box": { - "width": 2.08, - "height": 2.08 - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? query.variant : 0" - }, - "minecraft:type_family": { - "family": ["slime", "monster", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true - }, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement.jump": { - "jump_delay": [0.5, 1.5] - }, - "minecraft:on_target_acquired": { - "event": "minecraft:become_aggressive", - "target": "self" - }, - "minecraft:on_target_escape": { - "event": "minecraft:become_calm", - "target": "self" - }, - "minecraft:nameable": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.slime_float": { - "priority": 1, - "jump_chance_percentage": 0.8, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.slime_attack": { - "priority": 3 - }, - "minecraft:behavior.slime_random_direction": { - "priority": 4, - "add_random_time_range": 3, - "turn_range": 360, - "min_change_direction_time": 2 - }, - "minecraft:behavior.slime_keep_on_jumping": { - "priority": 5, - "speed_multiplier": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 16 - } - ], - "must_see": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 1, - "trigger": "spawn_small" - }, - { - "weight": 1, - "trigger": "spawn_medium" - }, - { - "weight": 1, - "trigger": "spawn_large" - } - ] - }, - "spawn_small": { - "add": { - "component_groups": ["minecraft:slime_small", "minecraft:slime_calm"] - } - }, - "spawn_medium": { - "add": { - "component_groups": ["minecraft:slime_medium", "minecraft:slime_calm"] - } - }, - "spawn_large": { - "add": { - "component_groups": ["minecraft:slime_large", "minecraft:slime_calm"] - } - }, - "minecraft:become_calm": { - "add": { - "component_groups": ["minecraft:slime_calm"] - } - }, - "minecraft:become_aggressive": { - "add": { - "component_groups": ["minecraft:slime_aggressive"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/small_fireball.json b/build/entities/small_fireball.json deleted file mode 100644 index 2d99a25..0000000 --- a/build/entities/small_fireball.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:small_fireball", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.31, - "height": 0.31 - }, - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": 5, - "knockback": true, - "catch_fire": true, - "semi_random_diff_damage": false - }, - "catch_fire": { - "fire_affected_by_griefing": true - }, - "remove_on_hit": {} - }, - "power": 1.3, - "gravity": 0, - "inertia": 1, - "liquid_inertia": 1, - "anchor": 2, - "offset": [0, 0.5, 0], - "semi_random_diff_damage": true, - "uncertainty_base": 10, - "reflect_on_hurt": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/sniffer.json b/build/entities/sniffer.json deleted file mode 100644 index c2b9138..0000000 --- a/build/entities/sniffer.json +++ /dev/null @@ -1,346 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:sniffer", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": true - }, - "component_groups": { - "sniffer_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.45 - }, - "minecraft:ageable": { - "duration": 2400, - "feed_items": ["torchflower_seeds"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - } - }, - "sniffer_adult": { - "minecraft:behavior.breed": { - "priority": 3, - "speed_multiplier": 1 - }, - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:breedable": { - "require_tame": false, - "causes_pregnancy": true, - "breeds_with": [ - { - "mate_type": "minecraft:sniffer", - "breed_event": { - "event": "on_pregnant", - "target": "self" - } - } - ], - "breed_items": ["torchflower_seeds"] - } - }, - "feeling_happy": { - "minecraft:behavior.feeling_happy": { - "priority": 5, - "cooldown_range": 0, - "duration_range": [2, 5], - "on_end": { - "event": "on_feeling_happy_end", - "target": "self" - } - } - }, - "stand_up": { - "minecraft:behavior.rising": { - "priority": 2, - "cooldown_range": 0, - "duration_range": [2, 5], - "on_end": { - "event": "on_rising_end", - "target": "self" - } - } - }, - "pushable": { - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - } - }, - "sniffer_pregnant": { - "minecraft:spawn_entity": { - "entities": { - "min_wait_time": 0, - "max_wait_time": 0, - "spawn_sound": "plop", - "spawn_item": "sniffer_egg", - "spawn_item_event": { - "event": "on_egg_spawned", - "target": "self" - }, - "single_use": true - } - }, - "minecraft:is_pregnant": {} - }, - "sniffer_search_and_dig": { - "minecraft:behavior.random_search_and_dig": { - "priority": 5, - "speed_multiplier": 1.25, - "find_valid_position_retries": 5, - "goal_radius": 2, - "search_range_xz": 20, - "search_range_y": 3, - "cooldown_range": 0, - "digging_duration_range": [8, 10], - "items": [ - { - "item": "torchflower_seeds", - "weight": 1 - }, - { - "item": "pitcher_pod", - "weight": 1 - } - ], - "spawn_item_after_seconds": 6, - "spawn_item_pos_offset": 2.25, - "on_searching_start": { - "event": "on_searching_start", - "target": "self" - }, - "on_fail_during_searching": { - "event": "on_fail_during_searching", - "target": "self" - }, - "on_digging_start": { - "event": "on_digging_start", - "target": "self" - }, - "on_item_found": { - "event": "on_item_found", - "target": "self" - }, - "on_fail_during_digging": { - "event": "on_fail_during_digging", - "target": "self" - }, - "on_success": { - "event": "on_search_and_digging_success", - "target": "self" - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 2 - }, - "minecraft:behavior.tempt": { - "priority": 4, - "speed_multiplier": 1.25, - "items": ["torchflower_seeds"] - }, - "minecraft:behavior.scenting": { - "priority": 6, - "cooldown_range": [400, 500], - "duration_range": 2, - "on_end": { - "event": "on_scenting_success", - "target": "self" - } - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "target_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:collision_box": { - "width": 1.9, - "height": 1.75 - }, - "minecraft:healable": { - "items": [ - { - "item": "torchflower_seeds", - "heal_amount": 2 - } - ] - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:type_family": { - "family": ["sniffer", "mob"] - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 14 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:follow_range": { - "value": 64 - }, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:movement": { - "value": 0.09 - }, - "minecraft:persistent": {}, - "minecraft:physics": {}, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "trigger": "minecraft:spawn_adult" - }, - { - "weight": 5, - "trigger": "minecraft:entity_born" - } - ] - }, - "minecraft:spawn_adult": { - "add": { - "component_groups": ["sniffer_adult", "pushable"] - } - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["sniffer_baby", "pushable"] - } - }, - "on_pregnant": { - "add": { - "component_groups": ["sniffer_pregnant"] - } - }, - "on_egg_spawned": { - "remove": { - "component_groups": ["sniffer_pregnant"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["sniffer_baby"] - }, - "add": { - "component_groups": ["sniffer_adult"] - } - }, - "on_scenting_success": { - "sequence": [ - { - "filters": { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["sniffer_search_and_dig"] - } - } - ] - }, - "on_digging_start": { - "remove": { - "component_groups": ["pushable"] - } - }, - "on_item_found": { - "add": { - "component_groups": ["feeling_happy"] - } - }, - "on_feeling_happy_end": { - "remove": { - "component_groups": ["feeling_happy"] - } - }, - "on_fail_during_searching": { - "remove": { - "component_groups": ["sniffer_search_and_dig"] - } - }, - "on_fail_during_digging": { - "remove": { - "component_groups": ["sniffer_search_and_dig"] - }, - "add": { - "component_groups": ["pushable", "stand_up"] - } - }, - "on_search_and_digging_success": { - "remove": { - "component_groups": ["sniffer_search_and_digging"] - }, - "add": { - "component_groups": ["pushable", "stand_up"] - } - }, - "on_rising_end": { - "remove": { - "component_groups": ["stand_up"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/snow_golem.json b/build/entities/snow_golem.json deleted file mode 100644 index 9551c22..0000000 --- a/build/entities/snow_golem.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:snow_golem", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:snowman_sheared": { - "minecraft:is_sheared": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["snowgolem", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:collision_box": { - "width": 0.4, - "height": 1.8 - }, - "minecraft:loot": { - "table": "loot_tables/entities/snowman.json" - }, - "minecraft:health": { - "value": 4, - "max": 4 - }, - "minecraft:movement": { - "value": 0.2 - }, - "minecraft:navigation.walk": { - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:attack": { - "damage": 2 - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "fall", - "deals_damage": false - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - }, - { - "filters": { - "test": "is_temperature_value", - "operator": ">", - "value": 1 - }, - "cause": "temperature", - "damage_per_tick": 1 - }, - { - "filters": { - "test": "in_contact_with_water", - "operator": "==", - "value": true - }, - "cause": "drowning", - "damage_per_tick": 1 - } - ] - }, - "minecraft:interact": { - "interactions": [ - { - "cooldown": 2.5, - "use_item": false, - "hurt_item": 1, - "spawn_items": { - "table": "loot_tables/entities/snow_golem_shear.json" - }, - "play_sounds": "shear", - "interact_text": "action.interact.shear", - "vibration": "shear", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "shears" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_component", - "operator": "!=", - "value": "minecraft:is_sheared" - } - ] - }, - "event": "minecraft:on_sheared", - "target": "self" - } - } - ] - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:behavior.ranged_attack": { - "priority": 1, - "speed_multiplier": 1.25, - "attack_interval": 1, - "attack_radius": 10 - }, - "minecraft:shooter": { - "def": "minecraft:snowball" - }, - "minecraft:trail": { - "block_type": "minecraft:snow_layer", - "spawn_filter": { - "test": "is_temperature_value", - "operator": "<", - "value": 0.81 - } - }, - "minecraft:behavior.random_stroll": { - "priority": 2, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 3, - "look_distance": 6 - }, - "minecraft:behavior.random_look_around": { - "priority": 4 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 1, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "monster" - }, - "within_default": 6 - } - ] - }, - "minecraft:persistent": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:on_sheared": { - "remove": {}, - "add": { - "component_groups": ["minecraft:snowman_sheared"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/snowball.json b/build/entities/snowball.json deleted file mode 100644 index 659f65e..0000000 --- a/build/entities/snowball.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:snowball", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "filter": "blaze", - "damage": 3, - "knockback": true - }, - "remove_on_hit": {}, - "particle_on_hit": { - "particle_type": "snowballpoof", - "num_particles": 6, - "on_entity_hit": true, - "on_other_hit": true - } - }, - "anchor": 1, - "power": 1.5, - "gravity": 0.03, - "angle_offset": 0, - "offset": [0, -0.1, 0] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 100, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/spider.json b/build/entities/spider.json deleted file mode 100644 index 9d19c62..0000000 --- a/build/entities/spider.json +++ /dev/null @@ -1,326 +0,0 @@ -{ - "format_version": "1.18.20", - "minecraft:entity": { - "description": { - "identifier": "minecraft:spider", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:spider_jockey": { - "minecraft:addrider": { - "entity_type": "minecraft:skeleton" - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["skeleton"], - "seats": { - "position": [0, 0.54, 0] - } - } - }, - "minecraft:spider_stray_jockey": { - "minecraft:addrider": { - "entity_type": "minecraft:skeleton.stray" - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["skeleton"], - "seats": { - "position": [0, 0.54, 0] - } - } - }, - "minecraft:spider_wither_jockey": { - "minecraft:addrider": { - "entity_type": "minecraft:skeleton.wither" - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["skeleton"], - "seats": { - "position": [0, 0.54, 0] - } - } - }, - "minecraft:spider_neutral": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_brightness", - "operator": "<", - "value": 0.49 - }, - "event": "minecraft:become_hostile" - } - }, - "minecraft:on_target_acquired": { - "event": "minecraft:become_angry" - } - }, - "minecraft:spider_hostile": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_brightness", - "operator": ">", - "value": 0.49 - }, - "event": "minecraft:become_neutral" - } - }, - "minecraft:on_target_acquired": { - "event": "minecraft:become_angry" - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "attack_interval": 5, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 16 - } - ] - } - }, - "minecraft:spider_angry": { - "minecraft:angry": { - "duration": 10, - "duration_delta": 3, - "calm_event": { - "event": "minecraft:become_calm", - "target": "self" - } - }, - "minecraft:behavior.leap_at_target": { - "priority": 4, - "yd": 0.4, - "must_be_on_ground": false - }, - "minecraft:behavior.melee_attack": { - "priority": 3, - "track_target": true, - "reach_multiplier": 0.8 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["spider", "monster", "mob", "arthropod"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:loot": { - "table": "loot_tables/entities/spider.json" - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 0.9 - }, - "minecraft:health": { - "value": 16, - "max": 16 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:navigation.climb": { - "can_path_over_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:attack": { - "damage": 2 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 1 - }, - "minecraft:behavior.mount_pathing": { - "priority": 5, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 7 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.54, -0.1] - } - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 1, - "randomize": [ - { - "weight": 80, - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": false - }, - { - "test": "is_snow_covered", - "value": true - }, - { - "test": "is_underground", - "value": false - } - ] - }, - "remove": {}, - "add": { - "component_groups": ["minecraft:spider_stray_jockey", "minecraft:spider_neutral"] - } - }, - { - "weight": 80, - "filters": { - "test": "is_biome", - "value": "the_nether" - }, - "remove": {}, - "add": { - "component_groups": ["minecraft:spider_wither_jockey", "minecraft:spider_neutral"] - } - }, - { - "weight": 20, - "filters": { - "any_of": [ - { - "test": "is_daytime", - "value": false - }, - { - "test": "is_underground", - "value": true - } - ] - }, - "remove": {}, - "add": { - "component_groups": ["minecraft:spider_jockey", "minecraft:spider_neutral"] - } - } - ] - }, - { - "weight": 99, - "remove": {}, - "add": { - "component_groups": ["minecraft:spider_neutral"] - } - } - ] - }, - "minecraft:become_hostile": { - "remove": { - "component_groups": ["minecraft:spider_neutral"] - }, - "add": { - "component_groups": ["minecraft:spider_hostile"] - } - }, - "minecraft:become_neutral": { - "remove": { - "component_groups": ["minecraft:spider_hostile"] - }, - "add": { - "component_groups": ["minecraft:spider_neutral"] - } - }, - "minecraft:become_angry": { - "add": { - "component_groups": ["minecraft:spider_angry"] - } - }, - "minecraft:become_calm": { - "remove": { - "component_groups": ["minecraft:spider_angry"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/splash_potion.json b/build/entities/splash_potion.json deleted file mode 100644 index 797d543..0000000 --- a/build/entities/splash_potion.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:splash_potion", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:projectile": { - "on_hit": { - "douse_fire": {}, - "thrown_potion_effect": {}, - "remove_on_hit": {} - }, - "power": 0.5, - "gravity": 0.05, - "angle_offset": -20, - "hit_sound": "glass" - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 5, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/squid.json b/build/entities/squid.json deleted file mode 100644 index 8c8ffb4..0000000 --- a/build/entities/squid.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "format_version": "1.18.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:squid", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:squid_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "!query.is_baby && query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["squid", "mob"] - }, - "minecraft:collision_box": { - "width": 0.95, - "height": 0.95 - }, - "minecraft:health": { - "value": 10, - "max": 10 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/squid.json" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_air": false, - "breathes_water": true - }, - "minecraft:movement": { - "value": 0.2 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "can_sink": false - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": { - "mass": 0.5 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.squid_move_away_from_ground": { - "priority": 1 - }, - "minecraft:behavior.squid_flee": { - "priority": 2 - }, - "minecraft:behavior.squid_idle": { - "priority": 2 - }, - "minecraft:behavior.squid_dive": { - "priority": 2 - }, - "minecraft:behavior.squid_out_of_water": { - "priority": 2 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "remove": {}, - "add": {} - }, - { - "weight": 5, - "remove": {}, - "add": { - "component_groups": ["minecraft:squid_baby"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/stray.json b/build/entities/stray.json deleted file mode 100644 index d9c4abf..0000000 --- a/build/entities/stray.json +++ /dev/null @@ -1,547 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:stray", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:revert_to_skeleton": { - "minecraft:transformation": { - "into": "minecraft:skeleton", - "delay": 0.5 - } - }, - "minecraft:ranged_attack": { - "minecraft:behavior.ranged_attack": { - "priority": 0, - "attack_interval_min": 1, - "attack_interval_max": 3, - "attack_radius": 15 - }, - "minecraft:shooter": { - "def": "minecraft:arrow", - "aux_val": 19 - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "minecraft:melee_mode" - }, - { - "filters": { - "test": "has_ranged_weapon", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "minecraft:melee_mode" - } - ] - } - }, - "minecraft:melee_attack": { - "minecraft:behavior.melee_attack": { - "priority": 4, - "track_target": true, - "speed_multiplier": 1.25 - }, - "minecraft:attack": { - "damage": 3, - "effect_name": "slowness", - "effect_duration": 10 - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "all_of": [ - { - "test": "in_water", - "subject": "self", - "operator": "==", - "value": false - }, - { - "test": "has_ranged_weapon", - "subject": "self", - "operator": "==", - "value": true - } - ] - }, - "event": "minecraft:ranged_mode" - } - ] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:equip_item": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:burns_in_daylight": {}, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/stray.json" - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "is_amphibious": true, - "avoid_sun": true, - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:equipment": { - "table": "loot_tables/entities/skeleton_gear.json" - }, - "minecraft:shooter": { - "def": "minecraft:arrow", - "aux_val": 19 - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "minecraft:melee_mode" - }, - { - "filters": { - "test": "has_ranged_weapon", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "minecraft:melee_mode" - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:netherite_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:stone_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:wooden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:bow", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:netherite_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - } - ] - }, - "minecraft:behavior.ranged_attack": { - "priority": 0, - "attack_interval_min": 1, - "attack_interval_max": 3, - "attack_radius": 15 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "reselect_targets": true, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 16 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.flee_sun": { - "priority": 2, - "speed_multiplier": 1 - }, - "minecraft:behavior.equip_item": { - "priority": 3 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 4, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "wolf" - }, - "max_dist": 6, - "walk_speed_multiplier": 1.2, - "sprint_speed_multiplier": 1.2 - } - ] - }, - "minecraft:behavior.pickup_items": { - "priority": 5, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1, - "pickup_based_on_chance": true, - "can_pickup_any_item": true - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:type_family": { - "family": ["stray", "skeleton", "monster", "mob", "undead"] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:ranged_attack"] - } - }, - "change_to_skeleton": { - "sequence": [ - { - "filters": { - "test": "is_underground", - "value": true - }, - "remove": {}, - "add": { - "component_groups": ["minecraft:revert_to_skeleton"] - } - }, - { - "randomize": [ - { - "weight": 20, - "remove": {}, - "add": { - "component_groups": ["minecraft:revert_to_skeleton"] - } - }, - { - "weight": 80, - "remove": {}, - "add": {} - } - ] - } - ] - }, - "minecraft:melee_mode": { - "remove": { - "component_groups": ["minecraft:ranged_attack"] - }, - "add": { - "component_groups": ["minecraft:melee_attack"] - } - }, - "minecraft:ranged_mode": { - "remove": { - "component_groups": ["minecraft:melee_attack"] - }, - "add": { - "component_groups": ["minecraft:ranged_attack"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/strider.json b/build/entities/strider.json deleted file mode 100644 index 3bdacff..0000000 --- a/build/entities/strider.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "format_version": "1.20.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:strider", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:strider_saddled": { - "minecraft:is_saddled": {}, - "minecraft:loot": { - "table": "loot_tables/entities/strider_saddled.json" - }, - "minecraft:boostable": { - "speed_multiplier": 1.35, - "duration": 16, - "boost_items": [ - { - "item": "warped_fungus_on_a_stick", - "damage": 1, - "replace_item": "fishing_rod" - } - ] - }, - "minecraft:rideable": { - "seat_count": 1, - "crouching_skip_interact": true, - "family_types": ["player"], - "interact_text": "action.interact.ride.strider", - "seats": { - "position": [0, 1.6, -0.2] - } - }, - "minecraft:item_controllable": { - "control_items": "warped_fungus_on_a_stick" - }, - "minecraft:behavior.controlled_by_player": { - "priority": 0, - "mount_speed_multiplier": 1.45 - } - }, - "minecraft:strider_unsaddled": { - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "saddle" - }, - "event": "minecraft:on_saddled" - }, - "use_item": true, - "play_sounds": "saddle", - "interact_text": "action.interact.saddle" - } - ] - } - }, - "minecraft:strider_piglin_jockey": { - "minecraft:addrider": { - "entity_type": "minecraft:zombie_pigman", - "spawn_event": "minecraft:spawn_as_strider_jockey" - }, - "minecraft:rideable": { - "seat_count": 1, - "crouching_skip_interact": true, - "family_types": ["player", "zombie_pigman"], - "interact_text": "action.interact.ride.strider", - "seats": { - "position": [0, 1.65, -0.2] - } - } - }, - "minecraft:strider_parent_jockey": { - "minecraft:addrider": { - "entity_type": "minecraft:strider", - "spawn_event": "minecraft:spawn_baby_strider_jockey" - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["strider"], - "seats": { - "position": [0, 1.6, 0] - } - } - }, - "minecraft:strider_baby": { - "minecraft:type_family": { - "family": ["strider", "strider_baby", "mob"] - }, - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["warped_fungus"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 6, - "speed_multiplier": 1.1 - } - }, - "minecraft:strider_adult": { - "minecraft:type_family": { - "family": ["strider", "strider_adult", "mob"] - }, - "minecraft:behavior.breed": { - "priority": 4, - "speed_multiplier": 1 - }, - "minecraft:loot": { - "table": "loot_tables/entities/strider.json" - }, - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:breedable": { - "require_tame": false, - "breeds_with": { - "mate_type": "minecraft:strider", - "baby_type": "minecraft:strider", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "breed_items": ["warped_fungus"] - } - }, - "minecraft:start_suffocating": { - "minecraft:is_shaking": {}, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "any_of": [ - { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - { - "test": "in_lava", - "subject": "other", - "operator": "==", - "value": true - } - ] - }, - "event": "stop_suffocating" - }, - { - "filters": { - "all_of": [ - { - "test": "is_riding", - "subject": "self", - "operator": "equals", - "value": false - }, - { - "test": "has_component", - "subject": "self", - "operator": "not", - "value": "minecraft:behavior.move_to_liquid" - } - ] - }, - "event": "on_not_riding_parent" - } - ] - } - }, - "minecraft:detect_suffocating": { - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "all_of": [ - { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": false - }, - { - "any_of": [ - { - "test": "is_riding", - "subject": "self", - "operator": "==", - "value": false - }, - { - "test": "in_lava", - "subject": "other", - "operator": "==", - "value": false - } - ] - } - ] - }, - "event": "start_suffocating" - }, - { - "filters": { - "all_of": [ - { - "test": "is_riding", - "subject": "self", - "operator": "equals", - "value": false - }, - { - "test": "has_component", - "subject": "self", - "operator": "not", - "value": "minecraft:behavior.move_to_liquid" - } - ] - }, - "event": "on_not_riding_parent" - } - ] - } - }, - "minecraft:strider_pathing_behaviors": { - "minecraft:behavior.rise_to_liquid_level": { - "priority": 0, - "liquid_y_offset": 0.25, - "rise_delta": 0.01, - "sink_delta": 0.01 - }, - "minecraft:behavior.move_to_liquid": { - "priority": 7, - "search_range": 16, - "search_height": 10, - "goal_radius": 0.9, - "material_type": "Lava", - "search_count": 30 - }, - "minecraft:behavior.random_stroll": { - "priority": 8, - "speed_multiplier": 0.8 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["strider", "mob"] - }, - "minecraft:collision_box": { - "width": 0.9, - "height": 1.7 - }, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_contact_with_water", - "operator": "==", - "value": true - }, - "cause": "drowning", - "damage_per_tick": 1 - } - ] - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:movement": { - "value": 0.16 - }, - "minecraft:lava_movement": { - "value": 0.32 - }, - "minecraft:movement.basic": {}, - "minecraft:navigation.walk": { - "can_path_over_lava": true, - "avoid_water": true, - "can_sink": false, - "can_walk_in_lava": true - }, - "minecraft:jump.static": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:fire_immune": {}, - "minecraft:nameable": {}, - "minecraft:physics": {}, - "minecraft:behavior.look_at_player": { - "priority": 9, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 10 - }, - "minecraft:behavior.panic": { - "priority": 3, - "speed_multiplier": 1.1, - "panic_sound": "panic", - "sound_interval": { - "range_min": 1, - "range_max": 3 - } - }, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 1.2, - "items": ["warped_fungus", "warped_fungus_on_a_stick"], - "can_tempt_while_ridden": true, - "tempt_sound": "tempt", - "sound_interval": { - "range_min": 2, - "range_max": 5 - } - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 40, - "trigger": "spawn_adult" - }, - { - "weight": 2, - "trigger": "spawn_adult_piglin_jockey" - }, - { - "weight": 8, - "trigger": "spawn_adult_parent_jockey" - }, - { - "weight": 50, - "trigger": "spawn_baby" - } - ] - }, - "minecraft:entity_born": { - "trigger": "spawn_baby" - }, - "spawn_adult": { - "add": { - "component_groups": ["minecraft:strider_adult", "minecraft:strider_unsaddled", "minecraft:detect_suffocating", "minecraft:strider_pathing_behaviors"] - } - }, - "spawn_adult_parent_jockey": { - "add": { - "component_groups": ["minecraft:strider_adult", "minecraft:strider_parent_jockey", "minecraft:strider_unsaddled", "minecraft:detect_suffocating", "minecraft:strider_pathing_behaviors"] - } - }, - "spawn_adult_piglin_jockey": { - "add": { - "component_groups": ["minecraft:strider_adult", "minecraft:strider_saddled", "minecraft:strider_piglin_jockey", "minecraft:detect_suffocating", "minecraft:strider_pathing_behaviors"] - } - }, - "spawn_baby": { - "add": { - "component_groups": ["minecraft:strider_baby", "minecraft:detect_suffocating", "minecraft:strider_pathing_behaviors"] - } - }, - "minecraft:spawn_baby_strider_jockey": { - "add": { - "component_groups": ["minecraft:strider_baby", "minecraft:detect_suffocating"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:strider_baby"] - }, - "add": { - "component_groups": ["minecraft:strider_adult", "minecraft:strider_unsaddled"] - } - }, - "minecraft:on_saddled": { - "remove": { - "component_groups": ["minecraft:strider_unsaddled"] - }, - "add": { - "component_groups": ["minecraft:strider_saddled"] - } - }, - "start_suffocating": { - "add": { - "component_groups": ["minecraft:start_suffocating"] - } - }, - "stop_suffocating": { - "add": { - "component_groups": ["minecraft:detect_suffocating"] - }, - "remove": { - "component_groups": ["minecraft:start_suffocating"] - } - }, - "on_not_riding_parent": { - "add": { - "component_groups": ["minecraft:strider_pathing_behaviors"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/tadpole.json b/build/entities/tadpole.json deleted file mode 100644 index 2c1e7fd..0000000 --- a/build/entities/tadpole.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:tadpole", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "grow_up": { - "minecraft:transformation": { - "into": "minecraft:frog", - "transformation_sound": "convert_to_frog" - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["tadpole", "mob"] - }, - "minecraft:collision_box": { - "width": 0.8, - "height": 0.6 - }, - "minecraft:breathable": { - "total_supply": 8, - "suffocate_time": 0, - "breathes_water": true, - "breathes_air": false, - "generates_bubbles": false - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 6 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:navigation.generic": { - "can_path_over_water": true, - "can_swim": true, - "can_walk": false, - "can_sink": false, - "avoid_damage_blocks": true - }, - "minecraft:movement.sway": { - "sway_amplitude": 0 - }, - "minecraft:movement": { - "value": 0.1 - }, - "minecraft:underwater_movement": { - "value": 0.1 - }, - "minecraft:physics": {}, - "minecraft:pushable": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:is_baby": {}, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["slime_ball"], - "grow_up": { - "event": "ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 2 - }, - "minecraft:behavior.tempt": { - "priority": 5, - "speed_multiplier": 1.25, - "can_tempt_vertically": true, - "items": ["slime_ball"] - }, - "minecraft:behavior.random_swim": { - "priority": 2, - "interval": 100 - }, - "minecraft:behavior.look_at_player": { - "priority": 3, - "target_distance": 6, - "probability": 0.02 - } - }, - "events": { - "ageable_grow_up": { - "sequence": [ - { - "add": { - "component_groups": ["grow_up"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/thrown_trident.json b/build/entities/thrown_trident.json deleted file mode 100644 index 10145a6..0000000 --- a/build/entities/thrown_trident.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:thrown_trident", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.35 - }, - "minecraft:projectile": { - "on_hit": { - "impact_damage": { - "damage": 8, - "knockback": true, - "semi_random_diff_damage": false, - "destroy_on_hit": false - }, - "stick_in_ground": { - "shake_time": 0 - } - }, - "liquid_inertia": 0.99, - "hit_sound": "item.trident.hit", - "hit_ground_sound": "item.trident.hit_ground", - "power": 4, - "gravity": 0.1, - "uncertainty_base": 1, - "uncertainty_multiplier": 0, - "stop_on_hurt": true, - "anchor": 1, - "should_bounce": true, - "multiple_targets": false, - "offset": [0, -0.1, 0] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/tnt.json b/build/entities/tnt.json deleted file mode 100644 index 27b853b..0000000 --- a/build/entities/tnt.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:tnt", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "from_explosion": { - "minecraft:explode": { - "fuse_length": { - "range_min": 0.5, - "range_max": 2 - }, - "fuse_lit": true, - "power": 4, - "causes_fire": false - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:type_family": { - "family": ["tnt", "inanimate"] - }, - "minecraft:collision_box": { - "width": 0.98, - "height": 0.98 - }, - "minecraft:explode": { - "fuse_length": 4, - "fuse_lit": true, - "power": 4, - "causes_fire": false - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": false, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 5, - "use_motion_prediction_hints": true - } - } - }, - "events": { - "from_explosion": { - "add": { - "component_groups": ["from_explosion"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/tnt_minecart.json b/build/entities/tnt_minecart.json deleted file mode 100644 index f3418d5..0000000 --- a/build/entities/tnt_minecart.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "format_version": "1.13.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:tnt_minecart", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:primed_tnt": { - "minecraft:explode": { - "fuse_length": 4, - "fuse_lit": true, - "power": 3, - "causes_fire": false - }, - "minecraft:rail_sensor": {}, - "minecraft:is_ignited": {} - }, - "minecraft:instant_explode_tnt": { - "minecraft:explode": { - "fuse_length": 0, - "fuse_lit": true, - "power": 3, - "causes_fire": false - }, - "minecraft:rail_sensor": {}, - "minecraft:is_ignited": {} - }, - "minecraft:inactive": { - "minecraft:rail_sensor": { - "on_activate": { - "filters": { - "all_of": [ - { - "test": "is_game_rule", - "domain": "tntexplodes", - "operator": "==", - "value": true - } - ] - }, - "event": "minecraft:on_prime" - } - }, - "minecraft:interact": { - "interactions": [ - { - "on_interact": { - "filters": { - "any_of": [ - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "fireball:0" - }, - { - "test": "has_equipment", - "subject": "other", - "domain": "hand", - "value": "flint_and_steel" - } - ], - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_game_rule", - "domain": "tntexplodes", - "operator": "==", - "value": true - } - ] - }, - "event": "minecraft:on_prime", - "target": "self" - }, - "swing": true, - "play_sounds": "ignite", - "interact_text": "action.interact.creeper" - }, - { - "on_interact": { - "filters": { - "any_of": [ - { - "test": "has_component", - "subject": "other", - "value": "fire_aspect" - } - ], - "all_of": [ - { - "test": "is_game_rule", - "domain": "tntexplodes", - "operator": "==", - "value": true - } - ] - }, - "event": "minecraft:on_prime", - "target": "self" - }, - "swing": true, - "interact_text": "action.interact.creeper" - } - ] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:type_family": { - "family": ["minecart", "inanimate"] - }, - "minecraft:collision_box": { - "width": 0.98, - "height": 0.7 - }, - "minecraft:rail_movement": {}, - "minecraft:is_stackable": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 60, - "max_dropped_ticks": 20, - "use_motion_prediction_hints": true - }, - "conditional_values": [ - { - "max_optimized_distance": 0, - "max_dropped_ticks": 0, - "conditional_values": [ - { - "test": "is_moving", - "subject": "self", - "operator": "==", - "value": true - } - ] - } - ] - } - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:inactive"] - } - }, - "minecraft:on_prime": { - "remove": { - "component_groups": ["minecraft:inactive"] - }, - "add": { - "component_groups": ["minecraft:primed_tnt"] - } - }, - "minecraft:on_instant_prime": { - "remove": { - "component_groups": ["minecraft:inactive"] - }, - "add": { - "component_groups": ["minecraft:instant_explode_tnt"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/trader_llama.json b/build/entities/trader_llama.json deleted file mode 100644 index c64640f..0000000 --- a/build/entities/trader_llama.json +++ /dev/null @@ -1,740 +0,0 @@ -{ - "format_version": "1.13.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:trader_llama", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:llama_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": [ - { - "item": "wheat", - "growth": 0.1 - }, - { - "item": "hay_block", - "growth": 0.9 - } - ], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 5, - "speed_multiplier": 1 - } - }, - "minecraft:llama_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/llama.json" - }, - "minecraft:behavior.breed": { - "priority": 4, - "speed_multiplier": 1 - }, - "minecraft:breedable": { - "require_tame": true, - "inherit_tamed": false, - "breeds_with": [ - { - "mate_type": "minecraft:llama", - "baby_type": "minecraft:llama", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - { - "mate_type": "minecraft:trader_llama", - "baby_type": "minecraft:trader_llama", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - } - ], - "breed_items": ["hay_block"] - } - }, - "minecraft:llama_wild": { - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["player"], - "interact_text": "action.interact.mount", - "seats": { - "position": [0, 1.17, -0.3] - } - }, - "minecraft:tamemount": { - "min_temper": 0, - "max_temper": 30, - "feed_text": "action.interact.feed", - "ride_text": "action.interact.mount", - "feed_items": [ - { - "item": "wheat", - "temper_mod": 3 - }, - { - "item": "hay_block", - "temper_mod": 6 - } - ], - "auto_reject_items": [ - { - "item": "horsearmorleather" - }, - { - "item": "horsearmoriron" - }, - { - "item": "horsearmorgold" - }, - { - "item": "horsearmordiamond" - }, - { - "item": "saddle" - } - ], - "tame_event": { - "event": "minecraft:on_tame", - "target": "self" - } - } - }, - "minecraft:llama_wandering_trader": { - "minecraft:on_friendly_anger": { - "event": "minecraft:defend_wandering_trader", - "target": "self" - }, - "minecraft:environment_sensor": { - "triggers": [ - { - "filters": { - "all_of": [ - { - "test": "is_leashed", - "subject": "self", - "value": false - }, - { - "test": "has_component", - "subject": "self", - "operator": "!=", - "value": "minecraft:is_tamed" - } - ] - }, - "event": "minecraft:on_tame" - }, - { - "filters": { - "all_of": [ - { - "test": "is_leashed", - "subject": "self", - "value": false - }, - { - "test": "has_component", - "subject": "self", - "operator": "==", - "value": "minecraft:persistent" - } - ] - }, - "event": "minecraft:remove_persistence" - } - ] - } - }, - "minecraft:llama_persistence": { - "minecraft:persistent": {} - }, - "minecraft:strength_1": { - "minecraft:strength": { - "value": 1, - "max": 5 - } - }, - "minecraft:strength_2": { - "minecraft:strength": { - "value": 2, - "max": 5 - } - }, - "minecraft:strength_3": { - "minecraft:strength": { - "value": 3, - "max": 5 - } - }, - "minecraft:strength_4": { - "minecraft:strength": { - "value": 4, - "max": 5 - } - }, - "minecraft:strength_5": { - "minecraft:strength": { - "value": 5, - "max": 5 - } - }, - "minecraft:llama_creamy": { - "minecraft:variant": { - "value": 0 - } - }, - "minecraft:llama_white": { - "minecraft:variant": { - "value": 1 - } - }, - "minecraft:llama_brown": { - "minecraft:variant": { - "value": 2 - } - }, - "minecraft:llama_gray": { - "minecraft:variant": { - "value": 3 - } - }, - "minecraft:llama_tamed": { - "minecraft:is_tamed": {}, - "minecraft:rideable": { - "seat_count": 1, - "crouching_skip_interact": true, - "family_types": ["player"], - "interact_text": "action.interact.ride.horse", - "seats": { - "position": [0, 1.17, -0.3] - } - }, - "minecraft:inventory": { - "inventory_size": 16, - "container_type": "horse", - "additional_slots_per_strength": 3 - }, - "minecraft:equippable": { - "slots": [ - { - "slot": 1, - "item": "carpet", - "accepted_items": ["carpet"] - } - ] - } - }, - "minecraft:llama_unchested": { - "minecraft:interact": { - "interactions": [ - { - "play_sounds": "armor.equip_generic", - "on_interact": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "chest" - } - ] - }, - "event": "minecraft:on_chest", - "target": "self" - }, - "use_item": true, - "interact_text": "action.interact.attachchest" - } - ] - } - }, - "minecraft:llama_chested": { - "minecraft:is_chested": {} - }, - "minecraft:llama_angry": { - "minecraft:angry": { - "duration": 4, - "broadcast_anger": false, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:behavior.ranged_attack": { - "priority": 2, - "attack_radius": 64, - "charge_shoot_trigger": 2, - "charge_charged_trigger": 1 - } - }, - "minecraft:llama_angry_wolf": { - "minecraft:angry": { - "duration": -1, - "broadcast_anger": false, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:behavior.ranged_attack": { - "priority": 2, - "attack_radius": 64, - "charge_shoot_trigger": 2, - "charge_charged_trigger": 1 - } - }, - "minecraft:llama_defend_trader": { - "minecraft:angry": { - "duration": 10, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:behavior.ranged_attack": { - "priority": 2, - "attack_radius": 64, - "charge_shoot_trigger": 2, - "charge_charged_trigger": 1 - } - }, - "minecraft:in_caravan": { - "minecraft:damage_sensor": { - "triggers": { - "cause": "all", - "deals_damage": true - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.run_around_like_crazy": { - "priority": 1, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.mount_pathing": { - "priority": 1, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1, - "hurt_owner": true, - "entity_types": { - "filters": { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "trader_llama" - } - } - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "attack_interval": 16, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "wolf" - }, - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_tamed" - } - ] - }, - "max_dist": 10 - } - ], - "must_see": false, - "must_reach": true - }, - "minecraft:behavior.follow_caravan": { - "priority": 3, - "speed_multiplier": 2.1, - "entity_count": 10, - "entity_types": { - "filters": { - "test": "is_family", - "subject": "other", - "value": "llama" - } - } - }, - "minecraft:behavior.panic": { - "priority": 4, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.7 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["trader_llama", "llama", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:mark_variant": { - "value": 1 - }, - "minecraft:health": { - "value": { - "range_min": 15, - "range_max": 30 - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:follow_range": { - "value": 40, - "max": 40 - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10, - "can_be_stolen": true - }, - "minecraft:balloonable": {}, - "minecraft:healable": { - "items": [ - { - "item": "wheat", - "heal_amount": 2 - }, - { - "item": "hay_block", - "heal_amount": 10 - } - ] - }, - "minecraft:shooter": { - "def": "minecraft:llama_spit" - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:damage_sensor": { - "triggers": { - "cause": "all", - "deals_damage": true, - "on_damage": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "trader_llama" - }, - { - "test": "in_caravan", - "value": false - } - ] - }, - "event": "minecraft:become_angry" - } - } - }, - "minecraft:on_target_acquired": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "target", - "value": "wolf" - }, - { - "test": "has_component", - "subject": "target", - "operator": "!=", - "value": "minecraft:is_tamed" - } - ] - }, - "event": "minecraft:mad_at_wolf", - "target": "self" - }, - "minecraft:on_target_escape": { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "target", - "value": "wolf" - }, - { - "test": "has_component", - "subject": "target", - "operator": "!=", - "value": "minecraft:is_tamed" - } - ] - }, - "event": "minecraft:on_calm", - "target": "self" - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:collision_box": { - "width": 0.9, - "height": 1.87 - } - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 90, - "trigger": "minecraft:spawn_adult" - }, - { - "weight": 10, - "trigger": "minecraft:spawn_baby" - } - ] - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:llama_baby"] - } - }, - "minecraft:from_wandering_trader": { - "sequence": [ - { - "add": { - "component_groups": ["minecraft:llama_adult", "minecraft:llama_wandering_trader", "minecraft:llama_persistence"] - } - }, - { - "trigger": "minecraft:add_attributes" - } - ] - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:llama_baby"] - }, - "add": { - "component_groups": ["minecraft:llama_adult", "minecraft:llama_wild"] - } - }, - "minecraft:on_tame": { - "remove": { - "component_groups": ["minecraft:llama_wild"] - }, - "add": { - "component_groups": ["minecraft:llama_tamed", "minecraft:llama_unchested"] - } - }, - "minecraft:remove_persistence": { - "remove": { - "component_groups": ["minecraft:llama_persistence"] - } - }, - "minecraft:join_caravan": { - "add": { - "component_groups": ["minecraft:in_caravan"] - } - }, - "minecraft:leave_caravan": { - "remove": { - "component_groups": ["minecraft:in_caravan"] - } - }, - "minecraft:mad_at_wolf": { - "add": { - "component_groups": ["minecraft:llama_angry_wolf"] - } - }, - "minecraft:defend_wandering_trader": { - "add": { - "component_groups": ["minecraft:llama_defend_trader"] - } - }, - "minecraft:become_angry": { - "add": { - "component_groups": ["minecraft:llama_angry"] - } - }, - "minecraft:on_calm": { - "remove": { - "component_groups": ["minecraft:llama_angry", "minecraft:llama_angry_wolf", "minecraft:llama_defend_trader"] - } - }, - "minecraft:on_chest": { - "remove": { - "component_groups": ["minecraft:llama_unchested"] - }, - "add": { - "component_groups": ["minecraft:llama_chested"] - } - }, - "minecraft:add_attributes": { - "sequence": [ - { - "randomize": [ - { - "weight": 32, - "add": { - "component_groups": ["minecraft:strength_1"] - } - }, - { - "weight": 32, - "add": { - "component_groups": ["minecraft:strength_2"] - } - }, - { - "weight": 32, - "add": { - "component_groups": ["minecraft:strength_3"] - } - }, - { - "weight": 2, - "add": { - "component_groups": ["minecraft:strength_4"] - } - }, - { - "weight": 2, - "add": { - "component_groups": ["minecraft:strength_5"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 25, - "add": { - "component_groups": ["minecraft:llama_creamy"] - } - }, - { - "weight": 25, - "add": { - "component_groups": ["minecraft:llama_white"] - } - }, - { - "weight": 25, - "add": { - "component_groups": ["minecraft:llama_brown"] - } - }, - { - "weight": 25, - "add": { - "component_groups": ["minecraft:llama_gray"] - } - } - ] - } - ] - }, - "minecraft:spawn_baby": { - "add": { - "component_groups": ["minecraft:llama_baby"] - }, - "trigger": "minecraft:add_attributes" - }, - "minecraft:spawn_adult": { - "add": { - "component_groups": ["minecraft:llama_adult", "minecraft:llama_wild"] - }, - "trigger": "minecraft:add_attributes" - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/tripod_camera.json b/build/entities/tripod_camera.json deleted file mode 100644 index 6912ee3..0000000 --- a/build/entities/tripod_camera.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "format_version": "1.13.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:tripod_camera", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:type_family": { - "family": ["tripodcamera", "inanimate", "mob"] - }, - "minecraft:health": { - "value": 4, - "max": 4 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/empty.json" - }, - "minecraft:collision_box": { - "width": 0.75, - "height": 1.8 - }, - "minecraft:physics": {}, - "minecraft:conditional_bandwidth_optimization": {} - } - } -} diff --git a/build/entities/tropicalfish.json b/build/entities/tropicalfish.json deleted file mode 100644 index 589d759..0000000 --- a/build/entities/tropicalfish.json +++ /dev/null @@ -1,1024 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:tropicalfish", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:tropicalfish_variant_a": { - "minecraft:variant": { - "value": 0 - } - }, - "minecraft:tropicalfish_variant_b": { - "minecraft:variant": { - "value": 1 - } - }, - "minecraft:tropicalfish_variant_pattern_1": { - "minecraft:mark_variant": { - "value": 0 - } - }, - "minecraft:tropicalfish_variant_pattern_2": { - "minecraft:mark_variant": { - "value": 1 - } - }, - "minecraft:tropicalfish_variant_pattern_3": { - "minecraft:mark_variant": { - "value": 2 - } - }, - "minecraft:tropicalfish_variant_pattern_4": { - "minecraft:mark_variant": { - "value": 3 - } - }, - "minecraft:tropicalfish_variant_pattern_5": { - "minecraft:mark_variant": { - "value": 4 - } - }, - "minecraft:tropicalfish_variant_pattern_6": { - "minecraft:mark_variant": { - "value": 5 - } - }, - "minecraft:tropicalfish_base_white": { - "minecraft:color": { - "value": 0 - } - }, - "minecraft:tropicalfish_base_orange": { - "minecraft:color": { - "value": 1 - } - }, - "minecraft:tropicalfish_base_magenta": { - "minecraft:color": { - "value": 2 - } - }, - "minecraft:tropicalfish_base_lightblue": { - "minecraft:color": { - "value": 3 - } - }, - "minecraft:tropicalfish_base_yellow": { - "minecraft:color": { - "value": 4 - } - }, - "minecraft:tropicalfish_base_lightgreen": { - "minecraft:color": { - "value": 5 - } - }, - "minecraft:tropicalfish_base_pink": { - "minecraft:color": { - "value": 6 - } - }, - "minecraft:tropicalfish_base_gray": { - "minecraft:color": { - "value": 7 - } - }, - "minecraft:tropicalfish_base_silver": { - "minecraft:color": { - "value": 8 - } - }, - "minecraft:tropicalfish_base_cyan": { - "minecraft:color": { - "value": 9 - } - }, - "minecraft:tropicalfish_base_purple": { - "minecraft:color": { - "value": 10 - } - }, - "minecraft:tropicalfish_base_blue": { - "minecraft:color": { - "value": 11 - } - }, - "minecraft:tropicalfish_base_brown": { - "minecraft:color": { - "value": 12 - } - }, - "minecraft:tropicalfish_base_green": { - "minecraft:color": { - "value": 13 - } - }, - "minecraft:tropicalfish_base_red": { - "minecraft:color": { - "value": 14 - } - }, - "minecraft:tropicalfish_pattern_white": { - "minecraft:color2": { - "value": 0 - } - }, - "minecraft:tropicalfish_pattern_orange": { - "minecraft:color2": { - "value": 1 - } - }, - "minecraft:tropicalfish_pattern_magenta": { - "minecraft:color2": { - "value": 2 - } - }, - "minecraft:tropicalfish_pattern_lightblue": { - "minecraft:color2": { - "value": 3 - } - }, - "minecraft:tropicalfish_pattern_yellow": { - "minecraft:color2": { - "value": 4 - } - }, - "minecraft:tropicalfish_pattern_lightgreen": { - "minecraft:color2": { - "value": 5 - } - }, - "minecraft:tropicalfish_pattern_pink": { - "minecraft:color2": { - "value": 6 - } - }, - "minecraft:tropicalfish_pattern_gray": { - "minecraft:color2": { - "value": 7 - } - }, - "minecraft:tropicalfish_pattern_silver": { - "minecraft:color2": { - "value": 8 - } - }, - "minecraft:tropicalfish_pattern_cyan": { - "minecraft:color2": { - "value": 9 - } - }, - "minecraft:tropicalfish_pattern_purple": { - "minecraft:color2": { - "value": 10 - } - }, - "minecraft:tropicalfish_pattern_blue": { - "minecraft:color2": { - "value": 11 - } - }, - "minecraft:tropicalfish_pattern_brown": { - "minecraft:color2": { - "value": 12 - } - }, - "minecraft:tropicalfish_pattern_green": { - "minecraft:color2": { - "value": 13 - } - }, - "minecraft:tropicalfish_pattern_red": { - "minecraft:color2": { - "value": 14 - } - }, - "minecraft:anenonme": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 1 - }, - "minecraft:color": { - "value": 1 - }, - "minecraft:color2": { - "value": 7 - } - }, - "minecraft:black_tang": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 0 - }, - "minecraft:color": { - "value": 7 - }, - "minecraft:color2": { - "value": 7 - } - }, - "minecraft:blue_dory": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 1 - }, - "minecraft:color": { - "value": 7 - }, - "minecraft:color2": { - "value": 3 - } - }, - "minecraft:butterfly_fish": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 4 - }, - "minecraft:color": { - "value": 0 - }, - "minecraft:color2": { - "value": 7 - } - }, - "minecraft:cichlid": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 1 - }, - "minecraft:color": { - "value": 11 - }, - "minecraft:color2": { - "value": 7 - } - }, - "minecraft:clownfish": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 0 - }, - "minecraft:color": { - "value": 1 - }, - "minecraft:color2": { - "value": 0 - } - }, - "minecraft:cc_betta": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 5 - }, - "minecraft:color": { - "value": 6 - }, - "minecraft:color2": { - "value": 3 - } - }, - "minecraft:dog_fish": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 3 - }, - "minecraft:color": { - "value": 10 - }, - "minecraft:color2": { - "value": 4 - } - }, - "minecraft:e_red_snapper": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 5 - }, - "minecraft:color": { - "value": 0 - }, - "minecraft:color2": { - "value": 14 - } - }, - "minecraft:goat_fish": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 5 - }, - "minecraft:color": { - "value": 0 - }, - "minecraft:color2": { - "value": 4 - } - }, - "minecraft:moorish_idol": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 2 - }, - "minecraft:color": { - "value": 0 - }, - "minecraft:color2": { - "value": 7 - } - }, - "minecraft:ornate_butterfly": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 5 - }, - "minecraft:color": { - "value": 0 - }, - "minecraft:color2": { - "value": 1 - } - }, - "minecraft:parrot_fish": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 3 - }, - "minecraft:color": { - "value": 9 - }, - "minecraft:color2": { - "value": 6 - } - }, - "minecraft:queen_angel_fish": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 4 - }, - "minecraft:color": { - "value": 5 - }, - "minecraft:color2": { - "value": 3 - } - }, - "minecraft:red_cichlid": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 4 - }, - "minecraft:color": { - "value": 14 - }, - "minecraft:color2": { - "value": 0 - } - }, - "minecraft:red_lipped_benny": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 2 - }, - "minecraft:color": { - "value": 7 - }, - "minecraft:color2": { - "value": 14 - } - }, - "minecraft:red_snapper": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 3 - }, - "minecraft:color": { - "value": 14 - }, - "minecraft:color2": { - "value": 0 - } - }, - "minecraft:threadfin": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 0 - }, - "minecraft:color": { - "value": 0 - }, - "minecraft:color2": { - "value": 4 - } - }, - "minecraft:tomato_clown": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 1 - }, - "minecraft:color": { - "value": 14 - }, - "minecraft:color2": { - "value": 0 - } - }, - "minecraft:triggerfish": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 1 - }, - "minecraft:color": { - "value": 7 - }, - "minecraft:color2": { - "value": 0 - } - }, - "minecraft:yellow_tang": { - "minecraft:variant": { - "value": 1 - }, - "minecraft:mark_variant": { - "value": 1 - }, - "minecraft:color": { - "value": 4 - }, - "minecraft:color2": { - "value": 4 - } - }, - "minecraft:yellowtail_parrot": { - "minecraft:variant": { - "value": 0 - }, - "minecraft:mark_variant": { - "value": 3 - }, - "minecraft:color": { - "value": 9 - }, - "minecraft:color2": { - "value": 4 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:type_family": { - "family": ["tropicalfish", "fish"] - }, - "minecraft:collision_box": { - "width": 0.4, - "height": 0.4 - }, - "minecraft:health": { - "value": 3, - "max": 3 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:loot": { - "table": "loot_tables/entities/tropicalfish.json" - }, - "minecraft:scale": { - "value": 1.3 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_air": false, - "breathes_water": true - }, - "minecraft:movement": { - "value": 0.12 - }, - "minecraft:underwater_movement": { - "value": 0.12 - }, - "minecraft:navigation.generic": { - "is_amphibious": false, - "can_path_over_water": false, - "can_swim": true, - "can_walk": false, - "can_breach": false, - "can_sink": false - }, - "minecraft:movement.sway": { - "sway_amplitude": 0 - }, - "minecraft:physics": { - "has_gravity": false - }, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:despawn": { - "despawn_from_distance": { - "min_distance": 32, - "max_distance": 40 - } - }, - "minecraft:behavior.swim_idle": { - "priority": 5, - "idle_time": 5, - "success_rate": 0.1 - }, - "minecraft:behavior.random_swim": { - "priority": 3, - "speed_multiplier": 1, - "xz_dist": 16, - "y_dist": 4, - "interval": 0 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 1, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "axolotl" - } - ] - }, - "max_dist": 6, - "walk_speed_multiplier": 1.5, - "sprint_speed_multiplier": 2 - } - ] - }, - "minecraft:behavior.swim_wander": { - "priority": 4, - "interval": 0.1, - "look_ahead": 2, - "speed_multiplier": 1, - "wander_time": 5 - }, - "minecraft:flocking": { - "in_water": true, - "match_variants": true, - "use_center_of_mass": false, - "low_flock_limit": 4, - "high_flock_limit": 8, - "goal_weight": 2, - "loner_chance": 0.1, - "influence_radius": 3, - "breach_influence": 7, - "separation_weight": 0.65, - "separation_threshold": 0.15, - "cohesion_weight": 2.75, - "cohesion_threshold": 1.5, - "innner_cohesion_threshold": 1.5, - "min_height": 1.5, - "max_height": 6, - "block_distance": 2, - "block_weight": 0.85 - }, - "minecraft:nameable": {}, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:become_anenonme": { - "add": { - "component_groups": ["minecraft:anenonme"] - } - }, - "minecraft:become_black_tang": { - "add": { - "component_groups": ["minecraft:black_tang"] - } - }, - "minecraft:become_blue_dory": { - "add": { - "component_groups": ["minecraft:blue_dory"] - } - }, - "minecraft:become_butterfly_fish": { - "add": { - "component_groups": ["minecraft:butterfly_fish"] - } - }, - "minecraft:become_cichlid": { - "add": { - "component_groups": ["minecraft:cichlid"] - } - }, - "minecraft:become_clownfish": { - "add": { - "component_groups": ["minecraft:clownfish"] - } - }, - "minecraft:become_cc_betta": { - "add": { - "component_groups": ["minecraft:cc_betta"] - } - }, - "minecraft:become_dog_fish": { - "add": { - "component_groups": ["minecraft:dog_fish"] - } - }, - "minecraft:become_e_red_snapper": { - "add": { - "component_groups": ["minecraft:e_red_snapper"] - } - }, - "minecraft:become_goat_fish": { - "add": { - "component_groups": ["minecraft:goat_fish"] - } - }, - "minecraft:become_moorish_idol": { - "add": { - "component_groups": ["minecraft:moorish_idol"] - } - }, - "minecraft:become_ornate_butterfly": { - "add": { - "component_groups": ["minecraft:ornate_butterfly"] - } - }, - "minecraft:become_parrot_fish": { - "add": { - "component_groups": ["minecraft:parrot_fish"] - } - }, - "minecraft:become_queen_angel_fish": { - "add": { - "component_groups": ["minecraft:queen_angel_fish"] - } - }, - "minecraft:become_red_cichlid": { - "add": { - "component_groups": ["minecraft:red_cichlid"] - } - }, - "minecraft:become_red_lipped_benny": { - "add": { - "component_groups": ["minecraft:red_lipped_benny"] - } - }, - "minecraft:become_red_snapper": { - "add": { - "component_groups": ["minecraft:red_snapper"] - } - }, - "minecraft:become_threadfin": { - "add": { - "component_groups": ["minecraft:threadfin"] - } - }, - "minecraft:become_tomato_clown": { - "add": { - "component_groups": ["minecraft:tomato_clown"] - } - }, - "minecraft:become_triggerfish": { - "add": { - "component_groups": ["minecraft:triggerfish"] - } - }, - "minecraft:become_yellow_tang": { - "add": { - "component_groups": ["minecraft:yellow_tang"] - } - }, - "minecraft:become_yellow_tail_parrot": { - "add": { - "component_groups": ["minecraft:yellow_tail_parrot"] - } - }, - "minecraft:entity_spawned": { - "sequence": [ - { - "add": { - "component_groups": ["adult"] - } - }, - { - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_variant_a"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_variant_b"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_variant_pattern_1"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_variant_pattern_2"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_variant_pattern_3"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_variant_pattern_4"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_variant_pattern_5"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_variant_pattern_6"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_white"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_orange"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_magenta"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_lightblue"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_yellow"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_lightgreen"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_pink"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_gray"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_silver"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_cyan"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_purple"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_blue"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_brown"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_green"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_base_red"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_white"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_orange"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_magenta"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_lightblue"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_yellow"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_lightgreen"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_pink"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_gray"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_silver"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_cyan"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_purple"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_blue"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_brown"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_green"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:tropicalfish_pattern_red"] - } - } - ] - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/turtle.json b/build/entities/turtle.json deleted file mode 100644 index ef69adb..0000000 --- a/build/entities/turtle.json +++ /dev/null @@ -1,273 +0,0 @@ -{ - "format_version": "1.18.20", - "minecraft:entity": { - "description": { - "identifier": "minecraft:turtle", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:baby": { - "minecraft:type_family": { - "family": ["turtle", "baby_turtle", "mob"] - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 0.2 - }, - "minecraft:underwater_movement": { - "value": 0.06 - }, - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.16 - }, - "minecraft:behavior.move_to_water": { - "priority": 1, - "search_range": 15, - "search_height": 5, - "goal_radius": 0.1 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["seagrass"], - "drop_items": ["turtle_shell_piece"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - } - }, - "minecraft:adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:type_family": { - "family": ["turtle", "mob"] - }, - "minecraft:collision_box": { - "width": 1.2, - "height": 0.4 - }, - "minecraft:underwater_movement": { - "value": 0.12 - }, - "minecraft:loot": { - "table": "loot_tables/entities/sea_turtle.json" - }, - "minecraft:breedable": { - "require_tame": false, - "causes_pregnancy": true, - "breeds_with": { - "mate_type": "minecraft:turtle", - "baby_type": "minecraft:turtle", - "breed_event": { - "event": "minecraft:become_pregnant", - "target": "self" - } - }, - "breed_items": ["seagrass"] - }, - "minecraft:behavior.breed": { - "priority": 2, - "speed_multiplier": 1 - }, - "minecraft:behavior.move_to_land": { - "priority": 6, - "search_range": 16, - "search_height": 5, - "goal_radius": 0.5 - }, - "minecraft:behavior.random_stroll": { - "priority": 9, - "interval": 100 - } - }, - "minecraft:pregnant": { - "minecraft:behavior.go_home": { - "priority": 1, - "speed_multiplier": 1, - "interval": 700, - "goal_radius": 4, - "on_home": [ - { - "event": "minecraft:go_lay_egg", - "target": "self" - } - ] - } - }, - "minecraft:wants_to_lay_egg": { - "minecraft:behavior.lay_egg": { - "priority": 1, - "speed_multiplier": 1, - "search_range": 16, - "search_height": 4, - "goal_radius": 1.5, - "on_lay": { - "event": "minecraft:laid_egg", - "target": "self" - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true, - "breathes_air": true, - "generates_bubbles": false - }, - "minecraft:nameable": {}, - "minecraft:health": { - "value": 30 - }, - "minecraft:damage_sensor": { - "triggers": { - "cause": "lightning", - "deals_damage": true, - "damage_multiplier": 2000 - } - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.1 - }, - "minecraft:water_movement": { - "drag_factor": 0.9 - }, - "minecraft:navigation.generic": { - "is_amphibious": true, - "can_path_over_water": false, - "can_swim": true, - "can_walk": true, - "can_sink": false, - "avoid_damage_blocks": true - }, - "minecraft:movement.amphibious": { - "max_turn": 5 - }, - "minecraft:jump.static": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:home": {}, - "minecraft:follow_range": { - "value": 1024 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.panic": { - "priority": 0, - "prefer_water": true, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.tempt": { - "priority": 3, - "speed_multiplier": 1.1, - "can_tempt_vertically": true, - "items": ["seagrass"] - }, - "minecraft:behavior.move_to_water": { - "priority": 4, - "search_range": 16, - "search_height": 5, - "goal_radius": 1.5 - }, - "minecraft:behavior.random_swim": { - "priority": 7, - "interval": 0, - "xz_dist": 30, - "y_dist": 15 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "target_distance": 6, - "probability": 0.02 - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 9, - "add": { - "component_groups": ["minecraft:adult"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["minecraft:baby"] - } - } - ] - }, - "minecraft:entity_born": { - "add": { - "component_groups": ["minecraft:baby"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:baby"] - }, - "add": { - "component_groups": ["minecraft:adult"] - } - }, - "minecraft:become_pregnant": { - "add": { - "component_groups": ["minecraft:pregnant"] - } - }, - "minecraft:go_lay_egg": { - "add": { - "component_groups": ["minecraft:wants_to_lay_egg"] - }, - "remove": { - "component_groups": ["minecraft:pregnant"] - } - }, - "minecraft:laid_egg": { - "remove": { - "component_groups": ["minecraft:wants_to_lay_egg"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/vex.json b/build/entities/vex.json deleted file mode 100644 index 05be9ab..0000000 --- a/build/entities/vex.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:vex", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["vex", "monster", "mob"] - }, - "minecraft:equipment": { - "table": "loot_tables/entities/vex_gear.json" - }, - "minecraft:health": { - "value": 14, - "max": 14 - }, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:collision_box": { - "width": 0.4, - "height": 0.8 - }, - "minecraft:movement": { - "value": 1 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:fire_immune": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.charge_attack": { - "priority": 4 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 3, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - "max_dist": 70 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - } - ] - }, - "max_dist": 70 - } - ], - "must_see": true - }, - "minecraft:behavior.look_at_player": { - "priority": 9, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.look_at_entity": { - "priority": 9, - "look_distance": 6, - "probability": 0.02, - "filters": { - "test": "is_family", - "subject": "other", - "value": "mob" - } - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:physics": { - "has_gravity": false, - "has_collision": false - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:game_event_movement_tracking": { - "emit_move": false, - "emit_swim": false - } - } - } -} diff --git a/build/entities/villager.json b/build/entities/villager.json deleted file mode 100644 index 1f2f75a..0000000 --- a/build/entities/villager.json +++ /dev/null @@ -1,1074 +0,0 @@ -{ - "format_version": "1.19.60", - "minecraft:entity": { - "description": { - "identifier": "minecraft:villager", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:celebrate": { - "minecraft:behavior.celebrate_survive": { - "priority": 5, - "fireworks_interval": { - "range_min": 2, - "range_max": 7 - }, - "duration": 30, - "on_celebration_end_event": { - "event": "minecraft:stop_celebrating", - "target": "self" - } - }, - "minecraft:behavior.move_outdoors": { - "priority": 2, - "speed_multiplier": 0.8, - "timeout_cooldown": 8 - } - }, - "become_witch": { - "minecraft:transformation": { - "into": "minecraft:witch", - "delay": 0.5 - } - }, - "become_villager_v2": { - "minecraft:transformation": { - "into": "minecraft:villager_v2", - "keep_level": true - } - }, - "become_zombie": { - "minecraft:transformation": { - "into": "minecraft:zombie_villager" - } - }, - "behavior_peasant": { - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:bread", - "want_amount": 3, - "surplus_amount": 6, - "stored_in_inventory": true - }, - { - "item": "minecraft:carrot", - "want_amount": 60, - "surplus_amount": 4, - "stored_in_inventory": true - }, - { - "item": "minecraft:potato", - "want_amount": 60, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:beetroot", - "want_amount": 60, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:wheat_seeds", - "want_amount": 64, - "surplus_amount": 64, - "stored_in_inventory": true, - "pickup_only": true - }, - { - "item": "minecraft:beetroot_seeds", - "want_amount": 64, - "surplus_amount": 64, - "stored_in_inventory": true, - "pickup_only": true - }, - { - "item": "minecraft:wheat", - "want_amount": 45, - "surplus_amount": 18, - "craft_into": "minecraft:bread", - "stored_in_inventory": true - } - ] - }, - "minecraft:behavior.harvest_farm_block": { - "priority": 9, - "speed_multiplier": 0.5 - } - }, - "behavior_non_peasant": { - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:bread", - "want_amount": 3, - "surplus_amount": 6, - "stored_in_inventory": true - }, - { - "item": "minecraft:carrot", - "want_amount": 12, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:potato", - "want_amount": 12, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:beetroot", - "want_amount": 12, - "surplus_amount": 24, - "stored_in_inventory": true - } - ] - } - }, - "farmer": { - "minecraft:type_family": { - "family": ["villager", "peasant", "farmer", "mob"] - }, - "minecraft:variant": { - "value": 0 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.farmer", - "table": "trading/farmer_trades.json", - "convert_trades_economy": true - } - }, - "fisherman": { - "minecraft:type_family": { - "family": ["villager", "peasant", "fisherman", "mob"] - }, - "minecraft:variant": { - "value": 0 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.fisherman", - "table": "trading/fisherman_trades.json", - "convert_trades_economy": true - } - }, - "shepherd": { - "minecraft:type_family": { - "family": ["villager", "peasant", "shepherd", "mob"] - }, - "minecraft:variant": { - "value": 0 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.shepherd", - "table": "trading/shepherd_trades.json", - "convert_trades_economy": true - } - }, - "fletcher": { - "minecraft:type_family": { - "family": ["villager", "peasant", "fletcher", "mob"] - }, - "minecraft:variant": { - "value": 0 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.fletcher", - "table": "trading/fletcher_trades.json", - "convert_trades_economy": true - } - }, - "librarian": { - "minecraft:type_family": { - "family": ["villager", "librarian", "mob"] - }, - "minecraft:variant": { - "value": 1 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.librarian", - "table": "trading/librarian_trades.json", - "convert_trades_economy": true - } - }, - "cartographer": { - "minecraft:type_family": { - "family": ["villager", "cartographer", "mob"] - }, - "minecraft:variant": { - "value": 1 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.cartographer", - "table": "trading/cartographer_trades.json", - "convert_trades_economy": true - } - }, - "cleric": { - "minecraft:type_family": { - "family": ["villager", "priest", "cleric", "mob"] - }, - "minecraft:variant": { - "value": 2 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.cleric", - "table": "trading/cleric_trades.json", - "convert_trades_economy": true - } - }, - "armorer": { - "minecraft:type_family": { - "family": ["villager", "blacksmith", "armorer", "mob"] - }, - "minecraft:variant": { - "value": 3 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.armor", - "table": "trading/armorer_trades.json", - "convert_trades_economy": true - } - }, - "weaponsmith": { - "minecraft:type_family": { - "family": ["villager", "blacksmith", "weaponsmith", "mob"] - }, - "minecraft:variant": { - "value": 3 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.weapon", - "table": "trading/weapon_smith_trades.json", - "convert_trades_economy": true - } - }, - "toolsmith": { - "minecraft:type_family": { - "family": ["villager", "blacksmith", "toolsmith", "mob"] - }, - "minecraft:variant": { - "value": 3 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.tool", - "table": "trading/tool_smith_trades.json", - "convert_trades_economy": true - } - }, - "butcher": { - "minecraft:type_family": { - "family": ["villager", "artisan", "butcher", "mob"] - }, - "minecraft:variant": { - "value": 4 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.butcher", - "table": "trading/butcher_trades.json", - "convert_trades_economy": true - } - }, - "leatherworker": { - "minecraft:type_family": { - "family": ["villager", "artisan", "leatherworker", "mob"] - }, - "minecraft:variant": { - "value": 4 - }, - "minecraft:trade_table": { - "display_name": "entity.villager.leather", - "table": "trading/leather_worker_trades.json", - "convert_trades_economy": true - } - }, - "baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.take_flower": { - "priority": 7, - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": true - } - ] - } - }, - "minecraft:behavior.play": { - "priority": 8, - "speed_multiplier": 0.32 - } - }, - "adult": { - "minecraft:behavior.make_love": { - "priority": 6 - }, - "minecraft:behavior.receive_love": { - "priority": 7 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["villager", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:nameable": {}, - "minecraft:movement": { - "value": 0.5 - }, - "minecraft:navigation.walk": { - "is_amphibious": true, - "can_path_over_water": true, - "can_pass_doors": true, - "can_open_doors": true, - "can_walk": true, - "avoid_water": true - }, - "minecraft:annotation.open_door": {}, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:inventory": { - "inventory_size": 8, - "private": true - }, - "minecraft:damage_sensor": { - "triggers": [ - { - "on_damage": { - "filters": { - "test": "is_family", - "subject": "other", - "value": "lightning" - }, - "event": "become_witch" - }, - "deals_damage": false - }, - { - "on_damage": { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "zombie" - }, - { - "test": "is_family", - "subject": "other", - "value": "husk" - } - ], - "all_of": [ - { - "test": "has_damage", - "value": "fatal" - } - ] - }, - "event": "become_zombie" - } - } - ] - }, - "minecraft:persistent": {}, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.trade_with_player": { - "priority": 1, - "filters": { - "all_of": [ - { - "all_of": [ - { - "test": "in_water", - "value": false - } - ] - }, - { - "any_of": [ - { - "test": "on_ground", - "value": true - }, - { - "test": "is_sleeping", - "value": true - } - ] - } - ] - } - }, - "minecraft:behavior.look_at_trading_player": { - "priority": 2 - }, - "minecraft:behavior.panic": { - "priority": 3, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 3, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "zombie" - }, - { - "test": "is_family", - "subject": "other", - "value": "zombie_villager" - }, - { - "test": "is_family", - "subject": "other", - "value": "illager" - }, - { - "test": "is_family", - "subject": "other", - "value": "vex" - } - ] - }, - "max_dist": 8, - "walk_speed_multiplier": 0.6, - "sprint_speed_multiplier": 0.6 - } - ] - }, - "minecraft:behavior.move_indoors": { - "priority": 4, - "speed_multiplier": 0.8 - }, - "minecraft:behavior.restrict_open_door": { - "priority": 5 - }, - "minecraft:behavior.open_door": { - "priority": 6, - "close_door_after": true - }, - "minecraft:behavior.share_items": { - "priority": 8, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 0.5, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "villager" - } - } - ] - }, - "minecraft:behavior.pickup_items": { - "priority": 9, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 0.5, - "can_pickup_to_hand_or_equipment": false - }, - "minecraft:behavior.random_stroll": { - "priority": 11, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.look_at_player": { - "priority": 12, - "look_distance": 8, - "probability": 0.02 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "become_witch": { - "add": { - "component_groups": ["become_witch"] - } - }, - "become_zombie": { - "sequence": [ - { - "filters": { - "test": "is_difficulty", - "value": "normal" - }, - "randomize": [ - { - "weight": 50, - "add": { - "component_groups": ["become_zombie"] - } - }, - { - "weight": 50 - } - ] - }, - { - "filters": { - "test": "is_difficulty", - "value": "hard" - }, - "add": { - "component_groups": ["become_zombie"] - } - } - ] - }, - "minecraft:entity_spawned": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 5, - "add": { - "component_groups": ["baby"] - } - }, - { - "weight": 95, - "add": { - "component_groups": ["adult"] - } - } - ] - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 5, - "add": { - "component_groups": ["farmer", "behavior_peasant"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fisherman", "behavior_peasant"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["shepherd", "behavior_peasant"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fletcher", "behavior_peasant"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["librarian", "behavior_non_peasant"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cartographer", "behavior_non_peasant"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cleric", "behavior_non_peasant"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["armorer", "behavior_non_peasant"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["weaponsmith", "behavior_non_peasant"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["toolsmith", "behavior_non_peasant"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["butcher", "behavior_non_peasant"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["leatherworker", "behavior_non_peasant"] - } - } - ] - } - ] - }, - "minecraft:entity_transformed": { - "sequence": [ - { - "filters": { - "test": "has_component", - "subject": "other", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["baby"] - } - }, - { - "filters": { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["adult"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "farmer" - }, - "add": { - "component_groups": ["farmer", "behavior_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "fisherman" - }, - "add": { - "component_groups": ["fisherman", "behavior_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "shepherd" - }, - "add": { - "component_groups": ["shepherd", "behavior_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "fletcher" - }, - "add": { - "component_groups": ["fletcher", "behavior_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "librarian" - }, - "add": { - "component_groups": ["librarian", "behavior_non_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cartographer" - }, - "add": { - "component_groups": ["cartographer", "behavior_non_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cleric" - }, - "add": { - "component_groups": ["cleric", "behavior_non_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "armorer" - }, - "add": { - "component_groups": ["armorer", "behavior_non_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "weaponsmith" - }, - "add": { - "component_groups": ["weaponsmith", "behavior_non_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "toolsmith" - }, - "add": { - "component_groups": ["toolsmith", "behavior_non_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "butcher" - }, - "add": { - "component_groups": ["butcher", "behavior_non_peasant"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "leatherworker" - }, - "add": { - "component_groups": ["leatherworker", "behavior_non_peasant"] - } - } - ] - }, - "minecraft:entity_born": { - "sequence": [ - { - "add": { - "component_groups": ["baby"] - } - }, - { - "randomize": [ - { - "weight": 5, - "add": { - "component_groups": ["farmer", "behavior_peasant"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fisherman", "behavior_peasant"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["shepherd", "behavior_peasant"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fletcher", "behavior_peasant"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["librarian", "behavior_non_peasant"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cartographer", "behavior_non_peasant"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cleric", "behavior_non_peasant"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["armorer", "behavior_non_peasant"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["weaponsmith", "behavior_non_peasant"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["toolsmith", "behavior_non_peasant"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["butcher", "behavior_non_peasant"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["leatherworker", "behavior_non_peasant"] - } - } - ] - } - ] - }, - "minecraft:spawn_farmer": { - "randomize": [ - { - "weight": 5, - "add": { - "component_groups": ["farmer", "adult", "behavior_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fisherman", "adult", "behavior_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["shepherd", "adult", "behavior_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fletcher", "adult", "behavior_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - } - ] - }, - "minecraft:spawn_librarian": { - "randomize": [ - { - "weight": 20, - "add": { - "component_groups": ["librarian", "adult", "behavior_non_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cartographer", "behavior_non_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - } - ] - }, - "minecraft:spawn_cleric": { - "add": { - "component_groups": ["cleric", "adult", "behavior_non_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - }, - "minecraft:spawn_armorer": { - "randomize": [ - { - "weight": 6, - "add": { - "component_groups": ["armorer", "adult", "behavior_non_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["weaponsmith", "adult", "behavior_non_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["toolsmith", "adult", "behavior_non_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - } - ] - }, - "minecraft:spawn_butcher": { - "randomize": [ - { - "weight": 10, - "add": { - "component_groups": ["butcher", "adult", "behavior_non_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["leatherworker", "adult", "behavior_non_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - } - ] - }, - "minecraft:ageable_grow_up": { - "sequence": [ - { - "remove": { - "component_groups": ["baby"] - }, - "add": { - "component_groups": ["adult"] - } - } - ] - }, - "minecraft:become_cleric": { - "add": { - "component_groups": ["cleric", "adult", "behavior_non_peasant"] - }, - "remove": { - "component_groups": ["baby"] - } - }, - "minecraft:start_celebrating": { - "add": { - "component_groups": ["minecraft:celebrate"] - } - }, - "minecraft:stop_celebrating": { - "remove": { - "component_groups": ["minecraft:celebrate"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/villager_v2.json b/build/entities/villager_v2.json deleted file mode 100644 index 66d1caa..0000000 --- a/build/entities/villager_v2.json +++ /dev/null @@ -1,3301 +0,0 @@ -{ - "format_version": "1.19.60", - "minecraft:entity": { - "description": { - "identifier": "minecraft:villager_v2", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:celebrate": { - "minecraft:behavior.celebrate_survive": { - "priority": 5, - "fireworks_interval": { - "range_min": 2, - "range_max": 7 - }, - "duration": 30, - "on_celebration_end_event": { - "event": "minecraft:stop_celebrating", - "target": "self" - } - }, - "minecraft:behavior.move_outdoors": { - "priority": 2, - "speed_multiplier": 0.8, - "timeout_cooldown": 8 - } - }, - "trade_resupply_component_group": { - "minecraft:trade_resupply": {} - }, - "become_witch": { - "minecraft:transformation": { - "into": "minecraft:witch", - "delay": 0.5 - } - }, - "become_zombie": { - "minecraft:transformation": { - "into": "minecraft:zombie_villager_v2", - "keep_level": true - } - }, - "work_schedule": { - "minecraft:scheduler": { - "min_delay_secs": 0, - "max_delay_secs": 10, - "scheduled_events": [ - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 0 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 8000 - } - ] - }, - "event": "minecraft:schedule_work_pro_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 8000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 10000 - } - ] - }, - "event": "minecraft:schedule_gather_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 10000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 11000 - } - ] - }, - "event": "minecraft:schedule_work_pro_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 11000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 12000 - } - ] - }, - "event": "minecraft:schedule_home_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 12000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 24000 - } - ] - }, - "event": "minecraft:schedule_bed_villager" - } - ] - } - }, - "basic_schedule": { - "minecraft:scheduler": { - "min_delay_secs": 0, - "max_delay_secs": 10, - "scheduled_events": [ - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 0 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 8000 - } - ] - }, - "event": "minecraft:schedule_wander_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 8000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 10000 - } - ] - }, - "event": "minecraft:schedule_gather_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 10000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 11000 - } - ] - }, - "event": "minecraft:schedule_wander_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 11000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 12000 - } - ] - }, - "event": "minecraft:schedule_home_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 12000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 24000 - } - ] - }, - "event": "minecraft:schedule_bed_villager" - } - ] - } - }, - "child_schedule": { - "minecraft:scheduler": { - "min_delay_secs": 0, - "max_delay_secs": 10, - "scheduled_events": [ - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 0 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 11000 - } - ] - }, - "event": "minecraft:schedule_play_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 11000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 12000 - } - ] - }, - "event": "minecraft:schedule_home_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 12000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 24000 - } - ] - }, - "event": "minecraft:schedule_bed_villager" - } - ] - } - }, - "jobless_schedule": { - "minecraft:scheduler": { - "min_delay_secs": 0, - "max_delay_secs": 10, - "scheduled_events": [ - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 2000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 13000 - } - ] - }, - "event": "minecraft:schedule_wander_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 13000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 14000 - } - ] - }, - "event": "minecraft:schedule_home_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 14000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 24000 - } - ] - }, - "event": "minecraft:schedule_bed_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 0 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 2000 - } - ] - }, - "event": "minecraft:schedule_bed_villager" - } - ] - } - }, - "fisher_schedule": { - "minecraft:scheduler": { - "min_delay_secs": 0, - "max_delay_secs": 10, - "scheduled_events": [ - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 0 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 8000 - } - ] - }, - "event": "minecraft:schedule_work_fisher" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 8000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 10000 - } - ] - }, - "event": "minecraft:schedule_gather_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 10000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 11000 - } - ] - }, - "event": "minecraft:schedule_work_fisher" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 11000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 12000 - } - ] - }, - "event": "minecraft:schedule_home_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 12000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 24000 - } - ] - }, - "event": "minecraft:schedule_bed_villager" - } - ] - } - }, - "librarian_schedule": { - "minecraft:scheduler": { - "min_delay_secs": 0, - "max_delay_secs": 10, - "scheduled_events": [ - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 0 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 8000 - } - ] - }, - "event": "minecraft:schedule_work_librarian" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 8000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 10000 - } - ] - }, - "event": "minecraft:schedule_gather_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 10000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 11000 - } - ] - }, - "event": "minecraft:schedule_work_librarian" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 11000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 12000 - } - ] - }, - "event": "minecraft:schedule_home_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 12000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 24000 - } - ] - }, - "event": "minecraft:schedule_bed_villager" - } - ] - } - }, - "farmer_schedule": { - "minecraft:scheduler": { - "min_delay_secs": 0, - "max_delay_secs": 10, - "scheduled_events": [ - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 0 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 8000 - } - ] - }, - "event": "minecraft:schedule_work_farmer" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 8000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 10000 - } - ] - }, - "event": "minecraft:schedule_gather_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 10000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 11000 - } - ] - }, - "event": "minecraft:schedule_work_farmer" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 11000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 12000 - } - ] - }, - "event": "minecraft:schedule_home_villager" - }, - { - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 12000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 24000 - } - ] - }, - "event": "minecraft:schedule_bed_villager" - } - ] - } - }, - "job_specific_goals": { - "minecraft:behavior.inspect_bookshelf": {}, - "minecraft:behavior.harvest_farm_block": {}, - "minecraft:behavior.explore_outskirts": {}, - "minecraft:behavior.work": {}, - "minecraft:behavior.work_composter": {}, - "minecraft:behavior.mingle": {}, - "minecraft:behavior.sleep": {} - }, - "work_schedule_villager": { - "minecraft:behavior.work": { - "priority": 7, - "active_time": 250, - "speed_multiplier": 0.5, - "goal_cooldown": 200, - "sound_delay_min": 100, - "sound_delay_max": 200, - "can_work_in_rain": false, - "work_in_rain_tolerance": 100, - "on_arrival": { - "event": "minecraft:resupply_trades", - "target": "self" - } - } - }, - "work_schedule_fisher": { - "minecraft:behavior.work": { - "priority": 7, - "active_time": 250, - "speed_multiplier": 0.5, - "goal_cooldown": 200, - "sound_delay_min": 100, - "sound_delay_max": 200, - "can_work_in_rain": false, - "work_in_rain_tolerance": 100, - "on_arrival": { - "event": "minecraft:resupply_trades", - "target": "self" - } - } - }, - "work_schedule_farmer": { - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:bread", - "want_amount": 3, - "surplus_amount": 6, - "stored_in_inventory": true - }, - { - "item": "minecraft:carrot", - "want_amount": 60, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:potato", - "want_amount": 60, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:beetroot", - "want_amount": 60, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:wheat_seeds", - "want_amount": 64, - "surplus_amount": 64, - "stored_in_inventory": true, - "pickup_only": true - }, - { - "item": "minecraft:beetroot_seeds", - "want_amount": 64, - "surplus_amount": 64, - "stored_in_inventory": true, - "pickup_only": true - }, - { - "item": "minecraft:torchflower_seeds", - "want_amount": 64, - "surplus_amount": 64, - "stored_in_inventory": true, - "pickup_only": true - }, - { - "item": "minecraft:pitcher_pod", - "want_amount": 64, - "surplus_amount": 64, - "stored_in_inventory": true, - "pickup_only": true - }, - { - "item": "minecraft:bone_meal", - "want_amount": 64, - "surplus_amount": 64, - "stored_in_inventory": true - }, - { - "item": "minecraft:wheat", - "want_amount": 45, - "surplus_amount": 18, - "craft_into": "minecraft:bread", - "stored_in_inventory": true - } - ] - }, - "minecraft:behavior.work_composter": { - "priority": 9, - "active_time": 250, - "speed_multiplier": 0.5, - "goal_cooldown": 200, - "can_work_in_rain": false, - "work_in_rain_tolerance": 100, - "on_arrival": { - "event": "minecraft:resupply_trades", - "target": "self" - } - }, - "minecraft:behavior.harvest_farm_block": { - "priority": 7 - }, - "minecraft:behavior.fertilize_farm_block": { - "priority": 8 - } - }, - "work_schedule_librarian": { - "minecraft:behavior.work": { - "priority": 7, - "active_time": 250, - "speed_multiplier": 0.5, - "goal_cooldown": 200, - "sound_delay_min": 100, - "sound_delay_max": 200, - "can_work_in_rain": false, - "work_in_rain_tolerance": 100, - "on_arrival": { - "event": "minecraft:resupply_trades", - "target": "self" - } - }, - "minecraft:behavior.inspect_bookshelf": { - "priority": 8, - "speed_multiplier": 0.6, - "search_range": 4, - "search_height": 3, - "goal_radius": 0.8, - "search_count": 0 - } - }, - "play_schedule_villager": { - "minecraft:behavior.play": { - "priority": 8, - "speed_multiplier": 0.6, - "friend_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "is_baby", - "subject": "other", - "operator": "==", - "value": true - } - ] - } - } - ] - } - }, - "gather_schedule_villager": { - "minecraft:behavior.mingle": { - "priority": 7, - "speed_multiplier": 0.5, - "duration": 30, - "cooldown_time": 10, - "mingle_partner_type": "minecraft:villager_v2", - "mingle_distance": 2 - } - }, - "home_schedule_villager": {}, - "bed_schedule_villager": { - "minecraft:behavior.sleep": { - "priority": 3, - "goal_radius": 1.5, - "speed_multiplier": 0.6, - "sleep_collider_height": 0.3, - "sleep_collider_width": 1, - "sleep_y_offset": 0.6, - "timeout_cooldown": 10 - } - }, - "wander_schedule_villager": { - "minecraft:behavior.explore_outskirts": { - "priority": 9, - "next_xz": 5, - "next_y": 3, - "min_wait_time": 3, - "max_wait_time": 10, - "max_travel_time": 60, - "speed_multiplier": 0.6, - "explore_dist": 6, - "min_perimeter": 1, - "min_dist_from_target": 2.5, - "timer_ratio": 2, - "dist_from_boundary": [5, 0, 5] - } - }, - "behavior_peasant": { - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:bread", - "want_amount": 3, - "surplus_amount": 6, - "stored_in_inventory": true - }, - { - "item": "minecraft:carrot", - "want_amount": 60, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:potato", - "want_amount": 60, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:beetroot", - "want_amount": 60, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:wheat_seeds", - "want_amount": 64, - "surplus_amount": 64, - "stored_in_inventory": true, - "pickup_only": true - }, - { - "item": "minecraft:beetroot_seeds", - "want_amount": 64, - "surplus_amount": 64, - "stored_in_inventory": true, - "pickup_only": true - }, - { - "item": "minecraft:wheat", - "want_amount": 45, - "surplus_amount": 18, - "craft_into": "minecraft:bread", - "stored_in_inventory": true - } - ] - } - }, - "behavior_non_peasant": { - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:bread", - "want_amount": 3, - "surplus_amount": 6, - "stored_in_inventory": true - }, - { - "item": "minecraft:carrot", - "want_amount": 12, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:potato", - "want_amount": 12, - "surplus_amount": 24, - "stored_in_inventory": true - }, - { - "item": "minecraft:beetroot", - "want_amount": 12, - "surplus_amount": 24, - "stored_in_inventory": true - } - ] - } - }, - "trade_components": { - "minecraft:behavior.trade_interest": {}, - "minecraft:economy_trade_table": {} - }, - "unskilled": { - "minecraft:type_family": { - "family": ["villager", "peasant", "unskilled", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "farmer": { - "minecraft:type_family": { - "family": ["villager", "peasant", "farmer", "mob"] - }, - "minecraft:variant": { - "value": 1 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.farmer", - "table": "trading/economy_trades/farmer_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "farmer", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "fisherman": { - "minecraft:type_family": { - "family": ["villager", "peasant", "fisherman", "mob"] - }, - "minecraft:variant": { - "value": 2 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.fisherman", - "table": "trading/economy_trades/fisherman_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "fisherman", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "shepherd": { - "minecraft:type_family": { - "family": ["villager", "peasant", "shepherd", "mob"] - }, - "minecraft:variant": { - "value": 3 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.shepherd", - "table": "trading/economy_trades/shepherd_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "shepherd", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "fletcher": { - "minecraft:type_family": { - "family": ["villager", "peasant", "fletcher", "mob"] - }, - "minecraft:variant": { - "value": 4 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.fletcher", - "table": "trading/economy_trades/fletcher_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "fletcher", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "librarian": { - "minecraft:type_family": { - "family": ["villager", "librarian", "mob"] - }, - "minecraft:variant": { - "value": 5 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.librarian", - "table": "trading/economy_trades/librarian_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "librarian", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "cartographer": { - "minecraft:type_family": { - "family": ["villager", "cartographer", "mob"] - }, - "minecraft:variant": { - "value": 6 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.cartographer", - "table": "trading/economy_trades/cartographer_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "cartographer", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "cleric": { - "minecraft:type_family": { - "family": ["villager", "priest", "cleric", "mob"] - }, - "minecraft:variant": { - "value": 7 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.cleric", - "table": "trading/economy_trades/cleric_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "cleric", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "armorer": { - "minecraft:type_family": { - "family": ["villager", "blacksmith", "armorer", "mob"] - }, - "minecraft:variant": { - "value": 8 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.armor", - "table": "trading/economy_trades/armorer_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "armorer", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "weaponsmith": { - "minecraft:type_family": { - "family": ["villager", "blacksmith", "weaponsmith", "mob"] - }, - "minecraft:variant": { - "value": 9 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.weapon", - "table": "trading/economy_trades/weapon_smith_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "weaponsmith", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "toolsmith": { - "minecraft:type_family": { - "family": ["villager", "blacksmith", "toolsmith", "mob"] - }, - "minecraft:variant": { - "value": 10 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.tool", - "table": "trading/economy_trades/tool_smith_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "toolsmith", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "butcher": { - "minecraft:type_family": { - "family": ["villager", "artisan", "butcher", "mob"] - }, - "minecraft:variant": { - "value": 11 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.butcher", - "table": "trading/economy_trades/butcher_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "butcher", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "leatherworker": { - "minecraft:type_family": { - "family": ["villager", "artisan", "leatherworker", "mob"] - }, - "minecraft:variant": { - "value": 12 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.leather", - "table": "trading/economy_trades/leather_worker_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "leatherworker", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "mason": { - "minecraft:type_family": { - "family": ["villager", "artisan", "stone_mason", "mob"] - }, - "minecraft:variant": { - "value": 13 - }, - "minecraft:behavior.trade_interest": { - "priority": 5, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:economy_trade_table": { - "display_name": "entity.villager.mason", - "table": "trading/economy_trades/stone_mason_trades.json", - "new_screen": true, - "persist_trades": true, - "cured_discount": [-100, -100], - "max_cured_discount": [-500, -500] - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "preferred_profession": "mason", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - } - }, - "nitwit": { - "minecraft:type_family": { - "family": ["villager", "peasant", "nitwit", "mob"] - }, - "minecraft:variant": { - "value": 14 - } - }, - "baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.take_flower": { - "priority": 9, - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": true - } - ] - } - }, - "minecraft:preferred_path": { - "max_fall_blocks": 1, - "jump_cost": 5, - "default_block_cost": 1.5, - "preferred_path_blocks": [ - { - "cost": 0, - "blocks": ["grass_path"] - }, - { - "cost": 1, - "blocks": [ - "cobblestone", - "stone", - "stonebrick", - "sandstone", - "mossy_cobblestone", - "stone_slab", - "stone_slab2", - "stone_slab3", - "stone_slab4", - "double_stone_slab", - "double_stone_slab2", - "double_stone_slab3", - "double_stone_slab4", - "wooden_slab", - "double_wooden_slab", - "planks", - "brick_block", - "nether_brick", - "red_nether_brick", - "end_bricks", - "red_sandstone", - "stained_glass", - "glass", - "glowstone", - "prismarine", - "emerald_block", - "diamond_block", - "lapis_block", - "gold_block", - "redstone_block", - "purple_glazed_terracotta", - "white_glazed_terracotta", - "orange_glazed_terracotta", - "magenta_glazed_terracotta", - "light_blue_glazed_terracotta", - "yellow_glazed_terracotta", - "lime_glazed_terracotta", - "pink_glazed_terracotta", - "gray_glazed_terracotta", - "silver_glazed_terracotta", - "cyan_glazed_terracotta", - "blue_glazed_terracotta", - "brown_glazed_terracotta", - "green_glazed_terracotta", - "red_glazed_terracotta", - "black_glazed_terracotta" - ] - }, - { - "cost": 50, - "blocks": ["bed", "lectern", "composter", "grindstone", "blast_furnace", "smoker", "fletching_table", "cartography_table", "brewing_stand", "smithing_table", "cauldron", "barrel", "loom", "stonecutter"] - } - ] - } - }, - "make_and_receive_love": { - "minecraft:behavior.make_love": { - "priority": 5 - }, - "minecraft:behavior.receive_love": { - "priority": 6 - } - }, - "adult": { - "minecraft:preferred_path": { - "max_fall_blocks": 1, - "jump_cost": 20, - "default_block_cost": 3, - "preferred_path_blocks": [ - { - "cost": 0, - "blocks": ["grass_path"] - }, - { - "cost": 1, - "blocks": [ - "cobblestone", - "stone", - "stonebrick", - "sandstone", - "mossy_cobblestone", - "stone_slab", - "stone_slab2", - "stone_slab3", - "stone_slab4", - "double_stone_slab", - "double_stone_slab2", - "double_stone_slab3", - "double_stone_slab4", - "wooden_slab", - "double_wooden_slab", - "planks", - "brick_block", - "nether_brick", - "red_nether_brick", - "end_bricks", - "red_sandstone", - "stained_glass", - "glass", - "glowstone", - "prismarine", - "emerald_block", - "diamond_block", - "lapis_block", - "gold_block", - "redstone_block", - "purple_glazed_terracotta", - "white_glazed_terracotta", - "orange_glazed_terracotta", - "magenta_glazed_terracotta", - "light_blue_glazed_terracotta", - "yellow_glazed_terracotta", - "lime_glazed_terracotta", - "pink_glazed_terracotta", - "gray_glazed_terracotta", - "silver_glazed_terracotta", - "cyan_glazed_terracotta", - "blue_glazed_terracotta", - "brown_glazed_terracotta", - "green_glazed_terracotta", - "red_glazed_terracotta", - "black_glazed_terracotta" - ] - }, - { - "cost": 50, - "blocks": ["bed", "lectern", "composter", "grindstone", "blast_furnace", "smoker", "fletching_table", "cartography_table", "brewing_stand", "smithing_table", "cauldron", "barrel", "loom", "stonecutter"] - } - ] - } - }, - "villager_skin_0": { - "minecraft:skin_id": { - "value": 0 - } - }, - "villager_skin_1": { - "minecraft:skin_id": { - "value": 1 - } - }, - "villager_skin_2": { - "minecraft:skin_id": { - "value": 2 - } - }, - "villager_skin_3": { - "minecraft:skin_id": { - "value": 3 - } - }, - "villager_skin_4": { - "minecraft:skin_id": { - "value": 4 - } - }, - "villager_skin_5": { - "minecraft:skin_id": { - "value": 5 - } - }, - "desert_villager": { - "minecraft:mark_variant": { - "value": 1 - } - }, - "jungle_villager": { - "minecraft:mark_variant": { - "value": 2 - } - }, - "savanna_villager": { - "minecraft:mark_variant": { - "value": 3 - } - }, - "snow_villager": { - "minecraft:mark_variant": { - "value": 4 - } - }, - "swamp_villager": { - "minecraft:mark_variant": { - "value": 5 - } - }, - "taiga_villager": { - "minecraft:mark_variant": { - "value": 6 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["villager", "mob"] - }, - "minecraft:mark_variant": { - "value": 0 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:hide": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:nameable": {}, - "minecraft:movement": { - "value": 0.5 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "can_pass_doors": true, - "can_open_doors": true, - "avoid_water": true - }, - "minecraft:follow_range": { - "value": 128 - }, - "minecraft:annotation.open_door": {}, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:inventory": { - "inventory_size": 8, - "private": true - }, - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "inhabitant", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": true, - "can_migrate": true, - "first_founding_reward": 5 - }, - "minecraft:damage_sensor": { - "triggers": [ - { - "on_damage": { - "filters": [ - { - "test": "is_family", - "subject": "other", - "value": "lightning" - }, - { - "test": "is_difficulty", - "operator": "!=", - "value": "peaceful" - } - ], - "event": "become_witch" - }, - "deals_damage": false - }, - { - "on_damage": { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "zombie" - }, - { - "test": "is_family", - "subject": "other", - "value": "husk" - } - ], - "all_of": [ - { - "test": "has_damage", - "value": "fatal" - } - ] - }, - "event": "become_zombie" - } - } - ] - }, - "minecraft:persistent": {}, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.hide": { - "priority": 0, - "speed_multiplier": 0.8, - "poi_type": "bed", - "duration": 30 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.trade_with_player": { - "priority": 2, - "filters": { - "all_of": [ - { - "all_of": [ - { - "test": "in_water", - "value": false - } - ] - }, - { - "any_of": [ - { - "test": "on_ground", - "value": true - }, - { - "test": "is_sleeping", - "value": true - } - ] - } - ] - } - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 4, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "zombie" - }, - { - "test": "is_family", - "subject": "other", - "value": "zombie_villager" - }, - { - "test": "is_family", - "subject": "other", - "value": "illager" - }, - { - "test": "is_family", - "subject": "other", - "value": "vex" - }, - { - "test": "is_family", - "subject": "other", - "value": "zoglin" - } - ] - }, - "max_dist": 8, - "walk_speed_multiplier": 0.6, - "sprint_speed_multiplier": 0.6 - } - ] - }, - "minecraft:behavior.pickup_items": { - "priority": 4, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 0.5, - "can_pickup_to_hand_or_equipment": false - }, - "minecraft:behavior.move_indoors": { - "priority": 6, - "speed_multiplier": 0.8, - "timeout_cooldown": 8 - }, - "minecraft:behavior.look_at_trading_player": { - "priority": 7 - }, - "minecraft:behavior.look_at_player": { - "priority": 9, - "look_distance": 8, - "probability": 0.02 - }, - "minecraft:behavior.share_items": { - "priority": 10, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 0.5, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "villager" - } - } - ] - }, - "minecraft:behavior.move_towards_dwelling_restriction": { - "priority": 11, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.random_stroll": { - "priority": 11, - "speed_multiplier": 0.6 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - } - }, - "events": { - "become_witch": { - "add": { - "component_groups": ["become_witch"] - } - }, - "become_zombie": { - "sequence": [ - { - "filters": { - "test": "is_difficulty", - "value": "normal" - }, - "randomize": [ - { - "weight": 50, - "add": { - "component_groups": ["become_zombie"] - } - }, - { - "weight": 50 - } - ] - }, - { - "filters": { - "test": "is_difficulty", - "value": "hard" - }, - "add": { - "component_groups": ["become_zombie"] - } - } - ] - }, - "minecraft:entity_spawned": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:skin_id" - }, - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_0"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_1"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_2"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_3"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_4"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_5"] - } - } - ] - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 5, - "add": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 95, - "sequence": [ - { - "add": { - "component_groups": ["adult", "make_and_receive_love"] - } - }, - { - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["farmer", "behavior_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["fisherman", "behavior_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["shepherd", "behavior_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["fletcher", "behavior_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["librarian", "behavior_non_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["cartographer", "behavior_non_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["cleric", "behavior_non_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["armorer", "behavior_non_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["weaponsmith", "behavior_non_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["toolsmith", "behavior_non_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["butcher", "behavior_non_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["leatherworker", "behavior_non_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["mason", "behavior_non_peasant", "basic_schedule"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["nitwit", "behavior_peasant", "jobless_schedule"] - } - } - ] - } - ] - } - ] - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "desert" - }, - { - "test": "has_biome_tag", - "value": "mesa" - } - ] - }, - "add": { - "component_groups": ["desert_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "jungle" - }, - "add": { - "component_groups": ["jungle_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "savanna" - }, - "add": { - "component_groups": ["savanna_villager"] - } - }, - { - "filters": { - "any_of": [ - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "cold" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "ocean" - } - ] - }, - { - "test": "has_biome_tag", - "value": "frozen" - } - ] - }, - "add": { - "component_groups": ["snow_villager"] - } - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "swamp" - }, - { - "test": "has_biome_tag", - "value": "mangrove_swamp" - } - ] - }, - "add": { - "component_groups": ["swamp_villager"] - } - }, - { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "has_biome_tag", - "value": "taiga" - }, - { - "test": "has_biome_tag", - "value": "extreme_hills" - } - ] - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "cold" - } - ] - }, - "add": { - "component_groups": ["taiga_villager"] - } - } - ] - }, - "minecraft:spawn_from_village": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 5, - "add": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 95, - "add": { - "component_groups": ["adult", "make_and_receive_love"] - }, - "sequence": [ - { - "randomize": [ - { - "weight": 90, - "add": { - "component_groups": ["unskilled", "behavior_peasant", "basic_schedule"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["nitwit", "behavior_peasant", "jobless_schedule"] - } - } - ] - } - ] - } - ] - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:skin_id" - }, - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_0"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_1"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_2"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_3"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_4"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_5"] - } - } - ] - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "desert" - }, - { - "test": "has_biome_tag", - "value": "mesa" - } - ] - }, - "add": { - "component_groups": ["desert_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "jungle" - }, - "add": { - "component_groups": ["jungle_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "savanna" - }, - "add": { - "component_groups": ["savanna_villager"] - } - }, - { - "filters": { - "any_of": [ - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "cold" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "ocean" - } - ] - }, - { - "test": "has_biome_tag", - "value": "frozen" - } - ] - }, - "add": { - "component_groups": ["snow_villager"] - } - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "swamp" - }, - { - "test": "has_biome_tag", - "value": "mangrove_swamp" - } - ] - }, - "add": { - "component_groups": ["swamp_villager"] - } - }, - { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "has_biome_tag", - "value": "taiga" - }, - { - "test": "has_biome_tag", - "value": "extreme_hills" - } - ] - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "cold" - } - ] - }, - "add": { - "component_groups": ["taiga_villager"] - } - } - ] - }, - "minecraft:entity_transformed": { - "sequence": [ - { - "filters": { - "test": "has_component", - "subject": "other", - "operator": "==", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "filters": { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "sequence": [ - { - "add": { - "component_groups": ["adult", "make_and_receive_love"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "farmer" - }, - "add": { - "component_groups": ["farmer", "behavior_peasant", "farmer_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "fisherman" - }, - "add": { - "component_groups": ["fisherman", "behavior_peasant", "fisher_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "shepherd" - }, - "add": { - "component_groups": ["shepherd", "behavior_peasant", "work_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "fletcher" - }, - "add": { - "component_groups": ["fletcher", "behavior_peasant", "work_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "librarian" - }, - "add": { - "component_groups": ["librarian", "behavior_non_peasant", "librarian_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cartographer" - }, - "add": { - "component_groups": ["cartographer", "behavior_non_peasant", "work_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cleric" - }, - "add": { - "component_groups": ["cleric", "behavior_non_peasant", "work_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "armorer" - }, - "add": { - "component_groups": ["armorer", "behavior_non_peasant", "work_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "weaponsmith" - }, - "add": { - "component_groups": ["weaponsmith", "behavior_non_peasant", "work_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "toolsmith" - }, - "add": { - "component_groups": ["toolsmith", "behavior_non_peasant", "work_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "butcher" - }, - "add": { - "component_groups": ["butcher", "behavior_non_peasant", "work_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "leatherworker" - }, - "add": { - "component_groups": ["leatherworker", "behavior_non_peasant", "work_schedule"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "stone_mason" - }, - "add": { - "component_groups": ["mason", "behavior_non_peasant", "work_schedule"] - } - } - ] - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "operator": "==", - "value": "zombie_villager" - }, - "sequence": [ - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 0 - }, - "add": { - "component_groups": ["villager_skin_0"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 1 - }, - "add": { - "component_groups": ["villager_skin_1"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 2 - }, - "add": { - "component_groups": ["villager_skin_2"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 3 - }, - "add": { - "component_groups": ["villager_skin_3"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 4 - }, - "add": { - "component_groups": ["villager_skin_4"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 5 - }, - "add": { - "component_groups": ["villager_skin_5"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 1 - }, - "add": { - "component_groups": ["desert_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 2 - }, - "add": { - "component_groups": ["jungle_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 3 - }, - "add": { - "component_groups": ["savanna_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 4 - }, - "add": { - "component_groups": ["snow_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 5 - }, - "add": { - "component_groups": ["swamp_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 6 - }, - "add": { - "component_groups": ["taiga_villager"] - } - } - ] - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "operator": "==", - "value": "villager" - }, - "sequence": [ - { - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_0"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_1"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_2"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_3"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_4"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_5"] - } - } - ] - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "desert" - }, - { - "test": "has_biome_tag", - "value": "mesa" - } - ] - }, - "add": { - "component_groups": ["desert_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "jungle" - }, - "add": { - "component_groups": ["jungle_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "savanna" - }, - "add": { - "component_groups": ["savanna_villager"] - } - }, - { - "filters": { - "any_of": [ - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "cold" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "ocean" - } - ] - }, - { - "test": "has_biome_tag", - "value": "frozen" - } - ] - }, - "add": { - "component_groups": ["snow_villager"] - } - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "swamp" - }, - { - "test": "has_biome_tag", - "value": "mangrove_swamp" - } - ] - }, - "add": { - "component_groups": ["swamp_villager"] - } - }, - { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "has_biome_tag", - "value": "taiga" - }, - { - "test": "has_biome_tag", - "value": "extreme_hills" - } - ] - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "cold" - } - ] - }, - "add": { - "component_groups": ["taiga_villager"] - } - } - ] - } - ] - }, - "minecraft:entity_born": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:skin_id" - }, - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_0"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_1"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_2"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_3"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_4"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_5"] - } - } - ] - }, - { - "add": { - "component_groups": ["baby", "unskilled", "child_schedule"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "desert" - }, - "add": { - "component_groups": ["desert_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "jungle" - }, - "add": { - "component_groups": ["jungle_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "savanna" - }, - "add": { - "component_groups": ["savanna_villager"] - } - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "cold" - }, - { - "test": "has_biome_tag", - "value": "frozen" - } - ] - }, - "add": { - "component_groups": ["snow_villager"] - } - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "swamp" - }, - { - "test": "has_biome_tag", - "value": "mangrove_swamp" - } - ] - }, - "add": { - "component_groups": ["swamp_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "taiga" - }, - "add": { - "component_groups": ["taiga_villager"] - } - } - ] - }, - "minecraft:spawn_farmer": { - "randomize": [ - { - "weight": 5, - "add": { - "component_groups": ["farmer", "adult", "make_and_receive_love", "behavior_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fisherman", "adult", "make_and_receive_love", "behavior_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["shepherd", "adult", "make_and_receive_love", "behavior_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fletcher", "adult", "make_and_receive_love", "behavior_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["mason", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - } - ] - }, - "minecraft:spawn_librarian": { - "randomize": [ - { - "weight": 20, - "add": { - "component_groups": ["librarian", "adult", "make_and_receive_love", "behavior_non_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cartographer", "behavior_non_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - } - ] - }, - "minecraft:spawn_cleric": { - "add": { - "component_groups": ["cleric", "adult", "make_and_receive_love", "behavior_non_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - }, - "minecraft:spawn_armorer": { - "randomize": [ - { - "weight": 6, - "add": { - "component_groups": ["armorer", "adult", "make_and_receive_love", "behavior_non_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["weaponsmith", "adult", "make_and_receive_love", "behavior_non_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["toolsmith", "adult", "make_and_receive_love", "behavior_non_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - } - ] - }, - "minecraft:spawn_butcher": { - "randomize": [ - { - "weight": 10, - "add": { - "component_groups": ["butcher", "adult", "make_and_receive_love", "behavior_non_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["leatherworker", "adult", "make_and_receive_love", "behavior_non_peasant", "basic_schedule"] - }, - "remove": { - "component_groups": ["baby", "child_schedule"] - } - } - ] - }, - "minecraft:ageable_grow_up": { - "randomize": [ - { - "weight": 10, - "remove": { - "component_groups": ["baby", "child_schedule"] - }, - "add": { - "component_groups": ["adult", "make_and_receive_love", "nitwit", "behavior_peasant", "jobless_schedule"] - } - }, - { - "weight": 90, - "remove": { - "component_groups": ["baby", "child_schedule"] - }, - "add": { - "component_groups": ["adult", "make_and_receive_love", "unskilled", "behavior_peasant", "basic_schedule"] - } - } - ] - }, - "minecraft:become_unskilled": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["adult", "make_and_receive_love", "unskilled", "behavior_peasant", "basic_schedule"] - } - }, - "minecraft:become_cleric": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["cleric", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:become_farmer": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["farmer", "adult", "make_and_receive_love", "behavior_peasant", "farmer_schedule"] - } - }, - "minecraft:become_fisherman": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["fisherman", "adult", "make_and_receive_love", "behavior_non_peasant", "fisher_schedule"] - } - }, - "minecraft:become_fletcher": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["fletcher", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:become_librarian": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["librarian", "adult", "make_and_receive_love", "behavior_non_peasant", "librarian_schedule"] - } - }, - "minecraft:become_cartographer": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["cartographer", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:become_armorer": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["armorer", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:become_weaponsmith": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["weaponsmith", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:become_toolsmith": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["toolsmith", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:become_butcher": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["butcher", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:become_leatherworker": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["leatherworker", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:become_sheperd": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["shepherd", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:become_mason": { - "remove": { - "component_groups": ["baby", "child_schedule", "job_specific_goals", "trade_components"] - }, - "add": { - "component_groups": ["mason", "adult", "make_and_receive_love", "behavior_non_peasant", "work_schedule"] - } - }, - "minecraft:schedule_wander_villager": { - "remove": { - "component_groups": ["home_schedule_villager", "bed_schedule_villager", "wander_schedule_villager", "job_specific_goals", "play_schedule_villager", "trade_resupply_component_group"] - }, - "add": { - "component_groups": ["make_and_receive_love", "wander_schedule_villager"] - } - }, - "minecraft:schedule_gather_villager": { - "remove": { - "component_groups": ["bed_schedule_villager", "wander_schedule_villager", "home_schedule_villager", "job_specific_goals", "play_schedule_villager", "trade_resupply_component_group"] - }, - "add": { - "component_groups": ["make_and_receive_love", "gather_schedule_villager"] - } - }, - "minecraft:schedule_home_villager": { - "remove": { - "component_groups": ["bed_schedule_villager", "wander_schedule_villager", "gather_schedule_villager", "job_specific_goals", "play_schedule_villager", "trade_resupply_component_group"] - }, - "add": { - "component_groups": ["make_and_receive_love", "home_schedule_villager"] - } - }, - "minecraft:schedule_bed_villager": { - "remove": { - "component_groups": ["make_and_receive_love", "home_schedule_villager", "gather_schedule_villager", "wander_schedule_villager", "job_specific_goals", "play_schedule_villager", "trade_resupply_component_group"] - }, - "add": { - "component_groups": ["bed_schedule_villager"] - } - }, - "minecraft:schedule_play_villager": { - "remove": { - "component_groups": ["home_schedule_villager", "gather_schedule_villager", "wander_schedule_villager", "bed_schedule_villager", "job_specific_goals", "trade_resupply_component_group"] - }, - "add": { - "component_groups": ["play_schedule_villager"] - } - }, - "minecraft:schedule_work_pro_villager": { - "remove": { - "component_groups": ["home_schedule_villager", "gather_schedule_villager", "wander_schedule_villager", "bed_schedule_villager", "play_schedule_villager"] - }, - "add": { - "component_groups": ["make_and_receive_love", "work_schedule_villager"] - } - }, - "minecraft:schedule_work_farmer": { - "remove": { - "component_groups": ["home_schedule_villager", "gather_schedule_villager", "wander_schedule_villager", "bed_schedule_villager", "job_specific_goals", "play_schedule_villager"] - }, - "add": { - "component_groups": ["make_and_receive_love", "work_schedule_farmer"] - } - }, - "minecraft:schedule_work_fisher": { - "remove": { - "component_groups": ["home_schedule_villager", "gather_schedule_villager", "wander_schedule_villager", "bed_schedule_villager", "job_specific_goals", "play_schedule_villager"] - }, - "add": { - "component_groups": ["make_and_receive_love", "work_schedule_fisher"] - } - }, - "minecraft:schedule_work_librarian": { - "remove": { - "component_groups": ["home_schedule_villager", "gather_schedule_villager", "wander_schedule_villager", "bed_schedule_villager", "job_specific_goals", "play_schedule_villager"] - }, - "add": { - "component_groups": ["make_and_receive_love", "work_schedule_librarian"] - } - }, - "minecraft:resupply_trades": { - "add": { - "component_groups": ["trade_resupply_component_group"] - } - }, - "minecraft:start_celebrating": { - "add": { - "component_groups": ["minecraft:celebrate"] - } - }, - "minecraft:stop_celebrating": { - "remove": { - "component_groups": ["minecraft:celebrate"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/vindicator.json b/build/entities/vindicator.json deleted file mode 100644 index 56c0720..0000000 --- a/build/entities/vindicator.json +++ /dev/null @@ -1,459 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:vindicator", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:celebrate": { - "minecraft:behavior.celebrate": { - "priority": 5, - "celebration_sound": "celebrate", - "sound_interval": { - "range_min": 2, - "range_max": 7 - }, - "jump_interval": { - "range_min": 1, - "range_max": 3.5 - }, - "duration": 30, - "on_celebration_end_event": { - "event": "minecraft:stop_celebrating", - "target": "self" - } - } - }, - "minecraft:vindicator_aggro": { - "minecraft:angry": { - "duration": -1, - "broadcast_anger": false, - "calm_event": { - "event": "minecraft:stop_aggro", - "target": "self" - } - } - }, - "minecraft:vindicator_johnny": { - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "within_radius": 12, - "must_see_forget_duration": 40, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "illager" - } - ] - }, - "max_dist": 12 - } - ] - } - }, - "minecraft:default_targeting": { - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "within_radius": 12, - "must_see_forget_duration": 40, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - "max_dist": 12 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - } - ] - }, - "max_dist": 12 - } - ] - } - }, - "minecraft:raid_configuration": { - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "hostile", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": false, - "can_migrate": true, - "first_founding_reward": 0 - }, - "minecraft:behavior.move_to_village": { - "priority": 4, - "speed_multiplier": 1, - "goal_radius": 2 - }, - "minecraft:loot": { - "table": "loot_tables/entities/vindicator_raid.json" - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "can_pass_doors": true, - "can_break_doors": true - }, - "minecraft:annotation.break_door": { - "break_time": 30, - "min_difficulty": "normal" - }, - "minecraft:ambient_sound_interval": { - "value": 2, - "range": 4, - "event_name": "ambient.in.raid" - } - }, - "minecraft:raid_persistence": { - "minecraft:persistent": {} - }, - "minecraft:raid_despawn": { - "minecraft:despawn": { - "despawn_from_distance": {} - } - }, - "minecraft:illager_squad_captain": { - "minecraft:is_illager_captain": {}, - "minecraft:variant": { - "value": 1 - }, - "minecraft:equipment": { - "table": "loot_tables/entities/vindicator_captain_equipment.json", - "slot_drop_chance": [ - { - "slot": "slot.armor.chest", - "drop_chance": 1 - } - ] - }, - "minecraft:damage_sensor": { - "triggers": { - "on_damage": { - "filters": { - "all_of": [ - { - "test": "has_damage", - "value": "fatal" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - } - ] - }, - "event": "minecraft:gain_bad_omen", - "target": "other" - } - } - } - }, - "minecraft:patrol_captain": { - "minecraft:is_illager_captain": {}, - "minecraft:variant": { - "value": 1 - }, - "minecraft:equipment": { - "table": "loot_tables/entities/vindicator_captain_equipment.json", - "slot_drop_chance": [ - { - "slot": "slot.armor.chest", - "drop_chance": 1 - } - ] - }, - "minecraft:damage_sensor": { - "triggers": { - "on_damage": { - "filters": { - "all_of": [ - { - "test": "has_damage", - "value": "fatal" - }, - { - "test": "is_family", - "subject": "other", - "value": "player" - } - ] - }, - "event": "minecraft:gain_bad_omen", - "target": "other" - } - } - }, - "minecraft:behavior.move_to_random_block": { - "priority": 5, - "speed_multiplier": 0.55, - "within_radius": 8, - "block_distance": 512 - } - }, - "minecraft:patrol_follower": { - "minecraft:behavior.follow_target_captain": { - "priority": 5, - "speed_multiplier": 0.8, - "within_radius": 64, - "follow_distance": 5 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? (query.is_baby ? 12 : 5) + (Math.die_roll(query.equipment_count,1,3)) : 0" - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:nameable": { - "default_trigger": { - "event": "minecraft:stop_johnny", - "target": "self" - }, - "name_actions": [ - { - "name_filter": "Johnny", - "on_named": { - "event": "minecraft:start_johnny", - "target": "self" - } - } - ] - }, - "minecraft:type_family": { - "family": ["vindicator", "monster", "illager", "mob"] - }, - "minecraft:variant": { - "value": 0 - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:health": { - "value": 24, - "max": 24 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:attack": { - "damage": 8 - }, - "minecraft:movement": { - "value": 0.35 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:follow_range": { - "value": 64 - }, - "minecraft:loot": { - "table": "loot_tables/entities/vindication_illager.json" - }, - "minecraft:equipment": { - "table": "loot_tables/entities/vindicator_gear.json" - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.melee_attack": { - "priority": 3 - }, - "minecraft:behavior.random_stroll": { - "priority": 9, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 10, - "look_distance": 8, - "probability": 0.02 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:on_target_acquired": { - "event": "minecraft:become_aggro", - "target": "self" - }, - "minecraft:on_target_escape": { - "event": "minecraft:stop_aggro", - "target": "self" - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - } - }, - "events": { - "minecraft:entity_spawned": { - "add": { - "component_groups": ["minecraft:default_targeting"] - } - }, - "minecraft:spawn_as_patrol_follower": { - "add": { - "component_groups": ["minecraft:default_targeting", "minecraft:patrol_follower"] - } - }, - "minecraft:become_aggro": { - "add": { - "component_groups": ["minecraft:vindicator_aggro"] - } - }, - "minecraft:stop_aggro": { - "remove": { - "component_groups": ["minecraft:vindicator_aggro"] - } - }, - "minecraft:start_johnny": { - "add": { - "component_groups": ["minecraft:vindicator_johnny"] - } - }, - "minecraft:stop_johnny": { - "remove": { - "component_groups": ["minecraft:vindicator_johnny"] - }, - "add": { - "component_groups": ["minecraft:default_targeting"] - } - }, - "minecraft:spawn_for_raid": { - "add": { - "component_groups": ["minecraft:default_targeting", "minecraft:raid_configuration", "minecraft:raid_persistence", "minecraft:raid_despawn"] - } - }, - "minecraft:spawn_as_illager_captain": { - "add": { - "component_groups": ["minecraft:default_targeting", "minecraft:illager_squad_captain"] - } - }, - "minecraft:promote_to_illager_captain": { - "add": { - "component_groups": ["minecraft:default_targeting", "minecraft:illager_squad_captain"] - }, - "remove": { - "component_groups": ["minecraft:patrol_follower"] - } - }, - "minecraft:promote_to_patrol_captain": { - "add": { - "component_groups": ["minecraft:default_targeting", "minecraft:patrol_captain"] - }, - "remove": { - "component_groups": ["minecraft:patrol_follower"] - } - }, - "minecraft:start_celebrating": { - "sequence": [ - { - "add": { - "component_groups": ["minecraft:celebrate"] - } - }, - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "minecraft:stop_celebrating": { - "remove": { - "component_groups": ["minecraft:celebrate"] - } - }, - "minecraft:raid_expired": { - "sequence": [ - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/wandering_trader.json b/build/entities/wandering_trader.json deleted file mode 100644 index 561d7ab..0000000 --- a/build/entities/wandering_trader.json +++ /dev/null @@ -1,430 +0,0 @@ -{ - "format_version": "1.19.60", - "minecraft:entity": { - "description": { - "identifier": "minecraft:wandering_trader", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "managed": { - "minecraft:managed_wandering_trader": {} - }, - "despawning": { - "minecraft:type_family": { - "family": ["wandering_trader", "wandering_trader_despawning", "mob"] - } - }, - "minecraft:scared": { - "minecraft:angry": { - "duration": 5, - "broadcastAnger": true, - "broadcastRange": 10, - "broadcast_targets": ["llama", "trader_llama"], - "broadcast_filters": { - "test": "is_leashed_to", - "subject": "other", - "value": true - }, - "calm_event": { - "event": "minecraft:become_calm", - "target": "self" - } - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:type_family": { - "family": ["wandering_trader", "mob"] - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:timer": { - "looping": false, - "random_time_choices": [ - { - "weight": 50, - "value": 2400 - }, - { - "weight": 50, - "value": 3600 - } - ], - "time_down_event": { - "event": "minecraft:start_despawn", - "target": "self" - } - }, - "minecraft:spawn_entity": { - "entities": [ - { - "min_wait_time": 0, - "max_wait_time": 0, - "spawn_entity": "trader_llama", - "spawn_event": "minecraft:from_wandering_trader", - "single_use": true, - "num_to_spawn": 2, - "should_leash": true - } - ] - }, - "minecraft:economy_trade_table": { - "display_name": "entity.wandering_trader.name", - "table": "trading/economy_trades/wandering_trader_trades.json", - "new_screen": true - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:movement": { - "value": 0.5 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "can_pass_doors": true, - "can_open_doors": false, - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:home": { - "restriction_radius": 16 - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:despawn": { - "remove_child_entities": true, - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "is_family", - "subject": "self", - "value": "wandering_trader_despawning" - }, - { - "test": "has_trade_supply", - "subject": "self", - "value": false - } - ] - }, - { - "test": "distance_to_nearest_player", - "operator": ">", - "value": 24 - } - ] - } - }, - "minecraft:damage_sensor": { - "triggers": [ - { - "cause": "entity_attack", - "deals_damage": true, - "on_damage": { - "event": "minecraft:become_scared" - } - }, - { - "cause": "projectile", - "deals_damage": true, - "on_damage": { - "event": "minecraft:become_scared" - } - }, - { - "cause": "magic", - "deals_damage": true, - "on_damage": { - "event": "minecraft:become_scared" - } - } - ] - }, - "minecraft:behavior.trade_with_player": { - "priority": 1, - "filters": { - "all_of": [ - { - "all_of": [ - { - "test": "in_water", - "value": false - } - ] - }, - { - "any_of": [ - { - "test": "on_ground", - "value": true - }, - { - "test": "is_sleeping", - "value": true - } - ] - } - ] - } - }, - "minecraft:behavior.trade_interest": { - "priority": 3, - "within_radius": 6, - "interest_time": 45, - "remove_item_time": 1, - "carried_item_switch_time": 2, - "cooldown": 2 - }, - "minecraft:behavior.look_at_trading_player": { - "priority": 4 - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.drink_potion": { - "priority": 1, - "speed_modifier": -0.2, - "potions": [ - { - "id": 7, - "chance": 1, - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 18000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 12000 - } - ] - }, - { - "test": "is_visible", - "subject": "self", - "value": true - }, - { - "any_of": [ - { - "test": "is_avoiding_mobs", - "subject": "self", - "value": true - }, - { - "all_of": [ - { - "test": "has_component", - "subject": "self", - "value": "minecraft:angry" - }, - { - "test": "is_family", - "subject": "target", - "operator": "!=", - "value": "player" - } - ] - } - ] - } - ] - } - }, - { - "id": 8, - "chance": 1, - "filters": { - "all_of": [ - { - "test": "hourly_clock_time", - "operator": ">=", - "value": 12000 - }, - { - "test": "hourly_clock_time", - "operator": "<", - "value": 18000 - }, - { - "test": "is_visible", - "subject": "self", - "value": true - }, - { - "any_of": [ - { - "test": "is_avoiding_mobs", - "subject": "self", - "value": true - }, - { - "test": "has_component", - "subject": "self", - "value": "minecraft:angry" - } - ] - } - ] - } - } - ] - }, - "minecraft:behavior.avoid_mob_type": { - "priority": 2, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "zombie" - }, - { - "test": "is_family", - "subject": "other", - "value": "zombie_villager" - }, - { - "test": "is_family", - "subject": "other", - "value": "zombie_pigman" - }, - { - "test": "is_family", - "subject": "other", - "value": "illager" - }, - { - "test": "is_family", - "subject": "other", - "value": "vex" - }, - { - "test": "is_family", - "subject": "other", - "value": "zoglin" - } - ] - }, - "walk_speed_multiplier": 0.6, - "sprint_speed_multiplier": 0.6 - } - ], - "max_dist": 6 - }, - "minecraft:behavior.drink_milk": { - "priority": 5, - "filters": { - "all_of": [ - { - "test": "is_daytime", - "value": true - }, - { - "test": "is_visible", - "subject": "self", - "value": false - }, - { - "test": "is_avoiding_mobs", - "subject": "self", - "value": false - } - ] - } - }, - "minecraft:behavior.move_towards_home_restriction": { - "priority": 6, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 0.6 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 8, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:nameable": {} - }, - "events": { - "minecraft:scheduled": { - "add": { - "component_groups": ["managed"] - } - }, - "minecraft:start_despawn": { - "add": { - "component_groups": ["despawning"] - } - }, - "minecraft:become_scared": { - "add": { - "component_groups": ["minecraft:scared"] - } - }, - "minecraft:become_calm": { - "remove": { - "component_groups": ["minecraft:scared"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/warden.json b/build/entities/warden.json deleted file mode 100644 index 4395407..0000000 --- a/build/entities/warden.json +++ /dev/null @@ -1,250 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:warden", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "emerging": { - "minecraft:behavior.emerge": { - "duration": 7, - "on_done": { - "event": "minecraft:emerged", - "target": "self" - } - } - }, - "pushable": { - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:movement_sound_distance_offset": { - "value": 0.55 - }, - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:attack": { - "damage": 30 - }, - "minecraft:vibration_listener": {}, - "minecraft:vibration_damper": {}, - "minecraft:suspect_tracking": {}, - "minecraft:anger_level": { - "max_anger": 150, - "angry_threshold": 80, - "remove_targets_below_angry_threshold": true, - "angry_boost": 20, - "anger_decrement_interval": 1, - "default_annoyingness": 35, - "default_projectile_annoyingness": 10, - "on_increase_sounds": [ - { - "sound": "listening_angry", - "condition": "query.anger_level(this) >= 40" - }, - { - "sound": "listening", - "condition": "query.anger_level(this) >= 0" - } - ], - "nuisance_filter": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "operator": "not", - "value": "warden" - }, - { - "test": "is_family", - "subject": "other", - "operator": "not", - "value": "inanimate" - } - ] - } - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["warden", "monster", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "can_path_over_lava": true, - "avoid_damage_blocks": true - }, - "minecraft:preferred_path": { - "max_fall_blocks": 20 - }, - "minecraft:ambient_sound_interval": { - "value": 2, - "range": 4, - "event_name": "ambient", - "event_names": [ - { - "event_name": "angry", - "condition": "query.anger_level(this) >= 80" - }, - { - "event_name": "agitated", - "condition": "query.anger_level(this) >= 40" - } - ] - }, - "minecraft:heartbeat": { - "interval": "2.0 - math.clamp(query.anger_level / 80 * 1.5, 0, 1.5)" - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:collision_box": { - "width": 0.9, - "height": 2.9 - }, - "minecraft:health": { - "value": 500, - "max": 500 - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:knockback_resistance": { - "value": 1 - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.dig": { - "priority": 1, - "duration": 5.5, - "idle_time": 60, - "vibration_is_disturbance": true, - "suspicion_is_disturbance": true, - "digs_in_daylight": false, - "on_start": { - "event": "on_digging_event", - "target": "self" - } - }, - "minecraft:behavior.roar": { - "priority": 2, - "duration": 4.2 - }, - "minecraft:behavior.sonic_boom": { - "priority": 3, - "duration": 3, - "speed_multiplier": 1.2, - "attack_damage": 10, - "attack_range_horizontal": 15, - "attack_range_vertical": 20, - "attack_cooldown": 2, - "knockback_vertical_strength": 0.5, - "knockback_horizontal_strength": 2.5, - "knockback_height_cap": 0.5, - "duration_until_attack_sound": 1.7, - "charge_sound": "sonic_charge", - "attack_sound": "sonic_boom" - }, - "minecraft:behavior.melee_attack": { - "priority": 4, - "speed_multiplier": 1.2, - "melee_fov": 360 - }, - "minecraft:behavior.investigate_suspicious_location": { - "priority": 5, - "speed_multiplier": 0.7 - }, - "minecraft:behavior.sniff": { - "priority": 6, - "duration": 4.16, - "sniffing_radius": 24, - "suspicion_radius_horizontal": 6, - "suspicion_radius_vertical": 20, - "cooldown_range": [5, 10] - }, - "minecraft:behavior.random_stroll": { - "priority": 9, - "speed_multiplier": 0.5 - }, - "minecraft:behavior.random_look_around": { - "priority": 11 - }, - "minecraft:physics": {}, - "minecraft:mob_effect": { - "effect_range": 20, - "effect_time": 13, - "mob_effect": "darkness", - "cooldown_time": 6, - "entity_filter": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "operator": "not", - "test": "has_ability", - "subject": "other", - "value": "invulnerable" - } - ] - } - }, - "minecraft:follow_range": 30, - "minecraft:fire_immune": {}, - "minecraft:nameable": {}, - "minecraft:loot": { - "table": "loot_tables/entities/warden.json" - } - }, - "events": { - "minecraft:spawn_emerging": { - "add": { - "component_groups": ["emerging"] - } - }, - "minecraft:emerged": { - "add": { - "component_groups": ["pushable"] - }, - "remove": { - "component_groups": ["emerging"] - } - }, - "minecraft:entity_spawned": { - "add": { - "component_groups": ["pushable"] - } - }, - "on_digging_event": { - "remove": { - "component_groups": ["pushable"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/witch.json b/build/entities/witch.json deleted file mode 100644 index 67229b4..0000000 --- a/build/entities/witch.json +++ /dev/null @@ -1,408 +0,0 @@ -{ - "format_version": "1.19.60", - "minecraft:entity": { - "description": { - "identifier": "minecraft:witch", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:celebrate": { - "minecraft:behavior.celebrate": { - "priority": 5, - "celebration_sound": "celebrate", - "sound_interval": { - "range_min": 2, - "range_max": 7 - }, - "jump_interval": { - "range_min": 1, - "range_max": 3.5 - }, - "duration": 30, - "on_celebration_end_event": { - "event": "minecraft:stop_celebrating", - "target": "self" - } - } - }, - "minecraft:raid_configuration": { - "minecraft:dweller": { - "dwelling_type": "village", - "dweller_role": "hostile", - "update_interval_base": 60, - "update_interval_variant": 40, - "can_find_poi": false, - "can_migrate": true, - "first_founding_reward": 0 - }, - "minecraft:behavior.move_to_village": { - "priority": 3, - "speed_multiplier": 1.2, - "goal_radius": 2 - }, - "minecraft:ambient_sound_interval": { - "value": 2, - "range": 4, - "event_name": "ambient.in.raid" - } - }, - "minecraft:raid_persistence": { - "minecraft:persistent": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:damage_sensor": {}, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? (query.is_baby ? 12 : 5) + (Math.die_roll(query.equipment_count,1,3)) : 0" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:nameable": {}, - "minecraft:loot": { - "table": "loot_tables/entities/witch.json" - }, - "minecraft:health": { - "value": 26, - "max": 26 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": false - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 1 - }, - "minecraft:behavior.ranged_attack": { - "priority": 2, - "speed_multiplier": 1, - "attack_interval_min": 3, - "attack_interval_max": 3, - "attack_radius": 10 - }, - "minecraft:shooter": { - "power": 0.75, - "def": "minecraft:splash_potion", - "aux_val": 23, - "sound": "throw", - "projectiles": [ - { - "def": "minecraft:splash_potion", - "aux_val": 17, - "filters": { - "all_of": [ - { - "test": "target_distance", - "subject": "self", - "value": 8, - "operator": ">=" - }, - { - "none_of": [ - { - "test": "has_mob_effect", - "subject": "other", - "value": "slowness" - } - ] - } - ] - } - }, - { - "def": "minecraft:splash_potion", - "aux_val": 25, - "filters": { - "all_of": [ - { - "test": "actor_health", - "subject": "other", - "value": 8, - "operator": ">=" - }, - { - "none_of": [ - { - "test": "has_mob_effect", - "subject": "other", - "value": "poison" - } - ] - } - ] - } - }, - { - "def": "minecraft:splash_potion", - "aux_val": 34, - "filters": { - "all_of": [ - { - "test": "target_distance", - "subject": "self", - "value": 3, - "operator": "<=" - }, - { - "none_of": [ - { - "test": "has_mob_effect", - "subject": "other", - "value": "weakness" - } - ] - } - ] - }, - "chance": 0.25 - } - ], - "magic": true - }, - "minecraft:behavior.random_stroll": { - "priority": 4, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 5, - "look_distance": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 5, - "look_distance": 8 - }, - "minecraft:behavior.drink_potion": { - "priority": 1, - "speed_modifier": -0.25, - "potions": [ - { - "id": 19, - "chance": 0.15, - "filters": { - "all_of": [ - { - "test": "is_underwater", - "subject": "self", - "value": true - }, - { - "none_of": [ - { - "test": "has_mob_effect", - "subject": "self", - "value": "water_breathing" - } - ] - } - ] - } - }, - { - "id": 12, - "chance": 0.15, - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "on_fire", - "subject": "self", - "value": true - }, - { - "test": "on_hot_block", - "subject": "self", - "value": true - }, - { - "test": "taking_fire_damage", - "subject": "self", - "value": true - } - ] - }, - { - "none_of": [ - { - "test": "has_mob_effect", - "subject": "self", - "value": "fire_resistance" - } - ] - } - ] - } - }, - { - "id": 21, - "chance": 0.05, - "filters": { - "all_of": [ - { - "test": "is_missing_health", - "subject": "self", - "value": true - } - ] - } - }, - { - "id": 14, - "chance": 0.25, - "filters": { - "all_of": [ - { - "test": "has_target", - "subject": "self", - "value": true - }, - { - "none_of": [ - { - "test": "has_mob_effect", - "subject": "self", - "value": "speed" - } - ] - }, - { - "test": "target_distance", - "subject": "self", - "value": 11, - "operator": ">=" - } - ] - } - } - ] - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 10 - } - ], - "must_reach": true - }, - "minecraft:type_family": { - "family": ["witch", "monster", "mob"] - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:follow_range": { - "value": 64 - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:spawn_for_raid": { - "add": { - "component_groups": ["minecraft:raid_configuration", "minecraft:raid_persistence"] - } - }, - "minecraft:start_celebrating": { - "sequence": [ - { - "add": { - "component_groups": ["minecraft:celebrate"] - } - }, - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "minecraft:stop_celebrating": { - "remove": { - "component_groups": ["minecraft:celebrate"] - } - }, - "minecraft:raid_expired": { - "sequence": [ - { - "filters": { - "test": "has_nametag", - "value": false - }, - "remove": { - "component_groups": ["minecraft:raid_persistence"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/wither.json b/build/entities/wither.json deleted file mode 100644 index d4d490e..0000000 --- a/build/entities/wither.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:wither", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "50" - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:boss": { - "should_darken_sky": true, - "hud_range": 55 - }, - "minecraft:damage_sensor": { - "triggers": { - "on_damage": { - "filters": { - "test": "is_family", - "subject": "other", - "value": "undead" - } - }, - "deals_damage": false - } - }, - "minecraft:health": { - "value": 600, - "max": 600 - }, - "minecraft:collision_box": { - "width": 1, - "height": 3 - }, - "minecraft:fire_immune": {}, - "minecraft:loot": { - "table": "loot_tables/entities/wither_boss.json" - }, - "minecraft:nameable": {}, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_water": true - }, - "minecraft:movement.basic": { - "max_turn": 180 - }, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:can_fly": {}, - "minecraft:behavior.float": { - "priority": 1 - }, - "minecraft:behavior.wither_random_attack_pos_goal": { - "priority": 3 - }, - "minecraft:behavior.wither_target_highest_damage": { - "priority": 1 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 2 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 3, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 70 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "undead" - }, - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "inanimate" - } - ] - }, - "max_dist": 70 - } - ], - "must_see": true - }, - "minecraft:behavior.random_stroll": { - "priority": 5, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_target": { - "priority": 5 - }, - "minecraft:behavior.look_at_player": { - "priority": 6, - "look_distance": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 7 - }, - "minecraft:type_family": { - "family": ["wither", "skeleton", "monster", "undead", "mob"] - }, - "minecraft:persistent": {}, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": {}, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/wither_skeleton.json b/build/entities/wither_skeleton.json deleted file mode 100644 index 0d4e60c..0000000 --- a/build/entities/wither_skeleton.json +++ /dev/null @@ -1,524 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:wither_skeleton", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:nameable": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:equip_item": {}, - "minecraft:collision_box": { - "width": 0.72, - "height": 2.01 - }, - "minecraft:attack": { - "damage": 4, - "effect_name": "wither", - "effect_duration": 10 - }, - "minecraft:loot": { - "table": "loot_tables/entities/wither_skeleton.json" - }, - "minecraft:equipment": { - "table": "loot_tables/entities/wither_skeleton_gear.json" - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "is_amphibious": true, - "avoid_sun": true, - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:netherite_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:stone_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:wooden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:wooden_shovel", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:stone_shovel", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:golden_shovel", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:iron_shovel", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:diamond_shovel", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:netherite_shovel", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:wooden_pickaxe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:stone_pickaxe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:golden_pickaxe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:iron_pickaxe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:diamond_pickaxe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:netherite_pickaxe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:wooden_axe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:stone_axe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:golden_axe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:iron_axe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:diamond_axe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:netherite_axe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:wooden_hoe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:stone_hoe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:golden_hoe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:iron_hoe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:diamond_hoe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:netherite_hoe", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:netherite_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - } - ] - }, - "minecraft:scale": { - "value": 1.2 - }, - "minecraft:fire_immune": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "reselect_targets": true, - "must_see": true, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "player" - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "piglin" - }, - { - "test": "is_difficulty", - "operator": "!=", - "value": "peaceful" - } - ] - }, - "max_dist": 16 - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:behavior.equip_item": { - "priority": 3 - }, - "minecraft:behavior.melee_attack": { - "priority": 4, - "track_target": true, - "speed_multiplier": 1.25 - }, - "minecraft:behavior.pickup_items": { - "priority": 5, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1, - "pickup_based_on_chance": true - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 8 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:type_family": { - "family": ["wither", "monster", "undead", "skeleton", "mob"] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": {}, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/wither_skull.json b/build/entities/wither_skull.json deleted file mode 100644 index b57247f..0000000 --- a/build/entities/wither_skull.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:wither_skull", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:exploding": { - "minecraft:explode": { - "fuse_length": 0, - "fuse_lit": true, - "power": 1, - "causes_fire": false, - "destroy_affected_by_griefing": true - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:collision_box": { - "width": 0.15, - "height": 0.15 - }, - "minecraft:projectile": { - "on_hit": { - "definition_event": { - "affect_projectile": true, - "event_trigger": { - "event": "minecraft:explode", - "target": "self" - } - }, - "mob_effect": { - "effect": "wither", - "durationeasy": 0, - "durationnormal": 200, - "durationhard": 800, - "amplifier": 1 - } - }, - "power": 1.2, - "gravity": 0, - "uncertainty_base": 7.5, - "uncertainty_multiplier": 1, - "shoot_sound": "bow", - "hit_sound": "bow.hit", - "anchor": 1, - "offset": [0, -0.1, 0], - "inertia": 1, - "liquid_inertia": 1, - "shoot_target": false - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - }, - "events": { - "minecraft:explode": { - "add": { - "component_groups": ["minecraft:exploding"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/wither_skull_dangerous.json b/build/entities/wither_skull_dangerous.json deleted file mode 100644 index 15aa8cd..0000000 --- a/build/entities/wither_skull_dangerous.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:wither_skull_dangerous", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:exploding": { - "minecraft:explode": { - "fuse_length": 0, - "fuse_lit": true, - "power": 1, - "causes_fire": false, - "max_resistance": 4, - "destroy_affected_by_griefing": true - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:collision_box": { - "width": 0.15, - "height": 0.15 - }, - "minecraft:projectile": { - "on_hit": { - "definition_event": { - "affect_projectile": true, - "event_trigger": { - "event": "minecraft:explode", - "target": "self" - } - }, - "mob_effect": { - "effect": "wither", - "durationeasy": 0, - "durationnormal": 200, - "durationhard": 800, - "amplifier": 1 - } - }, - "power": 0.6, - "gravity": 0, - "uncertainty_base": 7.5, - "uncertainty_multiplier": 1, - "shoot_sound": "bow", - "hit_sound": "bow.hit", - "anchor": 1, - "offset": [0, -0.1, 0], - "is_dangerous": true, - "inertia": 1, - "liquid_inertia": 1, - "shoot_target": false, - "reflect_on_hurt": true - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 7, - "use_motion_prediction_hints": true - } - } - }, - "events": { - "minecraft:explode": { - "add": { - "component_groups": ["minecraft:exploding"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/wolf.json b/build/entities/wolf.json deleted file mode 100644 index 917a4d9..0000000 --- a/build/entities/wolf.json +++ /dev/null @@ -1,482 +0,0 @@ -{ - "format_version": "1.18.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:wolf", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:wolf_baby": { - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:ageable": { - "duration": 1200, - "feed_items": ["chicken", "cooked_chicken", "beef", "cooked_beef", "muttonRaw", "muttonCooked", "porkchop", "cooked_porkchop", "rabbit", "cooked_rabbit", "rotten_flesh"], - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - } - }, - "minecraft:wolf_adult": { - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/wolf.json" - }, - "minecraft:breedable": { - "require_tame": true, - "require_full_health": true, - "breeds_with": { - "mate_type": "minecraft:wolf", - "baby_type": "minecraft:wolf", - "breed_event": { - "event": "minecraft:entity_born", - "target": "baby" - } - }, - "breed_items": ["chicken", "cooked_chicken", "beef", "cooked_beef", "muttonRaw", "muttonCooked", "porkchop", "cooked_porkchop", "rabbit", "cooked_rabbit", "rotten_flesh"] - } - }, - "minecraft:wolf_angry": { - "minecraft:angry": { - "duration": 25, - "broadcast_anger": true, - "broadcast_range": 20, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - }, - "minecraft:on_target_acquired": {}, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.675, -0.1] - } - } - }, - "minecraft:wolf_wild": { - "minecraft:behavior.avoid_mob_type": { - "priority": 3, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "llama" - }, - "max_dist": 24, - "walk_speed_multiplier": 1.5, - "sprint_speed_multiplier": 1.5 - } - ], - "probability_per_strength": 0.14 - }, - "minecraft:tameable": { - "probability": 0.33, - "tame_items": "bone", - "tame_event": { - "event": "minecraft:on_tame", - "target": "self" - } - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 4, - "reselect_targets": true, - "must_see": true, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "skeleton" - }, - { - "test": "is_family", - "subject": "other", - "value": "sheep" - }, - { - "test": "is_family", - "subject": "other", - "value": "rabbit" - }, - { - "test": "is_family", - "subject": "other", - "value": "fox" - } - ] - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 16 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "skeleton" - }, - { - "test": "is_underwater", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 16 - } - ] - }, - "minecraft:on_target_acquired": { - "event": "minecraft:become_angry", - "target": "self" - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 0.675, -0.1] - } - } - }, - "minecraft:wolf_tame": { - "minecraft:is_tamed": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:color": { - "value": 14 - }, - "minecraft:behavior.follow_owner": { - "priority": 6, - "speed_multiplier": 1, - "start_distance": 10, - "stop_distance": 2 - }, - "minecraft:attack": { - "damage": 4 - }, - "minecraft:behavior.breed": { - "priority": 2, - "speed_multiplier": 1 - }, - "minecraft:behavior.owner_hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.owner_hurt_target": { - "priority": 2 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 5, - "must_see": true, - "entity_types": [ - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "skeleton" - }, - "max_dist": 16 - } - ] - }, - "minecraft:sittable": {}, - "minecraft:is_dyeable": { - "interact_text": "action.interact.dye" - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10, - "on_leash": { - "event": "minecraft:on_leash", - "target": "self" - }, - "on_unleash": { - "event": "minecraft:on_unleash", - "target": "self" - } - }, - "minecraft:balloonable": { - "mass": 0.8 - }, - "minecraft:is_hidden_when_invisible": {}, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["wolf", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0 - }, - "minecraft:collision_box": { - "width": 0.6, - "height": 0.8 - }, - "minecraft:health": { - "value": 8, - "max": 8 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.3 - }, - "minecraft:navigation.walk": { - "can_path_over_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:healable": { - "items": [ - { - "item": "porkchop", - "heal_amount": 3 - }, - { - "item": "cooked_porkchop", - "heal_amount": 8 - }, - { - "item": "fish", - "heal_amount": 2 - }, - { - "item": "salmon", - "heal_amount": 2 - }, - { - "item": "clownfish", - "heal_amount": 1 - }, - { - "item": "pufferfish", - "heal_amount": 1 - }, - { - "item": "cooked_fish", - "heal_amount": 5 - }, - { - "item": "cooked_salmon", - "heal_amount": 6 - }, - { - "item": "beef", - "heal_amount": 3 - }, - { - "item": "cooked_beef", - "heal_amount": 8 - }, - { - "item": "chicken", - "heal_amount": 2 - }, - { - "item": "cooked_chicken", - "heal_amount": 6 - }, - { - "item": "muttonRaw", - "heal_amount": 2 - }, - { - "item": "muttonCooked", - "heal_amount": 6 - }, - { - "item": "rotten_flesh", - "heal_amount": 4 - }, - { - "item": "rabbit", - "heal_amount": 3 - }, - { - "item": "cooked_rabbit", - "heal_amount": 5 - }, - { - "item": "rabbit_stew", - "heal_amount": 10 - } - ] - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.float": { - "priority": 0 - }, - "minecraft:behavior.mount_pathing": { - "priority": 1, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.stay_while_sitting": { - "priority": 3 - }, - "minecraft:behavior.leap_at_target": { - "priority": 4, - "target_dist": 0.4 - }, - "minecraft:behavior.melee_attack": { - "priority": 5 - }, - "minecraft:behavior.random_stroll": { - "priority": 8, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 6, - "target_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.beg": { - "priority": 9, - "look_distance": 8, - "look_time": [2, 4], - "items": ["bone", "porkchop", "cooked_porkchop", "chicken", "cooked_chicken", "beef", "cooked_beef", "rotten_flesh", "muttonraw", "muttoncooked", "rabbit", "cooked_rabbit"] - }, - "minecraft:behavior.hurt_by_target": { - "priority": 3 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 9, - "remove": {}, - "add": { - "component_groups": ["minecraft:wolf_adult", "minecraft:wolf_wild"] - } - }, - { - "weight": 1, - "remove": {}, - "add": { - "component_groups": ["minecraft:wolf_baby", "minecraft:wolf_wild"] - } - } - ] - }, - "minecraft:entity_born": { - "remove": {}, - "add": { - "component_groups": ["minecraft:wolf_baby", "minecraft:wolf_tame"] - } - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:wolf_baby"] - }, - "add": { - "component_groups": ["minecraft:wolf_adult"] - } - }, - "minecraft:ageable_set_baby": { - "remove": { - "component_groups": ["minecraft:wolf_adult"] - }, - "add": { - "component_groups": ["minecraft:wolf_baby"] - } - }, - "minecraft:on_tame": { - "remove": { - "component_groups": ["minecraft:wolf_wild"] - }, - "add": { - "component_groups": ["minecraft:wolf_tame"] - } - }, - "minecraft:become_angry": { - "remove": { - "component_groups": ["minecraft:wolf_wild"] - }, - "add": { - "component_groups": ["minecraft:wolf_angry"] - } - }, - "minecraft:on_calm": { - "remove": { - "component_groups": ["minecraft:wolf_angry"] - }, - "add": { - "component_groups": ["minecraft:wolf_wild"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/xp_bottle.json b/build/entities/xp_bottle.json deleted file mode 100644 index 997f1d2..0000000 --- a/build/entities/xp_bottle.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "format_version": "1.12.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:xp_bottle", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:projectile": { - "on_hit": { - "grant_xp": { - "minXP": 3, - "maxXP": 11 - }, - "remove_on_hit": {} - }, - "power": 0.5, - "gravity": 0.05, - "angle_offset": -20, - "hit_sound": "glass" - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 5, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/xp_orb.json b/build/entities/xp_orb.json deleted file mode 100644 index 9268a0a..0000000 --- a/build/entities/xp_orb.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "events": { - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - }, - "component_groups": { - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "description": { - "identifier": "minecraft:xp_orb", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "components": { - "minecraft:collision_box": { - "width": 0.25, - "height": 0.25 - }, - "minecraft:type_family": { - "family": ["inanimate"] - }, - "minecraft:health": { - "value": 5, - "max": 5 - }, - "minecraft:buoyant": { - "apply_gravity": false, - "liquid_blocks": ["minecraft:flowing_water", "minecraft:water"] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": { - "default_values": { - "max_optimized_distance": 80, - "max_dropped_ticks": 10, - "use_motion_prediction_hints": true - } - } - } - } -} diff --git a/build/entities/zoglin.json b/build/entities/zoglin.json deleted file mode 100644 index fb0e9c6..0000000 --- a/build/entities/zoglin.json +++ /dev/null @@ -1,258 +0,0 @@ -{ - "format_version": "1.18.30", - "minecraft:entity": { - "description": { - "identifier": "minecraft:zoglin", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "zoglin_baby": { - "minecraft:type_family": { - "family": ["zoglin", "zoglin_baby", "undead", "mob"] - }, - "minecraft:is_baby": {}, - "minecraft:attack": { - "damage": 0.5 - }, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:collision_box": { - "width": 0.85, - "height": 0.85 - }, - "minecraft:custom_hit_test": { - "hitboxes": [ - { - "width": 1, - "height": 0.85, - "pivot": [0, 0.5, 0] - } - ] - } - }, - "zoglin_adult": { - "minecraft:type_family": { - "family": ["zoglin", "zoglin_adult", "undead", "mob"] - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 1.4 - }, - "minecraft:custom_hit_test": { - "hitboxes": [ - { - "width": 2, - "height": 1.75, - "pivot": [0, 1, 0] - } - ] - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:attack": { - "damage": [3, 8] - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:nameable": {}, - "minecraft:loot": { - "table": "loot_tables/entities/zoglin.json" - }, - "minecraft:experience_reward": { - "on_bred": "Math.Random(1,7)", - "on_death": "query.last_hit_by_player ? 5 : 0" - }, - "minecraft:health": { - "value": 40, - "max": 40 - }, - "minecraft:knockback_resistance": { - "value": 0.6 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 3, - "within_radius": 16, - "entity_types": [ - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "zoglin" - }, - { - "test": "is_family", - "subject": "other", - "operator": "!=", - "value": "creeper" - } - ] - }, - "max_dist": 16 - } - ], - "must_see": true - }, - "minecraft:behavior.melee_attack": { - "priority": 4, - "reach_multiplier": 2.15, - "speed_multiplier": 1.4, - "track_target": true - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:movement": { - "value": 0.25 - }, - "minecraft:navigation.walk": { - "is_amphibious": true, - "can_path_over_water": false, - "avoid_water": true, - "avoid_damage_blocks": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:fire_immune": {}, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:despawn": { - "filters": { - "any_of": [ - { - "all_of": [ - { - "test": "is_persistent", - "value": false - }, - { - "test": "distance_to_nearest_player", - "operator": ">", - "value": 54 - } - ] - }, - { - "all_of": [ - { - "test": "is_persistent", - "value": false - }, - { - "test": "inactivity_timer", - "subject": "self", - "value": 30 - }, - { - "test": "random_chance", - "value": 800 - }, - { - "test": "distance_to_nearest_player", - "operator": ">", - "value": 32 - } - ] - } - ] - } - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 1 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_transformed": { - "sequence": [ - { - "filters": { - "test": "has_component", - "subject": "other", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["zoglin_baby"] - } - }, - { - "filters": { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["zoglin_adult"] - } - } - ] - }, - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "add": { - "component_groups": ["zoglin_adult"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["zoglin_baby"] - } - } - ] - }, - "minecraft:as_adult": { - "add": { - "component_groups": ["zoglin_adult"] - } - }, - "minecraft:as_baby": { - "add": { - "component_groups": ["zoglin_baby"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/zombie.json b/build/entities/zombie.json deleted file mode 100644 index 24ae3ff..0000000 --- a/build/entities/zombie.json +++ /dev/null @@ -1,612 +0,0 @@ -{ - "format_version": "1.20.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:zombie", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:look_to_start_drowned_transformation": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": true - }, - "event": "minecraft:start_transforming" - } - } - }, - "minecraft:start_drowned_transformation": { - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_underwater", - "subject": "self", - "operator": "==", - "value": false - }, - "event": "minecraft:stop_transforming" - } - }, - "minecraft:timer": { - "looping": false, - "time": 30, - "time_down_event": { - "event": "minecraft:convert_to_drowned" - } - } - }, - "minecraft:convert_to_drowned": { - "minecraft:transformation": { - "into": "minecraft:drowned", - "transformation_sound": "convert_to_drowned", - "drop_equipment": true, - "delay": { - "value": 15 - } - }, - "minecraft:is_shaking": {} - }, - "minecraft:convert_to_baby_drowned": { - "minecraft:transformation": { - "into": "minecraft:drowned", - "transformation_sound": "convert_to_drowned", - "drop_equipment": true, - "delay": { - "value": 15 - } - }, - "minecraft:is_shaking": {} - }, - "minecraft:zombie_baby": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:movement": { - "value": 0.35 - } - }, - "minecraft:zombie_adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:movement": { - "value": 0.23 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 1.1, -0.35], - "lock_rider_rotation": 0 - } - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - } - }, - "minecraft:zombie_jockey": { - "minecraft:behavior.find_mount": { - "priority": 1, - "within_radius": 16, - "start_delay": 15, - "max_failed_attempts": 20 - } - }, - "minecraft:can_have_equipment": { - "minecraft:equipment": { - "table": "loot_tables/entities/zombie_equipment.json" - } - }, - "minecraft:can_break_doors": { - "minecraft:annotation.break_door": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:nameable": {}, - "minecraft:type_family": { - "family": ["zombie", "undead", "monster", "mob"] - }, - "minecraft:equip_item": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:burns_in_daylight": {}, - "minecraft:movement.basic": {}, - "minecraft:navigation.walk": { - "is_amphibious": true, - "can_pass_doors": true, - "can_walk": true, - "can_break_doors": true - }, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_air": true, - "breathes_water": true - }, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:loot": { - "table": "loot_tables/entities/zombie.json" - }, - "minecraft:shareables": { - "singular_pickup": true, - "items": [ - { - "item": "minecraft:netherite_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:stone_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:wooden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - } - ] - }, - "minecraft:environment_sensor": { - "triggers": { - "filters": { - "test": "is_underwater", - "operator": "==", - "value": true - }, - "event": "minecraft:start_transforming" - } - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.equip_item": { - "priority": 2 - }, - "minecraft:behavior.melee_attack": { - "priority": 3 - }, - "minecraft:behavior.stomp_turtle_egg": { - "priority": 4, - "speed_multiplier": 1, - "search_range": 10, - "search_height": 2, - "goal_radius": 1.14, - "interval": 20 - }, - "minecraft:behavior.pickup_items": { - "priority": 6, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1, - "pickup_based_on_chance": true, - "can_pickup_any_item": true, - "excluded_items": ["minecraft:glow_ink_sac"] - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "reselect_targets": true, - "within_radius": 25, - "must_see_forget_duration": 17, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 35 - }, - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - "max_dist": 35, - "must_see": false - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 35 - } - ] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "sequence": [ - { - "randomize": [ - { - "weight": 380, - "remove": {}, - "add": { - "component_groups": ["minecraft:zombie_adult", "minecraft:can_have_equipment"] - } - }, - { - "weight": 17, - "remove": {}, - "add": { - "component_groups": ["minecraft:zombie_baby", "minecraft:can_have_equipment"] - } - }, - { - "weight": 3, - "remove": {}, - "add": { - "component_groups": ["minecraft:zombie_baby", "minecraft:zombie_jockey", "minecraft:can_have_equipment"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 10, - "add": { - "component_groups": ["minecraft:can_break_doors"] - } - }, - { - "weight": 90 - } - ] - } - ] - }, - "minecraft:as_adult": { - "add": { - "component_groups": ["minecraft:zombie_adult"] - } - }, - "minecraft:as_baby": { - "add": { - "component_groups": ["minecraft:zombie_baby"] - } - }, - "minecraft:start_transforming": { - "add": { - "component_groups": ["minecraft:start_drowned_transformation"] - }, - "remove": { - "component_groups": ["minecraft:look_to_start_drowned_transformation"] - } - }, - "minecraft:stop_transforming": { - "add": { - "component_groups": ["minecraft:look_to_start_drowned_transformation"] - }, - "remove": { - "component_groups": ["minecraft:start_drowned_transformation"] - } - }, - "minecraft:convert_to_drowned": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["minecraft:convert_to_drowned"] - }, - "remove": { - "component_groups": ["minecraft:start_drowned_transformation"] - } - }, - { - "filters": { - "test": "has_component", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["minecraft:convert_to_baby_drowned"] - }, - "remove": { - "component_groups": ["minecraft:start_drowned_transformation"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/zombie_horse.json b/build/entities/zombie_horse.json deleted file mode 100644 index 240072e..0000000 --- a/build/entities/zombie_horse.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:zombie_horse", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:horse_baby": { - "minecraft:is_baby": {}, - "minecraft:scale_by_age": { - "start_scale": 0.5, - "end_scale": 1 - }, - "minecraft:ageable": { - "duration": 1200, - "grow_up": { - "event": "minecraft:ageable_grow_up", - "target": "self" - } - }, - "minecraft:behavior.follow_parent": { - "priority": 4, - "speed_multiplier": 1 - } - }, - "minecraft:horse_adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0" - }, - "minecraft:loot": { - "table": "loot_tables/entities/zombie_horse.json" - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "interact_text": "action.interact.ride.horse", - "seats": { - "position": [0, 1.2, -0.2] - } - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.5, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.player_ride_tamed": {} - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:type_family": { - "family": ["zombiehorse", "undead", "mob"] - }, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:collision_box": { - "width": 1.4, - "height": 1.6 - }, - "minecraft:health": { - "value": 15, - "max": 15 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:movement": { - "value": 0.2 - }, - "minecraft:navigation.walk": { - "is_amphibious": true, - "avoid_water": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:nameable": {}, - "minecraft:is_tamed": {}, - "minecraft:horse.jump_strength": { - "value": { - "range_min": 0.4, - "range_max": 1 - } - }, - "minecraft:leashable": { - "soft_distance": 4, - "hard_distance": 6, - "max_distance": 10 - }, - "minecraft:balloonable": {}, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.panic": { - "priority": 1, - "speed_multiplier": 1.2 - }, - "minecraft:behavior.random_stroll": { - "priority": 6, - "speed_multiplier": 0.7 - }, - "minecraft:behavior.look_at_player": { - "priority": 7, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 8 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 36, - "add": { - "component_groups": ["minecraft:horse_adult"] - } - }, - { - "weight": 9, - "add": { - "component_groups": ["minecraft:horse_baby"] - } - } - ] - }, - "minecraft:ageable_grow_up": { - "remove": { - "component_groups": ["minecraft:horse_baby"] - }, - "add": { - "component_groups": ["minecraft:horse_adult"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/zombie_pigman.json b/build/entities/zombie_pigman.json deleted file mode 100644 index 3ac712b..0000000 --- a/build/entities/zombie_pigman.json +++ /dev/null @@ -1,438 +0,0 @@ -{ - "format_version": "1.16.0", - "minecraft:entity": { - "description": { - "identifier": "minecraft:zombie_pigman", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "minecraft:pig_zombie_baby": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - } - }, - "minecraft:pig_zombie_adult": { - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 1.1, -0.35], - "lock_rider_rotation": 0 - } - }, - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - } - }, - "minecraft:pig_zombie_angry": { - "minecraft:angry": { - "duration": 25, - "broadcast_anger": true, - "broadcast_range": 20, - "calm_event": { - "event": "minecraft:on_calm", - "target": "self" - } - } - }, - "minecraft:pig_zombie_calm": { - "minecraft:on_target_acquired": { - "event": "minecraft:become_angry", - "target": "self" - } - }, - "minecraft:strider_jockey": { - "minecraft:equipment": { - "table": "loot_tables/entities/zombified_piglin_rider_gear.json" - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:equip_item": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:nameable": {}, - "minecraft:navigation.walk": { - "is_amphibious": true, - "can_pass_doors": true, - "can_open_doors": true, - "avoid_water": true, - "avoid_portals": true - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:fire_immune": {}, - "minecraft:type_family": { - "family": ["zombie_pigman", "undead", "monster", "mob"] - }, - "minecraft:loot": { - "table": "loot_tables/entities/zombie_pigman.json" - }, - "minecraft:equipment": { - "table": "loot_tables/entities/zombie_pigman_gear.json" - }, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:movement": { - "value": 0.23 - }, - "minecraft:attack": { - "damage": 5 - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:shareables": { - "items": [ - { - "item": "minecraft:netherite_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:iron_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:stone_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:golden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:wooden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:netherite_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - } - ] - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.mount_pathing": { - "priority": 2, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - }, - "minecraft:behavior.equip_item": { - "priority": 3 - }, - "minecraft:behavior.melee_attack": { - "priority": 4, - "speed_multiplier": 1.5 - }, - "minecraft:behavior.stomp_turtle_egg": { - "priority": 5, - "speed_multiplier": 1, - "search_range": 10, - "search_height": 2, - "goal_radius": 1.14, - "interval": 20 - }, - "minecraft:behavior.pickup_items": { - "priority": 6, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1, - "pickup_based_on_chance": true, - "can_pickup_any_item": true - }, - "minecraft:behavior.random_stroll": { - "priority": 7, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 8, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 9 - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "minecraft:entity_transformed": { - "sequence": [ - { - "filters": { - "test": "has_component", - "subject": "other", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["minecraft:pig_zombie_baby", "minecraft:pig_zombie_calm"] - } - }, - { - "filters": { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["minecraft:pig_zombie_adult", "minecraft:pig_zombie_calm"] - } - } - ] - }, - "minecraft:entity_spawned": { - "randomize": [ - { - "weight": 95, - "remove": {}, - "add": { - "component_groups": ["minecraft:pig_zombie_adult", "minecraft:pig_zombie_calm"] - } - }, - { - "weight": 5, - "remove": {}, - "add": { - "component_groups": ["minecraft:pig_zombie_baby", "minecraft:pig_zombie_calm"] - } - } - ] - }, - "minecraft:on_calm": { - "remove": { - "component_groups": ["minecraft:pig_zombie_angry"] - }, - "add": { - "component_groups": ["minecraft:pig_zombie_calm"] - } - }, - "minecraft:become_angry": { - "remove": { - "component_groups": ["minecraft:pig_zombie_calm"] - }, - "add": { - "component_groups": ["minecraft:pig_zombie_angry"] - } - }, - "minecraft:spawn_as_strider_jockey": { - "add": { - "component_groups": ["minecraft:strider_jockey"] - } - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/zombie_villager.json b/build/entities/zombie_villager.json deleted file mode 100644 index 2bb007a..0000000 --- a/build/entities/zombie_villager.json +++ /dev/null @@ -1,1013 +0,0 @@ -{ - "format_version": "1.20.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:zombie_villager", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "become_zombie_villager_v2": { - "minecraft:transformation": { - "into": "minecraft:zombie_villager_v2", - "keep_level": false - } - }, - "baby": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:movement": { - "value": 0.35 - } - }, - "adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:movement": { - "value": 0.23 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 1.1, -0.35] - } - }, - "minecraft:behavior.mount_pathing": { - "priority": 5, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - } - }, - "jockey": { - "minecraft:behavior.find_mount": { - "priority": 1, - "within_radius": 16 - } - }, - "can_break_doors": { - "minecraft:annotation.break_door": {} - }, - "from_abandoned_village": { - "minecraft:navigation.walk": { - "is_amphibious": true, - "can_pass_doors": true, - "can_open_doors": true, - "avoid_water": true, - "avoid_sun": true - }, - "minecraft:behavior.flee_sun": { - "priority": 4, - "speed_multiplier": 1 - } - }, - "to_villager": { - "minecraft:transformation": { - "into": "minecraft:villager", - "begin_transform_sound": "remedy", - "transformation_sound": "unfect", - "delay": { - "value": 100, - "block_assist_chance": 0.01, - "block_radius": 4, - "block_chance": 0.3, - "block_types": ["minecraft:bed", "minecraft:iron_bars"] - } - }, - "minecraft:spell_effects": { - "add_effects": [ - { - "effect": "strength", - "duration": 100 - }, - { - "effect": "heal", - "duration": 100 - } - ], - "remove_effects": "weakness" - }, - "minecraft:is_shaking": {} - }, - "farmer": { - "minecraft:type_family": { - "family": ["farmer", "zombie", "zombie_villager", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "fisherman": { - "minecraft:type_family": { - "family": ["fisherman", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "shepherd": { - "minecraft:type_family": { - "family": ["shepherd", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "fletcher": { - "minecraft:type_family": { - "family": ["fletcher", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "librarian": { - "minecraft:type_family": { - "family": ["librarian", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 1 - } - }, - "cartographer": { - "minecraft:type_family": { - "family": ["cartographer", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 1 - } - }, - "cleric": { - "minecraft:type_family": { - "family": ["cleric", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 2 - } - }, - "armorer": { - "minecraft:type_family": { - "family": ["armorer", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 3 - } - }, - "weaponsmith": { - "minecraft:type_family": { - "family": ["weaponsmith", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 3 - } - }, - "toolsmith": { - "minecraft:type_family": { - "family": ["toolsmith", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 3 - } - }, - "butcher": { - "minecraft:type_family": { - "family": ["butcher", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 4 - } - }, - "leatherworker": { - "minecraft:type_family": { - "family": ["leatherworker", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 4 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:navigation.walk": { - "is_amphibious": true, - "can_pass_doors": true, - "can_break_doors": true, - "avoid_sun": false - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:loot": { - "table": "loot_tables/entities/zombie.json" - }, - "minecraft:equip_item": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:burns_in_daylight": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:nameable": {}, - "minecraft:shareables": { - "singular_pickup": true, - "items": [ - { - "item": "minecraft:netherite_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:stone_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:wooden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - } - ] - }, - "minecraft:interact": { - "interactions": { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "golden_apple" - }, - { - "test": "has_component", - "subject": "self", - "value": "minecraft:effect.weakness" - } - ] - }, - "event": "villager_converted", - "target": "self" - }, - "use_item": true, - "interact_text": "action.interact.cure" - } - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.melee_attack": { - "priority": 6 - }, - "minecraft:behavior.equip_item": { - "priority": 3 - }, - "minecraft:behavior.stomp_turtle_egg": { - "priority": 4, - "speed_multiplier": 1, - "search_range": 10, - "search_height": 2, - "goal_radius": 1.14, - "interval": 20 - }, - "minecraft:behavior.pickup_items": { - "priority": 8, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1, - "pickup_based_on_chance": true, - "can_pickup_any_item": true, - "excluded_items": ["minecraft:glow_ink_sac"] - }, - "minecraft:behavior.random_stroll": { - "priority": 9, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 10, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 11 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "reselect_targets": true, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - } - ] - }, - "max_dist": 35 - }, - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - "max_dist": 35, - "must_see": false - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 35 - } - ] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - }, - "minecraft:conditional_bandwidth_optimization": {} - }, - "events": { - "villager_converted": { - "remove": {}, - "add": { - "component_groups": ["to_villager"] - } - }, - "minecraft:entity_spawned": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 9500, - "remove": {}, - "add": { - "component_groups": ["adult"] - } - }, - { - "weight": 425, - "remove": {}, - "add": { - "component_groups": ["baby"] - } - }, - { - "weight": 75, - "remove": {}, - "add": { - "component_groups": ["baby", "jockey"] - } - } - ] - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 5, - "add": { - "component_groups": ["farmer"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fisherman"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["shepherd"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fletcher"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["librarian"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cartographer"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cleric"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["armorer"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["weaponsmith"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["toolsmith"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["butcher"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["leatherworker"] - } - } - ] - }, - { - "randomize": [ - { - "weight": 10, - "add": { - "component_groups": ["can_break_doors"] - } - }, - { - "weight": 90 - } - ] - } - ] - }, - "minecraft:entity_transformed": { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "sequence": [ - { - "filters": { - "test": "has_component", - "subject": "other", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["baby"] - } - }, - { - "filters": { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["adult"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "farmer" - }, - "add": { - "component_groups": ["farmer"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "fisherman" - }, - "add": { - "component_groups": ["fisherman"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "shepherd" - }, - "add": { - "component_groups": ["shepherd"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "fletcher" - }, - "add": { - "component_groups": ["fletcher"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "librarian" - }, - "add": { - "component_groups": ["librarian"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cartographer" - }, - "add": { - "component_groups": ["cartographer"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cleric" - }, - "add": { - "component_groups": ["cleric"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "armorer" - }, - "add": { - "component_groups": ["armorer"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "weaponsmith" - }, - "add": { - "component_groups": ["weaponsmith"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "toolsmith" - }, - "add": { - "component_groups": ["toolsmith"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "butcher" - }, - "add": { - "component_groups": ["butcher"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "leatherworker" - }, - "add": { - "component_groups": ["leatherworker"] - } - } - ] - }, - "minecraft:become_cleric": { - "add": { - "component_groups": ["cleric"] - } - }, - "from_village": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 9500, - "remove": {}, - "add": { - "component_groups": ["adult"] - } - }, - { - "weight": 425, - "remove": {}, - "add": { - "component_groups": ["baby"] - } - }, - { - "weight": 75, - "remove": {}, - "add": { - "component_groups": ["baby", "jockey"] - } - } - ] - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 5, - "add": { - "component_groups": ["farmer"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fisherman"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["shepherd"] - } - }, - { - "weight": 5, - "add": { - "component_groups": ["fletcher"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["librarian"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cartographer"] - } - }, - { - "weight": 20, - "add": { - "component_groups": ["cleric"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["armorer"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["weaponsmith"] - } - }, - { - "weight": 6, - "add": { - "component_groups": ["toolsmith"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["butcher"] - } - }, - { - "weight": 10, - "add": { - "component_groups": ["leatherworker"] - } - } - ] - }, - { - "add": { - "component_groups": ["from_abandoned_village"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/entities/zombie_villager_v2.json b/build/entities/zombie_villager_v2.json deleted file mode 100644 index 388b6c2..0000000 --- a/build/entities/zombie_villager_v2.json +++ /dev/null @@ -1,1414 +0,0 @@ -{ - "format_version": "1.20.10", - "minecraft:entity": { - "description": { - "identifier": "minecraft:zombie_villager_v2", - "is_spawnable": false, - "is_summonable": false, - "is_experimental": false - }, - "component_groups": { - "baby": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:is_baby": {}, - "minecraft:scale": { - "value": 0.5 - }, - "minecraft:movement": { - "value": 0.35 - } - }, - "adult": { - "minecraft:experience_reward": { - "on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0" - }, - "minecraft:movement": { - "value": 0.23 - }, - "minecraft:rideable": { - "seat_count": 1, - "family_types": ["zombie"], - "seats": { - "position": [0, 1.1, -0.35] - } - }, - "minecraft:behavior.mount_pathing": { - "priority": 5, - "speed_multiplier": 1.25, - "target_dist": 0, - "track_target": true - } - }, - "jockey": { - "minecraft:behavior.find_mount": { - "priority": 1, - "within_radius": 16 - } - }, - "can_break_doors": { - "minecraft:annotation.break_door": {} - }, - "from_abandoned_village": { - "minecraft:navigation.walk": { - "is_amphibious": true, - "can_pass_doors": true, - "can_open_doors": true, - "avoid_water": true, - "avoid_sun": true - }, - "minecraft:behavior.flee_sun": { - "priority": 4, - "speed_multiplier": 1 - } - }, - "to_villager": { - "minecraft:transformation": { - "into": "minecraft:villager_v2", - "begin_transform_sound": "remedy", - "transformation_sound": "unfect", - "drop_equipment": true, - "keep_level": true, - "delay": { - "value": 100, - "block_assist_chance": 0.01, - "block_radius": 4, - "block_chance": 0.3, - "block_types": ["minecraft:bed", "minecraft:iron_bars"] - } - }, - "minecraft:spell_effects": { - "add_effects": [ - { - "effect": "strength", - "duration": 100 - }, - { - "effect": "heal", - "duration": 100 - } - ], - "remove_effects": "weakness" - }, - "minecraft:is_shaking": {} - }, - "unskilled": { - "minecraft:type_family": { - "family": ["unskilled", "zombie", "zombie_villager", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "nitwit": { - "minecraft:type_family": { - "family": ["nitwit", "zombie", "zombie_villager", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "farmer": { - "minecraft:type_family": { - "family": ["farmer", "zombie", "zombie_villager", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "fisherman": { - "minecraft:type_family": { - "family": ["fisherman", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "shepherd": { - "minecraft:type_family": { - "family": ["shepherd", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "fletcher": { - "minecraft:type_family": { - "family": ["fletcher", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "librarian": { - "minecraft:type_family": { - "family": ["librarian", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "cartographer": { - "minecraft:type_family": { - "family": ["cartographer", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "cleric": { - "minecraft:type_family": { - "family": ["cleric", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "armorer": { - "minecraft:type_family": { - "family": ["armorer", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "weaponsmith": { - "minecraft:type_family": { - "family": ["weaponsmith", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "toolsmith": { - "minecraft:type_family": { - "family": ["toolsmith", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "butcher": { - "minecraft:type_family": { - "family": ["butcher", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "leatherworker": { - "minecraft:type_family": { - "family": ["leatherworker", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "mason": { - "minecraft:type_family": { - "family": ["stone_mason", "zombie_villager", "zombie", "undead", "monster", "mob"] - }, - "minecraft:variant": { - "value": 0 - } - }, - "desert_villager": { - "minecraft:mark_variant": { - "value": 1 - } - }, - "jungle_villager": { - "minecraft:mark_variant": { - "value": 2 - } - }, - "savanna_villager": { - "minecraft:mark_variant": { - "value": 3 - } - }, - "snow_villager": { - "minecraft:mark_variant": { - "value": 4 - } - }, - "swamp_villager": { - "minecraft:mark_variant": { - "value": 5 - } - }, - "taiga_villager": { - "minecraft:mark_variant": { - "value": 6 - } - }, - "villager_skin_0": { - "minecraft:skin_id": { - "value": 0 - } - }, - "villager_skin_1": { - "minecraft:skin_id": { - "value": 1 - } - }, - "villager_skin_2": { - "minecraft:skin_id": { - "value": 2 - } - }, - "villager_skin_3": { - "minecraft:skin_id": { - "value": 3 - } - }, - "villager_skin_4": { - "minecraft:skin_id": { - "value": 4 - } - }, - "villager_skin_5": { - "minecraft:skin_id": { - "value": 5 - } - }, - "paradox:kick": { - "minecraft:instant_despawn": { - "remove_child_entities": true - } - } - }, - "components": { - "minecraft:is_hidden_when_invisible": {}, - "minecraft:navigation.walk": { - "is_amphibious": true, - "can_pass_doors": true, - "can_break_doors": true, - "avoid_sun": false - }, - "minecraft:movement.basic": {}, - "minecraft:jump.static": {}, - "minecraft:can_climb": {}, - "minecraft:breathable": { - "total_supply": 15, - "suffocate_time": 0, - "breathes_water": true - }, - "minecraft:loot": { - "table": "loot_tables/entities/zombie.json" - }, - "minecraft:equip_item": {}, - "minecraft:conditional_bandwidth_optimization": {}, - "minecraft:collision_box": { - "width": 0.6, - "height": 1.9 - }, - "minecraft:burns_in_daylight": {}, - "minecraft:health": { - "value": 20, - "max": 20 - }, - "minecraft:hurt_on_condition": { - "damage_conditions": [ - { - "filters": { - "test": "in_lava", - "subject": "self", - "operator": "==", - "value": true - }, - "cause": "lava", - "damage_per_tick": 4 - } - ] - }, - "minecraft:attack": { - "damage": 3 - }, - "minecraft:nameable": {}, - "minecraft:shareables": { - "singular_pickup": true, - "items": [ - { - "item": "minecraft:netherite_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:stone_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:wooden_sword", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:turtle_helmet", - "want_amount": 1, - "surplus_amount": 1, - "priority": 6 - }, - { - "item": "minecraft:skull:0", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:skull:1", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:carved_pumpkin", - "want_amount": 1, - "surplus_amount": 1, - "priority": 7 - }, - { - "item": "minecraft:netherite_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_chestplate", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_leggings", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - }, - { - "item": "minecraft:netherite_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 0 - }, - { - "item": "minecraft:diamond_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 1 - }, - { - "item": "minecraft:iron_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 2 - }, - { - "item": "minecraft:chainmail_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 3 - }, - { - "item": "minecraft:golden_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 4 - }, - { - "item": "minecraft:leather_boots", - "want_amount": 1, - "surplus_amount": 1, - "priority": 5 - } - ] - }, - "minecraft:interact": { - "interactions": { - "on_interact": { - "filters": { - "all_of": [ - { - "test": "has_equipment", - "domain": "hand", - "subject": "other", - "value": "golden_apple" - }, - { - "test": "has_component", - "subject": "self", - "value": "minecraft:effect.weakness" - } - ] - }, - "event": "villager_converted", - "target": "self" - }, - "use_item": true, - "interact_text": "action.interact.cure" - } - }, - "minecraft:despawn": { - "despawn_from_distance": {} - }, - "minecraft:behavior.melee_attack": { - "priority": 6 - }, - "minecraft:behavior.equip_item": { - "priority": 3 - }, - "minecraft:behavior.stomp_turtle_egg": { - "priority": 4, - "speed_multiplier": 1, - "search_range": 10, - "search_height": 2, - "goal_radius": 1.14, - "interval": 20 - }, - "minecraft:behavior.pickup_items": { - "priority": 8, - "max_dist": 3, - "goal_radius": 2, - "speed_multiplier": 1, - "pickup_based_on_chance": true, - "can_pickup_any_item": true, - "excluded_items": ["minecraft:glow_ink_sac"] - }, - "minecraft:behavior.random_stroll": { - "priority": 9, - "speed_multiplier": 1 - }, - "minecraft:behavior.look_at_player": { - "priority": 10, - "look_distance": 6, - "probability": 0.02 - }, - "minecraft:behavior.random_look_around": { - "priority": 11 - }, - "minecraft:behavior.hurt_by_target": { - "priority": 1 - }, - "minecraft:behavior.nearest_attackable_target": { - "priority": 2, - "must_see": true, - "reselect_targets": true, - "entity_types": [ - { - "filters": { - "any_of": [ - { - "test": "is_family", - "subject": "other", - "value": "player" - }, - { - "test": "is_family", - "subject": "other", - "value": "snowgolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "irongolem" - }, - { - "test": "is_family", - "subject": "other", - "value": "villager" - }, - { - "test": "is_family", - "subject": "other", - "value": "wandering_trader" - } - ] - }, - "max_dist": 35 - }, - { - "filters": { - "all_of": [ - { - "test": "is_family", - "subject": "other", - "value": "baby_turtle" - }, - { - "test": "in_water", - "subject": "other", - "operator": "!=", - "value": true - } - ] - }, - "max_dist": 35 - } - ] - }, - "minecraft:physics": {}, - "minecraft:pushable": { - "is_pushable": true, - "is_pushable_by_piston": true - } - }, - "events": { - "villager_converted": { - "remove": {}, - "add": { - "component_groups": ["to_villager"] - } - }, - "minecraft:entity_spawned": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 9500, - "remove": {}, - "add": { - "component_groups": ["adult"] - } - }, - { - "weight": 425, - "remove": {}, - "add": { - "component_groups": ["baby"] - } - }, - { - "weight": 75, - "remove": {}, - "add": { - "component_groups": ["baby", "jockey"] - } - } - ] - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["unskilled"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["nitwit"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["farmer"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["fisherman"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["shepherd"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["fletcher"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["librarian"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["cartographer"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["cleric"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["armorer"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["weaponsmith"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["toolsmith"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["butcher"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["leatherworker"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["mason"] - } - } - ] - }, - { - "trigger": "minecraft:add_biome_and_skin" - }, - { - "randomize": [ - { - "weight": 10, - "add": { - "component_groups": ["can_break_doors"] - } - }, - { - "weight": 90 - } - ] - } - ] - }, - "minecraft:spawn_skilled_adult": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "add": { - "component_groups": ["adult"] - } - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["farmer"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["fisherman"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["shepherd"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["fletcher"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["librarian"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["cartographer"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["cleric"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["armorer"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["weaponsmith"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["toolsmith"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["butcher"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["leatherworker"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["mason"] - } - } - ] - }, - { - "trigger": "minecraft:add_biome_and_skin" - } - ] - }, - "minecraft:entity_transformed": { - "sequence": [ - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:variant" - }, - "sequence": [ - { - "filters": { - "test": "has_component", - "subject": "other", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["baby"] - } - }, - { - "filters": { - "test": "has_component", - "subject": "other", - "operator": "!=", - "value": "minecraft:is_baby" - }, - "add": { - "component_groups": ["adult"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "unskilled" - }, - "add": { - "component_groups": ["unskilled"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "nitwit" - }, - "add": { - "component_groups": ["nitwit"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "farmer" - }, - "add": { - "component_groups": ["farmer"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "fisherman" - }, - "add": { - "component_groups": ["fisherman"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "shepherd" - }, - "add": { - "component_groups": ["shepherd"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "fletcher" - }, - "add": { - "component_groups": ["fletcher"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "librarian" - }, - "add": { - "component_groups": ["librarian"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cartographer" - }, - "add": { - "component_groups": ["cartographer"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "cleric" - }, - "add": { - "component_groups": ["cleric"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "armorer" - }, - "add": { - "component_groups": ["armorer"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "weaponsmith" - }, - "add": { - "component_groups": ["weaponsmith"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "toolsmith" - }, - "add": { - "component_groups": ["toolsmith"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "butcher" - }, - "add": { - "component_groups": ["butcher"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "leatherworker" - }, - "add": { - "component_groups": ["leatherworker"] - } - }, - { - "filters": { - "test": "is_family", - "subject": "other", - "value": "stone_mason" - }, - "add": { - "component_groups": ["mason"] - } - } - ] - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:mark_variant" - }, - "sequence": [ - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 1 - }, - "add": { - "component_groups": ["desert_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 2 - }, - "add": { - "component_groups": ["jungle_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 3 - }, - "add": { - "component_groups": ["savanna_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 4 - }, - "add": { - "component_groups": ["snow_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 5 - }, - "add": { - "component_groups": ["swamp_villager"] - } - }, - { - "filters": { - "test": "is_mark_variant", - "subject": "other", - "value": 6 - }, - "add": { - "component_groups": ["taiga_villager"] - } - } - ] - }, - { - "filters": { - "test": "has_component", - "operator": "!=", - "value": "minecraft:skin_id" - }, - "sequence": [ - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 0 - }, - "add": { - "component_groups": ["villager_skin_0"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 1 - }, - "add": { - "component_groups": ["villager_skin_1"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 2 - }, - "add": { - "component_groups": ["villager_skin_2"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 3 - }, - "add": { - "component_groups": ["villager_skin_3"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 4 - }, - "add": { - "component_groups": ["villager_skin_4"] - } - }, - { - "filters": { - "test": "is_skin_id", - "subject": "other", - "value": 5 - }, - "add": { - "component_groups": ["villager_skin_5"] - } - } - ] - } - ] - }, - "minecraft:become_cleric": { - "add": { - "component_groups": ["cleric"] - } - }, - "from_village": { - "sequence": [ - { - "trigger": "minecraft:entity_spawned" - }, - { - "add": { - "component_groups": ["from_abandoned_village"] - } - } - ] - }, - "minecraft:add_biome_and_skin": { - "sequence": [ - { - "randomize": [ - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_0"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_1"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_2"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_3"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_4"] - } - }, - { - "weight": 1, - "add": { - "component_groups": ["villager_skin_5"] - } - } - ] - }, - { - "filters": { - "any_of": [ - { - "test": "has_biome_tag", - "value": "desert" - }, - { - "test": "has_biome_tag", - "value": "mesa" - } - ] - }, - "add": { - "component_groups": ["desert_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "jungle" - }, - "add": { - "component_groups": ["jungle_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "savanna" - }, - "add": { - "component_groups": ["savanna_villager"] - } - }, - { - "filters": { - "any_of": [ - { - "all_of": [ - { - "test": "has_biome_tag", - "value": "cold" - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "ocean" - } - ] - }, - { - "test": "has_biome_tag", - "value": "frozen" - } - ] - }, - "add": { - "component_groups": ["snow_villager"] - } - }, - { - "filters": { - "test": "has_biome_tag", - "value": "swamp" - }, - "add": { - "component_groups": ["swamp_villager"] - } - }, - { - "filters": { - "all_of": [ - { - "any_of": [ - { - "test": "has_biome_tag", - "value": "taiga" - }, - { - "test": "has_biome_tag", - "value": "extreme_hills" - } - ] - }, - { - "test": "has_biome_tag", - "operator": "!=", - "value": "cold" - } - ] - }, - "add": { - "component_groups": ["taiga_villager"] - } - } - ] - }, - "paradox:kick": { - "add": { - "component_groups": ["paradox:kick"] - } - } - } - } -} diff --git a/build/functions/checks/optional/armorNBT.mcfunction b/build/functions/checks/optional/armorNBT.mcfunction deleted file mode 100644 index c863be5..0000000 --- a/build/functions/checks/optional/armorNBT.mcfunction +++ /dev/null @@ -1,31 +0,0 @@ -#Detect armor and replace with unenchanted version -execute as @s[scores={detect_helmet=1,ench_helmet=1}] at @s run /replaceitem entity @s slot.armor.head 0 leather_helmet 1 0 -execute as @s[scores={detect_helmet=2,ench_helmet=1}] at @s run /replaceitem entity @s slot.armor.head 0 chainmail_helmet 1 0 -execute as @s[scores={detect_helmet=3,ench_helmet=1}] at @s run /replaceitem entity @s slot.armor.head 0 iron_helmet 1 0 -execute as @s[scores={detect_helmet=4,ench_helmet=1}] at @s run /replaceitem entity @s slot.armor.head 0 golden_helmet 1 0 -execute as @s[scores={detect_helmet=5,ench_helmet=1}] at @s run /replaceitem entity @s slot.armor.head 0 diamond_helmet 1 0 -execute as @s[scores={detect_helmet=6,ench_helmet=1}] at @s run /replaceitem entity @s slot.armor.head 0 netherite_helmet 1 0 -execute as @s[scores={detect_helmet=7,ench_helmet=1}] at @s run /replaceitem entity @s slot.armor.head 0 turtle_helmet 1 0 - -execute as @s[scores={detect_chest=1,ench_chest=1}] at @s run /replaceitem entity @s slot.armor.chest 0 leather_chestplate 1 0 -execute as @s[scores={detect_chest=2,ench_chest=1}] at @s run /replaceitem entity @s slot.armor.chest 0 chainmail_chestplate 1 0 -execute as @s[scores={detect_chest=3,ench_chest=1}] at @s run /replaceitem entity @s slot.armor.chest 0 iron_chestplate 1 0 -execute as @s[scores={detect_chest=4,ench_chest=1}] at @s run /replaceitem entity @s slot.armor.chest 0 golden_chestplate 1 0 -execute as @s[scores={detect_chest=5,ench_chest=1}] at @s run /replaceitem entity @s slot.armor.chest 0 diamond_chestplate 1 0 -execute as @s[scores={detect_chest=6,ench_chest=1}] at @s run /replaceitem entity @s slot.armor.chest 0 netherite_chestplate 1 0 -execute as @s[scores={detect_chest=7,ench_chest=1}] at @s run /replaceitem entity @s slot.armor.chest 0 elytra 1 0 - -execute as @s[scores={detect_leggings=1,ench_legs=1}] at @s run /replaceitem entity @s slot.armor.legs 0 leather_leggings 1 0 -execute as @s[scores={detect_leggings=2,ench_legs=1}] at @s run /replaceitem entity @s slot.armor.legs 0 chainmail_leggings 1 0 -execute as @s[scores={detect_leggings=3,ench_legs=1}] at @s run /replaceitem entity @s slot.armor.legs 0 iron_leggings 1 0 -execute as @s[scores={detect_leggings=4,ench_legs=1}] at @s run /replaceitem entity @s slot.armor.legs 0 golden_leggings 1 0 -execute as @s[scores={detect_leggings=5,ench_legs=1}] at @s run /replaceitem entity @s slot.armor.legs 0 diamond_leggings 1 0 -execute as @s[scores={detect_leggings=6,ench_legs=1}] at @s run /replaceitem entity @s slot.armor.legs 0 netherite_leggings 1 0 - -scoreboard players add @s[type=player] armorvl 1 - -#Notify Staff -execute as @s[type=player] at @s run tellraw @a[tag=notify] {"rawtext":[{"text":"§f§4[§6Paradox§4]§f "},{"selector":"@s"},{"text":" §6has failed §7(Enchantment) §4Armor/A. VL= "},{"score":{"name":"@s","objective":"armorvl"}}]} - -#Notify Offenders who are not staff -tellraw @s[type=player,tag=!paradoxOpped] {"rawtext":[{"text":"§f§4[§6Paradox§4]§f You used enchanted armor. Violations: "},{"score":{"name": "@s","objective": "armorvl"}}]} diff --git a/build/functions/checks/optional/nocommandblocks.mcfunction b/build/functions/checks/optional/nocommandblocks.mcfunction deleted file mode 100644 index 1be2615..0000000 --- a/build/functions/checks/optional/nocommandblocks.mcfunction +++ /dev/null @@ -1,5 +0,0 @@ -# clear command blocks - -fill ~13 ~5 ~13 ~-13 ~-5 ~-13 air [] replace command_block -fill ~13 ~5 ~13 ~-13 ~-5 ~-13 air [] replace repeating_command_block -fill ~13 ~5 ~13 ~-13 ~-5 ~-13 air [] replace chain_command_block \ No newline at end of file diff --git a/build/functions/checks/optional/overridecommandblocksenabled.mcfunction b/build/functions/checks/optional/overridecommandblocksenabled.mcfunction deleted file mode 100644 index bbd045f..0000000 --- a/build/functions/checks/optional/overridecommandblocksenabled.mcfunction +++ /dev/null @@ -1,2 +0,0 @@ -execute as @s[scores={cmds=1}] at @s run gamerule commandblocksenabled true -execute as @s[scores={cmds=2..}] at @s run gamerule commandblocksenabled false \ No newline at end of file diff --git a/build/functions/checks/others.mcfunction b/build/functions/checks/others.mcfunction deleted file mode 100644 index f8fed19..0000000 --- a/build/functions/checks/others.mcfunction +++ /dev/null @@ -1,2 +0,0 @@ -# If the player is under y=-104 this teleports them back to y=-104 -tp @s[y=-105,dy=-205] ~ -104 ~ \ No newline at end of file diff --git a/build/functions/main.mcfunction b/build/functions/main.mcfunction deleted file mode 100644 index 09f5e90..0000000 --- a/build/functions/main.mcfunction +++ /dev/null @@ -1,15 +0,0 @@ -# Prevents disabler hacks from possibly disabling the anticheat -gamerule randomtickspeed 1 - -# Run all the checks -function checks/others - -# Optional checks -execute as @s[scores={commandblocks=1..}] at @s run function checks/optional/nocommandblocks -execute as @s[scores={cmds=1..}] at @s run /function checks/optional/overridecommandblocksenabled - -# Armor system -execute as @s[scores={ench_helmet=1,encharmor=1..}] at @s run /function checks/optional/armorNBT -execute as @s[scores={ench_chest=1,encharmor=1..}] at @s run /function checks/optional/armorNBT -execute as @s[scores={ench_legs=1,encharmor=1..}] at @s run /function checks/optional/armorNBT -execute as @s[scores={ench_boots=1,encharmor=1..}] at @s run /function checks/optional/armorNBT diff --git a/build/pack_icon.png b/build/pack_icon.png deleted file mode 100644 index def3a5a0496605f45d8adc3d466ca56ab9d8dfb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225835 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�u5S3u7o0^AcYRN8ZWS|$OP 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

(bb?S0N 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 1) { - // Remove double quotes from the reason if present - reason = args - .slice(1) - .join(" ") - .replace(/(^"|"$)/g, ""); - } - // Remove double quotes from the player name if present - playerName = playerName.replace(/(^"|"$)/g, ""); - // try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(playerName.toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Check if player exists - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // make sure they dont ban themselves - if (member === player) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者には実行できません`); - } - try { - member.addTag("Reason:" + reason); - member.addTag("By:" + player.name); - member.addTag("isBanned"); - } - catch (error) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ユーザーをBANできませんでした! エラー内容: ${error}`); - } - return sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f${player.name}§fが ${member.name}をBANしました§f. BAN理由: ${reason}`); -} diff --git a/build/scripts/commands/moderation/credits.js b/build/scripts/commands/moderation/credits.js deleted file mode 100644 index 61721b3..0000000 --- a/build/scripts/commands/moderation/credits.js +++ /dev/null @@ -1,85 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer } from "../../util.js"; -function creditsHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.credits) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: credits`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: credits [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Shows credits for Paradox Anti Cheat.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}credits`, - ` §4- §6Show credits for Paradox Anti Cheat§f`, - ` ${prefix}credits help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name credits - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function credits(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/credits.js:26)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.credits) { - return creditsHelp(player, prefix); - } - sendMsgToPlayer(player, [ - ` `, - `§l§6 Based on Scythe AntiCheat`, - `§l§4-----------------------------------------------------`, - `§lGithub:§f https://https://github.com/MrDiamond64/Scythe-AntiCheat`, - `§lDeveloped and maintained by MrDiamond64`, - ` `, - `§l§6 Major Contributers For Scythe`, - `§l§4-----------------------------------------------------`, - `Visual1mpact#1435 - Porting function-based commands to GameTest commands and finding many bugs`, - ` `, - `§l§6 Paradox AntiCheat (archived)`, - `§l§4-----------------------------------------------------`, - `§lGithub:§f https://github.com/Visual1mpact/Paradox_AntiCheat`, - `§lParadox AntiCheat§f - a utility to fight against malicious hackers on Bedrock Edition.`, - `§lDeveloped and maintained by Visual1mpact#1435`, - ` `, - `§l§6 Paradox AntiCheat (archived)`, - `§l§4-----------------------------------------------------`, - `§lGithub:§f https://github.com/frostice482/Paradox_AntiCheat`, - `§lDeveloped and maintained by FrostIce482#8139`, - ` `, - `§l§6 Paradox AntiCheat (Continued)`, - `§l§4-----------------------------------------------------`, - `§lGithub:§f https://github.com/Pete9xi/Paradox_AntiCheat`, - `§lDeveloped and maintained by Pete9xi#7928`, - ` `, - `§l§6 Major Contributers For Paradox`, - `§l§4-----------------------------------------------------`, - `Glitch#8024 - Implementing features and bug fixes`, - `FrostIce482#8139 - Implementing features, enhancing debugging, and bug fixes`, - `Visual1mpact#1435 - Implementing Features, debugging, security, and bug fixes`, - `Pete9xi#7928 - Implementing Features, debugging, GUI guru, and bug fixes`, - ` `, - ]); - return; -} diff --git a/build/scripts/commands/moderation/deop.js b/build/scripts/commands/moderation/deop.js deleted file mode 100644 index 6d0a75b..0000000 --- a/build/scripts/commands/moderation/deop.js +++ /dev/null @@ -1,89 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { crypto, getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function deopHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.deop) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: deop`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: deop [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Revokes permission to use Paradox AntiCheat features.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}deop ${player.name}`, - ` §4- §6Revoke Paradox-Op permission from players§f`, - ` ${prefix}deop help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name deop - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function deop(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/op.js:30)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.deop) { - return deopHelp(player, prefix); - } - // Are there arguements - if (!args.length) { - return deopHelp(player, prefix); - } - // try to find the player requested - let member; - if (args.length) { - const targetPlayerName = args.join(" "); // Combine all arguments into a single string - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(targetPlayerName.toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // Check for hash/salt and validate password from member - const memberHash = member.getDynamicProperty("hash"); - const memberSalt = member.getDynamicProperty("salt"); - let memberEncode; - try { - // Use either the operator's ID or the encryption password as the key - const memberKey = config.encryption.password ? config.encryption.password : member.id; - // Generate the hash - memberEncode = crypto(memberSalt, memberKey); - } - catch (error) { } - if (memberHash !== undefined && memberHash === memberEncode) { - member.removeDynamicProperty("hash"); - member.removeDynamicProperty("salt"); - member.removeTag("paradoxOpped"); - dynamicPropertyRegistry.delete(member.id); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f${member.name}から管理者権限を取り消しました`); - return sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f管理者権限が取り消されました`); - } - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${member.name}管理者権限を消去しました`); -} diff --git a/build/scripts/commands/moderation/despawn.js b/build/scripts/commands/moderation/despawn.js deleted file mode 100644 index c89e656..0000000 --- a/build/scripts/commands/moderation/despawn.js +++ /dev/null @@ -1,126 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer } from "../../util.js"; -function despawnHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.despawn) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: despawn`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: despawn [optional]`, - `§4[§6Optional§4]§f: entity, all, help`, - `§4[§6Description§4]§f: Despawns all or specified entities if they exist.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}despawn all`, - ` §4- §6Despawn all entities§f`, - ` ${prefix}despawn iron_golem`, - ` §4- §6Despawn all "iron_golem" entities§f`, - ` ${prefix}despawn creeper`, - ` §4- §6Despawn all "creeper" entities§f`, - ` ${prefix}despawn help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name despawn - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function despawn(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/moderation/despawn.js:31)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.despawn) { - return despawnHelp(player, prefix); - } - // Are there arguements - if (!args.length) { - return despawnHelp(player, prefix); - } - // try to find the entity or despawn them all if requested - const filter = { - excludeTypes: ["player"], - }; - const filteredEntities = world.getDimension("overworld").getEntities(filter); - // Specified entity - if (args[0] !== "all" && args.length > 0) { - let counter = 0; - let requestedEntity = ""; - for (const entity of filteredEntities) { - const filteredEntity = entity.typeId.replace("minecraft:", ""); - requestedEntity = args[0].replace("minecraft:", ""); - // If an entity was specified then handle it here - if (filteredEntity === requestedEntity || filteredEntity === args[0]) { - counter = ++counter; - // Despawn this entity - entity.triggerEvent("paradox:kick"); - continue; - // If all entities were specified then handle this here - } - } - if (counter > 0) { - return sendMsgToPlayer(player, ` §o§6|§f §4[§f${requestedEntity}§4]§f §6Amount: §4x${counter}§f`); - } - else { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 指定したモブが見つかりません!`); - } - } - // All entities - if (args[0] === "all") { - const entityCount = {}; - for (const entity of filteredEntities) { - let filteredEntity = entity.typeId.replace("minecraft:", ""); - if (filteredEntity === "item") { - const itemContainer = entity.getComponent("item"); - const itemName = itemContainer.itemStack; - if (itemName !== undefined) { - filteredEntity = itemName.typeId.replace("minecraft:", ""); - } - } - if (!entityCount[filteredEntity]) { - entityCount[filteredEntity] = 1; - } - else { - entityCount[filteredEntity]++; - } - // Despawn this entity - entity.triggerEvent("paradox:kick"); - } - let totalCounter = 0; - let entityMessage = ""; - for (const entity in entityCount) { - if (entityCount.hasOwnProperty(entity)) { - const count = entityCount[entity]; - if (count > 0) { - entityMessage += ` §6|§f §4[§f${entity}§4]§f §e${count} §6匹消去しました§f\n`; - totalCounter += count; - } - } - } - if (totalCounter > 0) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Killしました:`); - return sendMsgToPlayer(player, entityMessage); - } - else { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f モブを検知できませんでした!`); - } - } -} diff --git a/build/scripts/commands/moderation/help.js b/build/scripts/commands/moderation/help.js deleted file mode 100644 index cd4d215..0000000 --- a/build/scripts/commands/moderation/help.js +++ /dev/null @@ -1,131 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer } from "../../util.js"; -import { nonstaffhelp } from "./nonstaffhelp.js"; -/** - * @name help - * @param {ChatSendAfterEvent} message - Message object - */ -export function help(message) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/help.js:8)"); - } - const player = message.sender; - // Check for custom prefix - const prefix = getPrefix(player); - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - // if not then show them non staff commands - if (uniqueId !== player.name) { - return nonstaffhelp(message); - } - // Make sure the help command wasn't disabled - if (config.customcommands.help === false) { - config.customcommands.help = true; - } - const textDisabled = "Command §4DISABLED§f."; - return sendMsgToPlayer(player, [ - `§f§4[§6Paradox§4]§fコマンド一覧`, - ` `, - `§l§o§6[§4管理者用§6]§r§o`, - `§6${prefix}help§f - ヘルプページを表示します.`, - `§6${prefix}ban§f - ${config.customcommands.ban ? `指定したユーザーをBANします` : textDisabled}`, - `§6${prefix}autoban§f - ${config.customcommands.autoban ? `Autobanで設定した検知回数を超えるとBANしますデフォルト1000` : textDisabled}`, - `§6${prefix}unban§f - ${config.customcommands.unban ? `BAN解除できます(!unban BAN解除したいプレイヤーの名前又はuuid)` : textDisabled}`, - `§6${prefix}kick§f - ${config.customcommands.kick ? `指定したユーザーをキックします` : textDisabled}`, - `§6${prefix}mute§f - ${config.customcommands.mute ? `指定したユーザーをミュートします` : textDisabled}`, - `§6${prefix}unmute§f - ${config.customcommands.unmute ? `指定したユーザーのミュートを解除します` : textDisabled}`, - `§6${prefix}notify§f - ${config.customcommands.notify ? `検知した内容を表示できるようにします` : textDisabled}`, - `§6${prefix}credits§f - Paradoxの開発者の名前等`, - `§6${prefix}op§f - ${config.customcommands.op ? `管理者権限を取得します` : textDisabled}`, - `§6${prefix}deop§f - ${config.customcommands.deop ? `管理者権限を取り消します` : textDisabled}`, - `§6${prefix}modules§f - ${config.customcommands.modules ? `アンチチート機能一覧を表示します` : textDisabled}`, - `§6${prefix}prefix§f - !などを?とかに変更できますデフォルトは!です`, - `§6${prefix}prefix reset§f - デフォルトの!に戻します`, - `§6${prefix}lockdown§f - ${config.customcommands.lockdown ? `管理者以外のプレイヤーをキックしてメンテナンス中にできます` : textDisabled}`, - `§6${prefix}punish§f - ${config.customcommands.punish ? `指定したユーザーのインベントリとエンダーチェストを消去できます` : textDisabled}`, - `§6${prefix}tpa§f - ${config.customcommands.tpa ? `指定したユーザーにTPします` : textDisabled}`, - `§6${prefix}despawn§f - ${config.customcommands.despawn ? `指定したモブをkillします` : textDisabled}`, - ` `, - `§l§o§6[§4アンチチート機能§6]§r§o`, - `§6${prefix}allowgma§f - ${config.customcommands.allowgma ? `アドベンチャーを禁止します` : textDisabled}`, - `§6${prefix}allowgmc§f - ${config.customcommands.allowgmc ? `クリエイティブを禁止します` : textDisabled}`, - `§6${prefix}allowgms§f - ${config.customcommands.allowgms ? `サバイバルを禁止します` : textDisabled}`, - `§6${prefix}removecb§f - ${config.customcommands.removecommandblocks ? `有効にするとワールドに存在するコマンドブロックを全て消します.` : textDisabled}`, - `§6${prefix}bedrockvalidate§f - ${config.customcommands.bedrockvalidate ? `岩盤の確認を行う(機能はよくわからん)` : textDisabled}`, - `§6${prefix}overridecbe§f - ${config.customcommands.overidecommandblocksenabled ? `commandblocksenabled gamerule を常に有効または無効にします。` : textDisabled}`, - `§6${prefix}worldborder §f - ${config.customcommands.worldborder ? `オーバーワールド、ネザー、エンドのワールド境界を設定します。` : textDisabled}`, - `§6${prefix}autoclicker§f - ${config.customcommands.autoclicker ? `オートクリッカーを禁止します` : textDisabled}`, - `§6${prefix}jesusa§f - ${config.customcommands.jesusa ? `プレイヤーが水や溶岩の上を歩いているかどうかをチェックします(現Horionは検知できなかった).` : textDisabled}`, - `§6${prefix}enchantedarmor§f - ${config.customcommands.enchantedarmor ? `エンチャ付きの装備からエンチャを消す` : textDisabled}`, - `§6${prefix}antikillaura§f - ${config.customcommands.antikillaura ? `90度の角度の外側からの攻撃をチェックするかどうかを切り替える。` : textDisabled}`, - `§6${prefix}antikb§f - ${config.customcommands.antikb ? `Anti Knockbackをチェックする` : textDisabled}`, - `§6${prefix}badpackets1§f - ${config.customcommands.badpackets1 ? `各ブロードキャストのメッセージ長をチェックする。` : textDisabled}`, - `§6${prefix}spammera§f - ${config.customcommands.spammera ? `移動中にメッセージが送信されたかどうかをチェックする。` : textDisabled}`, - `§6${prefix}spammerb§f - ${config.customcommands.spammerb ? `泳いでいる時にメッセージが送信されたかどうかをチェックする。` : textDisabled}`, - `§6${prefix}spammerc§f - ${config.customcommands.spammerc ? `アイテム使用中にメッセージが送信されたかどうかをチェックする。` : textDisabled}`, - `§6${prefix}antispam§f - ${config.customcommands.antispam ? `2秒のクールダウンでチャットのスパムをチェックする。` : textDisabled}`, - `§6${prefix}crashera§f - ${config.customcommands.crashera ? `Horion crasherを対策する` : textDisabled}`, - `§6${prefix}namespoofa§f - ${config.customcommands.namespoofa ? `プレーヤーの名前が文字数の制限を超えていないかチェックする。` : textDisabled}`, - `§6${prefix}namespoofb§f - ${config.customcommands.namespoofb ? `プレイヤーの名前にASCII以外の文字が含まれていないかチェックする。` : textDisabled}`, - `§6${prefix}reacha§f - ${config.customcommands.reacha ? `プレイヤーの手の届かないところにブロックがあるかどうかをチェックする。` : textDisabled}`, - `§6${prefix}reachb§f - ${config.customcommands.reachb ? `プレイヤーの攻撃が届かないかチェックする。` : textDisabled}`, - `§6${prefix}speeda§f - ${config.customcommands.speeda ? `プレイヤーがスピードハックをしているかどうかをチェックする。` : textDisabled}`, - `§6${prefix}flya§f - ${config.customcommands.flya ? `プレイヤーがサバイバルの状態で飛行をしているかどうかをチェックする。` : textDisabled}`, - `§6${prefix}illegalitemsa§f - ${config.customcommands.illegalitemsa ? `インベントリに不正なアイテムがあるかどうかをチェックする。` : textDisabled}`, - `§6${prefix}illegalitemsb§f - ${config.customcommands.illegalitemsb ? `プレイヤーが不正なアイテムを置いていないかチェックする。` : textDisabled}`, - `§6${prefix}illegalitemsc§f - ${config.customcommands.illegalitemsc ? `ワールドに違法な落とし物がないかチェックする。` : textDisabled}`, - `§6${prefix}illegalenchant§f - ${config.customcommands.illegalenchant ? `アイテムに違法なエンチャントが施されていないかチェックする。` : textDisabled}`, - `§6${prefix}illegallores§f - ${config.customcommands.illegallores ? `アイテムに不正な名前がないかチェックする。` : textDisabled}`, - `§6${prefix}invalidsprinta§f - ${config.customcommands.invalidsprinta ? `盲目による不正なスプリントをチェックする` : textDisabled}`, - `§6${prefix}stackban§f - ${config.customcommands.stackban ? `プレイヤーが64以上の不正なスタックを持っているかどうかをチェックする。` : textDisabled}`, - `§6${prefix}antiscaffolda§f - ${config.customcommands.antiscaffolda ? `選手に違法な足場がないかチェックする。(Horionだと検知されにくい)` : textDisabled}`, - `§6${prefix}antinukera§f - ${config.customcommands.antinukera ? `選手がブロックを範囲破壊していないかチェックする` : textDisabled}`, - `§6${prefix}xraya§f - ${config.customcommands.xraya ? `プレイヤーが特定の鉱石を採掘したときと場所を管理者に通知する。` : textDisabled}`, - `§6${prefix}chatranks§f - ${config.customcommands.chatranks ? `チャットのランクを切り替える` : textDisabled}`, - `§6${prefix}antishulker§f - ${config.customcommands.antishulker ? `ワールドのシュルカーを全滅させる` : textDisabled}`, - `§6${prefix}ops§f - ${config.customcommands.ops ? `オンラインのプレイヤーが一人でも寝ると朝になります(銃アドオンを入れた状態だと不安定)` : textDisabled}`, - `§6${prefix}salvage§f - ${config.customcommands.salvage ? `新しいサルベージシステム[実験的]を切り替える` : textDisabled}`, - `§6${prefix}badpackets2§f - ${config.customcommands.badpackets2 ? `プレーヤーが選択したスロットが無効かどうかのチェックを切り替える。` : textDisabled}`, - `§6${prefix}clearlag§f - ${config.customcommands.clearlag ? `タイマーでアイテムやエンティティをクリアする。` : textDisabled}`, - `§6${prefix}antifalla§f - ${config.customcommands.antifalla ? `サバイバルで落下ダメージを受けないかどうかのチェックを切り替える。` : textDisabled}`, - `§6${prefix}showrules§f - ${config.customcommands.showrules ? `プレイヤーが初めてロードしたときにルールを表示するかどうかを切り替えます。` : textDisabled}`, - `§6${prefix}afk§f - ${config.customcommands.afk ? `放置しているプレイヤーをキックする ${config.modules.afk.minutes} 分` : textDisabled}`, - ` `, - `§l§o§6[§4管理者用ツール§6]§r§o`, - `§6${prefix}give§f - ${config.customcommands.give ? `Giveコマンドが使えます` : textDisabled}`, - `§6${prefix}ecwipe§f - ${config.customcommands.ecwipe ? `指定したプレイヤーのエンダーチェストを消去` : textDisabled}`, - `§6${prefix}fly§f - ${config.customcommands.fly ? `サバイバルの状態で飛べるようにします` : textDisabled}`, - `§6${prefix}freeze§f - ${config.customcommands.freeze ? `チーターを!freezeでy245に隔離して問題を起こせないようにします` : textDisabled}`, - `§6${prefix}stats§f - ${config.customcommands.stats ? `特定のプレイヤーのステータスを見る。` : textDisabled}`, - `§6${prefix}list§f - ${config.customcommands.fullreport ? `現在ワールドに居る全員のステータスを確認` : textDisabled}`, - `§6${prefix}van§f - ${config.customcommands.vanish ? `透明化できます(スペクターで良い)` : textDisabled}`, - `§6${prefix}chatranks§f - ${config.customcommands.chatranks ? `チャットランクを付けれます` : textDisabled}`, - `§6${prefix}clearchat§f - ${config.customcommands.clearchat ? `チャットを綺麗にします` : textDisabled}`, - `§6${prefix}invsee§f - ${config.customcommands.invsee ? `プレイヤーのインベントリにあるすべてのアイテムを一覧表示します。` : textDisabled}`, - `§6${prefix}tps§f - ${config.customcommands.sethome ? `現在の座標を保存する` : textDisabled}`, - `§6${prefix}tpg§f - ${config.customcommands.gohome ? `保存した座標にテレポートする。` : textDisabled}`, - `§6${prefix}tpl§f - ${config.customcommands.listhome ? `保存した場所のリストを表示します。` : textDisabled}`, - `§6${prefix}tpd§f - ${config.customcommands.delhome ? `リストから保存場所を削除する。` : textDisabled}`, - `§6${prefix}hotbar§f - ${config.customcommands.hotbar ? `すべてのプレーヤーのホットバーメッセージを切り替えます。例:おさかな~` : textDisabled}`, - `§6${prefix}ui§f - ${config.customcommands.paradoxiu ? `メニューを表示します` : textDisabled}`, - `§6${prefix}tpr§f - ${config.customcommands.tpr ? `指定したプレイヤーにTPリクエストを送信できます` : textDisabled}`, - `§6${prefix}map§f - ${config.customcommands.biome ? `自分が今いるバイオームを確認できます` : textDisabled}`, - `§6${prefix}rank§f - ${config.customcommands.rank ? `タグを付けれます` : textDisabled}`, - `§6${prefix}version§f - Paradoxのバージョンを表示できますが日本語版はこう君が編集している為バージョンが少しずれます`, - `§6${prefix}ch cr <名前> [パスワード]§f - ${config.customcommands.channel ? `新しいチャットチャンネルを作成する` : textDisabled}`, - `§6${prefix}ch de <名前> [パスワード]§f - ${config.customcommands.channel ? `既存のチャットチャンネルを削除する!` : textDisabled}`, - `§6${prefix}ch join <名前> [パスワード]§f - ${config.customcommands.channel ? `既存のチャットチャンネルに参加する!` : textDisabled}`, - `§6${prefix}ch in <名前> <プレイヤー>§f - ${config.customcommands.channel ? `プレイヤーをチャットチャンネルに招待する!` : textDisabled}`, - `§6${prefix}ch ha <名前> <プレイヤー>§f - ${config.customcommands.channel ? `チャットチャンネルの所有権を譲渡する!` : textDisabled}`, - `§6${prefix}ch le§f - ${config.customcommands.channel ? `現在のチャットチャンネルから退出する!` : textDisabled}`, - `§6${prefix}ch me§f - ${config.customcommands.channel ? `現在のチャットチャンネルのメンバーを一覧表示します!` : textDisabled}`, - ` `, - `§l§o§6[§4テスト用§6]§r§o`, - `§6${prefix}listitems§f - ${config.debug ? `Prints every item in the game and their max stack.` : textDisabled}`, - ` `, - `§l§o§6[§4詳細については、helpを付けてコマンドを実行してください。§6]§f`, - ]); -} diff --git a/build/scripts/commands/moderation/kick.js b/build/scripts/commands/moderation/kick.js deleted file mode 100644 index 7d1a5ff..0000000 --- a/build/scripts/commands/moderation/kick.js +++ /dev/null @@ -1,105 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function kickHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.kick) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: kick`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: kick [optional]`, - `§4[§6Optional§4]§f: username, reason, help`, - `§4[§6Description§4]§f: Kick the specified user and optionally gives a reason.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}kick ${player.name}`, - ` §4- §6Kick ${player.name} without specifying a reason§f`, - ` ${prefix}kick ${player.name} Hacker!`, - ` §4- §6Kick ${player.name} with the reason "Hacker!"§f`, - ` ${prefix}kick ${player.name} Stop trolling!`, - ` §4- §6Kick ${player.name} with the reason "Stop trolling!"§f`, - ` ${prefix}kick help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name kick - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function kick(message, args) { - handleKick(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleKick(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/kick.js:33)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.kick) { - return kickHelp(player, prefix); - } - // Are there arguements - if (!args.length) { - return kickHelp(player, prefix); - } - // Modify the argument handling - let playerName = args.shift(); - let reason = "理由なし"; - // Check if the command has a reason provided - if (args.length > 1) { - // Remove double quotes from the reason if present - reason = args - .slice(1) - .join(" ") - .replace(/(^"|"$)/g, ""); - } - // Remove double quotes from the player name if present - playerName = playerName.replace(/(^"|"$)/g, ""); - // try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(playerName.toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // make sure they dont kick themselves - if (member === player) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者にしか実行できません`); - } - player.runCommandAsync(`kick "${member.name}" §f\n\n${reason}`).catch((error) => { - console.warn(`${new Date()} | ` + error); - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f キックできませんでした`); - }); - return sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f${player.name}§f has kicked ${member.name}§f. Reason: ${reason}`); -} diff --git a/build/scripts/commands/moderation/lockdown.js b/build/scripts/commands/moderation/lockdown.js deleted file mode 100644 index 172f571..0000000 --- a/build/scripts/commands/moderation/lockdown.js +++ /dev/null @@ -1,104 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { crypto, getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function lockdownHelp(player, prefix, lockdownBoolean) { - let commandStatus; - if (!config.customcommands.lockdown) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (lockdownBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: lockdown`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: lockdown [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Kicks player's from server excluding Staff for maintenance.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}lockdown`, - ` §4- §6Initiate server lockdown for maintenance§f`, - ` ${prefix}lockdown help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name lockdown - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function lockdown(message, args) { - handleLockdown(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleLockdown(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/lockdown.js:37)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const lockdownBoolean = dynamicPropertyRegistry.get("lockdown_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.lockdown) { - return lockdownHelp(player, prefix, lockdownBoolean); - } - // If already locked down then unlock the server - if (lockdownBoolean) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f メンテナンスが完了しました`); - dynamicPropertyRegistry.set("lockdown_b", false); - return world.setDynamicProperty("lockdown_b", false); - } - // Default reason for locking it down - const reason = "ただいまメンテナンス中です!!詳しい進行状況はDiscordを確認してください"; - // Lock it down - const players = world.getPlayers(); - for (const pl of players) { - // Check for hash/salt and validate password - const hash = pl.getDynamicProperty("hash"); - const salt = pl.getDynamicProperty("salt"); - // Use either the operator's ID or the encryption password as the key - const key = config.encryption.password ? config.encryption.password : pl.id; - // Generate the hash - const encode = crypto?.(salt, key); - if (hash !== undefined && encode === hash) { - continue; - } - // Kick players from server - pl.runCommandAsync(`kick ${pl.name} §f\n\n${reason}`).catch(() => { - // Despawn players from server - pl.triggerEvent("paradox:kick"); - }); - } - // Shutting it down - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§fメンテナンス状態に入りました!`); - dynamicPropertyRegistry.set("lockdown_b", true); - return world.setDynamicProperty("lockdown_b", true); -} diff --git a/build/scripts/commands/moderation/modules.js b/build/scripts/commands/moderation/modules.js deleted file mode 100644 index 359341d..0000000 --- a/build/scripts/commands/moderation/modules.js +++ /dev/null @@ -1,152 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getScore, getPrefix, sendMsgToPlayer } from "../../util.js"; -function modulesHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.modules) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: modules`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: modules [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Shows a list of modules that are enabled and disabled in Paradox.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}modules`, - ` §4- §6Show a list of enabled and disabled modules§f`, - ` ${prefix}modules help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name module - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function modules(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/modules.js:28)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.modules) { - return modulesHelp(player, prefix); - } - // scores - const commandblocks = getScore("commandblocks", player); - const cmds = getScore("cmds", player); - const encharmor = getScore("encharmor", player); - const antikb = getScore("antikb", player); - // Booleans - const worldBorderBoolean = dynamicPropertyRegistry.get("worldborder_b"); - const xrayaBoolean = dynamicPropertyRegistry.get("xraya_b"); - const opsBoolean = dynamicPropertyRegistry.get("ops_b"); - const speedABoolean = dynamicPropertyRegistry.get("speeda_b"); - const nameSpoofABoolean = dynamicPropertyRegistry.get("namespoofa_b"); - const nameSpoofBBoolean = dynamicPropertyRegistry.get("namespoofb_b"); - const jesusABoolean = dynamicPropertyRegistry.get("jesusa_b"); - const InvalidSprintABoolean = dynamicPropertyRegistry.get("invalidsprinta_b"); - const illegalItemsABoolean = dynamicPropertyRegistry.get("illegalitemsa_b"); - const illegalItemsCBoolean = dynamicPropertyRegistry.get("illegalitemsc_b"); - const hotbarBoolean = dynamicPropertyRegistry.get("hotbar_b"); - const adventureGMBoolean = dynamicPropertyRegistry.get("adventuregm_b"); - const creativeGMBoolean = dynamicPropertyRegistry.get("creativegm_b"); - const survivalGMBoolean = dynamicPropertyRegistry.get("survivalgm_b"); - const flyABoolean = dynamicPropertyRegistry.get("flya_b"); - const crasherABoolean = dynamicPropertyRegistry.get("crashera_b"); - const bedrockValidateBoolean = dynamicPropertyRegistry.get("bedrockvalidate_b"); - const reachBBoolean = dynamicPropertyRegistry.get("reachb_b"); - const antiScaffoldABoolean = dynamicPropertyRegistry.get("antiscaffolda_b"); - const reachABoolean = dynamicPropertyRegistry.get("reacha_b"); - const illegalItemsBBoolean = dynamicPropertyRegistry.get("illegalitemsb_b"); - const antiNukerABoolean = dynamicPropertyRegistry.get("antinukera_b"); - const spammerCBoolean = dynamicPropertyRegistry.get("spammerc_b"); - const spammerBBoolean = dynamicPropertyRegistry.get("spammerb_b"); - const spammerABoolean = dynamicPropertyRegistry.get("spammera_b"); - const badPackets1Boolean = dynamicPropertyRegistry.get("badpackets1_b"); - const savageBoolean = dynamicPropertyRegistry.get("salvage_b"); - const illegalLoresBoolean = dynamicPropertyRegistry.get("illegallores_b"); - const illegalEnchantmentBoolean = dynamicPropertyRegistry.get("illegalenchantment_b"); - const lockdownBoolean = dynamicPropertyRegistry.get("lockdown_b"); - const antiShulkerBoolean = dynamicPropertyRegistry.get("antishulker_b"); - const chatRanksBoolean = dynamicPropertyRegistry.get("chatranks_b"); - const stackBanBoolean = dynamicPropertyRegistry.get("stackban_b"); - const badPackets2Boolean = dynamicPropertyRegistry.get("badpackets2_b"); - const antiSpamBoolean = dynamicPropertyRegistry.get("antispam_b"); - const clearLagBoolean = dynamicPropertyRegistry.get("clearlag_b"); - const antiFallABoolean = dynamicPropertyRegistry.get("antifalla_b"); - const showrulesBoolean = dynamicPropertyRegistry.get("showrules_b"); - const autobanBoolean = dynamicPropertyRegistry.get("autoban_b"); - const autoclickerBoolean = dynamicPropertyRegistry.get("autoclicker_b"); - const antiKillAuraBoolean = dynamicPropertyRegistry.get("antikillaura_b"); - const afkBoolean = dynamicPropertyRegistry.get("afk_b"); - const antiPhaseABoolean = dynamicPropertyRegistry.get("antiphasea_b"); - // Numbers - const worldBorderOverworldNumber = dynamicPropertyRegistry.get("worldborder_n"); - const worldBorderNetherNumber = dynamicPropertyRegistry.get("worldborder_nether_n"); - const worldBorderEndNumber = dynamicPropertyRegistry.get("worldborder_end_n"); - const status = (b) => (b ? "§a有効" : "§4無効"); - sendMsgToPlayer(player, [ - `§f§4[§6Paradox§4]§f List Of Modules:`, - `§o§6|§f Anti-GMA: ${status(adventureGMBoolean)}`, - `§o§6|§f Anti-GMS: ${status(survivalGMBoolean)}`, - `§o§6|§f Anti-GMC: ${status(creativeGMBoolean)}`, - `§o§6|§f Badpackets: ${status(badPackets1Boolean)}`, - `§o§6|§f SpammerA: ${status(spammerABoolean)}`, - `§o§6|§f SpammerB: ${status(spammerBBoolean)}`, - `§o§6|§f SpammerC: ${status(spammerCBoolean)}`, - `§o§6|§f Anti-Spam: ${status(antiSpamBoolean)}`, - `§o§6|§f CrasherA: ${status(crasherABoolean)}`, - `§o§6|§f NamespoofA: ${status(nameSpoofABoolean)}`, - `§o§6|§f NamespoofB: ${status(nameSpoofBBoolean)}`, - `§o§6|§f Bedrock: ${status(bedrockValidateBoolean)}`, - `§o§6|§f ReachA: ${status(reachABoolean)}`, - `§o§6|§f ReachB: ${status(reachBBoolean)}`, - `§o§6|§f JesusA: ${status(jesusABoolean)}`, - `§o§6|§f SpeedA: ${status(speedABoolean)}`, - `§o§6|§f InvalidSprintA: ${status(InvalidSprintABoolean)}`, - `§o§6|§f FlyA: ${status(flyABoolean)}`, - `§o§6|§f AntiFallA: ${status(antiFallABoolean)}`, - `§o§6|§f IllegalItemsA: ${illegalItemsABoolean ? `§a有効§f [違法スタックの禁止: ${status(stackBanBoolean)}§f]` : "§4無効"}`, - `§6|§f IllegalItemsB: ${illegalItemsBBoolean ? `§a有効§f [違法スタックの禁止: ${status(stackBanBoolean)}§f]` : "§4無効"}`, - `§o§6|§f IllegalItemsC: ${status(illegalItemsCBoolean)}`, - `§o§6|§f IllegalEnchantments: ${status(illegalEnchantmentBoolean)}`, - `§o§6|§f IllegalLores: ${status(illegalLoresBoolean)}`, - `§o§6|§f Anti-ScaffoldA: ${status(antiScaffoldABoolean)}`, - `§o§6|§f Anti-NukerA: ${status(antiNukerABoolean)}`, - `§o§6|§f XrayA: ${status(xrayaBoolean)}`, - `§o§6|§f Chat: ${status(chatRanksBoolean)}`, - `§o§6|§f Anti-Shulkers: ${status(antiShulkerBoolean)}`, - `§o§6|§f Hotbar: ${status(hotbarBoolean)}`, - `§o§6|§f OPS: ${status(opsBoolean)}`, - `§o§6|§f Salvage: ${status(savageBoolean)}`, - `§o§6|§f Lockdown: ${status(lockdownBoolean)}`, - `§o§6|§f Badpackets2: ${status(badPackets2Boolean)}`, - `§o§6|§f OverideCommandBlocksEnabled: ${status(cmds)}`, - `§o§6|§f RemoveCommandBlocks: ${status(commandblocks)}`, - `§o§6|§f Anti-Knockback: ${status(antikb)}`, - `§o§6|§f Anti-KillAura: ${status(antiKillAuraBoolean)}`, - `§o§6|§f Anti-Enchanted: ${status(encharmor)}`, - `§o§6|§f Autoclicker: ${status(autoclickerBoolean)}`, - `§o§6|§f World Border: ${worldBorderBoolean ? `§a有効§f (現世: §6${worldBorderOverworldNumber}§f ネザー: §6${worldBorderNetherNumber}§f エンド: §6${worldBorderEndNumber}§f)` : "§4無効"}`, - `§o§6|§f ClearLag: ${status(clearLagBoolean)}`, - `§o§6|§f ShowRules: ${status(showrulesBoolean)}`, - `§o§6|§f AutoBan: ${status(autobanBoolean)}`, - `§o§6|§f AFK: ${status(afkBoolean)}`, - `§o§6|§f AntiPhaseA: ${status(antiPhaseABoolean)}`, - ]); -} diff --git a/build/scripts/commands/moderation/mute.js b/build/scripts/commands/moderation/mute.js deleted file mode 100644 index 29159d0..0000000 --- a/build/scripts/commands/moderation/mute.js +++ /dev/null @@ -1,115 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function muteHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.mute) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: mute`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: mute [optional]`, - `§4[§6Optional§4]§f: mute, reason, help`, - `§4[§6Description§4]§f: Mutes the specified user and optionally gives reason.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}mute ${player.name}`, - ` §4- §6Mute ${player.name} without specifying a reason§f`, - ` ${prefix}mute ${player.name} Stop spamming!`, - ` §4- §6Mute ${player.name} with the reason "Stop spamming!"§f`, - ` ${prefix}mute help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name mute - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function mute(message, args) { - handleMute(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleMute(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/moderation/mute.js:30)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.mute) { - return muteHelp(player, prefix); - } - // Are there arguements - if (!args.length) { - return muteHelp(player, prefix); - } - // Modify the argument handling - let playerName = args.shift(); - let reason = "理由なし"; - // Check if the command has a reason provided - if (args.length > 1) { - // Remove double quotes from the reason if present - reason = args - .slice(1) - .join(" ") - .replace(/(^"|"$)/g, ""); - } - // Remove double quotes from the player name if present - playerName = playerName.replace(/(^"|"$)/g, ""); - // try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(playerName.toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // Get unique ID - const uniqueId2 = dynamicPropertyRegistry.get(member?.id); - // Make sure they dont mute themselves - if (uniqueId2 === uniqueId) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 自分自身には実行できません`); - } - // Make sure staff dont mute staff - if (uniqueId2 === member.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者には実行できません.`); - } - // If not already muted then tag - if (!member.hasTag("isMuted")) { - member.addTag("isMuted"); - } - else { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f このプレイヤーは既にミュート済みです.`); - } - // If Education Edition is enabled then legitimately mute them - member.runCommandAsync(`ability @s mute true`); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§fあなたは管理者にミュートされました. 理由: ${reason}`); - return sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f${player.name}§f が ${member.name}をミュート状態にしました§f. 理由: ${reason}`); -} diff --git a/build/scripts/commands/moderation/nonstaffhelp.js b/build/scripts/commands/moderation/nonstaffhelp.js deleted file mode 100644 index 6694e73..0000000 --- a/build/scripts/commands/moderation/nonstaffhelp.js +++ /dev/null @@ -1,39 +0,0 @@ -import { getPrefix, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -/** - * @name nonstaffhelp - * @param {ChatSendAfterEvent} message - Message object - */ -export function nonstaffhelp(message) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/nonstaffhelp.js:7)"); - } - const player = message.sender; - // Check for custom prefix - const prefix = getPrefix(player); - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId === undefined) { - return sendMsgToPlayer(player, [ - `§l§6[§4コマンドリスト!!§6]§r`, - config.customcommands.report ? `§6${prefix}report <名前> <荒らし>§r - 荒らしがいた場合これで報告できます.` : `§6${prefix}report §r - Command §4DISABLED§r.`, - config.customcommands.sethome ? `§6${prefix}tps <家の名前>§r - 自分の家の座標を保存します.` : `§6${prefix}sethome §r - Command §4DISABLED§r.`, - config.customcommands.gohome ? `§6${prefix}tpg <家の名前>§r - sethomeで設定した家にTPできます.` : `§6${prefix}gohome §r - Command §4DISABLED§r.`, - config.customcommands.listhome ? `§6${prefix}tpl §r - 自分の作った拠点リストを見れます.` : `§6${prefix}listhome§r - Command §4DISABLED§r.`, - config.customcommands.delhome ? `§6${prefix}tpd <家の名前>§r - 家の名前を入れた拠点の座標が削除されます.` : `§6${prefix}delhome §r - Command §4DISABLED§r.`, - config.customcommands.tpr ? `§6${prefix}tp <相手の名前>§r - 他のプレイヤーにTP申請を送れます相手が承諾するとtpされます.` : `§6${prefix}tpr §r - Command §4DISABLED§r.`, - config.customcommands.paradoxiu ? `§6${prefix}ui§r - GUIを開けます` : `§6${prefix}ui§rでメニューを開けます!§r.`, - config.customcommands.biome ? `§6${prefix}map§r - で今いるバイオームがわかります` : `§6${prefix}map§rで今いるバイオームが分かります!§r.`, - config.customcommands.channel ? `§6${prefix}ch cr §rで新しいチャットチャンネルを作成する` : `§6${prefix}channel create [password?]§f - Command §4DISABLED§f.`, - config.customcommands.channel ? `§6${prefix}ch de §r<名前> [パスワード]§f .` : `§6${prefix}channel delete [password?]§f - Command §4DISABLED§f.`, - config.customcommands.channel ? `§6${prefix}ch join §r<名前> [パスワード]§f .` : `§6${prefix}channel join [password?]§f - Command §4DISABLED§f.`, - config.customcommands.channel ? `§6${prefix}ch in §r<名前> <プレイヤー>§f -` : `§6${prefix}channel invite §f - Command §4DISABLED§f.`, - config.customcommands.channel ? `§6${prefix}ch ha §r<名前> <プレイヤー>§f .` : `§6${prefix}channel invite §f - Command §4DISABLED§f.`, - config.customcommands.channel ? `§6${prefix}ch le§f -§rで現在のチャンネルから抜けます ` : `§6${prefix}channel invite §f - Command §4DISABLED§f.`, - config.customcommands.channel ? `§6${prefix}ch me§f -§rで現在入っているチャンネルを表示! .` : `§6${prefix}channel leave§f - Command §4DISABLED§f.`, - ]); - } -} diff --git a/build/scripts/commands/moderation/notify.js b/build/scripts/commands/moderation/notify.js deleted file mode 100644 index 692e1bb..0000000 --- a/build/scripts/commands/moderation/notify.js +++ /dev/null @@ -1,60 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer } from "../../util.js"; -function notifyHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.notify) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: notify`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: notify [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles cheat notifications like a toggle.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}notify`, - ` §4- §6Toggle cheat notifications§f`, - ` ${prefix}notify help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name notify - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function notify(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/notify.js:26)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.notify) { - return notifyHelp(player, prefix); - } - const tagBoolean = player.hasTag("notify"); - // Disable - if (tagBoolean) { - player.removeTag("notify"); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 検知ログが見れなくなりました`); - } - // Enable - if (!tagBoolean) { - player.addTag("notify"); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 検知ログが見れるようになりました.`); - } -} diff --git a/build/scripts/commands/moderation/op.js b/build/scripts/commands/moderation/op.js deleted file mode 100644 index b04947e..0000000 --- a/build/scripts/commands/moderation/op.js +++ /dev/null @@ -1,127 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { crypto, UUID, getPrefix, sendMsg, sendMsgToPlayer, isValidUUID } from "../../util.js"; -function opHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.op) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - const passwordDescription = config.encryption.password ? `§4- §6Use your password to gain Paradox-Op§f` : `§4- §6Give yourself Paradox-Op§f`; - const commandUsage = config.encryption.password ? `${prefix}op ` : `${prefix}op`; - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: op`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: ${prefix}op [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Grants permission to use Paradox AntiCheat features.`, - `§4[§6Examples§4]§f:`, - ` ${commandUsage}`, - ` ${passwordDescription}`, - ` ${prefix}op help`, - ` §4- §6Show command help§f`, - ` ${prefix}op `, - ` §4- §6Grant Paradox-Op to another player§f`, - ]); -} -/** - * @name op - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function op(message, args) { - // Validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/op.js:30)"); - } - const operator = message.sender; - const prefix = getPrefix(operator); - const operatorHash = operator.getDynamicProperty("hash"); - const operatorSalt = operator.getDynamicProperty("salt"); - if (!operatorHash || !operatorSalt || (operatorHash !== crypto?.(operatorSalt, config.encryption.password || operator.id) && isValidUUID(operatorSalt))) { - if (!config.encryption.password) { - if (!operator.isOp()) { - return sendMsgToPlayer(operator, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - } - } - // Check if args is null, empty, or for help - if (args[0]?.toLowerCase() === "help") { - return opHelp(operator, prefix); - } - if (args.length === 0 && !config.encryption.password) { - // Operator wants to change their own password - const targetSalt = UUID.generate(); - // Use either the operator's ID or the encryption password as the key - const key = config.encryption.password ? config.encryption.password : operator.id; - // Generate the hash - const newHash = crypto?.(targetSalt, key); - operator.setDynamicProperty("hash", newHash); - operator.setDynamicProperty("salt", targetSalt); - operator.addTag("paradoxOpped"); - sendMsgToPlayer(operator, `§f§4[§6Paradox§4]§f 管理者になりました`); - dynamicPropertyRegistry.set(operator.id, operator.name); - return; - } - else if (args.length === 1 && config.encryption.password) { - // Allow the user to gain Paradox-Op using the password - if (config.encryption.password === args[0]) { - const targetSalt = UUID.generate(); - // Generate the hash using the provided password - const newHash = crypto?.(targetSalt, args[0]); - operator.setDynamicProperty("hash", newHash); - operator.setDynamicProperty("salt", targetSalt); - operator.addTag("paradoxOpped"); - sendMsgToPlayer(operator, `§f§4[§6Paradox§4]§f パスワードを使用して管理者になりました`); - dynamicPropertyRegistry.set(operator.id, operator.name); - } - else { - // Incorrect password - sendMsgToPlayer(operator, `§f§4[§6Paradox§4]§f 不明なパスワードですまた管理者しか実行できません.`); - } - } - else if (args.length >= 1 && operatorHash === crypto?.(operatorSalt, config.encryption.password || operator.id)) { - // Operator wants to grant "Paradox-Op" to another player - const targetPlayerName = args.join(" "); // Combine all arguments into a single string - // Try to find the player requested - let targetPlayer; - if (args.length) { - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(targetPlayerName.toLowerCase().replace(/"|\\|@/g, ""))) { - targetPlayer = pl; - break; - } - } - } - if (targetPlayer) { - const targetHash = targetPlayer.getDynamicProperty("hash"); - if (targetHash === undefined) { - const targetSalt = UUID.generate(); - targetPlayer.setDynamicProperty("salt", targetSalt); - // Use either the operator's ID or the encryption password as the key - const targetKey = config.encryption.password ? config.encryption.password : targetPlayer.id; - // Generate the hash - const newHash = crypto?.(targetSalt, targetKey); - targetPlayer.setDynamicProperty("hash", newHash); - dynamicPropertyRegistry.set(targetPlayer.id, targetPlayer.name); - sendMsgToPlayer(operator, `§f§4[§6Paradox§4]§f${targetPlayer.name}に管理者権限が付与されました`); - sendMsgToPlayer(targetPlayer, `§f§4[§6Paradox§4]§f 管理者になりました`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${targetPlayer.name}§f 管理者になりました`); - targetPlayer.addTag("paradoxOpped"); - } - else { - sendMsgToPlayer(operator, `§f§4[§6Paradox§4]§f ${targetPlayer.name} 既に管理者です`); - } - } - else { - sendMsgToPlayer(operator, `§f§4[§6Paradox§4]§f プレイヤーがオフライン又は存在していません ${targetPlayerName}.`); - } - } - else { - return opHelp(operator, prefix); - } -} diff --git a/build/scripts/commands/moderation/paradoxui.js b/build/scripts/commands/moderation/paradoxui.js deleted file mode 100644 index a4629ed..0000000 --- a/build/scripts/commands/moderation/paradoxui.js +++ /dev/null @@ -1,55 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { paradoxui } from "../../gui/paradoxui.js"; -import { ShowRules } from "../../gui/showrules/showrules.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function paradoxuiHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.paradoxiu) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: paradoxui`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: paradoxui [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Shows GUI for main menu.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}paradoxui`, - ` §4- §6Open the Paradox main menu GUI§f`, - ` ${prefix}paradoxui help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name paradoxUI - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function paradoxUI(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/paradoxui.js:36)"); - } - const player = message.sender; - const showrulesBoolean = dynamicPropertyRegistry.get("showrules_b"); - //check to see if the player has the rules tag incase they have been able to call the UI command before the - // rules have been displayed. - if (player.hasTag("ShowRulesOnJoin") && showrulesBoolean === true) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§fルールに同意してから開いて下さい`); - return ShowRules(); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.paradoxiu) { - return paradoxuiHelp(player, prefix); - } - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f チャット欄を閉じるとメニューが開きます`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f がメニューを開きました`); - paradoxui(player); -} diff --git a/build/scripts/commands/moderation/prefix.js b/build/scripts/commands/moderation/prefix.js deleted file mode 100644 index fe4d145..0000000 --- a/build/scripts/commands/moderation/prefix.js +++ /dev/null @@ -1,79 +0,0 @@ -import { getPrefix, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function resetPrefix(player) { - const sanitize = player.getTags(); - for (const tag of sanitize) { - if (tag.startsWith("Prefix:")) { - player.removeTag(tag); - config.customcommands.prefix = "!"; - } - } - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Prefix has been reset!`); -} -function prefixHelp(player, prefix) { - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: prefix`, - `§4[§6Usage§4]§f: prefix [optional]`, - `§4[§6Optional§4]§f: prefix, help`, - `§4[§6Description§4]§f: Changes the prefix for commands. Max is two characters.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}prefix !!`, - ` §4- §6Change command prefix to "!!"§f`, - ` ${prefix}prefix @!`, - ` §4- §6Change command prefix to "@!"§f`, - ` ${prefix}prefix $`, - ` §4- §6Change command prefix to "$"§f`, - ` ${prefix}prefix help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name prefix - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function prefix(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/prefix.js:34)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.prefix) { - return prefixHelp(player, prefix); - } - // Are there arguements - if (!args.length) { - return prefixHelp(player, prefix); - } - // check if array contains the string 'reset' - const argcheck = args.includes("reset"); - // reset prefix - if (argcheck === true) { - resetPrefix(player); - return; - } - if (args[0][0] == "/") { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f'/' を使用することはできません!`); - } - // Change Prefix command under conditions - if (args[0].length <= 2 && args[0].length >= 1) { - resetPrefix(player); - config.customcommands.prefix = args[0]; - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 接頭辞が次のように変更された '${args[0]}'!`); - return player.addTag("Prefix:" + args[0]); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 接頭辞の長さは2文字まで!`); - } -} diff --git a/build/scripts/commands/moderation/punish.js b/build/scripts/commands/moderation/punish.js deleted file mode 100644 index 0b5e227..0000000 --- a/build/scripts/commands/moderation/punish.js +++ /dev/null @@ -1,108 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function punishHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.punish) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: punish`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: punish [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Removes all items from the player's inventory and ender chest.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}punish ${player.name}`, - ` §4- §6Remove all items from ${player.name}§f`, - ` ${prefix}punish help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name punish - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function punish(message, args) { - handlePunish(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handlePunish(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/punish.js:10)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.punish) { - return punishHelp(player, prefix); - } - // Are there arguements - if (!args.length) { - return punishHelp(player, prefix); - } - // Try to find the player requested - let member; - if (args.length) { - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(args[0].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // Make sure they don't punish themselves - if (member === player) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者には実行できません.`); - } - // There are 30 slots ranging from 0 to 29 - // Let's clear out that ender chest - for (let slot = 0; slot < 30; slot++) { - member.runCommand(`replaceitem entity @s slot.enderchest ${slot} air`); - } - // Get requested player's inventory so we can wipe it out - const inventoryContainer = member.getComponent("minecraft:inventory"); - const inventory = inventoryContainer.container; - for (let i = 0; i < inventory.size; i++) { - const inventory_item = inventory.getItem(i); - if (!inventory_item) { - continue; - } - try { - inventory.setItem(i, undefined); - } - catch { } - } - // Notify staff and player that punishment has taken place - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f あなたのインベントリが全て消去された`); - // Use try/catch in case nobody has tag 'notify' as this will report 'no target selector' - return sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§fが ${member.name}のインベントリを全て消去した§f`); -} diff --git a/build/scripts/commands/moderation/tpa.js b/build/scripts/commands/moderation/tpa.js deleted file mode 100644 index ee25e4e..0000000 --- a/build/scripts/commands/moderation/tpa.js +++ /dev/null @@ -1,88 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer, setTimer } from "../../util.js"; -function tpaHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.tpa) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: tpa`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: tpa [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Teleport to a player or vice versa.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}tpa ${player.name} Steve`, - ` §4- §6Request to teleport to ${player.name} from Steve§f`, - ` ${prefix}tpa Steve ${player.name}`, - ` §4- §6Request to teleport Steve to ${player.name}§f`, - ` ${prefix}tpa help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name tpa - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function tpa(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/tpa.js:31)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.tpa) { - return tpaHelp(player, prefix); - } - // Are there arguements - if (!args.length) { - return tpaHelp(player, prefix); - } - let artificalPlayer; - let member; - // Try to find the player requested - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(args[0].toLowerCase().replace(/"|\\|@/g, ""))) { - artificalPlayer = pl; - } - if (pl.name.toLowerCase().includes(args[1].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - } - if (artificalPlayer && member) { - break; - } - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです Try '${prefix}tpa help' for more info.`); - } - // Check if teleporting to them or vice versa then set it up - if (args[0] && args[1]) { - // Let's teleport you to that player - setTimer(artificalPlayer.id); - artificalPlayer.teleport(member.location, { dimension: member.dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - // Let you know that you have been teleported - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f TP ${artificalPlayer.name} to ${member.name}`); - } - else { - // Need to specify who - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§fテレポートの "from "と "who "を忘れています!!`); - return tpaHelp(player, prefix); - } -} diff --git a/build/scripts/commands/moderation/unban.js b/build/scripts/commands/moderation/unban.js deleted file mode 100644 index fd2ad82..0000000 --- a/build/scripts/commands/moderation/unban.js +++ /dev/null @@ -1,83 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -export const queueUnban = new Set(); -function listQueue(queued, player) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Queued to be unbanned:`); - const setSize = queued.size; - if (setSize > 0) { - queued.forEach((queue) => - // List the players that are queued to be unbanned - sendMsgToPlayer(player, ` §o§6|§f §4[§f${queue}§4]§f`)); - } - else { - sendMsgToPlayer(player, ` §o§6|§f §4[§fList Is Empty§4]§f`); - } -} -function unbanHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.unban) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: unban`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: unban [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Allows specified players to join if banned (Doesn't include global ban).`, - `§4[§6Examples§4]§f:`, - ` ${prefix}unban ${player.name}`, - ` §4- §6Allow ${player.name} to join if banned§f`, - ` ${prefix}unban help`, - ` §4- §6Show command help§f`, - ]); -} -export function unban(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | Error: ${message} isn't defined. Did you forget to pass it? (./commands/moderation/unban.js:35)`); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguments - if (!args.length) { - return unbanHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if (argCheck && args[0].toLowerCase() === "help") { - return unbanHelp(player, prefix); - } - // List the queue if requested - if (argCheck && args[0].toLowerCase() === "list") { - return listQueue(queueUnban, player); - } - // Delete player from the queue if requested - if (argCheck && args[0].toLowerCase() === "delete") { - const nameToDelete = args.slice(1).join(" "); - if (queueUnban.delete(nameToDelete)) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${nameToDelete} がBANリストから削除されました!`); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${nameToDelete} がBANリストに入っていない!`); - } - return; - } - // Extract the username from the command and perform the unban action - let username = args.join(" "); - if (username.startsWith('"') && username.endsWith('"')) { - username = username.slice(1, -1); - } - queueUnban.add(username); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 追放解除待ちのプレイヤー=> ${username}`); -} diff --git a/build/scripts/commands/moderation/unmute.js b/build/scripts/commands/moderation/unmute.js deleted file mode 100644 index e83a660..0000000 --- a/build/scripts/commands/moderation/unmute.js +++ /dev/null @@ -1,105 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function unmuteHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.unmute) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: unmute`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: unmute [optional]`, - `§4[§6Optional§4]§f: username, reason, help`, - `§4[§6Description§4]§f: Unmutes the specified user and optionally gives a reason.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}unmute ${player.name}`, - ` §4- §6Unmute ${player.name} without specifying a reason§f`, - ` ${prefix}unmute ${player.name} You may chat`, - ` §4- §6Unmute ${player.name} with the reason "You may chat"§f`, - ` ${prefix}unmute help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name unmute - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function unmute(message, args) { - handleUnmute(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUnmute(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/moderation/unmute.js:30)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.unmute) { - return unmuteHelp(player, prefix); - } - // Are there arguements - if (!args.length) { - return unmuteHelp(player, prefix); - } - // Modify the argument handling - let playerName = args.shift(); - let reason = "理由なし"; - // Check if the command has a reason provided - if (args.length > 1) { - // Remove double quotes from the reason if present - reason = args - .slice(1) - .join(" ") - .replace(/(^"|"$)/g, ""); - } - // Remove double quotes from the player name if present - playerName = playerName.replace(/(^"|"$)/g, ""); - // try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(playerName.toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // If not already muted then tag - if (member.hasTag("isMuted")) { - member.removeTag("isMuted"); - } - else { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f このプレイヤーはミュートされていない`); - } - // If Education Edition is enabled then legitimately unmute - member.runCommandAsync(`ability @s mute false`); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f あなたはミュートが解除されました.`); - return sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§fが${member.name}のミュートを解除しました§f. 理由: ${reason}`); -} diff --git a/build/scripts/commands/settings/afk.js b/build/scripts/commands/settings/afk.js deleted file mode 100644 index ab33cbe..0000000 --- a/build/scripts/commands/settings/afk.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { AFK } from "../../penrose/TickEvent/afk/afk.js"; -function afkHelp(player, prefix, afkBoolean) { - let commandStatus; - if (!config.customcommands.afk) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (afkBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: afk`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: afk [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Kicks players that are AFK for ${config.modules.afk.minutes} minutes.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}afk`, - ` ${prefix}afk help`, - ]); -} -/** - * @name afk - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function afk(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/afk.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const afkBoolean = dynamicPropertyRegistry.get("afk_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.afk) { - return afkHelp(player, prefix, afkBoolean); - } - if (afkBoolean === false) { - // Allow - dynamicPropertyRegistry.set("afk_b", true); - world.setDynamicProperty("afk_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AFK§f!`); - AFK(); - } - else if (afkBoolean === true) { - // Deny - dynamicPropertyRegistry.set("afk_b", false); - world.setDynamicProperty("afk_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AFK§f!`); - } -} diff --git a/build/scripts/commands/settings/allowgma.js b/build/scripts/commands/settings/allowgma.js deleted file mode 100644 index a8d1a6a..0000000 --- a/build/scripts/commands/settings/allowgma.js +++ /dev/null @@ -1,83 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { Adventure } from "../../penrose/TickEvent/gamemode/adventure.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function allowgmaHelp(player, prefix, adventureGMBoolean) { - let commandStatus; - if (!config.customcommands.allowgma) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (adventureGMBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: allowgma`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: allowgma [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles Gamemode 2 (Adventure) to be used.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}allowgma`, - ` ${prefix}allowgma help`, - ]); -} -/** - * @name allowgma - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function allowgma(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/allowGMA.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const adventureGMBoolean = dynamicPropertyRegistry.get("adventuregm_b"); - const creativeGMBoolean = dynamicPropertyRegistry.get("creativegm_b"); - const survivalGMBoolean = dynamicPropertyRegistry.get("survivalgm_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.allowgma) { - return allowgmaHelp(player, prefix, adventureGMBoolean); - } - if (adventureGMBoolean === false) { - // Allow - dynamicPropertyRegistry.set("adventuregm_b", true); - world.setDynamicProperty("adventuregm_b", true); - // Make sure at least one is allowed since this could cause serious issues if all were locked down - // We will allow Adventure Mode in this case - if (survivalGMBoolean === true && creativeGMBoolean === true) { - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f Since all gamemodes were disallowed, Adventure mode has been enabled.`); - Adventure(); - return; - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has disallowed §4Gamemode 2 (Adventure)§f to be used!`); - Adventure(); - } - else if (adventureGMBoolean === true) { - // Deny - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has allowed §6Gamemode 2 (Adventure)§f to be used!`); - } -} diff --git a/build/scripts/commands/settings/allowgmc.js b/build/scripts/commands/settings/allowgmc.js deleted file mode 100644 index 762cec9..0000000 --- a/build/scripts/commands/settings/allowgmc.js +++ /dev/null @@ -1,84 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { Adventure } from "../../penrose/TickEvent/gamemode/adventure.js"; -import { Creative } from "../../penrose/TickEvent/gamemode/creative.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function allowgmcHelp(player, prefix, creativeGMBoolean) { - let commandStatus; - if (!config.customcommands.allowgmc) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (creativeGMBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: allowgmc`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: allowgmc [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles Gamemode 1 (Creative) to be used.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}allowgmc`, - ` ${prefix}allowgmc help`, - ]); -} -/** - * @name allowgmc - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function allowgmc(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/allowGMC.js:37)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const adventureGMBoolean = dynamicPropertyRegistry.get("adventuregm_b"); - const creativeGMBoolean = dynamicPropertyRegistry.get("creativegm_b"); - const survivalGMBoolean = dynamicPropertyRegistry.get("survivalgm_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.allowgmc) { - return allowgmcHelp(player, prefix, creativeGMBoolean); - } - if (creativeGMBoolean === false) { - // Allow - dynamicPropertyRegistry.set("creativegm_b", true); - world.setDynamicProperty("creativegm_b", true); - // Make sure at least one is allowed since this could cause serious issues if all were locked down - // We will allow Adventure Mode in this case - if (adventureGMBoolean === true && survivalGMBoolean === true) { - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f Since all gamemodes were disallowed, Adventure mode has been enabled.`); - Adventure(); - return; - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has disallowed §4Gamemode 1 (Creative)§f to be used!`); - Creative(); - } - else if (creativeGMBoolean === true) { - // Deny - dynamicPropertyRegistry.set("creativegm_b", false); - world.setDynamicProperty("creativegm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has allowed §6Gamemode 1 (Creative)§f to be used!`); - } -} diff --git a/build/scripts/commands/settings/allowgms.js b/build/scripts/commands/settings/allowgms.js deleted file mode 100644 index a99683a..0000000 --- a/build/scripts/commands/settings/allowgms.js +++ /dev/null @@ -1,84 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { Adventure } from "../../penrose/TickEvent/gamemode/adventure.js"; -import { Survival } from "../../penrose/TickEvent/gamemode/survival.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function allowgmsHelp(player, prefix, survivalGMBoolean) { - let commandStatus; - if (!config.customcommands.allowgms) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (survivalGMBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: allowgms`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: allowgms [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles Gamemode 0 (Survival) to be used.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}allowgms`, - ` ${prefix}allowgms help`, - ]); -} -/** - * @name allowgms - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function allowgms(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/allowGMS.js:37)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const adventureGMBoolean = dynamicPropertyRegistry.get("adventuregm_b"); - const creativeGMBoolean = dynamicPropertyRegistry.get("creativegm_b"); - const survivalGMBoolean = dynamicPropertyRegistry.get("survivalgm_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.allowgms) { - return allowgmsHelp(player, prefix, survivalGMBoolean); - } - if (survivalGMBoolean === false) { - // Allow - dynamicPropertyRegistry.set("survivalgm_b", true); - world.setDynamicProperty("survivalgm_b", true); - // Make sure at least one is allowed since this could cause serious issues if all were locked down - // We will allow Adventure Mode in this case - if (adventureGMBoolean === true && creativeGMBoolean === true) { - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f Since all gamemodes were disallowed, Adventure mode has been enabled.`); - Adventure(); - return; - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has disallowed §4Gamemode 0 (Survival)§f to be used!`); - Survival(); - } - else if (survivalGMBoolean === true) { - // Deny - dynamicPropertyRegistry.set("survivalgm_b", false); - world.setDynamicProperty("survivalgm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has allowed §6Gamemode 0 (Survival)§f to be used!`); - } -} diff --git a/build/scripts/commands/settings/antifalla.js b/build/scripts/commands/settings/antifalla.js deleted file mode 100644 index fbb1994..0000000 --- a/build/scripts/commands/settings/antifalla.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { AntiFallA } from "../../penrose/TickEvent/antifalla/antifall_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function antifallaHelp(player, prefix, antifallABoolean) { - let commandStatus; - if (!config.customcommands.antifalla) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (antifallABoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: antifalla`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: antifalla [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for taking no fall damage in survival.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}antifalla`, - ` ${prefix}antifalla help`, - ]); -} -/** - * @name antifallA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function antifallA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/antifalla.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const antifallABoolean = dynamicPropertyRegistry.get("antifalla_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.antifalla) { - return antifallaHelp(player, prefix, antifallABoolean); - } - if (antifallABoolean === false) { - // Allow - dynamicPropertyRegistry.set("antifalla_b", true); - world.setDynamicProperty("antifalla_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiFallA§f!`); - AntiFallA(); - } - else if (antifallABoolean === true) { - // Deny - dynamicPropertyRegistry.set("antifalla_b", false); - world.setDynamicProperty("antifalla_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiFallA§f!`); - } -} diff --git a/build/scripts/commands/settings/antikb.js b/build/scripts/commands/settings/antikb.js deleted file mode 100644 index 9b26257..0000000 --- a/build/scripts/commands/settings/antikb.js +++ /dev/null @@ -1,85 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { AntiKnockbackA } from "../../penrose/TickEvent/knockback/antikb_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function antikbHelp(player, prefix, antikbBoolean) { - let commandStatus; - if (!config.customcommands.antikb) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (antikbBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: antikb`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: antikb [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles Anti Knockback for all players.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}antikb`, - ` ${prefix}antikb help`, - ]); -} -/** - * @name antiknockback - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function antiknockback(message, args) { - handleAntiKnockback(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleAntiKnockback(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/antikb.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const antikbBoolean = dynamicPropertyRegistry.get("antikb_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.antikb) { - return antikbHelp(player, prefix, antikbBoolean); - } - if (antikbBoolean === false) { - // Allow - dynamicPropertyRegistry.set("antikb_b", true); - world.setDynamicProperty("antikb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti Knockback§f!`); - AntiKnockbackA(); - } - else if (antikbBoolean === true) { - // Deny - dynamicPropertyRegistry.set("antikb_b", false); - world.setDynamicProperty("antikb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti Knockback§f!`); - } -} diff --git a/build/scripts/commands/settings/antinukera.js b/build/scripts/commands/settings/antinukera.js deleted file mode 100644 index 6650a2e..0000000 --- a/build/scripts/commands/settings/antinukera.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { NukerA } from "../../penrose/BlockBreakAfterEvent/nuker/nuker_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function antinukeraHelp(player, prefix, antiNukerABoolean) { - let commandStatus; - if (!config.customcommands.antinukera) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (antiNukerABoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: antinukera`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: antinukera [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Checks player's for nuking blocks.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}antinukera`, - ` ${prefix}antinukera help`, - ]); -} -/** - * @name antinukerA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function antinukerA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/antinukera.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const antiNukerABoolean = dynamicPropertyRegistry.get("antinukera_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.antinukera) { - return antinukeraHelp(player, prefix, antiNukerABoolean); - } - if (antiNukerABoolean === false) { - // Allow - dynamicPropertyRegistry.set("antinukera_b", true); - world.setDynamicProperty("antinukera_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiNukerA§f!`); - NukerA(); - } - else if (antiNukerABoolean === true) { - // Deny - dynamicPropertyRegistry.set("antinukera_b", false); - world.setDynamicProperty("antinukera_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiNukerA§f!`); - } -} diff --git a/build/scripts/commands/settings/antiphasea.js b/build/scripts/commands/settings/antiphasea.js deleted file mode 100644 index 1a25b3b..0000000 --- a/build/scripts/commands/settings/antiphasea.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { AntiPhaseA } from "../../penrose/TickEvent/phase/phase_a.js"; -function antiphaseaHelp(player, prefix, antiphaseABoolean) { - let commandStatus; - if (!config.customcommands.antiphasea) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (antiphaseABoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: antiphasea`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: antiphasea [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for players phasing through blocks.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}antiphasea`, - ` ${prefix}antiphasea help`, - ]); -} -/** - * @name antiphaseA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function antiphaseA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/antiphasea.js:34)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const antiphaseABoolean = dynamicPropertyRegistry.get("antiphasea_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.antiphasea) { - return antiphaseaHelp(player, prefix, antiphaseABoolean); - } - if (antiphaseABoolean === false) { - // Allow - dynamicPropertyRegistry.set("antiphasea_b", true); - world.setDynamicProperty("antiphasea_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiPhaseA§f!`); - AntiPhaseA(); - } - else if (antiphaseABoolean === true) { - // Deny - dynamicPropertyRegistry.set("antiphasea_b", false); - world.setDynamicProperty("antiphasea_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiPhaseA§f!`); - } -} diff --git a/build/scripts/commands/settings/antiscaffolda.js b/build/scripts/commands/settings/antiscaffolda.js deleted file mode 100644 index 63cc54a..0000000 --- a/build/scripts/commands/settings/antiscaffolda.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { ScaffoldA } from "../../penrose/BlockPlaceAfterEvent/scaffold/scaffold_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function antiscaffoldaHelp(player, prefix, antiScaffoldABoolean) { - let commandStatus; - if (!config.customcommands.antiscaffolda) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (antiScaffoldABoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: antiscaffolda`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: antiscaffolda [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Checks player's for illegal scaffolding.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}antiscaffolda`, - ` ${prefix}antiscaffolda help`, - ]); -} -/** - * @name antiscaffoldA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function antiscaffoldA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/antiscaffolda.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const antiScaffoldABoolean = dynamicPropertyRegistry.get("antiscaffolda_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.antiscaffolda) { - return antiscaffoldaHelp(player, prefix, antiScaffoldABoolean); - } - if (antiScaffoldABoolean === false) { - // Allow - dynamicPropertyRegistry.set("antiscaffolda_b", true); - world.setDynamicProperty("antiscaffolda_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiScaffoldA§f!`); - ScaffoldA(); - } - else if (antiScaffoldABoolean === true) { - // Deny - dynamicPropertyRegistry.set("antiscaffolda_b", false); - world.setDynamicProperty("antiscaffolda_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiScaffoldA§f!`); - } -} diff --git a/build/scripts/commands/settings/antishulker.js b/build/scripts/commands/settings/antishulker.js deleted file mode 100644 index eee09be..0000000 --- a/build/scripts/commands/settings/antishulker.js +++ /dev/null @@ -1,70 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function antishulkerHelp(player, prefix, antiShulkerBoolean) { - let commandStatus; - if (!config.customcommands.antishulker) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (antiShulkerBoolean) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: antishulker`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: antishulker [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Allows or denies shulker boxes in the world.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}antishulker`, - ` ${prefix}antishulker help`, - ]); -} -/** - * @name antishulker - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function antishulker(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/antishulker.js:35)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const antiShulkerBoolean = dynamicPropertyRegistry.get("antishulker_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.antishulker) { - return antishulkerHelp(player, prefix, antiShulkerBoolean); - } - if (antiShulkerBoolean === false) { - // Allow - dynamicPropertyRegistry.set("antishulker_b", true); - world.setDynamicProperty("antishulker_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti-Shulkers§f!`); - } - else if (antiShulkerBoolean === true) { - // Deny - dynamicPropertyRegistry.set("antishulker_b", false); - world.setDynamicProperty("antishulker_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti-Shulkers§f!`); - } -} diff --git a/build/scripts/commands/settings/antispam.js b/build/scripts/commands/settings/antispam.js deleted file mode 100644 index 4f0b65e..0000000 --- a/build/scripts/commands/settings/antispam.js +++ /dev/null @@ -1,74 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { beforeAntiSpam } from "../../penrose/ChatSendBeforeEvent/chat/antispam.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { afterAntiSpam } from "../../penrose/ChatSendAfterEvent/chat/antispam.js"; -function antispamHelp(player, prefix, antiSpamBoolean) { - let commandStatus; - if (!config.customcommands.antispam) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (antiSpamBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: antispam`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: antispam [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Checks for spamming in chat with 2 second cooldown.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}antispam`, - ` ${prefix}antispam help`, - ]); -} -/** - * @name antispam - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function antispam(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/antispam.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const antiSpamBoolean = dynamicPropertyRegistry.get("antispam_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.antispam) { - return antispamHelp(player, prefix, antiSpamBoolean); - } - if (antiSpamBoolean === false) { - // Allow - dynamicPropertyRegistry.set("antispam_b", true); - world.setDynamicProperty("antispam_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti Spam§f!`); - beforeAntiSpam(); - afterAntiSpam(); - } - else if (antiSpamBoolean === true) { - // Deny - dynamicPropertyRegistry.set("antispam_b", false); - world.setDynamicProperty("antispam_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti Spam§f!`); - } -} diff --git a/build/scripts/commands/settings/auracheck.js b/build/scripts/commands/settings/auracheck.js deleted file mode 100644 index e613529..0000000 --- a/build/scripts/commands/settings/auracheck.js +++ /dev/null @@ -1,81 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import { KillAura } from "../../penrose/EntityHitEntityAfterEvent/killaura.js"; -function auraCheckHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.antikillaura) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: antikillaura`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: antikillaura [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Toggles checks for attacks outside a 90 degree angle.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}antikillaura ${player.name}`, - ` ${prefix}antikillaura help`, - ]); -} -/** - * @name auracheck - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function auracheck(message, args) { - handleAuraCheck(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleAuraCheck(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/utility/auracheck.js:29)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const antiKillAuraBoolean = dynamicPropertyRegistry.get("antikillaura_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return auraCheckHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.antikillaura) { - return auraCheckHelp(player, prefix); - } - if (antiKillAuraBoolean === true) { - // Deny - dynamicPropertyRegistry.set("antikillaura_b", false); - world.setDynamicProperty("antikillaura_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiKillAura§f!`); - } - else if (antiKillAuraBoolean === false) { - // Allow - dynamicPropertyRegistry.set("antikillaura_b", true); - world.setDynamicProperty("antikillaura_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiKillAura§f!`); - KillAura(); - } -} diff --git a/build/scripts/commands/settings/autoban.js b/build/scripts/commands/settings/autoban.js deleted file mode 100644 index cc239bf..0000000 --- a/build/scripts/commands/settings/autoban.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { AutoBan } from "../../penrose/TickEvent/ban/autoban.js"; -function autobanHelp(player, prefix, autoBanBoolean) { - let commandStatus; - if (!config.customcommands.autoban) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (autoBanBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: autoban`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: autoban [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles the autoban module which will ban players based on their violations if above 50.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}autoban`, - ` ${prefix}autoban help`, - ]); -} -/** - * @name autoban - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function autoban(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/autoban.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const autoBanBoolean = dynamicPropertyRegistry.get("autoban_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.autoban) { - return autobanHelp(player, prefix, autoBanBoolean); - } - if (autoBanBoolean === false) { - // Allow - dynamicPropertyRegistry.set("autoban_b", true); - world.setDynamicProperty("autoban_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6autoban§f!`); - AutoBan(); - } - else if (autoBanBoolean === true) { - // Deny - dynamicPropertyRegistry.set("autoban_b", false); - world.setDynamicProperty("autoban_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4autoban§f!`); - } -} diff --git a/build/scripts/commands/settings/autoclicker.js b/build/scripts/commands/settings/autoclicker.js deleted file mode 100644 index 7ac5531..0000000 --- a/build/scripts/commands/settings/autoclicker.js +++ /dev/null @@ -1,85 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import { AutoClicker } from "../../penrose/EntityHitEntityAfterEvent/autoclicker.js"; -function autoclickerHelp(player, prefix, autoClickerBoolean) { - let commandStatus; - if (!config.customcommands.autoclicker) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (autoClickerBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: autoclicker`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: autoclicker [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for players using autoclickers while attacking.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}autoclicker`, - ` ${prefix}autoclicker help`, - ]); -} -/** - * @name autoclicker - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function autoclick(message, args) { - handleAutoClick(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleAutoClick(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/autoclicker.js:33)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const autoClickerBoolean = dynamicPropertyRegistry.get("autoclicker_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.autoclicker) { - return autoclickerHelp(player, prefix, autoClickerBoolean); - } - if (autoClickerBoolean === false) { - // Allow - dynamicPropertyRegistry.set("autoclicker_b", true); - world.setDynamicProperty("autoclicker_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AutoClicker§f!`); - AutoClicker(); - } - else if (autoClickerBoolean === true) { - // Deny - dynamicPropertyRegistry.set("autoclicker_b", false); - world.setDynamicProperty("autoclicker_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AutoClicker§f!`); - } -} diff --git a/build/scripts/commands/settings/badpackets1.js b/build/scripts/commands/settings/badpackets1.js deleted file mode 100644 index 9b6940d..0000000 --- a/build/scripts/commands/settings/badpackets1.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { BadPackets1 } from "../../penrose/ChatSendBeforeEvent/spammer/badpackets_1.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function badpackets1Help(player, prefix, badPackets1Boolean) { - let commandStatus; - if (!config.customcommands.badpackets1) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (badPackets1Boolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: badpackets1`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: badpackets1 [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for message lengths with each broadcast.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}badpackets1`, - ` ${prefix}badpackets1 help`, - ]); -} -/** - * @name badpackets1 - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function badpackets1(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/badpackets1.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const badPackets1Boolean = dynamicPropertyRegistry.get("badpackets1_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.badpackets1) { - return badpackets1Help(player, prefix, badPackets1Boolean); - } - if (badPackets1Boolean === false) { - // Allow - dynamicPropertyRegistry.set("badpackets1_b", true); - world.setDynamicProperty("badpackets1_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Badpackets1§f!`); - BadPackets1(); - } - else if (badPackets1Boolean === true) { - // Deny - dynamicPropertyRegistry.set("badpackets1_b", false); - world.setDynamicProperty("badpackets1_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Badpackets1§f!`); - } -} diff --git a/build/scripts/commands/settings/badpackets2.js b/build/scripts/commands/settings/badpackets2.js deleted file mode 100644 index 22472b6..0000000 --- a/build/scripts/commands/settings/badpackets2.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { BadPackets2 } from "../../penrose/TickEvent/badpackets2/badpackets2.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function badpackets2Help(player, prefix, badPackets2Boolean) { - let commandStatus; - if (!config.customcommands.badpackets2) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (badPackets2Boolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: badpackets2`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: badpackets2 [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for invalid selected slots by player.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}badpackets2`, - ` ${prefix}badpackets2 help`, - ]); -} -/** - * @name badpackets2 - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function badpackets2(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/badpackets2.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const badPackets2Boolean = dynamicPropertyRegistry.get("badpackets2_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.badpackets2) { - return badpackets2Help(player, prefix, badPackets2Boolean); - } - if (badPackets2Boolean === false) { - // Allow - dynamicPropertyRegistry.set("badpackets2_b", true); - world.setDynamicProperty("badpackets2_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Badpackets2§f!`); - BadPackets2(); - } - else if (badPackets2Boolean === true) { - // Deny - dynamicPropertyRegistry.set("badpackets2_b", false); - world.setDynamicProperty("badpackets2_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Badpackets2§f!`); - } -} diff --git a/build/scripts/commands/settings/bedrockvalidate.js b/build/scripts/commands/settings/bedrockvalidate.js deleted file mode 100644 index 8c8ecf6..0000000 --- a/build/scripts/commands/settings/bedrockvalidate.js +++ /dev/null @@ -1,72 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { BedrockValidate } from "../../penrose/TickEvent/bedrock/bedrockvalidate.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function bedrockValidateHelp(player, prefix, bedrockValidateBoolean) { - let commandStatus; - if (!config.customcommands.bedrockvalidate) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (bedrockValidateBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: bedrockvalidate`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: bedrockvalidate [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for bedrock validations.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}bedrockvalidate`, - ` ${prefix}bedrockvalidate help`, - ]); -} -/** - * @name bedrockvalidate - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function bedrockvalidate(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/bedrockValidate.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const bedrockValidateBoolean = dynamicPropertyRegistry.get("bedrockvalidate_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.bedrockvalidate) { - return bedrockValidateHelp(player, prefix, bedrockValidateBoolean); - } - if (bedrockValidateBoolean === false) { - // Allow - dynamicPropertyRegistry.set("bedrockvalidate_b", true); - world.setDynamicProperty("bedrockvalidate_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6BedrockValidate§f!`); - BedrockValidate(); - } - else if (bedrockValidateBoolean === true) { - // Deny - dynamicPropertyRegistry.set("bedrockvalidate_b", false); - world.setDynamicProperty("bedrockvalidate_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4BedrockValidate§f!`); - } -} diff --git a/build/scripts/commands/settings/chatranks.js b/build/scripts/commands/settings/chatranks.js deleted file mode 100644 index b38de26..0000000 --- a/build/scripts/commands/settings/chatranks.js +++ /dev/null @@ -1,70 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function chatRanksHelp(player, prefix, chatRanksBoolean) { - let commandStatus; - if (!config.customcommands.chatranks) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (chatRanksBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: chatranks`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: chatranks [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles chat ranks.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}chatranks`, - ` ${prefix}chatranks help`, - ]); -} -/** - * @name chatranks - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function chatranks(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/chatranks.js:35)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const chatRanksBoolean = dynamicPropertyRegistry.get("chatranks_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.chatranks) { - return chatRanksHelp(player, prefix, chatRanksBoolean); - } - if (chatRanksBoolean === false) { - // Allow - dynamicPropertyRegistry.set("chatranks_b", true); - world.setDynamicProperty("chatranks_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6ChatRanks§f!`); - } - else if (chatRanksBoolean === true) { - // Deny - dynamicPropertyRegistry.set("chatranks_b", false); - world.setDynamicProperty("chatranks_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4ChatRanks§f!`); - } -} diff --git a/build/scripts/commands/settings/crashera.js b/build/scripts/commands/settings/crashera.js deleted file mode 100644 index 87d1b73..0000000 --- a/build/scripts/commands/settings/crashera.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { CrasherA } from "../../penrose/TickEvent/crasher/crasher_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function crasheraHelp(player, prefix, crasherABoolean) { - let commandStatus; - if (!config.customcommands.crashera) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (crasherABoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: crashera`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: crashera [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for the infamous Horion Crasher.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}crashera`, - ` ${prefix}crashera help`, - ]); -} -/** - * @name crasherA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function crasherA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/crashera.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const crasherABoolean = dynamicPropertyRegistry.get("crashera_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.crashera) { - return crasheraHelp(player, prefix, crasherABoolean); - } - if (crasherABoolean === false) { - // Allow - dynamicPropertyRegistry.set("crashera_b", true); - world.setDynamicProperty("crashera_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6CrasherA§f!`); - CrasherA(); - } - else if (crasherABoolean === true) { - // Deny - dynamicPropertyRegistry.set("crashera_b", false); - world.setDynamicProperty("crashera_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4CrasherA§f!`); - } -} diff --git a/build/scripts/commands/settings/enchantedarmor.js b/build/scripts/commands/settings/enchantedarmor.js deleted file mode 100644 index 6e28012..0000000 --- a/build/scripts/commands/settings/enchantedarmor.js +++ /dev/null @@ -1,80 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, getScore, sendMsg, sendMsgToPlayer } from "../../util.js"; -function enchantedArmorHelp(player, prefix, encharmorscore) { - let commandStatus; - if (!config.customcommands.enchantedarmor) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (encharmorscore <= 0) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: enchantedarmor`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: enchantedarmor [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles Anti Enchanted Armor for all players.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}enchantedarmor`, - ` ${prefix}enchantedarmor help`, - ]); -} -/** - * @name enchantedarmor - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function enchantedarmor(message, args) { - handleEnchantedArmor(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleEnchantedArmor(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/enchantedarmor.js:33)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - const encharmorscore = getScore("encharmor", player); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.enchantedarmor) { - return enchantedArmorHelp(player, prefix, encharmorscore); - } - if (encharmorscore <= 0) { - // Allow - player.runCommand(`scoreboard players set paradox:config encharmor 1`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti Enchanted Armor§f!`); - } - else if (encharmorscore >= 1) { - // Deny - player.runCommand(`scoreboard players set paradox:config encharmor 0`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti Enchanted Armor§f!`); - } - return player.runCommand(`scoreboard players operation @a encharmor = paradox:config encharmor`); -} diff --git a/build/scripts/commands/settings/flya.js b/build/scripts/commands/settings/flya.js deleted file mode 100644 index 15dac0e..0000000 --- a/build/scripts/commands/settings/flya.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { FlyA } from "../../penrose/TickEvent/fly/fly_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function flyaHelp(player, prefix, flyABoolean) { - let commandStatus; - if (!config.customcommands.flya) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (flyABoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: flya`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: flya [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for illegal flying in survival.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}flya`, - ` ${prefix}flya help`, - ]); -} -/** - * @name flyA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function flyA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/flya.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const flyABoolean = dynamicPropertyRegistry.get("flya_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.flya) { - return flyaHelp(player, prefix, flyABoolean); - } - if (flyABoolean === false) { - // Allow - dynamicPropertyRegistry.set("flya_b", true); - world.setDynamicProperty("flya_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6FlyA§f!`); - FlyA(); - } - else if (flyABoolean === true) { - // Deny - dynamicPropertyRegistry.set("flya_b", false); - world.setDynamicProperty("flya_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4FlyA§f!`); - } -} diff --git a/build/scripts/commands/settings/illegalenchant.js b/build/scripts/commands/settings/illegalenchant.js deleted file mode 100644 index 80b6b2a..0000000 --- a/build/scripts/commands/settings/illegalenchant.js +++ /dev/null @@ -1,70 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function illegalEnchantHelp(player, prefix, illegalEnchantmentBoolean) { - let commandStatus; - if (!config.customcommands.illegalenchant) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (illegalEnchantmentBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: illegalenchant`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: illegalenchant [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for items with illegal enchantments.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}illegalenchant`, - ` ${prefix}illegalenchant help`, - ]); -} -/** - * @name illegalEnchant - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function illegalEnchant(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/illegalenchant.js:35)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const illegalEnchantmentBoolean = dynamicPropertyRegistry.get("illegalenchantment_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.illegalenchant) { - return illegalEnchantHelp(player, prefix, illegalEnchantmentBoolean); - } - if (illegalEnchantmentBoolean === false) { - // Allow - dynamicPropertyRegistry.set("illegalenchantment_b", true); - world.setDynamicProperty("illegalenchantment_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalEnchantments§f!`); - } - else if (illegalEnchantmentBoolean === true) { - // Deny - dynamicPropertyRegistry.set("illegalenchantment_b", false); - world.setDynamicProperty("illegalenchantment_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalEnchantments§f!`); - } -} diff --git a/build/scripts/commands/settings/illegalitemsa.js b/build/scripts/commands/settings/illegalitemsa.js deleted file mode 100644 index 91e2795..0000000 --- a/build/scripts/commands/settings/illegalitemsa.js +++ /dev/null @@ -1,80 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { IllegalItemsA } from "../../penrose/TickEvent/illegalitems/illegalitems_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function illegalItemsAHelp(player, prefix, illegalItemsABoolean) { - let commandStatus; - if (!config.customcommands.illegalitemsa) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (illegalItemsABoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: illegalitemsa`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: illegalitemsa [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for player's that have illegal items in inventory.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}illegalitemsa`, - ` ${prefix}illegalitemsa help`, - ]); -} -/** - * @name illegalitemsA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function illegalitemsA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/illegalitemsa.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const illegalItemsABoolean = dynamicPropertyRegistry.get("illegalitemsa_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.illegalitemsa) { - return illegalItemsAHelp(player, prefix, illegalItemsABoolean); - } - if (illegalItemsABoolean === false) { - // Allow - dynamicPropertyRegistry.set("illegalitemsa_b", true); - world.setDynamicProperty("illegalitemsa_b", true); - const nohasTag = world.getPlayers({ excludeTags: ["illegalitemsA"] }); - for (const temp of nohasTag) { - temp.addTag("illegalitemsA"); - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalItemsA§f!`); - IllegalItemsA(); - } - else if (illegalItemsABoolean === true) { - // Deny - dynamicPropertyRegistry.set("illegalitemsa_b", false); - world.setDynamicProperty("illegalitemsa_b", false); - const hasTag = world.getPlayers({ tags: ["illegalitemsA"] }); - for (const temp of hasTag) { - temp.removeTag("illegalitemsA"); - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalItemsA§f!`); - } -} diff --git a/build/scripts/commands/settings/illegalitemsb.js b/build/scripts/commands/settings/illegalitemsb.js deleted file mode 100644 index ce8285d..0000000 --- a/build/scripts/commands/settings/illegalitemsb.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { IllegalItemsB } from "../../penrose/BlockPlaceAfterEvent/illegalitems/illegalitems_b.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function illegalItemsBHelp(player, prefix, illegalItemsBBoolean) { - let commandStatus; - if (!config.customcommands.illegalitemsb) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (illegalItemsBBoolean) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: illegalitemsb`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: illegalitemsb [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for player's that place illegal items.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}illegalitemsb`, - ` ${prefix}illegalitemsb help`, - ]); -} -/** - * @name illegalitemsB - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function illegalitemsB(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/illegalitemsb.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const illegalItemsBBoolean = dynamicPropertyRegistry.get("illegalitemsb_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.illegalitemsb) { - return illegalItemsBHelp(player, prefix, illegalItemsBBoolean); - } - if (illegalItemsBBoolean === false) { - // Allow - dynamicPropertyRegistry.set("illegalitemsb_b", true); - world.setDynamicProperty("illegalitemsb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalItemsB§f!`); - IllegalItemsB(); - } - else if (illegalItemsBBoolean === true) { - // Deny - dynamicPropertyRegistry.set("illegalitemsb_b", false); - world.setDynamicProperty("illegalitemsb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalItemsB§f!`); - } -} diff --git a/build/scripts/commands/settings/illegalitemsc.js b/build/scripts/commands/settings/illegalitemsc.js deleted file mode 100644 index 9172037..0000000 --- a/build/scripts/commands/settings/illegalitemsc.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { IllegalItemsC } from "../../penrose/TickEvent/illegalitems/illegalitems_c.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function illegalItemsCHelp(player, prefix, illegalItemsCBoolean) { - let commandStatus; - if (!config.customcommands.illegalitemsc) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (illegalItemsCBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: illegalitemsc`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: illegalitemsc [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for illegal dropped items.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}illegalitemsc`, - ` ${prefix}illegalitemsc help`, - ]); -} -/** - * @name illegalitemsC - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function illegalitemsC(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/illegalitemsc.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const illegalItemsCBoolean = dynamicPropertyRegistry.get("illegalitemsc_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.illegalitemsc) { - return illegalItemsCHelp(player, prefix, illegalItemsCBoolean); - } - if (illegalItemsCBoolean === false) { - // Allow - dynamicPropertyRegistry.set("illegalitemsc_b", true); - world.setDynamicProperty("illegalitemsc_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalItemsC§f!`); - IllegalItemsC(); - } - else if (illegalItemsCBoolean === true) { - // Deny - dynamicPropertyRegistry.set("illegalitemsc_b", false); - world.setDynamicProperty("illegalitemsc_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalItemsC§f!`); - } -} diff --git a/build/scripts/commands/settings/illegallores.js b/build/scripts/commands/settings/illegallores.js deleted file mode 100644 index 220fed4..0000000 --- a/build/scripts/commands/settings/illegallores.js +++ /dev/null @@ -1,70 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function illegalLoresHelp(player, prefix, illegalLoresBoolean) { - let commandStatus; - if (!config.customcommands.illegallores) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (illegalLoresBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: illegallores`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: illegallores [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for illegal Lores on items.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}illegallores`, - ` ${prefix}illegallores help`, - ]); -} -/** - * @name illegalLores - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function illegalLores(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/illegalLores.js:35)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const illegalLoresBoolean = dynamicPropertyRegistry.get("illegallores_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.illegallores) { - return illegalLoresHelp(player, prefix, illegalLoresBoolean); - } - if (illegalLoresBoolean === false) { - // Allow - dynamicPropertyRegistry.set("illegallores_b", true); - world.setDynamicProperty("illegallores_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalLores§f!`); - } - else if (illegalLoresBoolean === true) { - // Deny - dynamicPropertyRegistry.set("illegallores_b", false); - world.setDynamicProperty("illegallores_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalLores§f!`); - } -} diff --git a/build/scripts/commands/settings/invalidsprinta.js b/build/scripts/commands/settings/invalidsprinta.js deleted file mode 100644 index d2e2fa0..0000000 --- a/build/scripts/commands/settings/invalidsprinta.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { InvalidSprintA } from "../../penrose/TickEvent/invalidsprint/invalidsprint_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function invalidSprintAHelp(player, prefix, invalidSprintABoolean) { - let commandStatus; - if (!config.customcommands.invalidsprinta) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (invalidSprintABoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: invalidsprinta`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: invalidsprinta [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for illegal sprinting with blindness effect.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}invalidsprinta`, - ` ${prefix}invalidsprinta help`, - ]); -} -/** - * @name invalidsprintA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function invalidsprintA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/invaidsprinta.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const invalidSprintABoolean = dynamicPropertyRegistry.get("invalidsprinta_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.invalidsprinta) { - return invalidSprintAHelp(player, prefix, invalidSprintABoolean); - } - if (invalidSprintABoolean === false) { - // Allow - dynamicPropertyRegistry.set("invalidsprinta_b", true); - world.setDynamicProperty("invalidsprinta_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6InvalidSprintA§f!`); - InvalidSprintA(); - } - else if (invalidSprintABoolean === true) { - // Deny - dynamicPropertyRegistry.set("invalidsprinta_b", false); - world.setDynamicProperty("invalidsprinta_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4InvalidSprintA§f!`); - } -} diff --git a/build/scripts/commands/settings/jesusa.js b/build/scripts/commands/settings/jesusa.js deleted file mode 100644 index 1ce3246..0000000 --- a/build/scripts/commands/settings/jesusa.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { JesusA } from "../../penrose/TickEvent/jesus/jesus_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function jesusAHelp(player, prefix, jesusaBoolean) { - let commandStatus; - if (!config.customcommands.jesusa) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (jesusaBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: jesusa`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: jesusa [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for walking/sprinting on water or lava.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}jesusa`, - ` ${prefix}jesusa help`, - ]); -} -/** - * @name jesusA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function jesusA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/jesusa.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const jesusaBoolean = dynamicPropertyRegistry.get("jesusa_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.jesusa) { - return jesusAHelp(player, prefix, jesusaBoolean); - } - if (jesusaBoolean === false) { - // Allow - dynamicPropertyRegistry.set("jesusa_b", true); - world.setDynamicProperty("jesusa_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6JesusA§f!`); - JesusA(); - } - else if (jesusaBoolean === true) { - // Deny - dynamicPropertyRegistry.set("jesusa_b", false); - world.setDynamicProperty("jesusa_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4JesusA§f!`); - } -} diff --git a/build/scripts/commands/settings/lagclear.js b/build/scripts/commands/settings/lagclear.js deleted file mode 100644 index 14438c2..0000000 --- a/build/scripts/commands/settings/lagclear.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { ClearLag } from "../../penrose/TickEvent/clearlag/clearlag.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function clearlagHelp(player, prefix, clearLagBoolean) { - let commandStatus; - if (!config.customcommands.clearlag) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (clearLagBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: clearlag`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: clearlag [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Clears items and entities with timer.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}clearlag`, - ` ${prefix}clearlag help`, - ]); -} -/** - * @name clearlag - * @param {ChatSendAfterEvent} message - Message object - * @param {srting[]} args - Additional arguments provided (optional). - */ -export function clearlag(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/clearlag.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const clearLagBoolean = dynamicPropertyRegistry.get("clearlag_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.clearlag) { - return clearlagHelp(player, prefix, clearLagBoolean); - } - if (clearLagBoolean === false) { - // Allow - dynamicPropertyRegistry.set("clearlag_b", true); - world.setDynamicProperty("clearlag_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6ClearLag§f!`); - ClearLag(); - } - else if (clearLagBoolean === true) { - // Deny - dynamicPropertyRegistry.set("clearlag_b", false); - world.setDynamicProperty("clearlag_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4ClearLag§f!`); - } -} diff --git a/build/scripts/commands/settings/namespoofa.js b/build/scripts/commands/settings/namespoofa.js deleted file mode 100644 index 7140802..0000000 --- a/build/scripts/commands/settings/namespoofa.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { NamespoofA } from "../../penrose/TickEvent/namespoof/namespoof_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function namespoofAHelp(player, prefix, nameSpoofBoolean) { - let commandStatus; - if (!config.customcommands.namespoofa) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (nameSpoofBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: namespoofa`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: namespoofa [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for player's name exceeding character limitations.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}namespoofa`, - ` ${prefix}namespoofa help`, - ]); -} -/** - * @name namespoofA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function namespoofA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/namespoofa.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const nameSpoofBoolean = dynamicPropertyRegistry.get("namespoofa_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.namespoofa) { - return namespoofAHelp(player, prefix, nameSpoofBoolean); - } - if (nameSpoofBoolean === false) { - // Allow - dynamicPropertyRegistry.set("namespoofa_b", true); - world.setDynamicProperty("namespoofa_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6NamespoofA§f!`); - NamespoofA(); - } - else if (nameSpoofBoolean === true) { - // Deny - dynamicPropertyRegistry.set("namespoofa_b", false); - world.setDynamicProperty("namespoofa_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4NamespoofA§f!`); - } -} diff --git a/build/scripts/commands/settings/namespoofb.js b/build/scripts/commands/settings/namespoofb.js deleted file mode 100644 index e63bec5..0000000 --- a/build/scripts/commands/settings/namespoofb.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { NamespoofB } from "../../penrose/TickEvent/namespoof/namespoof_b.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function namespoofBHelp(player, prefix, nameSpoofBoolean) { - let commandStatus; - if (!config.customcommands.namespoofb) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (nameSpoofBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: namespoofb`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: namespoofb [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for player's name that has Non ASCII characters.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}namespoofb`, - ` ${prefix}namespoofb help`, - ]); -} -/** - * @name namespoofB - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function namespoofB(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/namespoofb.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const nameSpoofBoolean = dynamicPropertyRegistry.get("namespoofb_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.namespoofb) { - return namespoofBHelp(player, prefix, nameSpoofBoolean); - } - if (nameSpoofBoolean === false) { - // Allow - dynamicPropertyRegistry.set("namespoofb_b", true); - world.setDynamicProperty("namespoofb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6NamespoofB§f!`); - NamespoofB; - } - else if (nameSpoofBoolean === true) { - // Deny - dynamicPropertyRegistry.set("namespoofb_b", false); - world.setDynamicProperty("namespoofb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4NamespoofB§f!`); - } -} diff --git a/build/scripts/commands/settings/oneplayersleep.js b/build/scripts/commands/settings/oneplayersleep.js deleted file mode 100644 index 5d1c314..0000000 --- a/build/scripts/commands/settings/oneplayersleep.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { OPS } from "../../penrose/TickEvent/oneplayersleep/oneplayersleep.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function opsHelp(player, prefix, opsBoolean) { - let commandStatus; - if (!config.customcommands.ops) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (opsBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: ops`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: ops [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles One Player Sleep (OPS) for all online players.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}ops`, - ` ${prefix}ops help`, - ]); -} -/** - * @name ops - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function ops(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/oneplayersleep.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const opsBoolean = dynamicPropertyRegistry.get("ops_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.ops) { - return opsHelp(player, prefix, opsBoolean); - } - if (opsBoolean === false) { - // Allow - dynamicPropertyRegistry.set("ops_b", true); - world.setDynamicProperty("ops_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6OPS§f!`); - OPS(); - } - else if (opsBoolean === true) { - // Deny - dynamicPropertyRegistry.set("ops_b", false); - world.setDynamicProperty("ops_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4OPS§f!`); - } -} diff --git a/build/scripts/commands/settings/overidecommandblocksenabled.js b/build/scripts/commands/settings/overidecommandblocksenabled.js deleted file mode 100644 index 5d7da6a..0000000 --- a/build/scripts/commands/settings/overidecommandblocksenabled.js +++ /dev/null @@ -1,85 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, getScore, sendMsg, sendMsgToPlayer } from "../../util.js"; -function overrideCBEHelp(player, prefix, cmdsscore) { - let commandStatus; - if (!config.customcommands.overidecommandblocksenabled) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (cmdsscore <= 0) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: overridecbe`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: overridecbe [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Forces the commandblocksenabled gamerule to be enabled or disabled at all times.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}overridecbe`, - ` ${prefix}overridecbe help`, - ]); -} -/** - * @name overidecommandblocksenabled - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function overidecommandblocksenabled(message, args) { - handleOverideCommandBlocksEnabled(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleOverideCommandBlocksEnabled(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/overideCommandBlocksEnabled.js:7)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - const cmdsscore = getScore("cmds", player); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.overidecommandblocksenabled) { - return overrideCBEHelp(player, prefix, cmdsscore); - } - if (cmdsscore <= 0) { - // Allow - player.runCommand(`scoreboard players set paradox:config cmds 1`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has set CommandBlocksEnabled as §6enabled§f!`); - } - else if (cmdsscore === 1) { - // Deny - player.runCommand(`scoreboard players set paradox:config cmds 2`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has set CommandBlocksEnabled as §4disabled§f!`); - } - else if (cmdsscore >= 2) { - // Force - player.runCommand(`scoreboard players set paradox:config cmds 0`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has §etoggled§f Force-CommandBlocksEnabled!`); - } - return player.runCommand(`scoreboard players operation @a cmds = paradox:config cmds`); -} diff --git a/build/scripts/commands/settings/reacha.js b/build/scripts/commands/settings/reacha.js deleted file mode 100644 index 0d872ce..0000000 --- a/build/scripts/commands/settings/reacha.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { ReachA } from "../../penrose/BlockPlaceAfterEvent/reach/reach_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function reachAHelp(player, prefix, reachABoolean) { - let commandStatus; - if (!config.customcommands.reacha) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (reachABoolean) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: reacha`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: reacha [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for player's placing blocks beyond reach.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}reacha`, - ` ${prefix}reacha help`, - ]); -} -/** - * @name reachA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function reachA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/reacha.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const reachABoolean = dynamicPropertyRegistry.get("reacha_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.reacha) { - return reachAHelp(player, prefix, reachABoolean); - } - if (reachABoolean === false) { - // Allow - dynamicPropertyRegistry.set("reacha_b", true); - world.setDynamicProperty("reacha_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6ReachA§f!`); - ReachA(); - } - else if (reachABoolean === true) { - // Deny - dynamicPropertyRegistry.set("reacha_b", false); - world.setDynamicProperty("reacha_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4ReachA§f!`); - } -} diff --git a/build/scripts/commands/settings/reachb.js b/build/scripts/commands/settings/reachb.js deleted file mode 100644 index 83ab5ef..0000000 --- a/build/scripts/commands/settings/reachb.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { ReachB } from "../../penrose/EntityHitEntityAfterEvent/reach_b.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function reachBHelp(player, prefix, reachBBoolean) { - let commandStatus; - if (!config.customcommands.reachb) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (reachBBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: reachb`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: reachb [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for player's attacking beyond reach.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}reachb`, - ` ${prefix}reachb help`, - ]); -} -/** - * @name reachB - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function reachB(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/reachb.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const reachBBoolean = dynamicPropertyRegistry.get("reachb_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.reachb) { - return reachBHelp(player, prefix, reachBBoolean); - } - if (reachBBoolean === false) { - // Allow - dynamicPropertyRegistry.set("reachb_b", true); - world.setDynamicProperty("reachb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6ReachB§f!`); - ReachB(); - } - else if (reachBBoolean === true) { - // Deny - dynamicPropertyRegistry.set("reachb_b", false); - world.setDynamicProperty("reachb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4ReachB§f!`); - } -} diff --git a/build/scripts/commands/settings/removecommandblocks.js b/build/scripts/commands/settings/removecommandblocks.js deleted file mode 100644 index 32af0d3..0000000 --- a/build/scripts/commands/settings/removecommandblocks.js +++ /dev/null @@ -1,80 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, getScore, sendMsg, sendMsgToPlayer } from "../../util.js"; -function removeCBEHelp(player, prefix, commandblocksscore) { - let commandStatus; - if (!config.customcommands.removecommandblocks) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (commandblocksscore <= 0) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: removecb`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: removecb [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles Anti Command Blocks (Clears all when enabled).`, - `§4[§6Examples§4]§f:`, - ` ${prefix}removecb`, - ` ${prefix}removecb help`, - ]); -} -/** - * @name removecommandblocks - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function removecommandblocks(message, args) { - handleRemoveCommandBlocks(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleRemoveCommandBlocks(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/removeCommandBlocks.js:33)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - const commandblocksscore = getScore("commandblocks", player); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.removecommandblocks) { - return removeCBEHelp(player, prefix, commandblocksscore); - } - if (commandblocksscore <= 0) { - // Allow - player.runCommand(`scoreboard players set paradox:config commandblocks 1`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti Command Blocks§f!`); - } - else if (commandblocksscore >= 1) { - // Deny - player.runCommand(`scoreboard players set paradox:config commandblocks 0`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti Command Blocks§f!`); - } - return player.runCommand(`scoreboard players operation @a commandblocks = paradox:config commandblocks`); -} diff --git a/build/scripts/commands/settings/salvagesystem.js b/build/scripts/commands/settings/salvagesystem.js deleted file mode 100644 index e852e8c..0000000 --- a/build/scripts/commands/settings/salvagesystem.js +++ /dev/null @@ -1,70 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function salvageHelp(player, prefix, salvageBoolean) { - let commandStatus; - if (!config.customcommands.salvage) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (salvageBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: salvage`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: salvage [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles new salvage system [Experimental].`, - `§4[§6Examples§4]§f:`, - ` ${prefix}salvage`, - ` ${prefix}salvage help`, - ]); -} -/** - * @name salvage - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function salvage(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/salvage.js:35)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const salvageBoolean = dynamicPropertyRegistry.get("salvage_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.salvage) { - return salvageHelp(player, prefix, salvageBoolean); - } - if (salvageBoolean === false) { - // Allow - dynamicPropertyRegistry.set("salvage_b", true); - world.setDynamicProperty("salvage_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Salvage§f!`); - } - else if (salvageBoolean === true) { - // Deny - dynamicPropertyRegistry.set("salvage_b", false); - world.setDynamicProperty("salvage_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Salvage§f!`); - } -} diff --git a/build/scripts/commands/settings/showrules.js b/build/scripts/commands/settings/showrules.js deleted file mode 100644 index 98046c5..0000000 --- a/build/scripts/commands/settings/showrules.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { ShowRules } from "../../gui/showrules/showrules.js"; -function showrulesHelp(player, prefix, showrulesBoolean) { - let commandStatus; - if (!config.customcommands.showrules) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (showrulesBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: showrules`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: showrules [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles showing the rules when the player loads in for the first time.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}showrules`, - ` ${prefix}showrules help`, - ]); -} -/** - * @name showrules - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function showrules(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/moderation/showrules.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const showrulesBoolean = dynamicPropertyRegistry.get("showrules_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.showrules) { - return showrulesHelp(player, prefix, showrulesBoolean); - } - if (showrulesBoolean === false) { - // Allow - dynamicPropertyRegistry.set("showrules_b", true); - world.setDynamicProperty("showrules_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6showrules§f!`); - ShowRules(); - } - else if (showrulesBoolean === true) { - // Deny - dynamicPropertyRegistry.set("showrules_b", false); - world.setDynamicProperty("showrules_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4showrules§f!`); - } -} diff --git a/build/scripts/commands/settings/spammera.js b/build/scripts/commands/settings/spammera.js deleted file mode 100644 index ebc4ddc..0000000 --- a/build/scripts/commands/settings/spammera.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { SpammerA } from "../../penrose/ChatSendBeforeEvent/spammer/spammer_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function spammerAHelp(player, prefix, spammerABoolean) { - let commandStatus; - if (!config.customcommands.spammera) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (spammerABoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: spammera`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: spammera [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for messages sent while moving.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}spammera`, - ` ${prefix}spammera help`, - ]); -} -/** - * @name spammerA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function spammerA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/spammera.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const spammerABoolean = dynamicPropertyRegistry.get("spammera_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.spammera) { - return spammerAHelp(player, prefix, spammerABoolean); - } - if (spammerABoolean === false) { - // Allow - dynamicPropertyRegistry.set("spammera_b", true); - world.setDynamicProperty("spammera_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6SpammerA§f!`); - SpammerA(); - } - else if (spammerABoolean === true) { - // Deny - dynamicPropertyRegistry.set("spammera_b", false); - world.setDynamicProperty("spammera_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4SpammerA§f!`); - } -} diff --git a/build/scripts/commands/settings/spammerb.js b/build/scripts/commands/settings/spammerb.js deleted file mode 100644 index b2c7126..0000000 --- a/build/scripts/commands/settings/spammerb.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { SpammerB } from "../../penrose/ChatSendBeforeEvent/spammer/spammer_b.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function spammerBHelp(player, prefix, spammerBBoolean) { - let commandStatus; - if (!config.customcommands.spammerb) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (spammerBBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: spammerb`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: spammerb [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for messages sent while swinging.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}spammerb`, - ` ${prefix}spammerb help`, - ]); -} -/** - * @name spammerB - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function spammerB(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/spammerb.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const spammerBBoolean = dynamicPropertyRegistry.get("spammerb_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.spammerb) { - return spammerBHelp(player, prefix, spammerBBoolean); - } - if (spammerBBoolean === false) { - // Allow - dynamicPropertyRegistry.set("spammerb_b", true); - world.setDynamicProperty("spammerb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6SpammerB§f!`); - SpammerB(); - } - else if (spammerBBoolean === true) { - // Deny - dynamicPropertyRegistry.set("spammerb_b", false); - world.setDynamicProperty("spammerb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4SpammerB§f!`); - } -} diff --git a/build/scripts/commands/settings/spammerc.js b/build/scripts/commands/settings/spammerc.js deleted file mode 100644 index e933741..0000000 --- a/build/scripts/commands/settings/spammerc.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { SpammerC } from "../../penrose/ChatSendBeforeEvent/spammer/spammer_c.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function spammerCHelp(player, prefix, spammerCBoolean) { - let commandStatus; - if (!config.customcommands.spammerc) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (spammerCBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: spammerc`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: spammerc [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for messages sent while using items.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}spammerc`, - ` ${prefix}spammerc help`, - ]); -} -/** - * @name spammerC - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function spammerC(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/spammerC.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const spammerCBoolean = dynamicPropertyRegistry.get("spammerc_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.spammerc) { - return spammerCHelp(player, prefix, spammerCBoolean); - } - if (spammerCBoolean === false) { - // Allow - dynamicPropertyRegistry.set("spammerc_b", true); - world.setDynamicProperty("spammerc_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6SpammerC§f!`); - SpammerC(); - } - else if (spammerCBoolean === true) { - // Deny - dynamicPropertyRegistry.set("spammerc_b", false); - world.setDynamicProperty("spammerc_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4SpammerC§f!`); - } -} diff --git a/build/scripts/commands/settings/speeda.js b/build/scripts/commands/settings/speeda.js deleted file mode 100644 index 3dbc8b2..0000000 --- a/build/scripts/commands/settings/speeda.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { SpeedA } from "../../penrose/TickEvent/speed/speed_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function speedAHelp(player, prefix, speedBoolean) { - let commandStatus; - if (!config.customcommands.speeda) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (speedBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: speeda`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: speeda [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for player's speed hacking.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}speeda`, - ` ${prefix}speeda help`, - ]); -} -/** - * @name speedA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function speedA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/speeda.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const speedBoolean = dynamicPropertyRegistry.get("speeda_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.speeda) { - return speedAHelp(player, prefix, speedBoolean); - } - if (speedBoolean === false) { - // Allow - dynamicPropertyRegistry.set("speeda_b", true); - world.setDynamicProperty("speeda_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6SpeedA§f!`); - SpeedA(); - } - else if (speedBoolean === true) { - // Deny - dynamicPropertyRegistry.set("speeda_b", false); - world.setDynamicProperty("speeda_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4SpeedA§f!`); - } -} diff --git a/build/scripts/commands/settings/stackban.js b/build/scripts/commands/settings/stackban.js deleted file mode 100644 index 2592632..0000000 --- a/build/scripts/commands/settings/stackban.js +++ /dev/null @@ -1,82 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function stackBanHelp(player, prefix, stackBanBoolean) { - let commandStatus; - if (!config.customcommands.stackban) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (stackBanBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: stackban`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: stackban [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Toggles checks for player's with illegal stacks over 64.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}stackban`, - ` ${prefix}stackban help`, - ]); -} -/** - * @name stackban - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function stackban(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/stackban.js:35)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const stackBanBoolean = dynamicPropertyRegistry.get("stackban_b"); - const illegalItemsABoolean = dynamicPropertyRegistry.get("illegalitemsa_b"); - const illegalItemsBBoolean = dynamicPropertyRegistry.get("illegalitemsb_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.stackban) { - return stackBanHelp(player, prefix, stackBanBoolean); - } - if (!illegalItemsABoolean && !illegalItemsBBoolean) { - if (stackBanBoolean) { - // In this stage they are likely turning it off so oblige their request - dynamicPropertyRegistry.set("stackban_b", false); - return world.setDynamicProperty("stackban_b", false); - } - // If illegal items are not enabled then let user know this feature is inaccessible - // It will not work without one of them - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You need to enable Illegal Items to use this feature.`); - } - if (stackBanBoolean === false) { - // Allow - dynamicPropertyRegistry.set("stackban_b", true); - world.setDynamicProperty("stackban_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6StackBans§f!`); - } - else if (stackBanBoolean === true) { - // Deny - dynamicPropertyRegistry.set("stackban_b", false); - world.setDynamicProperty("stackban_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4StackBans§f!`); - } -} diff --git a/build/scripts/commands/settings/worldborder.js b/build/scripts/commands/settings/worldborder.js deleted file mode 100644 index b2750db..0000000 --- a/build/scripts/commands/settings/worldborder.js +++ /dev/null @@ -1,124 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { WorldBorder } from "../../penrose/TickEvent/worldborder/worldborder.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function worldBorderHelp(player, prefix, worldBorderBoolean) { - let commandStatus; - if (!config.customcommands.worldborder) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (worldBorderBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: worldborder`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: worldborder [optional]`, - `§4[§6Optional§4]§f: disable, help`, - `§4[§6Description§4]§f: Sets the world border and restricts players to that border.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}worldborder 10000 5000`, - ` ${prefix}worldborder -o 10000 -n 5000 -e 10000`, - ` ${prefix}worldborder -overworld 10000 -nether 5000`, - ` ${prefix}worldborder -overworld 10000`, - ` ${prefix}worldborder -nether 5000`, - ` ${prefix}worldborder -n 5000`, - ` ${prefix}worldborder disable`, - ` ${prefix}worldborder help`, - ]); -} -function setWorldBorder(player, overworldSize, netherSize, endSize) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has set the §6World Border§f! Overworld: ${overworldSize} Nether: ${netherSize} End: ${endSize}`); - dynamicPropertyRegistry.set("worldborder_b", true); - dynamicPropertyRegistry.set("worldborder_n", Math.abs(overworldSize)); - dynamicPropertyRegistry.set("worldborder_nether_n", Math.abs(netherSize)); - dynamicPropertyRegistry.set("worldborder_end_n", Math.abs(endSize)); - world.setDynamicProperty("worldborder_b", true); - world.setDynamicProperty("worldborder_n", Math.abs(overworldSize)); - world.setDynamicProperty("worldborder_nether_n", Math.abs(netherSize)); - world.setDynamicProperty("worldborder_end_n", Math.abs(endSize)); - WorldBorder(); -} -/** - * @name worldborder - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function worldborders(message, args) { - if (!message) { - return console.warn(`${new Date()} | Error: ${message} isn't defined. Did you forget to pass it? (./commands/settings/worldborder.js:38)`); - } - const player = message.sender; - const uniqueId = dynamicPropertyRegistry.get(player?.id); - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - const prefix = getPrefix(player); - const worldBorderBoolean = dynamicPropertyRegistry.get("worldborder_b"); - // Cache - const length = args.length; - if (!length || args[0].toLowerCase() === "help" || !config.customcommands.worldborder) { - return worldBorderHelp(player, prefix, worldBorderBoolean); - } - // Shutdown worldborder - if (args[0] === "disable") { - // Disable Worldborder - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> the §6World Border§f!`); - dynamicPropertyRegistry.set("worldborder_b", false); - dynamicPropertyRegistry.set("worldborder_n", 0); - dynamicPropertyRegistry.set("worldborder_nether_n", 0); - dynamicPropertyRegistry.set("worldborder_end_n", 0); - world.setDynamicProperty("worldborder_b", false); - world.setDynamicProperty("worldborder_n", 0); - world.setDynamicProperty("worldborder_nether_n", 0); - world.setDynamicProperty("worldborder_end_n", 0); - return; - } - const paramIndexes = { - "-overworld": -1, - "-o": -1, - "-nether": -1, - "-n": -1, - "-end": -1, - "-e": -1, - }; - for (let i = 0; i < length; i++) { - if (paramIndexes[args[i]] !== undefined) { - paramIndexes[args[i]] = i; - } - } - let overworldSize = dynamicPropertyRegistry.get("worldborder_n") || 0; - let netherSize = dynamicPropertyRegistry.get("worldborder_nether_n") || 0; - let endSize = dynamicPropertyRegistry.get("worldborder_end_n") || 0; - for (let i = 0; i < length; i++) { - const arg = args[i].toLowerCase(); - switch (arg) { - case "-overworld": - case "-o": - overworldSize = Number(args[i + 1]); - break; - case "-nether": - case "-n": - netherSize = Number(args[i + 1]); - break; - case "-end": - case "-e": - endSize = Number(args[i + 1]); - break; - } - } - if (overworldSize || netherSize || endSize) { - setWorldBorder(player, overworldSize, netherSize, endSize); - return; - } - return worldBorderHelp(player, prefix, worldBorderBoolean); -} diff --git a/build/scripts/commands/settings/xraya.js b/build/scripts/commands/settings/xraya.js deleted file mode 100644 index e73e732..0000000 --- a/build/scripts/commands/settings/xraya.js +++ /dev/null @@ -1,72 +0,0 @@ -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -import config from "../../data/config.js"; -import { world } from "@minecraft/server"; -import { XrayA } from "../../penrose/BlockBreakAfterEvent/xray/xray_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -function xrayAHelp(player, prefix, xrayBoolean) { - let commandStatus; - if (!config.customcommands.xraya) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (xrayBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: xraya`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: xraya [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Notify's staff when and where player's mine specific ores.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}xraya`, - ` ${prefix}xraya help`, - ]); -} -/** - * @name xrayA - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function xrayA(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/settings/xraya.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const xrayBoolean = dynamicPropertyRegistry.get("xraya_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.xraya) { - return xrayAHelp(player, prefix, xrayBoolean); - } - if (xrayBoolean === false) { - // Allow - dynamicPropertyRegistry.set("xraya_b", true); - world.setDynamicProperty("xraya_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6XrayA§f!`); - XrayA(); - } - else if (xrayBoolean === true) { - // Deny - dynamicPropertyRegistry.set("xraya_b", false); - world.setDynamicProperty("xraya_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4XrayA§f!`); - } -} diff --git a/build/scripts/commands/utility/biome.js b/build/scripts/commands/utility/biome.js deleted file mode 100644 index 830603b..0000000 --- a/build/scripts/commands/utility/biome.js +++ /dev/null @@ -1,174 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer } from "../../util.js"; -function biomeHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.biome) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: biome`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: biome [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Sends the current biome and direction the player is facing. §6Note you need to enable Molang. `, - `§4[§6Examples§4]§f:`, - ` ${prefix}biome`, - ` §4- §6Send the current biome and direction to the player§f`, - ` ${prefix}biome help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name biome - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function biome(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./utility/biome.js:26)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.biome) { - return biomeHelp(player, prefix); - } - const directionMap = new Map([ - ["North", "向いている方角: 北"], - ["South", "向いている方角: 南"], - ["East", "向いている方角: 東"], - ["West", "向いている方角: 西"], - ]); - const defaultDirection = "Facing: Unknown!"; - let direction; - // Iterate over the map entries to find a matching tag - for (const [tag, mappedDirection] of directionMap.entries()) { - if (player.hasTag(tag)) { - direction = mappedDirection; - break; - } - } - // If no matching tag is found, assign the default direction - if (!direction) { - direction = defaultDirection; - } - //Biome Map - const biomeMap = new Map([ - ["basalt_deltas", "バイオーム: ネザーの玄武岩の三角州"], - ["bamboo_jungle", "バイオーム: まばらなジャングル "], - ["bamboo_jungle_hills", "バイオーム: 竹林"], - ["beach", "バイオーム: ビーチ"], - ["birch_forest", "バイオーム: 白樺の森"], - ["birch_forest_hills", "バイオーム: ちょい崖の白樺の森"], - ["birch_forest_hills_mutated", "バイオーム: 白樺の森の丘の突然変異!?"], - ["birch_forest_mutated", "バイオーム: 白樺の森の変異!?"], - ["cold_beach", "バイオーム: 雪のビーチ"], - ["cold_ocean", "バイオーム: 冷たい海洋"], - ["cold_taiga", "バイオーム: 雪のタイガ"], - ["cold_taiga_hills", "バイオーム: ちょい崖のタイガ"], - ["cold_taiga_mutated", "バイオーム: 崖タイガw"], - ["crimson_forest", "バイオーム: ネザー真紅の森"], - ["deep_cold_ocean", "バイオーム: 冷たい深海"], - ["deep_frozen_ocean", "バイオーム: 凍った深海"], - ["deep_lukewarm_ocean", "バイオーム: ぬるい深海"], - ["deep_ocean", "バイオーム: ただの深海"], - ["deep_warm_ocean", "バイオーム: 深海【海底神殿あるかも?】"], - ["desert", "バイオーム: 砂漠~"], - ["desert_hills", "バイオーム: 砂漠の崖~"], - ["desert_mutated", "バイオーム: 崖砂漠~"], - ["extreme_hills_edge", "バイオーム: 吹きさらしの谷~"], - ["extreme_hills_mutated", "バイオーム: エメラルドが取れそうな山"], - ["extreme_hills_plus_trees", "バイオーム: 山岳"], - ["extreme_hills_plus_trees_mutated", "バイオーム: 森のある山"], - ["flower_forest", "バイオーム: 花の森"], - ["forest", "バイオーム: ただの森"], - ["forest_hills", "バイオーム: ちょい崖の森"], - ["frozen_ocean", "バイオーム: 凍った海"], - ["frozen_river", "バイオーム: 凍った川"], - ["ice_mountains", "バイオーム: 氷の山【スキーできるね!】"], - ["ice_plains", "バイオーム: 氷原"], - ["ice_plains_spikes", "バイオーム: 氷原のトラップ"], - ["jungle", "バイオーム: ただのジャングル"], - ["jungle_edge", "バイオーム: ジャングルエッジ~"], - ["jungle_edge_mutated", "バイオーム: 変異したジャングル・エッジ~"], - ["jungle_hills", "バイオーム: ジャングル・ヒルズ"], - ["jungle_mutated", "バイオーム: ジャングルの突然変異!?"], - ["legacy_frozen_ocean", "バイオーム:シロクマさんがスポーンする凍った海"], - ["lofty_peaks", "バイオーム: 雪山岳"], - ["lukewarm_ocean", "バイオーム: ぬるい海"], - ["mega_spruce_taiga", "バイオーム: トウヒの原生林"], - ["mega_spruce_taiga_hills", "バイオーム: 寒いタイガの原生林"], - ["mega_taiga", "バイオーム: 巨大なタイガの原生林"], - ["mega_taiga_hills", "バイオーム: 巨大なトウヒの森!"], - ["mesa", "バイオーム: メサ"], - ["mesa_bryce", "バイオーム: メサブライス"], - ["mesa_plateau", "バイオーム: メサ高原"], - ["mesa_plateau_mutated", "バイオーム:メサ高原の突然変異"], - ["mesa_plateau_stone", "バイオーム: 石テーブルトップ"], - ["mesa_plateau_stone_mutated", "バイオーム: メサ・プラトー・ストーン"], - ["mountain_grove", "バイオーム: マウンテン・グローブ"], - ["mountain_meadow", "バイオーム: マウンテン・メドウ"], - ["mountain_peaks", "バイオーム: 山頂"], - ["mushroom_island", "バイオーム: マッシュルーム・アイランド"], - ["mushroom_island_shore", "バイオーム:マッシュルーム・アイランド・ショア"], - ["nether_wastes", "バイオーム: ネザーの荒地"], - ["ocean", "バイオーム: 海"], - ["plains", "バイオーム: 平野"], - ["river", "バイオーム: 川"], - ["roofed_forest_mutated", "バイオーム: 変異した屋根のある森"], - ["savanna", "バイオーム: サバンナ"], - ["savanna_mutated", "バイオーム:サバンナ"], - ["savanna_plateau", "バイオーム:サバンナ"], - ["savanna_plateau_mutated", "バイオーム:サバンナ"], - ["snow_capped_peaks", "バイオーム: 雪に覆われた山々"], - ["snowy_slopes", "バイオーム: 雪の坂道"], - ["soulsand_valley", "バイオーム:ネザーのソウルサンド地帯"], - ["stone_beach", "バイオーム: 石浜"], - ["sunflower_plains", "バイオーム:ひまわり平野"], - ["swamp", "バイオーム: 沼地"], - ["swamp_mutated", "バイオーム: 沼地"], - ["taiga", "バイオーム: タイガ"], - ["taiga_hills", "バイオーム: タイガ"], - ["taiga_mutated", "バイオーム: タイガ"], - ["the_end", "バイオーム: エンド!!"], - ["warm_ocean", "バイオーム: 暖かい海"], - ["warped_forest", "バイオーム: 歪んだ森"], - ["deep_dark", "バイオーム: 深い闇"], - ["lush_caves", "バイオーム: 豊かな洞窟"], - ["jagged_peaks", "バイオーム: 緑豊かな鍾乳洞"], - ["dripstone_caves", "バイオーム: ドリップストーン洞窟"], - ["meadow", "バイオーム: 草地"], - ["mangrove_swamp", "バイオーム: マングローブ湿地"], - ["cherry_grove", "バイオーム: チェリー・グローブ"], - ["roofed_forest", "バイオーム: 屋根の森"], - ["grove", "バイオーム: グローブ"], - ["stony_peaks", "バイオーム: ストーニー・ピークス"], - ]); - const defaultBiome = "Unknown Or §4Molang is not enabled!§f"; - let currentBiome; - // Iterate over the map entries to find a matching tag - for (const [tag, mappedBiome] of biomeMap.entries()) { - if (player.hasTag(tag)) { - currentBiome = mappedBiome; - break; - } - } - // If no matching tag is found, assign the default biome - if (!currentBiome) { - currentBiome = defaultBiome; - } - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${currentBiome} \n§f§4[§6Paradox§4]§f ${direction}`); -} diff --git a/build/scripts/commands/utility/channel.js b/build/scripts/commands/utility/channel.js deleted file mode 100644 index fd2e7a2..0000000 --- a/build/scripts/commands/utility/channel.js +++ /dev/null @@ -1,288 +0,0 @@ -import { world } from "@minecraft/server"; -import { createChatChannel, inviteToChatChannel, getPrefix, sendMsgToPlayer, switchChatChannel, deleteChatChannel, handOverChannelOwnership, getPlayerChannel, chatChannels, getPlayerById, playerChannelMap, getPlayerByName } from "../../util.js"; -import config from "../../data/config.js"; -function chatChannelHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.channel) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Chat Channel Commands§4]§f:`, - `§4[§6Status§4]§f: ${commandStatus}`, - ``, - `§4[§6Command§4]§f: ${prefix}channel create `, - `§4[§6Description§4]§f: Create a new chat channel (with optional password).`, - `§4[§6Examples§4]§f:`, - ` ${prefix}channel create test`, - ` §4- §6Create a chat channel named 'test' without a password§f`, - ` ${prefix}channel create test password123`, - ` §4- §6Create a chat channel named 'test' with password 'password123'§f`, - ``, - `§4[§6Command§4]§f: ${prefix}channel delete `, - `§4[§6Description§4]§f: Delete an existing chat channel (with optional password).`, - `§4[§6Examples§4]§f:`, - ` ${prefix}channel delete test`, - ` §4- §6Delete the chat channel named 'test'§f`, - ` ${prefix}channel delete test password123`, - ` §4- §6Delete the chat channel named 'test' with password 'password123'§f`, - ``, - `§4[§6Command§4]§f: ${prefix}channel invite `, - `§4[§6Description§4]§f: Invite a player to join your chat channel.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}channel invite test player123`, - ` §4- §6Invite 'player123' to join the chat channel 'test'§f`, - ``, - `§4[§6Command§4]§f: ${prefix}channel join `, - `§4[§6Description§4]§f: Join a chat channel (with optional password).`, - `§4[§6Examples§4]§f:`, - ` ${prefix}channel join test`, - ` §4- §6Join the chat channel 'test'§f`, - ` ${prefix}channel join test password123`, - ` §4- §6Join the chat channel 'test' with password 'password123'§f`, - ``, - `§4[§6Command§4]§f: ${prefix}channel handover `, - `§4[§6Description§4]§f: Transfer ownership of a chat channel.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}channel handover test newOwner123`, - ` §4- §6Transfer ownership of the chat channel 'test' to 'newOwner123'§f`, - ``, - `§4[§6Command§4]§f: ${prefix}channel members`, - `§4[§6Description§4]§f: List all members in the same chat channel.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}channel members`, - ` §4- §6List all members in the same chat channel§f`, - ``, - `§4[§6Command§4]§f: ${prefix}channel leave`, - `§4[§6Description§4]§f: Leave the current chat channel.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}channel leave`, - ` §4- §6Leave the current chat channel§f`, - ]); -} -export function chatChannel(message, args) { - if (!message) { - console.warn(`${new Date()} | Error: ${message} isn't defined.`); - return; - } - const player = message.sender; - const prefix = getPrefix(player); - const commandArgs = args; - if (commandArgs[0] !== "me" && commandArgs[0] !== "le" && (commandArgs[0] === "help" || commandArgs.length < 2)) { - chatChannelHelp(player, prefix); - return; - } - const subCommand = commandArgs[0]; // Extract the subcommand - const subCommandArgs = commandArgs.slice(1); // Extract the subcommand arguments - switch (subCommand) { - case "me": { - const channelNameForMembers = getPlayerChannel(player.id); - if (!channelNameForMembers) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f あなたはどのチャットチャンネルにも入っていません.`); - return; - } - const channel = chatChannels[channelNameForMembers]; - const channelMembers = channel.members; - const memberListTitle = `§f§4[§6Paradox§4]§f 全メンバーとチャンネル一覧=> §6${channelNameForMembers}§f`; - const membersList = Array.from(channelMembers) - .map((memberID) => { - const member = getPlayerById(memberID); - if (member !== null) { - const isStatus = member.id === channel.owner ? "所有者" : "メンバー"; - return ` §o§6| §4[§6${isStatus}§4] §7${member.name}§f`; - } - return ""; - }) - .filter((memberLine) => memberLine !== "") - .join("\n"); - sendMsgToPlayer(player, [memberListTitle, membersList]); - break; - } - case "cr": { - const existingChannelName = getPlayerChannel(player.id); - if (existingChannelName) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f すでにチャットチャンネルに入っています! 参加チャンネル=> (${existingChannelName}). まずは今いるチャンネルから抜けてください`); - } - else { - const channelName = subCommandArgs[0]; - const password = subCommandArgs[1]; // Optional password argument - const createResult = createChatChannel(channelName, password, player.id); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f チャンネル=> '${channelName}' ${createResult ? "作成." : "既に作成済み"}`); - } - break; - } - case "de": { - const channelNameToDelete = subCommandArgs[0]; - const passwordToDelete = subCommandArgs[1]; // Optional password argument - const deleteResult = deleteChatChannel(channelNameToDelete, passwordToDelete); - if (deleteResult === "wrong_password") { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§fパスワードが違います '${channelNameToDelete}'.`); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f チャンネル=> '${channelNameToDelete}' ${deleteResult ? "消去." : "見つかりませんでした."}`); - } - break; - } - case "in": { - const channelNameToInvite = subCommandArgs[0]; - const playerToInvite = subCommandArgs[1]; - if (!playerToInvite) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Usage: ${prefix}channel invite `); - return; - } - const joinedPlayer = getPlayerByName(playerToInvite); - if (playerToInvite) { - const inviteResult = inviteToChatChannel(playerToInvite, channelNameToInvite); - if (inviteResult) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${playerToInvite}を招待しました 招待したチャンネル=> '${channelNameToInvite}'.`); - const joinedPlayerName = joinedPlayer ? joinedPlayer.name : "不明なプレイヤー"; - const joinMessage = `§f§4[§6Paradox§4]§f §6${joinedPlayerName}§f チャンネルに参加しました.`; - const channel = chatChannels[channelNameToInvite]; - channel.members.forEach((memberId) => { - const member = getPlayerById(memberId); - if (member && member !== joinedPlayer) { - sendMsgToPlayer(member, joinMessage); - } - }); - sendMsgToPlayer(joinedPlayer, `§f§4[§6Paradox§4]§f ${player.name} からあなたに '${channelNameToInvite}'のチャンネルに招待されています`); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${playerToInvite} は既にチャンネルに参加しています`); - } - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f '${playerToInvite}' が見つかりませんでした`); - } - break; - } - case "join": { - const channelNameToJoin = subCommandArgs[0]; - const passwordToJoin = subCommandArgs[1]; // Optional password argument - const newChannel = switchChatChannel(player.id, channelNameToJoin, passwordToJoin); - if (newChannel === "wrong_password") { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§fパスワードが違います '${channelNameToJoin}'.`); - } - else if (newChannel === "already_in_channel") { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f すでにチャットチャンネルに入っています! 消す又は抜けてから入ってね`); - } - else if (newChannel !== false) { - const joinedPlayer = getPlayerById(player.id); - const joinedPlayerName = joinedPlayer ? joinedPlayer.name : "不明なプレイヤー"; - const joinMessage = `§f§4[§6Paradox§4]§f §6${joinedPlayerName}§fチャンネルに参加しました.`; - const channel = chatChannels[channelNameToJoin]; - channel.members.forEach((memberId) => { - const member = getPlayerById(memberId); - if (member && member !== joinedPlayer) { - sendMsgToPlayer(member, joinMessage); - } - }); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f '${channelNameToJoin}'に参加しました`); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 何かしらの原因で参加できませんでした`); - } - break; - } - case "handover": { - const channelNameToHandOver = subCommandArgs[0]; - const newOwnerName = subCommandArgs[1]; - const handOverResult = handOverChannelOwnership(channelNameToHandOver, player, newOwnerName); - if (handOverResult === "not_owner") { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f あなたはチャットチャンネルの所有者ではありません '${channelNameToHandOver}'.`); - } - else if (handOverResult === "target_not_found") { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f '${newOwnerName}' が見つかりません`); - } - else if (handOverResult) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f チャットチャンネルの所有権が '${channelNameToHandOver}'から '${newOwnerName}'に譲渡されました`); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f チャットチャネルの所有権を移行できません`); - } - break; - } - case "le": { - const channelNameToLeave = getPlayerChannel(player.id); - if (!channelNameToLeave) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f あなたはどのチャットチャンネルにもいない.`); - return; - } - const channelToLeave = chatChannels[channelNameToLeave]; - const isOwner = channelToLeave.owner === player.id; - // Remove the player from the channel - channelToLeave.members.delete(player.id); - playerChannelMap[player.id] = null; - // Inform all remaining members in the channel that the player left - const leavingPlayer = getPlayerById(player.id); - const leavingPlayerName = leavingPlayer ? leavingPlayer.name : "不明なプレイヤー"; - const leaveMessage = `§f§4[§6Paradox§4]§f §6${leavingPlayerName}§f がチャンネルから抜けた`; - channelToLeave.members.forEach((memberId) => { - const member = getPlayerById(memberId); - if (member) { - sendMsgToPlayer(member, leaveMessage); - } - }); - if (isOwner) { - // If the leaving player is the owner, transfer ownership to another member - const newOwnerId = Array.from(channelToLeave.members)[0]; // Get the first member as new owner - if (newOwnerId) { - handOverChannelOwnership(channelNameToLeave, getPlayerById(player.id), getPlayerById(newOwnerId).name); - const newOwnerObject = getPlayerById(newOwnerId); - sendMsgToPlayer(newOwnerObject, `§f§4[§6Paradox§4]§f チャットチャンネルの所有権が '${channelNameToLeave}' から '${newOwnerObject.name}'に譲渡された。`); - } - else { - // If no other members, delete the channel - deleteChatChannel(channelNameToLeave, channelToLeave.password); - } - } - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f '${channelNameToLeave}'から抜けました!`); - break; - } - default: - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 不明なチャットチャネルコマンド '${prefix}channel help' コマンドのヘルプを表示する`); - break; - } -} -// Define a callback function to handle the playerLeave event -function onPlayerLeave(event) { - const playerId = event.playerId; - const channelName = getPlayerChannel(playerId); - if (!channelName) { - return; // Player wasn't in any channel - } - const channel = chatChannels[channelName]; - if (channel.owner === playerId) { - // If the leaving player is the owner, transfer ownership to another member - const newOwnerId = Array.from(channel.members).find((memberId) => memberId !== playerId); - if (newOwnerId) { - handOverChannelOwnership(channelName, getPlayerById(playerId), newOwnerId); - const newOwnerObject = getPlayerById(newOwnerId); - sendMsgToPlayer(newOwnerObject, `§f§4[§6Paradox§4]§fチャットチャンネルの所有権が '${channelName}' から '${newOwnerObject.name}'に譲渡された`); - } - else { - // If no other members, delete the channel - deleteChatChannel(channelName, channel.password); - return; - } - } - // Remove the player from the channel - channel.members.delete(playerId); - playerChannelMap[playerId] = null; - // Inform all remaining members in the channel that the player left - const leavingPlayer = getPlayerById(playerId); - const leavingPlayerName = leavingPlayer ? leavingPlayer.name : "Unknown Player"; - const leaveMessage = `§f§4[§6Paradox§4]§f §6${leavingPlayerName}§f チャンネルから抜けた.`; - channel.members.forEach((memberId) => { - const member = getPlayerById(memberId); - if (member) { - sendMsgToPlayer(member, leaveMessage); - } - }); -} -const onChannelLeave = () => { - // Subscribe the callback function to the playerLeave event - world.afterEvents.playerLeave.subscribe(onPlayerLeave); -}; -export { onChannelLeave }; diff --git a/build/scripts/commands/utility/clearchat.js b/build/scripts/commands/utility/clearchat.js deleted file mode 100644 index c7aa349..0000000 --- a/build/scripts/commands/utility/clearchat.js +++ /dev/null @@ -1,52 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function clearChatHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.clearchat) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: clearchat`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: clearchat [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Will clear the chat.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}clearchat`, - ` §4- §6Clear the chat§f`, - ` ${prefix}clearchat help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name clearchat - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function clearchat(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./utility/notify.js:26)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.clearchat) { - return clearChatHelp(player, prefix); - } - for (let clear = 0; clear < 10; clear++) - sendMsg("@a", "\n".repeat(60)); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}がチャット欄をクリアしました`); -} diff --git a/build/scripts/commands/utility/delhome.js b/build/scripts/commands/utility/delhome.js deleted file mode 100644 index 488783a..0000000 --- a/build/scripts/commands/utility/delhome.js +++ /dev/null @@ -1,79 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { decryptString, getPrefix, sendMsgToPlayer } from "../../util.js"; -function delhomeHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.delhome) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: delhome`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: delhome [optional]`, - `§4[§6Optional§4]§f: name, help`, - `§4[§6Description§4]§f: Will delete specified saved home location.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}delhome cave`, - ` §4- §6Delete the saved home location named "cave"§f`, - ` ${prefix}delhome help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name delhome - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function delhome(message, args) { - // Validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/utility/delhome.js:26)"); - } - const player = message.sender; - // Check for custom prefix - const prefix = getPrefix(player); - // Cache - const length = args.length; - // Are there arguements - if (!length) { - return delhomeHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.delhome) { - return delhomeHelp(player, prefix); - } - // Don't allow spaces - if (length > 1) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 空白を入れないでね`); - } - // Hash the coordinates for security - const salt = world.getDynamicProperty("crypt"); - // Find and delete this saved home location - let verify = false; - let encryptedString = ""; - const tags = player.getTags(); - const tagsLength = tags.length; - for (let i = 0; i < tagsLength; i++) { - if (tags[i].startsWith("1337")) { - encryptedString = tags[i]; - // Decode it so we can verify it - tags[i] = decryptString(tags[i], salt); - } - if (tags[i].startsWith(args[0].toString() + " X", 13)) { - verify = true; - player.removeTag(encryptedString); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 消去しました '${args[0]}'!`); - break; - } - } - if (verify === true) { - return; - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f '${args[0]}' は存在しません`); - } -} diff --git a/build/scripts/commands/utility/ecwipe.js b/build/scripts/commands/utility/ecwipe.js deleted file mode 100644 index 8b0bec1..0000000 --- a/build/scripts/commands/utility/ecwipe.js +++ /dev/null @@ -1,84 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer } from "../../util.js"; -function ecWipeHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.ecwipe) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: ecwipe`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: ecwipe [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Will wipe out player's entire ender chest.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}ecwipe ${player.name}`, - ` §4- §6Wipe out the entire ender chest of ${player.name}§f`, - ` ${prefix}ecwipe help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name ecwipe - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided. - */ -export function ecwipe(message, args) { - handleECWipe(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleECWipe(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/utility/ecwipe.js:29)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return ecWipeHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.ecwipe) { - return ecWipeHelp(player, prefix); - } - // try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(args[0].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // There are 30 slots ranging from 0 to 29 - for (let slot = 0; slot < 30; slot++) { - member.runCommand(`replaceitem entity @s slot.enderchest ${slot} air`); - } - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${member.name}'のエンダーチェストが消去された`); -} diff --git a/build/scripts/commands/utility/fly.js b/build/scripts/commands/utility/fly.js deleted file mode 100644 index f4bfc3b..0000000 --- a/build/scripts/commands/utility/fly.js +++ /dev/null @@ -1,116 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function flyHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.fly) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: fly`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: fly [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Will grant player the ability to fly.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}fly ${player.name}`, - ` §4- §6Grant the ability to fly to ${player.name}§f`, - ` ${prefix}fly help`, - ` §4- §6Show command help§f`, - ]); -} -function mayflydisable(player, member) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> 飛行モード => ${player === member ? "themselves" : member.name}.`); -} -function mayflyenable(player, member) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> 飛行モード=> ${player === member ? "themselves" : member.name}.`); -} -/** - * @name fly - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - (Optional) Additional arguments provided (optional). - */ -export function fly(message, args) { - handleFly(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleFly(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/utility/fly.js:38)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return flyHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.fly) { - return flyHelp(player, prefix); - } - // try to find the player requested - let member; - if (args.length) { - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(args[0].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - const membertag = member.getTags(); - if (!membertag.includes("noflying") && !membertag.includes("flying")) { - member - .runCommandAsync(`ability @s mayfly true`) - .then(() => { - member.addTag("flying"); - mayflyenable(player, member); - }) - .catch(() => { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f§4[Fly]§f Education Editionが無効です.`); - }); - return; - } - if (membertag.includes("flying")) { - member.addTag("noflying"); - } - if (member.hasTag("noflying")) { - member - .runCommandAsync(`ability @s mayfly false`) - .then(() => { - member.removeTag("flying"); - mayflydisable(player, member); - member.removeTag("noflying"); - }) - .catch(() => { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f§4[Fly]§f Education Editionが無効です.`); - }); - return; - } -} diff --git a/build/scripts/commands/utility/freeze.js b/build/scripts/commands/utility/freeze.js deleted file mode 100644 index 08b44fe..0000000 --- a/build/scripts/commands/utility/freeze.js +++ /dev/null @@ -1,108 +0,0 @@ -import { world } from "@minecraft/server"; -import { MinecraftEffectTypes } from "../../node_modules/@minecraft/vanilla-data/lib/index"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function freezeHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.freeze) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: freeze`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: freeze [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Will freeze or unfreeze the specified player.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}freeze ${player.name}`, - ` §4- §6Freeze or unfreeze ${player.name}§f`, - ` ${prefix}freeze help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name freeze - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function freeze(message, args) { - handleFreeze(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleFreeze(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/utility/freeze.js:30)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return freezeHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.freeze) { - return freezeHelp(player, prefix); - } - // try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(args[0].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // Get unique ID - const uniqueId2 = dynamicPropertyRegistry.get(member?.id); - // Make sure the user has permissions to run the command - if (uniqueId2 === member.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者には実行できません.`); - } - const boolean = member.hasTag("paradoxFreeze"); - if (boolean) { - member.removeTag("paradoxFreeze"); - member.runCommand(`effect @s clear`); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f フリーズが解除されました`); - sendMsg(`@a[tag=paradoxOpped]`, `${member.name}§f のフリーズが解除されました.`); - return; - } - if (!boolean) { - // Blindness - member.addEffect(MinecraftEffectTypes.Blindness, 1000000, { amplifier: 255, showParticles: true }); - // Mining Fatigue - member.addEffect(MinecraftEffectTypes.MiningFatigue, 1000000, { amplifier: 255, showParticles: true }); - // Weakness - member.addEffect(MinecraftEffectTypes.Weakness, 1000000, { amplifier: 255, showParticles: true }); - // Slowness - member.addEffect(MinecraftEffectTypes.Slowness, 1000000, { amplifier: 255, showParticles: true }); - member.addTag("paradoxFreeze"); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f フリーズ状態になりました.`); - sendMsg(`@a[tag=paradoxOpped]`, `${member.name}§fがフリーズしました`); - return; - } -} diff --git a/build/scripts/commands/utility/fullreport.js b/build/scripts/commands/utility/fullreport.js deleted file mode 100644 index 0f172c1..0000000 --- a/build/scripts/commands/utility/fullreport.js +++ /dev/null @@ -1,154 +0,0 @@ -import { ItemStack, world } from "@minecraft/server"; -import { MinecraftEnchantmentTypes } from "../../node_modules/@minecraft/vanilla-data/lib/index"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { allscores, getGamemode, getPrefix, getScore, sendMsgToPlayer } from "../../util.js"; -function fullReportHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.fullreport) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: fullreport`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: fullreport [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: View logs from all player's currently online.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}fullreport`, - ` §4- §6View logs from all currently online players§f`, - ` ${prefix}fullreport help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name fullreport - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function fullreport(message, args) { - handleFullReport(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleFullReport(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/utility/fullreport.js:28)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.fullreport) { - return fullReportHelp(player, prefix); - } - if (!player.hasTag("notify")) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f チートログを有効にしてね!.`); - } - const players = world.getPlayers(); - for (const member of players) { - const reportBody = [ - `\n§r§4[§6Paradox§4]§r 現在オンラインのプレイヤーログを収集しました §6${member.name}§r`, - `§r§4[§6Paradox§4]§r §6${member.name}§rのゲームモードは ${getGamemode(member)}です`, - `§r§4[§6Paradox§4]§r §6${member.name}§rのプレイヤーIDは【 ${member.id} 】です`, - `§f§4[§6Paradox§4]§f §6${member.name}§f is currently at X= ${member.location.x.toFixed(0)} Y= ${member.location.y.toFixed(0)} Z= ${member.location.z.toFixed(0)}`, - ]; - switch (true) { - case member.hasTag("paradoxFreeze"): - reportBody.push(`§f§4[§6Paradox§4]§f §6${member.name}§f 行動が制限されています検知内容=> ${member.hasTag("freezeAura") ? "AntiKillAura" : member.hasTag("freezeNukerA") ? "AntiNukerA" : member.hasTag("freezeScaffoldA") ? "AntiScaffoldA" : "Staff"}`); - break; - case member.hasTag("flying"): - reportBody.push(`§f§4[§6Paradox§4]§f §6${member.name}§f飛べます`); - break; - case member.hasTag("vanish"): - reportBody.push(`§f§4[§6Paradox§4]§f §6${member.name}§f透明化が有効です`); - break; - } - let violationsFound = 0; - let vlCount = 0; - let divider = false; - allscores.forEach((objective) => { - vlCount++; - const score = getScore(objective, member); - if (score > 0) { - violationsFound++; - if (violationsFound === 1) { - divider = true; - reportBody.push(`§f§4[§6Paradox§4]§4 ----------------------------------§f`); - } - reportBody.push(`§f§4[§6Paradox§4]§f §f§4[§6${objective.replace("vl", "").toUpperCase()}§4]§f: ${score}回検知されています`); - } - if (vlCount === allscores.length && divider === true) { - reportBody.push(`§f§4[§6Paradox§4]§4 ----------------------------------§f`); - } - }); - const equipment = member.getComponent("equipment_inventory"); - const helmet = equipment.getEquipment("head"); - const chest = equipment.getEquipment("chest"); - const legs = equipment.getEquipment("legs"); - const feet = equipment.getEquipment("feet"); - const mainhand = equipment.getEquipment("mainhand"); - const offhand = equipment.getEquipment("offhand"); - const materialColors = { - golden: "§6", - iron: "§7", - diamond: "§b", - leather: "§e", - chainmail: "§8", - turtle: "§a", - netherite: "§4", - elytra: "§5", - none: "§f", // white - }; - for (const [verification, armorType] of [ - [helmet, "帽子"], - [chest, "服"], - [legs, "ズボン"], - [feet, "靴"], - [mainhand, "メインハンド"], - [offhand, "オフハンド"], - ]) { - if (!(verification instanceof ItemStack)) { - continue; - } - const enchantedEquipment = verification.getComponent("enchantments"); - const enchantList = enchantedEquipment.enchantments; - if (!enchantList) { - continue; - } - let isEnchanted = false; - for (const enchant in MinecraftEnchantmentTypes) { - const enchantNumber = enchantList.hasEnchantment(MinecraftEnchantmentTypes[enchant]); - if (enchantNumber > 0) { - isEnchanted = true; - } - } - let materialType = verification.typeId.split(":")[1].replace(/_\w+/, ""); - if (armorType === "Mainhand" || armorType === "Offhand") { - materialType = verification.typeId.split(":")[1]; - } - const materialColor = materialColors[materialType] || materialColors["none"]; - reportBody.push(`§f§4[§6Paradox§4]§f ${armorType}: ${isEnchanted ? "§aエンチャ有§f" : "§4エンチャ無§f"} || ${materialColor}${materialType}`); - } - sendMsgToPlayer(player, reportBody); - } -} diff --git a/build/scripts/commands/utility/give.js b/build/scripts/commands/utility/give.js deleted file mode 100644 index 4502706..0000000 --- a/build/scripts/commands/utility/give.js +++ /dev/null @@ -1,125 +0,0 @@ -import { world, ItemStack } from "@minecraft/server"; -import { MinecraftItemTypes } from "../../node_modules/@minecraft/vanilla-data/lib/index"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer, toPascalCase } from "../../util.js"; -function giveHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.fullreport) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: give`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: give [optional]`, - `§4[§6Optional§4]§f: username item amount data, help`, - `§4[§6Description§4]§f: Gives player items.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}give ${player.name} diamond 64`, - ` §4- §6Give ${player.name} 64 diamonds§f`, - ` ${prefix}give ${player.name} iron_ore 64`, - ` §4- §6Give ${player.name} 64 iron ore§f`, - ` ${prefix}give ${player.name} tropical_fish 64`, - ` §4- §6Give ${player.name} 64 tropical fish§f`, - ` ${prefix}give ${player.name} log2 64 1`, - ` §4- §6Give ${player.name} 64 spruce logs§f`, - ` ${prefix}give help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name give - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function give(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/utility/give.js:36)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.give) { - return giveHelp(player, prefix); - } - // Are there arguements - if (!args.length) { - return giveHelp(player, prefix); - } - // Try to find the player requested - let member; - if (args.length) { - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(args[0].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - /** - * Verify if the parameters are valid to prevent errors - * args[0] = username - * args[1] = item - * args[2] = amount - * args[3] = data (optional) - */ - let confirmItem = false; - const itemStringConvert = toPascalCase(args[1]); - for (const itemValidate in MinecraftItemTypes) { - if (itemStringConvert === itemValidate) { - confirmItem = true; - break; - } - } - if (confirmItem) { - if (isNaN(Number(args[2]))) { - /** - * This parameter is invalid so we will remove it and add a default value of 1. - */ - args.splice(2, 1, "1"); - } - if (isNaN(Number(args[3]))) { - /** - * This parameter is invalid - */ - args.splice(3, 1, "0"); - } - // Make a new ItemStack so we can validate the max allowed amount for that item - const newItemStack = new ItemStack(args[1]); - const maxStack = newItemStack.maxAmount; - if (maxStack >= Number(args[2])) { - player.runCommandAsync(`give ${member.name} ${args[1]} ${Number(args[2])} ${Number(args[3])}`); - /* This is commented out because in 1.19.70 they removed the data parameter from ItemStack - const invContainer = member.getComponent("inventory") as EntityInventoryComponent; - - const inv = invContainer.container; - const item = new ItemStack(MinecraftItemTypes[itemStringConvert], Number(args[2]), Number(args[3])); - inv.addItem(item); - */ - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${member.name} に ${args[1]} x${args[2]}を与えました`); - } - else { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f スタック数が上限を超えています! ${maxStack} が最大です.`); - } - } - else { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f このアイテムは見つかりませんでした!もう一度お試しください`); - } -} diff --git a/build/scripts/commands/utility/gohome.js b/build/scripts/commands/utility/gohome.js deleted file mode 100644 index bb63b35..0000000 --- a/build/scripts/commands/utility/gohome.js +++ /dev/null @@ -1,166 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { decryptString, getPrefix, sendMsgToPlayer, setTimer } from "../../util.js"; -const cooldownTimer = new WeakMap(); -function dhms(ms) { - const days = Math.floor(ms / (24 * 60 * 60 * 1000)); - const daysms = ms % (24 * 60 * 60 * 1000); - const hours = Math.floor(daysms / (60 * 60 * 1000)); - const hoursms = ms % (60 * 60 * 1000); - const minutes = Math.floor(hoursms / (60 * 1000)); - const minutesms = ms % (60 * 1000); - const sec = Math.floor(minutesms / 1000); - if (days !== 0) { - return days + " 一日 : " + hours + " 時間 : " + minutes + " 分 : " + sec + " 秒"; - } - if (hours !== 0) { - return hours + " 時間 : " + minutes + " 分 : " + sec + " 秒"; - } - if (minutes !== 0) { - return minutes + " 分 : " + sec + " 秒"; - } - return sec + " 秒"; -} -function goHomeHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.gohome) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: gohome`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: gohome [optional]`, - `§4[§6Optional§4]§f: name, help`, - `§4[§6Description§4]§f: Return home to a specified saved location.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}gohome barn`, - ` §4- §6Return to the "barn" home§f`, - ` ${prefix}gohome help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name gohome - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function gohome(message, args) { - handleGoHome(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleGoHome(message, args) { - // Validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/utility/gohome.js:52)"); - } - const player = message.sender; - // Check for custom prefix - const prefix = getPrefix(player); - // Cache - const length = args.length; - // Are there arguements - if (!length) { - return goHomeHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.gohome) { - return goHomeHelp(player, prefix); - } - // Don't allow spaces - if (length > 1) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 空白を入れないでね`); - } - // Hash the coordinates for security - const salt = world.getDynamicProperty("crypt"); - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - let homex; - let homey; - let homez; - let dimension; - let coordinatesArray; - const tags = player.getTags(); - const tagsLength = tags.length; - for (let i = 0; i < tagsLength; i++) { - if (tags[i].startsWith("1337")) { - // Decode it so we can verify it - tags[i] = decryptString(tags[i], salt); - } - if (tags[i].startsWith(args[0].toString() + " X", 13)) { - // Split string into array - coordinatesArray = tags[i].split(" "); - break; - } - } - if (!coordinatesArray) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f '${args[0]}' 存在しません`); - } - const coordArrayLength = coordinatesArray.length; - for (let i = 0; i < coordArrayLength; i++) { - // Get their location from the array - if (coordinatesArray[i].includes("X:")) { - homex = parseInt(coordinatesArray[i].replace("X:", "")); - } - if (coordinatesArray[i].includes("Y:")) { - homey = parseInt(coordinatesArray[i].replace("Y:", "")); - } - if (coordinatesArray[i].includes("Z:")) { - homez = parseInt(coordinatesArray[i].replace("Z:", "")); - } - if (coordinatesArray[i].includes("Dimension:")) { - dimension = coordinatesArray[i].replace("Dimension:", ""); - } - } - if (!homex || !homey || !homez || !dimension) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f '${args[0]}' 存在しません!`); - } - else { - let cooldownCalc; - let activeTimer; - // Get original time in milliseconds - const cooldownVerify = cooldownTimer.get(player); - // Convert config settings to milliseconds so we can be sure the countdown is accurate - const msSettings = config.modules.goHome.days * 24 * 60 * 60 * 1000 + config.modules.goHome.hours * 60 * 60 * 1000 + config.modules.goHome.minutes * 60 * 1000 + config.modules.goHome.seconds * 1000; - if (cooldownVerify !== undefined) { - // Determine difference between new and original times in milliseconds - const bigBrain = new Date().getTime() - cooldownVerify; - // Subtract realtime clock from countdown in configuration to get difference - cooldownCalc = msSettings - bigBrain; - // Convert difference to clock format D : H : M : S - activeTimer = dhms(cooldownCalc); - } - else { - // First time executed so we default to configuration in milliseconds - cooldownCalc = msSettings; - } - // If timer doesn't exist or has expired then grant permission to teleport and set the countdown - if (cooldownCalc === msSettings || cooldownCalc <= 0 || uniqueId === player.name) { - // This timer is a grace period - setTimer(player.id); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f TPしました!`); - player.teleport({ x: homex, y: homey, z: homez }, { dimension: world.getDimension(dimension), rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - // Delete old key and value - cooldownTimer.delete(player); - // Create new key and value with current time in milliseconds - cooldownTimer.set(player, new Date().getTime()); - } - else { - // Teleporting to fast - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f テレポート間隔がはやすぎます${activeTimer} 待ってください`); - } - } -} diff --git a/build/scripts/commands/utility/hotbar.js b/build/scripts/commands/utility/hotbar.js deleted file mode 100644 index 90d7c62..0000000 --- a/build/scripts/commands/utility/hotbar.js +++ /dev/null @@ -1,107 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { Hotbar } from "../../penrose/TickEvent/hotbar/hotbar.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -const configMessageBackup = new WeakMap(); -// Dummy object -const dummy = []; -function hotbarHelp(player, prefix, hotbarBoolean) { - let commandStatus; - if (!config.customcommands.hotbar) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (hotbarBoolean === false) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: hotbar`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: hotbar [optional]`, - `§4[§6Optional§4]§f: message, disable, help`, - `§4[§6Description§4]§f: Displays a hotbar message for all player's currently online.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}hotbar`, - ` §4- §6Display the current hotbar message§f`, - ` ${prefix}hotbar disable`, - ` §4- §6Disable the hotbar message§f`, - ` ${prefix}hotbar Anarchy Server | Realm Code: 34fhf843`, - ` §4- §6Set the hotbar message to "Anarchy Server | Realm Code: 34fhf843"§f`, - ` ${prefix}hotbar help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name hotbar - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function hotbar(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/utility/hotbar.js:37)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const hotbarBoolean = dynamicPropertyRegistry.get("hotbar_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.hotbar) { - return hotbarHelp(player, prefix, hotbarBoolean); - } - /** - * Backup original message from config (initial usage only) - * - * Reload server to reset this in memory - */ - if (configMessageBackup.has(dummy) === false) { - configMessageBackup.set(dummy, config.modules.hotbar.message); - } - if ((hotbarBoolean === false && !args.length) || (hotbarBoolean === false && args[0].toLowerCase() !== "disable")) { - // Allow - dynamicPropertyRegistry.set("hotbar_b", true); - world.setDynamicProperty("hotbar_b", true); - if (args.length >= 1) { - config.modules.hotbar.message = args.join(" "); - } - else { - config.modules.hotbar.message = configMessageBackup.get(dummy); - } - sendMsg("@a[tag=paradoxOpped]", `${player.name} 以下の機能が有効です!=> §6Hotbar`); - Hotbar(); - } - else if (hotbarBoolean === true && args.length === 1 && args[0].toLowerCase() === "disable") { - // Deny - dynamicPropertyRegistry.set("hotbar_b", false); - world.setDynamicProperty("hotbar_b", false); - sendMsg("@a[tag=paradoxOpped]", `${player.name} 以下の機能が無効です!=> §6Hotbar`); - } - else if ((hotbarBoolean === true && args.length >= 1) || (hotbarBoolean === true && !args.length)) { - if (args.length >= 1) { - config.modules.hotbar.message = args.join(" "); - } - else { - config.modules.hotbar.message = configMessageBackup.get(dummy); - } - sendMsg("@a[tag=paradoxOpped]", `${player.name} §6Hotbar§rを更新しました`); - } - else { - return hotbarHelp(player, prefix, hotbarBoolean); - } -} diff --git a/build/scripts/commands/utility/invsee.js b/build/scripts/commands/utility/invsee.js deleted file mode 100644 index 6bef708..0000000 --- a/build/scripts/commands/utility/invsee.js +++ /dev/null @@ -1,78 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer } from "../../util.js"; -function invseeHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.invsee) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: invsee`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: invsee [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Shows the entire inventory of the specified player.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}invsee ${player.name}`, - ` §4- §6Show the inventory of ${player.name}§f`, - ` ${prefix}invsee help`, - ` §4- §6Show command help§f`, - ]); -} -// found the inventory viewing scipt in the bedrock addons discord, unsure of the original owner (not my code) -/** - * @name invsee - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function invsee(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/utility/invsee.js:30)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return invseeHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.invsee) { - return invseeHelp(player, prefix); - } - // try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(args[0].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - const inv = member.getComponent("inventory"); - const container = inv.container; - sendMsgToPlayer(player, [ - ` `, - `§f§4[§6Paradox§4]§f ${member.name}'のアイテム欄:`, - ...Array.from(Array(container.size), (_a, i) => { - const item = container.getItem(i); - return ` §6|§r §fアイテム欄 ${i}§r §6=>§r ${item ? `§4[§f${item.typeId.replace("minecraft:", "")}§4]§r §4x${item.amount}§6個持ってます!§r` : "§7(無し)"}`; - }), - ` `, - ]); -} diff --git a/build/scripts/commands/utility/listhome.js b/build/scripts/commands/utility/listhome.js deleted file mode 100644 index 9c74842..0000000 --- a/build/scripts/commands/utility/listhome.js +++ /dev/null @@ -1,106 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { decryptString, getPrefix, sendMsgToPlayer } from "../../util.js"; -function listHomeHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.listhome) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: listhome`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: listhome [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Shows a list of saved home locations.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}listhome`, - ` §4- §6Show a list of saved home locations§f`, - ` ${prefix}listhome help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name listhome - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function listhome(message, args) { - // Validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/utility/listhome.js:26)"); - } - const player = message.sender; - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.listhome) { - return listHomeHelp(player, prefix); - } - // Hash the coordinates for security - const salt = world.getDynamicProperty("crypt"); - // Create an array to store the home location messages - const homeMessages = []; - const tags = player.getTags(); - const tagsLength = tags.length; - let counter = 0; - for (let i = 0; i < tagsLength; i++) { - if (tags[i].startsWith("1337")) { - // Decode it so we can verify it - tags[i] = decryptString(tags[i], salt); - // If invalid then skip it - if (tags[i].startsWith("LocationHome:") === false) { - continue; - } - // Split string into array - const coordinatesArray = tags[i].split(" "); - const coordArrayLength = coordinatesArray.length; - let home; - let homex; - let homey; - let homez; - let dimension; - counter = ++counter; - for (let j = 0; j < coordArrayLength; j++) { - // Get their location from the array - if (coordinatesArray[j].includes("LocationHome:")) { - home = coordinatesArray[j].replace("LocationHome:", ""); - } - if (coordinatesArray[j].includes("X:")) { - homex = parseInt(coordinatesArray[j].replace("X:", "")); - } - if (coordinatesArray[j].includes("Y:")) { - homey = parseInt(coordinatesArray[j].replace("Y:", "")); - } - if (coordinatesArray[j].includes("Z:")) { - homez = parseInt(coordinatesArray[j].replace("Z:", "")); - } - if (coordinatesArray[j].includes("Dimension:")) { - dimension = coordinatesArray[j].replace("Dimension:", ""); - } - // Inside the loop where you are processing each home location - if (!homex || !homey || !homez || !dimension) { - continue; - } - else { - if (counter === 1) { - homeMessages.push(`§f§4[§6Paradox§4]§f 保存されている座標:`); - } - homeMessages.push(` §o§6|§f §4[§f${home}§4]§f §6=>§f ${homex} ${homey} ${homez} §6<=§f §4[§f${dimension}§4]§f`); - } - } - } - continue; - } - if (homeMessages.length > 0) { - // Send all the home location messages at once using sendMsgToPlayer - sendMsgToPlayer(player, homeMessages); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 現在保存されている座標はありません`); - } - return; -} diff --git a/build/scripts/commands/utility/paradoxVersion.js b/build/scripts/commands/utility/paradoxVersion.js deleted file mode 100644 index 6937213..0000000 --- a/build/scripts/commands/utility/paradoxVersion.js +++ /dev/null @@ -1,42 +0,0 @@ -import versionFile from "../../version.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function versionHelp(player, prefix) { - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: version`, - `§4[§6Usage§4]§f: version [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Will print out the installed version of paradox`, - `§4[§6Examples§4]§f:`, - ` ${prefix}version`, - ` §4- §6Print out the installed version of paradox§f`, - ` ${prefix}version help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name paradoxVersion - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function paradoxVersion(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./utility/paradoxVersion.js:26)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if (argCheck && args[0].toLowerCase() === "help") { - return versionHelp(player, prefix); - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f Version §2${versionFile.version}`); -} diff --git a/build/scripts/commands/utility/rank.js b/build/scripts/commands/utility/rank.js deleted file mode 100644 index 2a150ac..0000000 --- a/build/scripts/commands/utility/rank.js +++ /dev/null @@ -1,106 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { resetTag, getPrefix, sendMsgToPlayer, sendMsg } from "../../util.js"; -function rankHelp(player, prefix, chatRanksBoolean) { - let commandStatus; - if (!config.customcommands.rank || !config.customcommands.chatranks) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - let moduleStatus; - if (chatRanksBoolean === false || !config.customcommands.chatranks) { - moduleStatus = "§6[§4DISABLED§6]§f"; - } - else { - moduleStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: rank`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Module§4]§f: ${moduleStatus}`, - `§4[§6Usage§4]§f: rank [optional]`, - `§4[§6Optional§4]§f: tag, tag--tag, reset, help`, - `§4[§6Description§4]§f: Gives one or more ranks to a specified player or resets it.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}rank ${player.name} Admin`, - ` §4- §6Give the "Admin" rank to the specified player§f`, - ` ${prefix}rank ${player.name} Contributor--Mod`, - ` §4- §6Give the "Contributor" and "Mod" ranks to the specified player§f`, - ` ${prefix}rank ${player.name} Staff--Mod--Helper`, - ` §4- §6Give the "Staff", "Mod", and "Helper" rank to the specified player§f`, - ` ${prefix}rank reset ${player.name}`, - ` §4- §6Reset all ranks of the specified player§f`, - ` ${prefix}rank help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name rank - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function rank(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./utility/rank.js:37)"); - } - const player = message.sender; - // fixes a bug that kills !tag when using custom names - player.nameTag = player.name; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Get Dynamic Property Boolean - const chatRanksBoolean = dynamicPropertyRegistry.get("chatranks_b"); - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return rankHelp(player, prefix, chatRanksBoolean); - } - // Was help requested - const argCheck = args[0].toLowerCase(); - if (argCheck === "help" || !config.customcommands.rank || !chatRanksBoolean || !config.customcommands.chatranks) { - return rankHelp(player, prefix, chatRanksBoolean); - } - const playerName = args.slice(0, -1).join(" "); // Combine all arguments except the last one as the player name - const rank = args[args.length - 1]; // Last argument is the rank - // try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(playerName.toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // check if array contains the string 'reset' - const argcheck = args[1]?.toLowerCase() || undefined; - // reset rank - if (argcheck === "reset") { - resetTag(member); - return; - } - // Add new rank if command is utilize correctly - if (args.length >= 2) { - const newRank = "Rank:" + rank; - resetTag(member); - member.addTag(newRank); - } - else { - return rankHelp(player, prefix, chatRanksBoolean); - } - if (player === member) { - return sendMsg("@a[tag=paradoxOpped]", `${player.name} ランクを変えました`); - } - sendMsg("@a[tag=paradoxOpped]", `${player.name}が ${member.name}'のランクを変更しました`); -} diff --git a/build/scripts/commands/utility/report.js b/build/scripts/commands/utility/report.js deleted file mode 100644 index 54dc27f..0000000 --- a/build/scripts/commands/utility/report.js +++ /dev/null @@ -1,69 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function reportHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.report) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: report`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: report [optional]`, - `§4[§6Optional§4]§f: username, reason, help`, - `§4[§6Description§4]§f: Reports player's to online Staff for malicious activities.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}report ${player.name}`, - ` §4- §6Report ${player.name} to online Staff§f`, - ` ${prefix}report ${player.name} Caught hacking!`, - ` §4- §6Report ${player.name} for hacking with a reason§f`, - ` ${prefix}report help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name report - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function report(message, args) { - // Validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/moderation/ban.js:29)"); - } - const player = message.sender; - const reason = args.slice(1).join(" ") || "理由なし"; - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return reportHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.report) { - return reportHelp(player, prefix); - } - // Try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(args[0].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f !report §f`); - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // Make sure they dont report themselves - if (member === player) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f自分自身には実行できません.`); - } - sendMsgToPlayer(player, `§r§4[§6Paradox§4]§r ${member.name}§r が報告を受けましたしました=>内容: ${reason}`); - sendMsg("@a[tag=notify]", `§r§4[§6Paradox§4]§r ${player.name}§rが ${member.name}§rに報告を送信しました内=>内容: ${reason}`); -} diff --git a/build/scripts/commands/utility/sethome.js b/build/scripts/commands/utility/sethome.js deleted file mode 100644 index 6c0020b..0000000 --- a/build/scripts/commands/utility/sethome.js +++ /dev/null @@ -1,102 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { decryptString, getPrefix, encryptString, sendMsgToPlayer } from "../../util.js"; -function setHomeHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.sethome) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: sethome`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: sethome [optional]`, - `§4[§6Optional§4]§f: name, help`, - `§4[§6Description§4]§f: Saves home location based on current coordinates. Up to ${config.modules.setHome.max} total.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}sethome barn`, - ` §4- §6Save a home location with the name "barn"§f`, - ` ${prefix}sethome help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name sethome - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function sethome(message, args) { - // Validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/utility/sethome.js:26)"); - } - const player = message.sender; - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return setHomeHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.sethome) { - return setHomeHelp(player, prefix); - } - // Get current location - const { x, y, z } = player.location; - const homex = x.toFixed(0); - const homey = y.toFixed(0); - const homez = z.toFixed(0); - let currentDimension; - // Don't allow spaces - if (args.length > 1 || args[0].trim().length === 0) { - setHomeHelp(player, prefix); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 空白を入れないでね`); - } - // Hash the coordinates for security - const salt = world.getDynamicProperty("crypt"); - // Make sure this name doesn't exist already and it doesn't exceed limitations - let verify = false; - let counter = 0; - const tags = player.getTags(); - const tagsLength = tags.length; - for (let i = 0; i < tagsLength; i++) { - if (tags[i].startsWith("1337")) { - // Decode it so we can verify if it already exists - tags[i] = decryptString(tags[i], String(salt)); - } - if (tags[i].startsWith(args[0].toString() + " X", 13)) { - verify = true; - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f【'${args[0]}'】同じ名前の座標があります`); - break; - } - if (tags[i].startsWith("LocationHome:")) { - counter = ++counter; - } - if (counter >= config.modules.setHome.max && config.modules.setHome.enabled) { - verify = true; - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${config.modules.setHome.max} 保存数が上限に達しました`); - break; - } - } - if (verify === true) { - return; - } - // Save which dimension they were in - if (player.dimension.id === "minecraft:overworld") { - currentDimension = "overworld"; - } - if (player.dimension.id === "minecraft:nether") { - currentDimension = "nether"; - } - if (player.dimension.id === "minecraft:the_end") { - currentDimension = "the_end"; - } - const decryptedLocationString = `LocationHome:${args[0]} X:${homex} Y:${homey} Z:${homez} Dimension:${currentDimension}`; - const security = encryptString(decryptedLocationString, String(salt)); - // Store their new home coordinates - player.addTag(security); - sendMsgToPlayer(player, `§r§4[§6Paradox§4]§r'${args[0]}'を座標§2X=${homex} §4Y=${homey} §eZ=${homez}§rに設定しました`); -} diff --git a/build/scripts/commands/utility/stats.js b/build/scripts/commands/utility/stats.js deleted file mode 100644 index 6e66ed8..0000000 --- a/build/scripts/commands/utility/stats.js +++ /dev/null @@ -1,166 +0,0 @@ -import { ItemStack, world } from "@minecraft/server"; -import { MinecraftEnchantmentTypes } from "../../node_modules/@minecraft/vanilla-data/lib/index"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsgToPlayer, getGamemode, allscores, getScore } from "../../util.js"; -function statsHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.stats) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: stats`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: stats [optional]`, - `§4[§6Optional§4]§f: username, help`, - `§4[§6Description§4]§f: Shows logs from the specified user.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}stats ${player.name}`, - ` §4- §6Show logs for the specified user§f`, - ` ${prefix}stats help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name stats - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function stats(message, args) { - handleStats(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleStats(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./commands/utility/stats.js:29)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return statsHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.stats) { - return statsHelp(player, prefix); - } - if (!player.hasTag("notify")) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f チートログを有効にしてね!.`); - } - // try to find the player requested - let member; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(args[0].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - const reportBody = [ - `\n§r§4[§6Paradox§4]§r §6${member.name}のユーザーログを取得しました§r`, - `§r§4[§6Paradox§4]§r §6${member.name}§rは${getGamemode(member)}です`, - `§r§4[§6Paradox§4]§r §6${member.name}§rは現在 X= ${member.location.x.toFixed(0)} Y= ${member.location.y.toFixed(0)} Z= ${member.location.z.toFixed(0)}にいます`, - ]; - switch (true) { - case member.hasTag("paradoxFreeze"): - reportBody.push(`§f§4[§6Paradox§4]§f §6${member.name}§f 行動が制限されています ${member.hasTag("freezeAura") ? "AntiKillAura" : member.hasTag("freezeNukerA") ? "AntiNukerA" : member.hasTag("freezeScaffoldA") ? "AntiScaffoldA" : "Staff"}`); - break; - case member.hasTag("flying"): - reportBody.push(`§r§4[§6Paradox§4]§r §6${member.name}§r飛行モードが有効です`); - break; - case member.hasTag("vanish"): - reportBody.push(`§r§4[§6Paradox§4]§r §6${member.name}§r透明化が有効です`); - break; - } - let violationsFound = 0; - let vlCount = 0; - let divider = false; - allscores.forEach((objective) => { - vlCount++; - const score = getScore(objective, member); - if (score > 0) { - violationsFound++; - if (violationsFound === 1) { - divider = true; - reportBody.push(`§f§4[§6Paradox§4]§4 ----------------------------------§f`); - } - reportBody.push(`§r§4[§6Paradox§4]§r §r§4[§6${objective.replace("vl", "").toUpperCase()}§4]§r ${score}回検知されています`); - } - if (vlCount === allscores.length && divider === true) { - reportBody.push(`§f§4[§6Paradox§4]§4 ----------------------------------§f`); - } - }); - const equipment = member.getComponent("equipment_inventory"); - const helmet = equipment.getEquipment("head"); - const chest = equipment.getEquipment("chest"); - const legs = equipment.getEquipment("legs"); - const feet = equipment.getEquipment("feet"); - const mainhand = equipment.getEquipment("mainhand"); - const offhand = equipment.getEquipment("offhand"); - const materialColors = { - golden: "§6", - iron: "§7", - diamond: "§b", - leather: "§e", - chainmail: "§8", - turtle: "§a", - netherite: "§4", - elytra: "§5", - none: "§f", // white - }; - for (const [verification, armorType] of [ - [helmet, "帽子"], - [chest, "服"], - [legs, "ズボン"], - [feet, "靴"], - [mainhand, "メインハンド"], - [offhand, "オフハンド"], - ]) { - if (!(verification instanceof ItemStack)) { - continue; - } - const enchantedEquipment = verification.getComponent("enchantments"); - const enchantList = enchantedEquipment.enchantments; - if (!enchantList) { - continue; - } - let isEnchanted = false; - for (const enchant in MinecraftEnchantmentTypes) { - const enchantNumber = enchantList.hasEnchantment(MinecraftEnchantmentTypes[enchant]); - if (enchantNumber > 0) { - isEnchanted = true; - } - } - let materialType = verification.typeId.split(":")[1].replace(/_\w+/, ""); - if (armorType === "Mainhand" || armorType === "Offhand") { - materialType = verification.typeId.split(":")[1]; - } - const materialColor = materialColors[materialType] || materialColors["none"]; - reportBody.push(`§r§4[§6Paradox§4]§r ${armorType}: ${isEnchanted ? "§aエンチャ有§r" : "§4エンチャ無§r"} || ${materialColor}${materialType}`); - } - sendMsgToPlayer(player, reportBody); -} diff --git a/build/scripts/commands/utility/tpr.js b/build/scripts/commands/utility/tpr.js deleted file mode 100644 index 4331b81..0000000 --- a/build/scripts/commands/utility/tpr.js +++ /dev/null @@ -1,158 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config"; -import { decryptString, getPrefix, sendMsgToPlayer, setTimer } from "../../util"; -const teleportRequests = []; -// This allows us to read from the teleportRequests array without -// creating a memory leak by accidentally modifying its contents. -export function getTeleportRequests() { - return teleportRequests; -} -function tprHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.tpr) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: tpr`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: tpr [optional]`, - `§4[§6Optional§4]§f: name, help`, - `§4[§6Description§4]§f: Will send requests to tp to players.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}tpr ${player.name}`, - ` §4- §6Send a teleport request to the specified player§f`, - ` ${prefix}tpr help`, - ` §4- §6Show command help§f`, - ]); -} -// This handles the submission of requests -function teleportRequestHandler({ sender, message }) { - const player = sender; - const args = message.split(" "); - if (args.length < 2) - return; - // Extract the target name from the message, including the "@" symbol - const targetName = args[1].trim(); - // Try to find the player requested, including the "@" symbol - let target; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(targetName.toLowerCase().replace(/"|\\|@/g, ""))) { - target = pl; - break; - } - } - if (!target) { - sendMsgToPlayer(player, "§f§4[§6Paradox§4]§f 指定したプレイヤーが見つかりません"); - return; - } - const requestIndex = teleportRequests.findIndex((r) => r.target === target); - if (requestIndex !== -1) { - const request = teleportRequests[requestIndex]; - if (Date.now() >= request.expiresAt) { - teleportRequests.splice(requestIndex, 1); - } - else { - sendMsgToPlayer(player, "§f§4[§6Paradox§4]§f そのプレイヤーはすでにテレポートのリクエストを保留にしています"); - return; - } - } - /** - * 1000 milliseconds per second - * 60 seconds per minute, or 60000 milliseconds per minute - * 60 minutes per hour, or 3600000 milliseconds per hour - * 24 hours per day, or 86400000 milliseconds per day - */ - const { tprExpiration } = config.modules; - const durationInMs = tprExpiration.seconds * 1000 + tprExpiration.minutes * 60000 + tprExpiration.hours * 3600000 + tprExpiration.days * 86400000; - teleportRequests.push({ - requester: player, - target, - expiresAt: Date.now() + durationInMs, // Expires in the time specified in 'durationInMs' - }); - sendMsgToPlayer(player, `§r§4[§6Paradox§4]§r TPリクエストを ${target.name}. に送りました`); - sendMsgToPlayer(target, `§r§4[§6Paradox§4]§r ${player.name}.からあなた宛てにTPリクエストが来ています 許可するにはチャット欄でyes拒否するにはnotと送ってください`); -} -// This handles requests pending approval -function teleportRequestApprovalHandler(object) { - const { sender, message } = object; - const lowercaseMessage = decryptString(message, sender.id).toLowerCase(); - // Extract the response from the decrypted string - const refChar = lowercaseMessage.split("§r"); - const extractedPhrase = refChar[1]; - const isApprovalRequest = extractedPhrase === "yes" || extractedPhrase === "approve"; - const isDenialRequest = extractedPhrase === "not" || extractedPhrase === "deny"; - if (!isApprovalRequest && !isDenialRequest) { - return; - } - const player = sender; - object.sendToTargets = true; - // Target is the player with the request and player is the same target responding to the request - const requestIndex = teleportRequests.findIndex((r) => r.target === player); - // Target doesn't exist so return - if (requestIndex === -1) - return; - const request = teleportRequests[requestIndex]; - if (Date.now() >= request.expiresAt) { - sendMsgToPlayer(request.requester, "§f§4[§6Paradox§4]§f テレポート要求の有効期限が切れました。もう一度やり直してください。"); - sendMsgToPlayer(request.target, "§f§4[§6Paradox§4]§f テレポート要求の有効期限が切れました。もう一度やり直してください。"); - teleportRequests.splice(requestIndex, 1); - return; - } - if (isApprovalRequest) { - setTimer(request.requester.id); - request.requester.teleport(request.target.location, { dimension: request.target.dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - sendMsgToPlayer(request.requester, `§f§4[§6Paradox§4]§f${request.target.name}がTPを許可しました`); - } - else { - sendMsgToPlayer(request.requester, `§f§4[§6Paradox§4]§f${request.target.name}がTPを拒否しました`); - } - teleportRequests.splice(requestIndex, 1); -} -export function TeleportRequestHandler({ sender, message }, args) { - // Validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? ./commands/utility/tpr.js:71)"); - } - const player = sender; - // Check for custom prefix - const prefix = getPrefix(player); - // Are there arguements - if (!args.length) { - return tprHelp(player, prefix); - } - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.tpr) { - return tprHelp(player, prefix); - } - // Handle submitted requests here - if (message.startsWith(`${prefix}tpr`)) { - const event = { - sender, - message, - }; - teleportRequestHandler(event); - } - // This is for the GUI when sending approvals or denials - const validMessages = ["yes", "approve", "not", "deny"]; - if (validMessages.some((msg) => msg === message)) { - const event = { - sender, - message, - }; - teleportRequestApprovalHandler(event); - } -} -// Subscribe to teleportRequestApprovalHandler -const TpRequestListener = () => { - // If TPR is not disabled - const validate = config.customcommands.tpr; - if (validate) { - world.afterEvents.chatSend.subscribe(teleportRequestApprovalHandler); - } -}; -export { TpRequestListener }; diff --git a/build/scripts/commands/utility/vanish.js b/build/scripts/commands/utility/vanish.js deleted file mode 100644 index 855f072..0000000 --- a/build/scripts/commands/utility/vanish.js +++ /dev/null @@ -1,76 +0,0 @@ -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getPrefix, sendMsg, sendMsgToPlayer } from "../../util.js"; -function vanishHelp(player, prefix) { - let commandStatus; - if (!config.customcommands.vanish) { - commandStatus = "§6[§4DISABLED§6]§f"; - } - else { - commandStatus = "§6[§aENABLED§6]§f"; - } - return sendMsgToPlayer(player, [ - `\n§o§4[§6Command§4]§f: vanish`, - `§4[§6Status§4]§f: ${commandStatus}`, - `§4[§6Usage§4]§f: vanish [optional]`, - `§4[§6Optional§4]§f: help`, - `§4[§6Description§4]§f: Turns the player invisible to monitor online player's.`, - `§4[§6Examples§4]§f:`, - ` ${prefix}vanish`, - ` §4- §6Turns the player invisible to other players§f`, - ` ${prefix}vanish help`, - ` §4- §6Show command help§f`, - ]); -} -/** - * @name vanish - * @param {ChatSendAfterEvent} message - Message object - * @param {string[]} args - Additional arguments provided (optional). - */ -export function vanish(message, args) { - handleVanish(message, args).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleVanish(message, args) { - // validate that required params are defined - if (!message) { - return console.warn(`${new Date()} | ` + "Error: ${message} isnt defined. Did you forget to pass it? (./utility/vanish.js:26)"); - } - const player = message.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - // Check for custom prefix - const prefix = getPrefix(player); - // Was help requested - const argCheck = args[0]; - if ((argCheck && args[0].toLowerCase() === "help") || !config.customcommands.vanish) { - return vanishHelp(player, prefix); - } - const vanishBoolean = player.hasTag("vanish"); - if (vanishBoolean) { - player.removeTag("vanish"); - player.triggerEvent("unvanish"); - player.runCommandAsync(`effect @s clear`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 透明化が解除されました`); - sendMsg(`@a[tag=paradoxOpped]`, `§f§4[§6Paradox§4]§f ${player.name}§fは透明化が解除されました`); - } - else { - player.addTag("vanish"); - player.triggerEvent("vanish"); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 透明化が有効です`); - sendMsg(`@a[tag=paradoxOpped]`, `§f§4[§6Paradox§4]§f ${player.name}§f は透明化が有効になりました`); - } -} diff --git a/build/scripts/data/clearlag.js b/build/scripts/data/clearlag.js deleted file mode 100644 index 485ab96..0000000 --- a/build/scripts/data/clearlag.js +++ /dev/null @@ -1,477 +0,0 @@ -/** - * List of items to be cleared with clearlag. Remove or add items here - * if you want those items to be cleared or not cleared. - */ -const clear = [ - "minecraft:apple", - "minecraft:porkchop", - "minecraft:cod", - "minecraft:salmon", - "minecraft:dried_kelp", - "minecraft:beef", - "minecraft:chicken", - "minecraft:rotten_flesh", - "minecraft:spider_eye", - "minecraft:carrot", - "minecraft:potato", - "minecraft:poisonous_potato", - "minecraft:beetroot", - "minecraft:sweet_berries", - "minecraft:wheat_seeds", - "minecraft:pumpkin_seeds", - "minecraft:melon_seeds", - "minecraft:beetroot_seeds", - "minecraft:wooden_sword", - "minecraft:wooden_shovel", - "minecraft:wooden_pickaxe", - "minecraft:wooden_axe", - "minecraft:stone_sword", - "minecraft:stone_shovel", - "minecraft:stone_pickaxe", - "minecraft:stone_axe", - "minecraft:stick", - "minecraft:bowl", - "minecraft:golden_sword", - "minecraft:golden_shovel", - "minecraft:golden_pickaxe", - "minecraft:golden_axe", - "minecraft:string", - "minecraft:feather", - "minecraft:wooden_hoe", - "minecraft:stone_hoe", - "minecraft:golden_hoe", - "minecraft:wheat", - "minecraft:leather_helmet", - "minecraft:leather_chestplate", - "minecraft:leather_leggings", - "minecraft:leather_boots", - "minecraft:chainmail_helmet", - "minecraft:chainmail_chestplate", - "minecraft:chainmail_leggings", - "minecraft:chainmail_boots", - "minecraft:golden_helmet", - "minecraft:golden_chestplate", - "minecraft:golden_leggings", - "minecraft:golden_boots", - "minecraft:flint", - "minecraft:painting", - "minecraft:oak_sign", - "minecraft:wooden_door", - "minecraft:minecart", - "minecraft:redstone", - "minecraft:snowball", - "minecraft:kelp", - "minecraft:brick", - "minecraft:clay_ball", - "minecraft:slime_ball", - "minecraft:egg", - "minecraft:glowstone_dust", - "minecraft:bone", - "minecraft:sugar", - "minecraft:gold_nugget", - "minecraft:fermented_spider_eye", - "minecraft:magma_cream", - "minecraft:ender_eye", - "minecraft:raw_iron", - "minecraft:raw_gold", - "minecraft:raw_copper", - "minecraft:fire_charge", - "minecraft:quartz", - "minecraft:prismarine_crystals", - "minecraft:mutton", - "minecraft:chorus_fruit", - "minecraft:prismarine_shard", - "minecraft:iron_nugget", - "minecraft:phantom_membrane", - "minecraft:mangrove_leaves", - "minecraft:mangrove_propagule", - "minecraft:mangrove_roots", - "minecraft:muddy_mangrove_roots", - "minecraft:stone", - "minecraft:dirt", - "minecraft:sand", - "minecraft:stained_hardened_clay", - "minecraft:log", - "minecraft:stonebrick", - "minecraft:sea_pickle", - "minecraft:sapling", - "minecraft:leaves", - "minecraft:leaves2", - "minecraft:azalea_leaves", - "minecraft:sandstone", - "minecraft:red_sandstone", - "minecraft:crimson_roots", - "minecraft:warped_roots", - "minecraft:yellow_flower", - "minecraft:red_flower", - "minecraft:double_plant", - "minecraft:snow_layer", - "minecraft:planks", - "minecraft:tallgrass", - "minecraft:seagrass", - "minecraft:brown_mushroom_block", - "minecraft:red_mushroom_block", - "minecraft:log2", - "minecraft:end_portal_frame", - "minecraft:monster_egg", - "minecraft:prismarine", - "minecraft:magma", - "minecraft:bamboo", - "minecraft:smoker", - "minecraft:smithing_table", - "minecraft:barrel", - "minecraft:lantern", - "minecraft:loom", - "minecraft:grindstone", - "minecraft:cartography_table", - "minecraft:fletching_table", - "minecraft:wood", - "minecraft:chemistry_table", - "minecraft:tnt", - "minecraft:hard_stained_glass", - "minecraft:colored_torch_rg", - "minecraft:colored_torch_bp", - "minecraft:light_block", - "minecraft:pumpkin", - "minecraft:carved_pumpkin", - "minecraft:element_0", - "minecraft:element_1", - "minecraft:element_2", - "minecraft:element_3", - "minecraft:element_4", - "minecraft:element_5", - "minecraft:element_6", - "minecraft:element_7", - "minecraft:element_8", - "minecraft:element_9", - "minecraft:element_10", - "minecraft:element_11", - "minecraft:element_12", - "minecraft:element_13", - "minecraft:element_14", - "minecraft:element_15", - "minecraft:element_16", - "minecraft:element_17", - "minecraft:element_18", - "minecraft:element_19", - "minecraft:element_20", - "minecraft:element_21", - "minecraft:element_22", - "minecraft:element_23", - "minecraft:element_24", - "minecraft:element_25", - "minecraft:element_26", - "minecraft:element_27", - "minecraft:element_28", - "minecraft:element_29", - "minecraft:element_30", - "minecraft:element_31", - "minecraft:element_32", - "minecraft:element_33", - "minecraft:element_34", - "minecraft:element_35", - "minecraft:element_36", - "minecraft:element_37", - "minecraft:element_38", - "minecraft:element_39", - "minecraft:element_40", - "minecraft:element_41", - "minecraft:element_42", - "minecraft:element_43", - "minecraft:element_44", - "minecraft:element_45", - "minecraft:element_46", - "minecraft:element_47", - "minecraft:element_48", - "minecraft:element_49", - "minecraft:element_50", - "minecraft:element_51", - "minecraft:element_52", - "minecraft:element_53", - "minecraft:element_54", - "minecraft:element_55", - "minecraft:element_56", - "minecraft:element_57", - "minecraft:element_58", - "minecraft:element_59", - "minecraft:element_60", - "minecraft:element_61", - "minecraft:element_62", - "minecraft:element_63", - "minecraft:element_64", - "minecraft:element_65", - "minecraft:element_66", - "minecraft:element_67", - "minecraft:element_68", - "minecraft:element_69", - "minecraft:element_70", - "minecraft:element_71", - "minecraft:element_72", - "minecraft:element_73", - "minecraft:element_74", - "minecraft:element_75", - "minecraft:element_76", - "minecraft:element_77", - "minecraft:element_78", - "minecraft:element_79", - "minecraft:element_80", - "minecraft:element_81", - "minecraft:element_82", - "minecraft:element_83", - "minecraft:element_84", - "minecraft:element_85", - "minecraft:element_86", - "minecraft:element_87", - "minecraft:element_88", - "minecraft:element_89", - "minecraft:element_90", - "minecraft:element_91", - "minecraft:element_92", - "minecraft:element_93", - "minecraft:element_94", - "minecraft:element_95", - "minecraft:element_96", - "minecraft:element_97", - "minecraft:element_98", - "minecraft:element_99", - "minecraft:element_100", - "minecraft:element_101", - "minecraft:element_102", - "minecraft:element_103", - "minecraft:element_104", - "minecraft:element_105", - "minecraft:element_106", - "minecraft:element_107", - "minecraft:element_108", - "minecraft:element_109", - "minecraft:element_110", - "minecraft:element_111", - "minecraft:element_112", - "minecraft:element_113", - "minecraft:element_114", - "minecraft:element_115", - "minecraft:element_116", - "minecraft:element_117", - "minecraft:element_118", - "minecraft:composter", - "minecraft:spawn_egg", - "minecraft:glow_berries", - "minecraft:polished_basalt", - "minecraft:nether_gold_ore", - "minecraft:piston_arm_collision", - "minecraft:powder_snow", - "minecraft:dark_oak_button", - "minecraft:jungle_button", - "minecraft:crimson_wall_sign", - "minecraft:end_gateway", - "minecraft:hanging_roots", - "minecraft:calcite", - "minecraft:stripped_dark_oak_log", - "minecraft:lime_glazed_terracotta", - "minecraft:info_update", - "minecraft:mossy_cobblestone", - "minecraft:deepslate", - "minecraft:end_bricks", - "minecraft:packed_ice", - "minecraft:packed_mud", - "minecraft:moss_carpet", - "minecraft:warped_fungus", - "minecraft:potatoes", - "minecraft:tuff", - "minecraft:mangrove_log", - "minecraft:melon_block", - "minecraft:mob_spawner", - "minecraft:soul_fire", - "minecraft:exposed_copper", - "minecraft:hardened_clay", - "minecraft:stripped_jungle_log", - "minecraft:dripstone_block", - "minecraft:vine", - "minecraft:yellow_glazed_terracotta", - "minecraft:stonecutter", - "minecraft:warped_planks", - "minecraft:mangrove_planks", - "minecraft:invisible_bedrock", - "minecraft:magenta_glazed_terracotta", - "minecraft:orange_glazed_terracotta", - "minecraft:smooth_basalt", - "minecraft:underwater_torch", - "minecraft:silver_glazed_terracotta", - "minecraft:glowingobsidian", - "minecraft:brown_mushroom", - "minecraft:brown_glazed_terracotta", - "minecraft:oxidized_copper", - "minecraft:copper_ore", - "minecraft:cobblestone", - "minecraft:polished_blackstone", - "minecraft:mycelium", - "minecraft:redstone_wire", - "minecraft:lava", - "minecraft:end_stone", - "minecraft:glowstone", - "minecraft:mangrove_wood", - "minecraft:red_glazed_terracotta", - "minecraft:crimson_nylium", - "minecraft:structure_void", - "minecraft:snow", - "minecraft:stripped_mangrove_wood", - "minecraft:coal_ore", - "minecraft:client_request_placeholder_block", - "minecraft:redstone_ore", - "minecraft:nether_wart_block", - "minecraft:crimson_hyphae", - "minecraft:small_dripleaf_block", - "minecraft:basalt", - "minecraft:lit_redstone_lamp", - "minecraft:quartz_ore", - "minecraft:daylight_detector_inverted", - "minecraft:chorus_flower", - "minecraft:cracked_nether_bricks", - "minecraft:powered_repeater", - "minecraft:deepslate_tiles", - "minecraft:red_mushroom", - "minecraft:gilded_blackstone", - "minecraft:reserved6", - "minecraft:unknown", - "minecraft:infested_deepslate", - "minecraft:lit_redstone_ore", - "minecraft:deadbush", - "minecraft:polished_blackstone_bricks", - "minecraft:frosted_ice", - "minecraft:flowing_water", - "minecraft:brick_block", - "minecraft:hard_glass", - "minecraft:cave_vines", - "minecraft:iron_bars", - "minecraft:melon_stem", - "minecraft:crimson_planks", - "minecraft:jigsaw", - "minecraft:border_block", - "minecraft:chiseled_polished_blackstone", - "minecraft:chiseled_deepslate", - "minecraft:beetroot", - "minecraft:skull", - "minecraft:cyan_glazed_terracotta", - "minecraft:cracked_deepslate_bricks", - "minecraft:dirt_with_roots", - "minecraft:kelp", - "minecraft:deepslate_bricks", - "minecraft:blue_glazed_terracotta", - "minecraft:light_blue_glazed_terracotta", - "minecraft:flowering_azalea", - "minecraft:weeping_vines", - "minecraft:chorus_plant", - "minecraft:water", - "minecraft:white_glazed_terracotta", - "minecraft:stripped_warped_hyphae", - "minecraft:moving_block", - "minecraft:glow_lichen", - "minecraft:wall_banner", - "minecraft:twisting_vines", - "minecraft:deny", - "minecraft:bubble_column", - "minecraft:soul_soil", - "minecraft:soul_sand", - "minecraft:reinforced_deepslate", - "minecraft:black_glazed_terracotta", - "minecraft:stripped_acacia_log", - "minecraft:crafting_table", - "minecraft:crimson_stem", - "minecraft:warped_hyphae", - "minecraft:warped_wart_block", - "minecraft:carrots", - "minecraft:tripwire_hook", - "minecraft:cave_vines_body_with_berries", - "minecraft:stripped_birch_log", - "minecraft:sweet_berry_bush", - "minecraft:reeds", - "minecraft:barrier", - "minecraft:jungle_standing_sign", - "minecraft:fire", - "minecraft:deepslate_gold_ore", - "minecraft:stripped_spruce_log", - "minecraft:pumpkin_stem", - "minecraft:sticky_piston_arm_collision", - "minecraft:warped_nylium", - "minecraft:quartz_bricks", - "minecraft:unpowered_comparator", - "minecraft:structure_block", - "minecraft:pearlescent_froglight", - "minecraft:nether_sprouts", - "minecraft:verdant_froglight", - "minecraft:warped_stem", - "minecraft:stripped_crimson_hyphae", - "minecraft:cocoa", - "minecraft:lever", - "minecraft:moss_block", - "minecraft:pink_glazed_terracotta", - "minecraft:chain_command_block", - "minecraft:green_glazed_terracotta", - "minecraft:deepslate_redstone_ore", - "minecraft:cobbled_deepslate", - "minecraft:mud", - "minecraft:ice", - "minecraft:web", - "minecraft:azalea", - "minecraft:mud_bricks", - "minecraft:hopper", - "minecraft:stripped_crimson_stem", - "minecraft:standing_banner", - "minecraft:grass", - "minecraft:cactus", - "minecraft:purple_glazed_terracotta", - "minecraft:bedrock", - "minecraft:blackstone_stairs", - "minecraft:blue_ice", - "minecraft:sculk", - "minecraft:netherrack", - "minecraft:lit_blast_furnace", - "minecraft:allow", - "minecraft:chest", - "minecraft:chain", - "minecraft:clay", - "minecraft:sculk_vein", - "minecraft:deepslate_coal_ore", - "minecraft:cracked_polished_blackstone_bricks", - "minecraft:flowing_lava", - "minecraft:lit_furnace", - "minecraft:chiseled_nether_bricks", - "minecraft:deepslate_lapis_ore", - "minecraft:nether_brick", - "minecraft:camera", - "minecraft:wheat", - "minecraft:spore_blossom", - "minecraft:dropper", - "minecraft:stripped_warped_stem", - "minecraft:pointed_dripstone", - "minecraft:netherreactor", - "minecraft:chemical_heat", - "minecraft:trip_wire", - "minecraft:cauldron", - "minecraft:cave_vines_head_with_berries", - "minecraft:stripped_oak_log", - "minecraft:brewing_stand", - "minecraft:bamboo_sapling", - "minecraft:stonecutter_block", - "minecraft:end_portal", - "minecraft:blackstone", - "minecraft:lit_deepslate_redstone_ore", - "minecraft:lit_smoker", - "minecraft:repeating_command_block", - "minecraft:waxed_oxidized_double_cut_copper_slab", - "minecraft:crimson_fungus", - "minecraft:polished_deepslate", - "minecraft:portal", - "minecraft:command_block", - "minecraft:polished_blackstone_button", - "minecraft:furnace", - "minecraft:info_update2", - "minecraft:dispenser", - "minecraft:grass_path", - "minecraft:unlit_redstone_torch", - "minecraft:gray_glazed_terracotta", - "minecraft:lodestone", - "minecraft:stripped_mangrove_log", - "minecraft:gravel", -]; -export const clearItems = Object.setPrototypeOf(Object.fromEntries(clear.map((v) => [v, ""])), null); diff --git a/build/scripts/data/config.js b/build/scripts/data/config.js deleted file mode 100644 index 0f1128f..0000000 --- a/build/scripts/data/config.js +++ /dev/null @@ -1,282 +0,0 @@ -export default { - debug: true, - customcommands: { - prefix: "!", - ban: true, - clearchat: true, - help: true, - op: true, - deop: true, - credits: true, - allowgma: true, - allowgmc: true, - allowgms: true, - bedrockvalidate: true, - modules: true, - overidecommandblocksenabled: true, - removecommandblocks: true, - worldborder: true, - autoclicker: true, - jesusa: true, - phase: true, - ecwipe: true, - freeze: true, - stats: true, - fullreport: true, - kick: true, - mute: true, - unmute: true, - fly: true, - invsee: true, - notify: true, - rank: true, - vanish: true, - enchantedarmor: true, - antikillaura: true, - antikb: true, - report: true, - badpackets1: true, - spammera: true, - spammerb: true, - spammerc: true, - antispam: true, - crashera: true, - namespoofa: true, - namespoofb: true, - reacha: true, - reachb: true, - speeda: true, - invalidsprinta: true, - flya: true, - antifalla: true, - illegalitemsa: true, - illegalitemsb: true, - illegalitemsc: true, - antiscaffolda: true, - antinukera: true, - xraya: true, - unban: true, - chatranks: true, - antishulker: true, - stackban: true, - lockdown: true, - punish: true, - sethome: true, - gohome: true, - listhome: true, - delhome: true, - tpa: true, - illegalenchant: true, - illegallores: true, - despawn: true, - hotbar: true, - ops: true, - salvage: true, - badpackets2: true, - give: true, - clearlag: true, - showrules: true, - paradoxiu: true, - tpr: true, - autoban: true, - biome: true, - afk: true, - antiphasea: true, - channel: true, - }, - modules: { - badpackets1: { - enabled: true, - minLength: 1, - maxlength: 512, - }, - spammerA: { - enabled: true, - }, - spammerB: { - enabled: true, - }, - spammerC: { - enabled: true, - }, - antispam: { - enabled: true, - }, - crasherA: { - enabled: true, - }, - namespoofA: { - enabled: true, - minNameLength: 3, - maxNameLength: 16, - }, - namespoofB: { - enabled: true, - banregex: /[^\x00-\x7F]|[/:\\*?"<>]|^\.$|\.$/gu, - // Deny any invalid character not within the scope of this regex - // Only kick because playstation and switch consoles are able to rename themselves - kickregex: /^(?![A-Za-z0-9_\s]{3,16}$).*$/g, - }, - bedrockValidate: { - enabled: true, - overworld: true, - nether: true, - }, - reachA: { - enabled: true, - reach: 6, - }, - reachB: { - enabled: true, - reach: 5, - }, - jesusA: { - enabled: false, - }, - speedA: { - enabled: true, - speed: 12.84, - }, - invalidsprintA: { - enabled: true, - speed: 8.21, - }, - flyA: { - enabled: true, - }, - antifallA: { - enabled: true, - }, - illegalitemsA: { - enabled: false, - }, - illegalitemsB: { - enabled: false, - }, - illegalitemsC: { - enabled: true, - }, - stackBan: { - enabled: false, - }, - antikbA: { - enabled: false, - magnitude: -0.078, - }, - antiscaffoldA: { - enabled: true, - max: 13, - }, - antinukerA: { - enabled: true, - }, - xrayA: { - enabled: true, - }, - chatranks: { - enabled: true, - }, - antishulker: { - enabled: false, - }, - worldBorder: { - enabled: false, - nether: 0, - overworld: 0, - end: 0, - }, - survivalGM: { - enabled: false, - }, - adventureGM: { - enabled: false, - }, - creativeGM: { - enabled: false, - }, - setHome: { - enabled: true, - max: 10, - }, - goHome: { - seconds: 10, - minutes: 0, - hours: 0, - days: 0, - }, - clearLag: { - enabled: false, - seconds: 0, - minutes: 0, - hours: 1, - days: 0, - }, - illegalEnchantment: { - enabled: false, - }, - illegalLores: { - enabled: false, - exclude: "(+DATA)", - }, - hotbar: { - enabled: false, - message: "プラグインが有効です", // Put Message inside the quotes - }, - ops: { - enabled: true, - }, - salvage: { - enabled: false, - }, - badpackets2: { - enabled: true, - }, - showrules: { - enabled: true, - rule1: "ルール1: チートはダメ!!", - rule2: "ルール2: 人の許可なく建築を破壊しない", - rule3: "ルール3: スパム行為などは禁止!!", - rule4: "ルール4: みんなで仲良くしてね", - rule5: "ルール5: !helpでコマンドが使えます確認してみてね", - }, - paradoxui: { - enabled: true, - }, - tprExpiration: { - seconds: 0, - minutes: 2, - hours: 0, - days: 0, - }, - banAppeal: { - enabled: true, - discordLink: "異議がある場合Discordで連絡してください", - }, - autoBan: { - enabled: false, - //Time interval in ticks 1 second = 20 ticks - banHammerInterval: 6000, - }, - antiKillAura: { - enabled: true, - }, - afk: { - enabled: true, - minutes: 10, - }, - antiphaseA: { - enabled: true, - }, - }, - /** - * Set your password here. - * - * This is required for Realm users to gain Paradox-Op. - * - * Anyone else is welcome to use this if they like but - * レルムズで使用する場合必ずパスワードを設定してね - */ - encryption: { - password: "", - }, -}; diff --git a/build/scripts/data/globalban.js b/build/scripts/data/globalban.js deleted file mode 100644 index c8c8154..0000000 --- a/build/scripts/data/globalban.js +++ /dev/null @@ -1,511 +0,0 @@ -export const banplayer = [ - { name: "123yuuki" }, - { name: "a0marun" }, - { name: "A4471" }, - { name: "ab2fx" }, - { name: "Adgods" }, - { name: "Adminless" }, - { name: "Agods" }, - { name: "aiii554212" }, - { name: "aiueo0106" }, - { name: "Aiyzox" }, - { name: "akakki123" }, - { name: "AkazukinzZ" }, - { name: "akki0606" }, - { name: "Akzu8755g" }, - { name: "alex00123030" }, - { name: "Aleximont" }, - { name: "AlexP8944" }, - { name: "Allthenations98" }, - { name: "ALS514" }, - { name: "AltAnormalOM" }, - { name: "Anderycarim" }, - { name: "anime to1053" }, - { name: "AnnoyedMars1884" }, - { name: "Ansheloty Vc" }, - { name: "Anthony4933" }, - { name: "AntiBanCheat927" }, - { name: "AnticCascade214" }, - { name: "Apollo Games317" }, - { name: "appie UwU" }, - { name: "Apple Store7542" }, - { name: "appollios" }, - { name: "ArQlito" }, - { name: "Asatobyjg" }, - { name: "Ashoffici4l" }, - { name: "asuma6" }, - { name: "Ayumi5691" }, - { name: "Ayxet" }, - { name: "azxpert" }, - { name: "Badmanclientdeb" }, - { name: "BattFuuhaya" }, - { name: "BeadiXBL" }, - { name: "Beast89900" }, - { name: "BestowalSalt246" }, - { name: "BibleB0t" }, - { name: "BIGBOY6914" }, - { name: "BIG GHOST360" }, - { name: "BIKON TEC" }, - { name: "BionicBen1218" }, - { name: "BLADE FEAR6" }, - { name: "Blaze dog" }, - { name: "BlockingBelow" }, - { name: "Bluefire5975" }, - { name: "Blue Shadow8558" }, - { name: "BobFji" }, - { name: "BossLamp7162256" }, - { name: "BossLicense1725" }, - { name: "brack dream" }, - { name: "Brad764" }, - { name: "brawthejjawp" }, - { name: "BrendonBone mod" }, - { name: "BrownArticYT" }, - { name: "bstb canada" }, - { name: "Bubblz xD" }, - { name: "BuildSmash" }, - { name: "Burrito1210" }, - { name: "Bussin Scamz" }, - { name: "cabbage2310" }, - { name: "Cacadoodledoo1" }, - { name: "cagywalk344" }, - { name: "CAke My Mans" }, - { name: "CannedWither" }, - { name: "CaptObvious504" }, - { name: "CarltonRBX" }, - { name: "CheeseWobba" }, - { name: "churros0801" }, - { name: "CODBACAYDEN" }, - { name: "CoinBus7505" }, - { name: "cooljo2338" }, - { name: "coolnumerousrim" }, - { name: "coutan" }, - { name: "Crazygamer" }, - { name: "Creaky" }, - { name: "CrownChara99" }, - { name: "Ctrlaltdelete66" }, - { name: "CubicalCoyote75" }, - { name: "Dabezt679onyt" }, - { name: "dadannnohaka1111" }, - { name: "dainiakuma4986" }, - { name: "DairyLicense141" }, - { name: "Danny5502" }, - { name: "Danny Devito426" }, - { name: "Dante506391" }, - { name: "DarkerxLegend" }, - { name: "darkflash123456" }, - { name: "Dark pote9476" }, - { name: "Deamz1039" }, - { name: "Dedr7667" }, - { name: "DeltaGigano" }, - { name: "Demian127016" }, - { name: "Destroyer C00L" }, - { name: "dhb34" }, - { name: "DIO77957551" }, - { name: "dio brand0w0159" }, - { name: "DividingHare956" }, - { name: "DMFX 642" }, - { name: "DOCTORBIKON TEC" }, - { name: "doctortech887" }, - { name: "Draconix Killer" }, - { name: "Dragon96706" }, - { name: "DribFR" }, - { name: "Drwans" }, - { name: "DullHz" }, - { name: "Easton102399" }, - { name: "Echovite9835" }, - { name: "EcoAutomod" }, - { name: "Economydev" }, - { name: "ema0922" }, - { name: "Emerson05035226" }, - { name: "entity 606" }, - { name: "epicfailsgaming" }, - { name: "Fallgem77650477" }, - { name: "FartherHat1634" }, - { name: "fatmole" }, - { name: "FazeFishTTV" }, - { name: "Fe3rees" }, - { name: "FFX777" }, - { name: "Fireharu0628" }, - { name: "fivenight0316" }, - { name: "FlyawayMantis12" }, - { name: "FoozoiNYC" }, - { name: "forestblack8889" }, - { name: "FortuneCraft112" }, - { name: "FoxLab1024" }, - { name: "freshthekinder" }, - { name: "frickyea99" }, - { name: "Frostice482" }, - { name: "furaneko710" }, - { name: "Fuwzar" }, - { name: "gaiggggeeee" }, - { name: "Geiusici" }, - { name: "gingerfrog79175" }, - { name: "giyokundaK" }, - { name: "gkkuu" }, - { name: "godNYAKICHIgod" }, - { name: "God Of 2b2t" }, - { name: "Goergebush420" }, - { name: "GOTstar888" }, - { name: "GravityBot" }, - { name: "guraymar" }, - { name: "GutsyPrism50721" }, - { name: "HailedLeader522" }, - { name: "Hakaty9L" }, - { name: "HandsomRain12" }, - { name: "hannkyuu0417" }, - { name: "HASIMOTO6843" }, - { name: "HeadyCheetah419" }, - { name: "HEALR156" }, - { name: "hennakao9711" }, - { name: "Herobrine483616" }, - { name: "HighGuyMike" }, - { name: "Hikaru130" }, - { name: "Hostile Boi5243" }, - { name: "HostingEconomy" }, - { name: "hyuga01068006" }, - { name: "I aisu I" }, - { name: "I Aisu I" }, - { name: "iAndroidBoy" }, - { name: "ibu1104" }, - { name: "igorrites26164" }, - { name: "ika286desuga" }, - { name: "imageman309" }, - { name: "ImarockboiYT" }, - { name: "ImCardboard6" }, - { name: "i might drop jr" }, - { name: "Infernogod4473" }, - { name: "inhu san { name: " }, - { name: "Inu7172" }, - { name: "iphosjsju8762" }, - { name: "IrishRebel41" }, - { name: "ITSBEARCRAFT&&&" }, - { name: "Jagaimo246726" }, - { name: "JAMtoo2oof" }, - { name: "jinsora5984" }, - { name: "Jmichaelz" }, - { name: "Jomo667" }, - { name: "JOSE36056" }, - { name: "joshua44093" }, - { name: "jozfking" }, - { name: "Julisco21" }, - { name: "k5559983" }, - { name: "kansyucyo546952" }, - { name: "Karon8442" }, - { name: "ke1go L32" }, - { name: "KebabNerdTog" }, - { name: "KhaosKid08" }, - { name: "Kindbunny145622" }, - { name: "Kingkarter8013" }, - { name: "KingLeo332" }, - { name: "kizaki kousuke" }, - { name: "koil V0" }, - { name: "kurano121pvp" }, - { name: "kuroneko1300" }, - { name: "kuzira05012" }, - { name: "KuzuYou8872" }, - { name: "l5788" }, - { name: "LeasingAsp16479" }, - { name: "Lemoncake21378" }, - { name: "LeonTheLeapordJ" }, - { name: "LifeAsADog7565" }, - { name: "LightningMan401" }, - { name: "liker57889" }, - { name: "llzoxll" }, - { name: "LoginXb0x" }, - { name: "Lojogro" }, - { name: "lolGR9059" }, - { name: "lu4264" }, - { name: "M1tchellPZDC" }, - { name: "MaddeBaddie" }, - { name: "MaddMaster" }, - { name: "MajesticalGoat8" }, - { name: "majorasxlinkVA" }, - { name: "makimaki1233" }, - { name: "mao710" }, - { name: "Marukenkun" }, - { name: "masa1145147410" }, - { name: "MasterAlt" }, - { name: "MCharizard" }, - { name: "melon223" }, - { name: "Meltoria666" }, - { name: "mew151 413" }, - { name: "MexicanDream286" }, - { name: "Mich8766" }, - { name: "michika40" }, - { name: "mikadukiyuu0919" }, - { name: "minecraftman919" }, - { name: "minelion9988" }, - { name: "Miner noob pro" }, - { name: "misosoupkure" }, - { name: "mizu12165338" }, - { name: "mochi mochi 888" }, - { name: "Moistbigcow" }, - { name: "Mojangster" }, - { name: "MolecularCarp" }, - { name: "morewolf6987016" }, - { name: "morningrin" }, - { name: "MotherlyElm5080" }, - { name: "Mr pro Gamer" }, - { name: "Mujalistic" }, - { name: "mune0722" }, - { name: "Mustardapple984" }, - { name: "mystictrapper67" }, - { name: "NackerGameJP" }, - { name: "nananaoto" }, - { name: "naonao1539" }, - { name: "nappunkun" }, - { name: "Nappunkun0" }, - { name: "Narurun1630" }, - { name: "Nashikaziki" }, - { name: "nations99sucks" }, - { name: "NatureCipher" }, - { name: "ndash98dh8asyfd" }, - { name: "nekonekotann" }, - { name: "NevadaKlient71" }, - { name: "NeverNoticeX" }, - { name: "NewDaichi" }, - { name: "NG Pegasus" }, - { name: "NicktrosGaming" }, - { name: "Night8515" }, - { name: "NightfallsX" }, - { name: "NightGeoduck247" }, - { name: "Night Phantom600" }, - { name: "nightwalkerlotsalts" }, - { name: "niizima981" }, - { name: "nikoichi0229422" }, - { name: "ninjabals360" }, - { name: "NinjaXhunter130" }, - { name: "ninzinkun14541" }, - { name: "NoE1837" }, - { name: "noguchi1861" }, - { name: "Norfolk2020" }, - { name: "NorthWolf88158" }, - { name: "NotProovyPlays" }, - { name: "NRedPhoenix" }, - { name: "Nun Souls" }, - { name: "nUs188" }, - { name: "NXXYV7883" }, - { name: "nyanko4519" }, - { name: "Nyx7320" }, - { name: "OakUnicorn30402" }, - { name: "OIlllIIlIIlO" }, - { name: "Olanh fm" }, - { name: "otosan2857" }, - { name: "Overtkerr" }, - { name: "PandaExpress885" }, - { name: "Patrick9455" }, - { name: "PeakAttic816794" }, - { name: "Pepegamessk" }, - { name: "PerkySinger3944" }, - { name: "PianoPandora948" }, - { name: "PicanteRat27798" }, - { name: "PicaresqueRat" }, - { name: "PicoNotNeko" }, - { name: "pinguintod482" }, - { name: "PINKhappyBEAR9" }, - { name: "player19623138" }, - { name: "Player19623138" }, - { name: "PointedAlpaca71" }, - { name: "pokotinmaru" }, - { name: "ponta6758" }, - { name: "pooo931" }, - { name: "POPB0B 2B2T" }, - { name: "POTATO 2108112" }, - { name: "Potechi35" }, - { name: "Prodeadless" }, - { name: "Progamer" }, - { name: "proxinhaosun" }, - { name: "puruton29" }, - { name: "Qerusbyd" }, - { name: "QP chandayo" }, - { name: "Qsa static" }, - { name: "QuandaleDGNGLE" }, - { name: "R1ester" }, - { name: "RA310711" }, - { name: "RandomYTvideos" }, - { name: "realherobrine73" }, - { name: "Redjaguarcat" }, - { name: "red kooooo" }, - { name: "ReekyStarling83" }, - { name: "regaria13" }, - { name: "RegentDuke34366" }, - { name: "Reglec6327" }, - { name: "reiwagames" }, - { name: "Relond213" }, - { name: "riirie72" }, - { name: "riku390" }, - { name: "Rimru2101" }, - { name: "RlyEpic" }, - { name: "RodDellPvP5621" }, - { name: "Royal Preadator" }, - { name: "Rsaforars" }, - { name: "RusherB0T" }, - { name: "RushinBDev" }, - { name: "rusiaaa2642" }, - { name: "Russak2245" }, - { name: "Ryu00HT" }, - { name: "S4D3 galaxy" }, - { name: "SafeYUTO0520" }, - { name: "sakipq1131" }, - { name: "Samdesap" }, - { name: "sandshrew81" }, - { name: "satoiori1025" }, - { name: "SchwepeDrunkGal" }, - { name: "SCNicholas" }, - { name: "Scout1072" }, - { name: "scp1210souma" }, - { name: "seasonedcord" }, - { name: "SEBA7321" }, - { name: "Seekandestroy3" }, - { name: "SEKAKURO66" }, - { name: "sekakuro666" }, - { name: "Sekakuro6661204" }, - { name: "Shape a shadow" }, - { name: "SharpnesNeco" }, - { name: "ShEID0nMC" }, - { name: "ShelledCanoe644" }, - { name: "ShoppingLeaf279" }, - { name: "shouyoushouyou" }, - { name: "Siro11122" }, - { name: "sirokuma1234893" }, - { name: "sithlordsoth" }, - { name: "SKULLBLOCK6551" }, - { name: "Skullkid7800" }, - { name: "SkullRealms18" }, - { name: "SlappsKing" }, - { name: "slimesalt" }, - { name: "SlmplyLogicPvP" }, - { name: "Snazzy crazy" }, - { name: "SneezyRelic513" }, - { name: "Sofi2591" }, - { name: "SoldPlatypus619" }, - { name: "SORAmama103" }, - { name: "Soulbound" }, - { name: "soupergamer0" }, - { name: "Spanishick9762" }, - { name: "sprayNprayJ580" }, - { name: "SSkygenDog S" }, - { name: "StarAttorney249" }, - { name: "STARKILLER" }, - { name: "starthree477738" }, - { name: "Star Wands" }, - { name: "steve5059" }, - { name: "Steve5059" }, - { name: "StipuledVirus1" }, - { name: "StrafeYourself" }, - { name: "su e9k" }, - { name: "sugiwan0402" }, - { name: "Sugiwan0402" }, - { name: "Suica048" }, - { name: "Suika048" }, - { name: "Summerscroll737" }, - { name: "sunnygain32" }, - { name: "SunSet7481" }, - { name: "superXmario91" }, - { name: "surimin0323" }, - { name: "SUZU 800" }, - { name: "SwankSnail58571" }, - { name: "Sweetdream2you" }, - { name: "SWT landen09" }, - { name: "SYAKEX2525" }, - { name: "tajmw" }, - { name: "TakeMyL" }, - { name: "TakeNeko1" }, - { name: "Takukitisan" }, - { name: "Takurou3993" }, - { name: "tamokage" }, - { name: "TANA7891" }, - { name: "TatteredManx400" }, - { name: "Tazerr Eu" }, - { name: "TenMite36115759" }, - { name: "ThawingSkate243" }, - { name: "thebatman200611" }, - { name: "TheDoctorDog19" }, - { name: "TheDoctorDog2" }, - { name: "TheDoctorRendik" }, - { name: "TheFinalStrand69" }, - { name: "Theforceoftek" }, - { name: "TheKingPengu" }, - { name: "thekoolkrab" }, - { name: "TheWolfPro8532" }, - { name: "ThoricGos33" }, - { name: "ThreeTrain7676" }, - { name: "thtbaconguy1029" }, - { name: "TimelyTurnip351" }, - { name: "timmy_is_daddy57" }, - { name: "TK31493" }, - { name: "TLWTyler" }, - { name: "Tokiwa0707" }, - { name: "Toxic1320" }, - { name: "TTVassassin1160" }, - { name: "Tubaexperte5221" }, - { name: "tubuhiro" }, - { name: "TudouFan" }, - { name: "TwiningImpala94" }, - { name: "TwofacedMouse89" }, - { name: "udon080" }, - { name: "unaa2007" }, - { name: "unbatedDegree55" }, - { name: "UniformKap8104" }, - { name: "UniformYard0076" }, - { name: "UnknownMyKB" }, - { name: "UpperHealer8521" }, - { name: "UrgentTrash7032" }, - { name: "Use Horion" }, - { name: "VolantSubset630" }, - { name: "VTuber51" }, - { name: "WailingSun65116" }, - { name: "Wanner568" }, - { name: "WickedJustin207" }, - { name: "Wildanimal49" }, - { name: "WilierMedusa749" }, - { name: "Wils8689" }, - { name: "winniezapoo" }, - { name: "woowben123" }, - { name: "Worrer" }, - { name: "WrierStream62" }, - { name: "x1xLeox1x7614" }, - { name: "x_beast6464_xX" }, - { name: "X ChipBag X" }, - { name: "xCREEPERX8381" }, - { name: "XD438" }, - { name: "xIlIlIIlIIlIx55" }, - { name: "xIlSHNAGSlIx" }, - { name: "XkuromX" }, - { name: "Xonnel4423" }, - { name: "x Pneuzide x" }, - { name: "xRaccoonEggz" }, - { name: "XsteveX8231" }, - { name: "Xxfazeemyth242" }, - { name: "Xx_Floppy_xX" }, - { name: "Xxlm418xX" }, - { name: "xXnobuXx2020" }, - { name: "XxPvPxX" }, - { name: "yakeyake224" }, - { name: "yamato0112" }, - { name: "Yanyaa kun28" }, - { name: "YavorK" }, - { name: "Yoboypizza5288" }, - { name: "You4bot" }, - { name: "Youtube1500" }, - { name: "youtubegames3" }, - { name: "Yt Xiam" }, - { name: "yugona3" }, - { name: "yumaukitako" }, - { name: "Yusan3016" }, - { name: "yusuke0557" }, - { name: "YutomoriSoji" }, - { name: "yuu2007sei" }, - { name: "yuukanhan" }, - { name: "yuumiyuyu" }, - { name: "Yuya141129" }, - { name: "ZacharyPlayzYT" }, - { name: "Zenithbrine" }, - { name: "ZISPAN0S" }, - { name: "zkxxx64 roblox" }, - { name: "zNull0" }, - { name: "ZPOLSKI5079" }, - { name: "Zreepah" }, - { name: "Zrixi8628" }, - { name: "Zxero110" }, -]; diff --git a/build/scripts/data/illegalItemsB_whitelist.js b/build/scripts/data/illegalItemsB_whitelist.js deleted file mode 100644 index f5a82f8..0000000 --- a/build/scripts/data/illegalItemsB_whitelist.js +++ /dev/null @@ -1,2 +0,0 @@ -const whitelist = new Set(["minecraft:pumpkin_stem", "minecraft:melon_stem", "minecraft:standing_sign", "minecraft:wall_sign", "minecraft:reeds"]); -export const illegalItemsBWhitelist = whitelist; diff --git a/build/scripts/data/itemban.js b/build/scripts/data/itemban.js deleted file mode 100644 index cec9d01..0000000 --- a/build/scripts/data/itemban.js +++ /dev/null @@ -1,154 +0,0 @@ -const illegalitemList = new Set([ - "minecraft:light_block", - "minecraft:lit_smoker", - "minecraft:daylight_detector_inverted", - "minecraft:powered_comparator", - "minecraft:lit_blast_furnace", - "minecraft:lit_furnace", - "minecraft:camera", - "minecraft:end_gateway", - "minecraft:fire", - "minecraft:soul_fire", - "minecraft:frosted_ice", - "minecraft:flowing_lava", - "minecraft:unknown", - "minecraft:flowing_water", - "minecraft:barrier", - "minecraft:command_block", - "minecraft:chemistry_table", - "minecraft:debug_stick", - "minecraft:command_block_minecart", - "minecraft:repeating_command_block", - "minecraft:spawn_egg", - "minecraft:spawner", - "minecraft:structure_block", - "minecraft:structure_void", - "minecraft:info_update", - "minecraft:info_update2", - "minecraft:reserved3", - "minecraft:reserved4", - "minecraft:reserved6", - "minecraft:movingblock", - "minecraft:moving_block", - "minecraft:movingBlock", - "minecraft:invisiblebedrock", - "minecraft:invisible_bedrock", - "minecraft:bedrock", - "minecraft:glowingobsidian", - "minecraft:compoundcreator", - "minecraft:underwater_torch", - "minecraft:chemical_heat", - "minecraft:end_portal", - "minecraft:end_portal_frame", - "minecraft:colored_torch", - "minecraft:hard_stained_glass_pane", - "minecraft:hard_glass_pane", - "minecraft:allow", - "minecraft:chain_command_block", - "minecraft:client_request_placeholder_block", - "minecraft:deny", - "minecraft:npc_spawn", - "minecraft:stickyPistonArmCollision", - "minecraft:sticky_piston_arm_collision", - "minecraft:piston_arm_collision", - "minecraft:netherreactor", - "minecraft:mob_spawner", - "minecraft:border_block", - "minecraft:bubble_column", - "minecraft:jigsaw", - "minecraft:portal", - "minecraft:chicken_spawn_egg", - "minecraft:bee_spawn_egg", - "minecraft:cow_spawn_egg", - "minecraft:pig_spawn_egg", - "minecraft:sheep_spawn_egg", - "minecraft:wolf_spawn_egg", - "minecraft:polar_bear_spawn_egg", - "minecraft:ocelot_spawn_egg", - "minecraft:cat_spawn_egg", - "minecraft:mooshroom_spawn_egg", - "minecraft:bat_spawn_egg", - "minecraft:parrot_spawn_egg", - "minecraft:rabbit_spawn_egg", - "minecraft:llama_spawn_egg", - "minecraft:horse_spawn_egg", - "minecraft:donkey_spawn_egg", - "minecraft:chicken_spawn_egg", - "minecraft:mule_spawn_egg", - "minecraft:skeleton_horse_spawn_egg", - "minecraft:zombie_horse_spawn_egg", - "minecraft:tropical_fish_spawn_egg", - "minecraft:cod_spawn_egg", - "minecraft:pufferfish_spawn_egg", - "minecraft:salmon_spawn_egg", - "minecraft:dolphin_spawn_egg", - "minecraft:sea_turtle_spawn_egg", - "minecraft:panda_spawn_egg", - "minecraft:fox_spawn_egg", - "minecraft:creeper_spawn_egg", - "minecraft:enderman_spawn_egg", - "minecraft:silverfish_spawn_egg", - "minecraft:skeleton_spawn_egg", - "minecraft:wither_spawn_egg", - "minecraft:stray_spawn_egg", - "minecraft:slime_spawn_egg", - "minecraft:spider_spawn_egg", - "minecraft:zombie_spawn_egg", - "minecraft:zombified_piglin_spawn_egg", - "minecraft:husk_spawn_egg", - "minecraft:drowned_spawn_egg", - "minecraft:squid_spawn_egg", - "minecraft:glow_squid_spawn_egg", - "minecraft:cave_spider_spawn_egg", - "minecraft:witch_spawn_egg", - "minecraft:guardian_spawn_egg", - "minecraft:elder_guardian_spawn_egg", - "minecraft:endermite_spawn_egg", - "minecraft:magma_cube_spawn_egg", - "minecraft:strider_spawn_egg", - "minecraft:hoglin_spawn_egg", - "minecraft:piglin_spawn_egg", - "minecraft:zoglin_spawn_egg", - "minecraft:piglin_brute_spawn_egg", - "minecraft:goat_spawn_egg", - "minecraft:axolotl_spawn_egg", - "minecraft:ghast_spawn_egg", - "minecraft:blaze_spawn_egg", - "minecraft:shulker_spawn_egg", - "minecraft:vindicator_spawn_egg", - "minecraft:evoker_spawn_egg", - "minecraft:vex_spawn_egg", - "minecraft:villager_spawn_egg", - "minecraft:wandering_trader_spawn_egg", - "minecraft:zombie_villager_spawn_egg", - "minecraft:phantom_spawn_egg", - "minecraft:pillager_spawn_egg", - "minecraft:ravager_spawn_egg", - "minecraft:allay_spawn_egg", - "minecraft:tadpole_spawn_egg", - "minecraft:frog_spawn_egg", - "minecraft:warden_spawn_egg", - "minecraft:pumpkin_stem", - "minecraft:melon_stem", - "minecraft:lava", - "minecraft:water", - "minecraft:lit_redstonelamp", - "minecraft:powered repeater", - "minecraft:lit_redstone_ore", - "minecraft:lit_deepslate_redstone_ore", - "minecraft:standing_sign", - "minecraft:wall_sign", - "minecraft:pistonarmcollision", - "minecraft:stickypistonarmcollision", - "minecraft:chalkboard", - "minecraft:lava_cauldron", - "minecraft:border", - "minecraft:glow_stick", - "minecraft:reeds", - "minecraft:double_stone_slab", - "minecraft:double_wooden_slab", - "minecraft:monster_egg", - "minecraft:stone_monster_egg", - "minecraft:farmland", -]); -export const illegalitems = illegalitemList; diff --git a/build/scripts/data/onjoindata.js b/build/scripts/data/onjoindata.js deleted file mode 100644 index a88419c..0000000 --- a/build/scripts/data/onjoindata.js +++ /dev/null @@ -1,47 +0,0 @@ -export const onJoinPrimaryData = [ - "cmds", - "commandblocks", - "encharmor", - "detect_helmet", - "detect_chest", - "detect_leggings", - "detect_boots", - "xPos", - "yPos", - "zPos", - "xPosFreeze", - "yPosFreeze", - "zPosFreeze", - "realm", - "ench_helmet", - "ench_chest", - "ench_legs", - "ench_boots", - "autoclickervl", - "badpacketsvl", - "killauravl", - "flyvl", - "illegalitemsvl", - "cbevl", - "gamemodevl", - "spammervl", - "namespoofvl", - "speedvl", - "crashervl", - "reachvl", - "invalidsprintvl", - "armorvl", - "antikbvl", - "antifallvl", - "nukervl", - "scaffoldvl", - "antiphasevl", -]; -export const onJoinSecondaryData = [ - "scoreboard players operation @a commandblocks = paradox:config commandblocks", - "scoreboard players operation @a cmds = paradox:config cmds", - "scoreboard players operation @a encharmor = paradox:config encharmor", - "event entity @s[tag=vanish] vanish", - "ability @s[tag=flying] mayfly true", - "ability @s[tag=isMuted] mute true", -]; diff --git a/build/scripts/data/xray.js b/build/scripts/data/xray.js deleted file mode 100644 index ac15a1d..0000000 --- a/build/scripts/data/xray.js +++ /dev/null @@ -1,16 +0,0 @@ -const xray = [ - "minecraft:ancient_debris", - "minecraft:diamond_ore", - "minecraft:deepslate_diamond_ore", - "minecraft:emerald_ore", - "minecraft:deepslate_emerald_ore", - "minecraft:redstone_ore", - "minecraft:deepslate_redstone_ore", - "minecraft:lapis_ore", - "minecraft:deepslate_lapis_ore", - "minecraft:gold_ore", - "minecraft:deepslate_gold_ore", - "minecraft:iron_ore", - "minecraft:deepslate_iron_ore", -]; -export const xrayblocks = Object.setPrototypeOf(Object.fromEntries(xray.map((v) => [v, ""])), null); diff --git a/build/scripts/gui/PlayerSpawnAfterEvent/rules/rules.js b/build/scripts/gui/PlayerSpawnAfterEvent/rules/rules.js deleted file mode 100644 index 5b466b2..0000000 --- a/build/scripts/gui/PlayerSpawnAfterEvent/rules/rules.js +++ /dev/null @@ -1,45 +0,0 @@ -import { world } from "@minecraft/server"; -import { ShowRules } from "../../showrules/showrules.js"; -import { dynamicPropertyRegistry } from "../../../penrose/WorldInitializeAfterEvent/registry.js"; -/** - * Handles the player spawn event and displays join rules. - * - * @name onJoinRules - * @param {PlayerSpawnAfterEvent} object - The player spawn event object. - */ -export function onJoinRules(object) { - handledleOnJoinRules(object).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handledleOnJoinRules(object) { - //Get Dynamic Property - const showrulesBoolean = dynamicPropertyRegistry.get("showrules_b"); - // Unsubscribe if disabled in-game - if (showrulesBoolean === false) { - world.afterEvents.playerSpawn.unsubscribe(onJoinRules); - return; - } - // Properties of class - const { player, initialSpawn } = object; - // Show rules if its their initial spawn in the world - if (initialSpawn === true) { - player.addTag("ShowRulesOnJoin"); - ShowRules(); - } - else { - return; - } -} -const onJoinrules = () => { - world.afterEvents.playerSpawn.subscribe(onJoinRules); -}; -export { onJoinrules }; diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/chatui.js b/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/chatui.js deleted file mode 100644 index 33530a3..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/chatui.js +++ /dev/null @@ -1,52 +0,0 @@ -import { ActionFormData } from "@minecraft/server-ui"; -import { notifyHandler } from "./results/notify"; -import { chatRanksHandler } from "./results/chatranks"; -import { muteHandler } from "./results/mute"; -import { unmuteHandler } from "./results/unmute"; -import { clearChatHandler } from "./results/clearchat"; -export function chatui(player) { - //show chat ui - const chatui = new ActionFormData(); - chatui.title("§4Paradox - Configure Chat§4"); - chatui.body("§eSettings related to chat.§e"); - chatui.button("Notify", "textures/ui/chat_send"); - chatui.button("Ranks", "textures/ui/saleribbon"); - chatui.button("Mute", "textures/ui/mute_on"); - chatui.button("Unmute", "textures/ui/mute_off"); - chatui.button("Clear Chat", "textures/ui/cancel"); - chatui - .show(player) - .then((chatResult) => { - // Use a switch statement to handle different selections - switch (chatResult.selection) { - case 0: - notifyHandler(player); - break; - case 1: - chatRanksHandler(player); - break; - case 2: - muteHandler(player); - break; - case 3: - unmuteHandler(player); - break; - case 4: - clearChatHandler(player); - break; - default: - break; - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/chatranks.js b/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/chatranks.js deleted file mode 100644 index 1fba656..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/chatranks.js +++ /dev/null @@ -1,33 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiCHATRANKS } from "../../../../moderation/uiChatranks"; -export function chatRanksHandler(player) { - //Chat Ranks ui - const chatranksui = new ModalFormData(); - let onlineList = []; - const chatRanksBoolean = dynamicPropertyRegistry.get("chatranks_b"); - chatranksui.title("§4Change A Player's Chat Rank§4"); - onlineList = Array.from(world.getPlayers(), (player) => player.name); - const predefinedrank = ["Owner", "Admin", "Mod", "Member"]; - chatranksui.dropdown(`\n§fSelect a player to change their rank:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - chatranksui.dropdown(`\n§fSelect a pre defined rank or you can set a custom on below:§f`, predefinedrank); - chatranksui.textField("Enter a custom Rank:", "VIP"); - chatranksui.toggle("Chat Ranks - Enables or Disables chat ranks:", chatRanksBoolean); - chatranksui - .show(player) - .then((chatranksResult) => { - uiCHATRANKS(chatranksResult, onlineList, predefinedrank, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/clearchat.js b/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/clearchat.js deleted file mode 100644 index f6ea5de..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/clearchat.js +++ /dev/null @@ -1,32 +0,0 @@ -import { MessageFormData } from "@minecraft/server-ui"; -import { uiCLEARCHAT } from "../../../../moderation/uiClearchat"; -import { paradoxui } from "../../../../paradoxui"; -export function clearChatHandler(player) { - //Clear Chat ui - const clearchatui = new MessageFormData(); - clearchatui.title("§4Clear Chat§4"); - clearchatui.body("Are you sure you want to clear chat?"); - clearchatui.button1("Yes"); - clearchatui.button2("No"); - clearchatui - .show(player) - .then((clearchatResult) => { - if (clearchatResult.selection === 0) { - uiCLEARCHAT(player); - } - if (clearchatResult.selection === 1) { - paradoxui(player); - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/mute.js b/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/mute.js deleted file mode 100644 index 8296e60..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/mute.js +++ /dev/null @@ -1,28 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiMUTE } from "../../../../moderation/uiMute"; -export function muteHandler(player) { - //Mute ui - const muteui = new ModalFormData(); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - muteui.title("§4Mute A Player In Chat.§4"); - muteui.dropdown(`\n§fSelect a player to mute:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - muteui.textField("Reason:", "Has been posting discord links."); - muteui - .show(player) - .then((muteResult) => { - uiMUTE(muteResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/notify.js b/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/notify.js deleted file mode 100644 index a46e42e..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/notify.js +++ /dev/null @@ -1,29 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiNOTIFY } from "../../../../moderation/uiNotify"; -export function notifyHandler(player) { - //notify ui - const notifyui = new ModalFormData(); - let onlineList = []; - notifyui.title("§4Enable or Disable Notifications§4"); - onlineList = Array.from(world.getPlayers(), (player) => player.name); - notifyui.dropdown(`\n§fSelect a player to Enable or Disable Notifications:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - //by default set the current value to disabled. - notifyui.toggle("Notifications:", false); - notifyui - .show(player) - .then((notifyResult) => { - uiNOTIFY(notifyResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/unmute.js b/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/unmute.js deleted file mode 100644 index 5017a61..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/guiHandlerChat/results/unmute.js +++ /dev/null @@ -1,28 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiUNMUTE } from "../../../../moderation/uiUnmute"; -export function unmuteHandler(player) { - //UnMute ui - const unmuteui = new ModalFormData(); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - unmuteui.title("§4Mute A Player In Chat§4"); - unmuteui.dropdown(`\n§fSelect a player to unmute:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - unmuteui.textField("Reason:", "Permissions to talk in chat."); - unmuteui - .show(player) - .then((muteResult) => { - uiUNMUTE(muteResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/moderationui.js b/build/scripts/gui/guiHandler/guiHandlerModeration/moderationui.js deleted file mode 100644 index ca16e3c..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/moderationui.js +++ /dev/null @@ -1,100 +0,0 @@ -import { ActionFormData } from "@minecraft/server-ui"; -import { banHandler } from "./results/ban"; -import { unbanHandler } from "./results/unban"; -import { rulesHandler } from "./results/rules"; -import { chatui } from "./guiHandlerChat/chatui"; -import { lockdownHandler } from "./results/lockdown"; -import { punishHandler } from "./results/punish"; -import { tpaHandler } from "./results/tpa"; -import { kickHandler } from "./results/kick"; -import { ecwipeHandler } from "./results/ecwipe"; -import { freezeHandler } from "./results/freeze"; -import { flyHandler } from "./results/fly"; -import { vanishHandler } from "./results/vanish"; -import { despawnHandler } from "./results/despawn"; -import { autobanHandler } from "./results/autoban"; -import { inventoryHandler } from "./results/inventoryui"; -export function moderationui(player) { - //new window for Moderation - const moderationui = new ActionFormData(); - moderationui.title("§4管理者メニュー§4"); - moderationui.button("Ban", "textures/ui/hammer_l"); - moderationui.button("Ban解除", "textures/ui/check"); - moderationui.button("ルール", "textures/items/book_writable"); - moderationui.button("チャット", "textures/ui/newOffersIcon"); - moderationui.button("メンテナンス", "textures/ui/lock_color"); - moderationui.button("アイテム削除", "textures/ui/trash"); - moderationui.button("テレポート", "textures/blocks/portal_placeholder"); - moderationui.button("キック", "textures/items/gold_boots"); - moderationui.button("エンダーチェスト消去", "textures/blocks/ender_chest_front"); - moderationui.button("フリーズ", "textures/ui/frozen_effect"); - moderationui.button("飛行モード", "textures/ui/flyingascend"); - moderationui.button("透明", "textures/items/potion_bottle_invisibility"); - moderationui.button("モブをキル", "textures/ui/trash"); - moderationui.button("自動Ban", "textures/ui/hammer_l"); - moderationui.button("インベントリ", "textures/blocks/chest_front"); - moderationui - .show(player) - .then((ModUIresult) => { - switch (ModUIresult.selection) { - case 0: - banHandler(player); - break; - case 1: - unbanHandler(player); - break; - case 2: - rulesHandler(player); - break; - case 3: - chatui(player); - break; - case 4: - lockdownHandler(player); - break; - case 5: - punishHandler(player); - break; - case 6: - tpaHandler(player); - break; - case 7: - kickHandler(player); - break; - case 8: - ecwipeHandler(player); - break; - case 9: - freezeHandler(player); - break; - case 10: - flyHandler(player); - break; - case 11: - vanishHandler(player); - break; - case 12: - despawnHandler(player); - break; - case 13: - autobanHandler(player); - break; - case 14: - inventoryHandler(player); - break; - default: - break; - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/autoban.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/autoban.js deleted file mode 100644 index ec50b7a..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/autoban.js +++ /dev/null @@ -1,25 +0,0 @@ -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiAUTOBAN } from "../../../moderation/uiAutoBan"; -export function autobanHandler(player) { - const autoBanBoolean = dynamicPropertyRegistry.get("autoban_b"); - const autobanui = new ModalFormData(); - autobanui.title("§4メニュー:自動BAN§4"); - autobanui.toggle("機能を有効又は無効にします", autoBanBoolean); - autobanui - .show(player) - .then((autobanResult) => { - uiAUTOBAN(autobanResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/ban.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/ban.js deleted file mode 100644 index 5d1b1e1..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/ban.js +++ /dev/null @@ -1,29 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiBAN } from "../../../moderation/uiBan"; -export function banHandler(player) { - //show ban ui here - const banui = new ModalFormData(); - let onlineList = []; - banui.title("§4メニュー:ユーザーをBANします§4"); - onlineList = Array.from(world.getPlayers(), (player) => player.name); - banui.dropdown(`\n§fBANするユーザーを選択§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - banui.textField(`BAN理由:`, `理由入力.`); - banui - .show(player) - .then((banResult) => { - //ban function goes here - uiBAN(banResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/despawn.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/despawn.js deleted file mode 100644 index ba36768..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/despawn.js +++ /dev/null @@ -1,24 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { uiDESPAWNER } from "../../../moderation/uiDespawner"; -export function despawnHandler(player) { - const despawnerui = new ModalFormData(); - despawnerui.title("§4モブをキル§4"); - despawnerui.textField("キルしたいモブの名前を入れるとモブが消えます", "creeper"); - despawnerui.toggle("現チャンクにいる全てのモブを消します:", false); - despawnerui - .show(player) - .then((despawnerResult) => { - uiDESPAWNER(despawnerResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/ecwipe.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/ecwipe.js deleted file mode 100644 index 78ee919..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/ecwipe.js +++ /dev/null @@ -1,26 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiEWIPE } from "../../../moderation/uiEwipe"; -export function ecwipeHandler(player) { - const ewipeui = new ModalFormData(); - ewipeui.title("§4エンダーチェストの中身を消す§4"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - ewipeui.dropdown(`\n§f消したいプレイヤーを指定:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - ewipeui - .show(player) - .then((ewipeResult) => { - uiEWIPE(ewipeResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/fly.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/fly.js deleted file mode 100644 index 9a395f6..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/fly.js +++ /dev/null @@ -1,26 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiFLY } from "../../../moderation/uiFly"; -export function flyHandler(player) { - const flyui = new ModalFormData(); - flyui.title("§4飛行モード§4"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - flyui.dropdown(`\n§f飛行させたいプレイヤーを指定無効する場合も同様に:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - flyui - .show(player) - .then((flyResult) => { - uiFLY(flyResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/freeze.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/freeze.js deleted file mode 100644 index 17a28f9..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/freeze.js +++ /dev/null @@ -1,26 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiFREEZE } from "../../../moderation/uiFreeze"; -export function freezeHandler(player) { - const freezeui = new ModalFormData(); - freezeui.title("§4プレイヤーをフリーズさせます.§4"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - freezeui.dropdown(`\n§f行動を制限したいユーザーを選択§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - freezeui - .show(player) - .then((freezeResult) => { - uiFREEZE(freezeResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/inventoryui.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/inventoryui.js deleted file mode 100644 index e14fb01..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/inventoryui.js +++ /dev/null @@ -1,29 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../../../data/config"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiINVENTORY } from "../../../moderation/uiInventory"; -export function inventoryHandler(player) { - if (config.debug === true) { - const inventoryUI = new ModalFormData(); - inventoryUI.title("§4メニュー:アイテム欄を確認§4"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - inventoryUI.dropdown(`\n§fアイテム欄を見たいプレイヤーを選択:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - inventoryUI - .show(player) - .then((inventoryUIResult) => { - uiINVENTORY(inventoryUIResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - } -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/kick.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/kick.js deleted file mode 100644 index e48cf99..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/kick.js +++ /dev/null @@ -1,27 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiKICK } from "../../../moderation/uiKick"; -export function kickHandler(player) { - const kickui = new ModalFormData(); - kickui.title("§4キックメニュー§4"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - kickui.dropdown(`\n§fキックしたいユーザーを指定§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - kickui.textField("理由:", "荒らし!"); - kickui - .show(player) - .then((kickResult) => { - uiKICK(kickResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/lockdown.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/lockdown.js deleted file mode 100644 index 35f2d22..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/lockdown.js +++ /dev/null @@ -1,28 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiLOCKDOWN } from "../../../moderation/uiLockdown"; -export function lockdownHandler(player) { - //Lockdown ui - const lockdownui = new ModalFormData(); - // Get Dynamic Property Boolean - const lockdownBoolean = dynamicPropertyRegistry.get("lockdown_b"); - lockdownui.title("§4メンテナンスメニュー§4"); - lockdownui.textField("メンテナンス理由:", "例:一時的にメンテナンスに入ります"); - lockdownui.toggle("メンテナンス状態を有効又は無効にします:", lockdownBoolean); - lockdownui - .show(player) - .then((lockdownResult) => { - uiLOCKDOWN(lockdownResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/managePlayersSavedLocations.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/managePlayersSavedLocations.js deleted file mode 100644 index 58c7462..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/managePlayersSavedLocations.js +++ /dev/null @@ -1,26 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiManagePlayerSavedLocations } from "../../../moderation/uiManagePlayerSavedLocations"; -export function managePlayerSavedLocationsHandler(player) { - const managePlayerSavedLocationsUI = new ModalFormData(); - managePlayerSavedLocationsUI.title("§4座標管理§4"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - managePlayerSavedLocationsUI.dropdown(`\n§f指定したプレイヤーの座標を削除できます【追加できません】§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - managePlayerSavedLocationsUI - .show(player) - .then((managePlayerSavedLocationsUIResult) => { - uiManagePlayerSavedLocations(managePlayerSavedLocationsUIResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/punish.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/punish.js deleted file mode 100644 index 60c7512..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/punish.js +++ /dev/null @@ -1,54 +0,0 @@ -import { world } from "@minecraft/server"; -import { MessageFormData, ModalFormData } from "@minecraft/server-ui"; -import { uiPUNISH } from "../../../moderation/uiPunish"; -import { paradoxui } from "../../../paradoxui"; -export function punishHandler(player) { - //Punish UI im going to use two forms one as a yes/no message so i can advise what this will do. - const punishprewarnui = new MessageFormData(); - punishprewarnui.title("§4アイテム欄をクリア§4"); - punishprewarnui.body("エンダーチェストとアイテム欄をクリアしていいですか?"); - punishprewarnui.button1("はい"); - punishprewarnui.button2("いいえ"); - punishprewarnui - .show(player) - .then((prewarnResult) => { - if (prewarnResult.selection === 0) { - //show the Punish UI - const punishui = new ModalFormData(); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - punishui.title("§4アイテム欄をクリア§4"); - punishui.dropdown(`\n§f消したいユーザーを指定§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - punishui - .show(player) - .then((punishResult) => { - uiPUNISH(punishResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - } - else if (prewarnResult.selection === 1 || prewarnResult.canceled) { - paradoxui(player); - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/rules.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/rules.js deleted file mode 100644 index 886f7d9..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/rules.js +++ /dev/null @@ -1,29 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiRULES } from "../../../moderation/uiRules"; -export function rulesHandler(player) { - //show rules ui - const rulesui = new ModalFormData(); - rulesui.title("§4ルールに関する設定§4"); - const showrulesBoolean = dynamicPropertyRegistry.get("showrules_b"); - const KickOnDeclineBoolean = dynamicPropertyRegistry.get("kickondecline_b"); - rulesui.toggle("ルールを有効又は無効:", showrulesBoolean); - rulesui.toggle("ルールに同意しないとキック:", KickOnDeclineBoolean); - rulesui - .show(player) - .then((rulesResult) => { - // due to limitations we can't edit the rules in game. - uiRULES(rulesResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/tpa.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/tpa.js deleted file mode 100644 index 8b923a8..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/tpa.js +++ /dev/null @@ -1,28 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiTPA } from "../../../moderation/uiTpa"; -export function tpaHandler(player) { - const tpaui = new ModalFormData(); - tpaui.title("§4TPメニュー§4"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - tpaui.dropdown(`\n§fTPしたいプレイヤー選択:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - tpaui.toggle("指定したプレイヤーにTP:", true); - tpaui.toggle("指定プレイヤーを自分にTP", false); - tpaui - .show(player) - .then((tpaResult) => { - uiTPA(tpaResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/unban.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/unban.js deleted file mode 100644 index 3965e7a..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/unban.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { uiUNBAN } from "../../../moderation/uiUnban"; -export function unbanHandler(player) { - //show unban ui here - const unbanui = new ModalFormData(); - unbanui.title("§4BAN解除§4"); - unbanui.textField(`ユーザー:`, `解除したいユーザーの名前を入力`); - unbanui.toggle("BAN解除を取り消し【解除申請をしたプレイヤーの名前】", false); - unbanui - .show(player) - .then((unbanResult) => { - uiUNBAN(unbanResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModeration/results/vanish.js b/build/scripts/gui/guiHandler/guiHandlerModeration/results/vanish.js deleted file mode 100644 index 957d77f..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModeration/results/vanish.js +++ /dev/null @@ -1,26 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiVANISH } from "../../../moderation/uiVanish"; -export function vanishHandler(player) { - const vanishui = new ModalFormData(); - vanishui.title("§4透明化§4"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - vanishui.dropdown(`\n§f透明化します:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - vanishui - .show(player) - .then((vanishResult) => { - uiVANISH(vanishResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/movementui.js b/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/movementui.js deleted file mode 100644 index 9f1db69..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/movementui.js +++ /dev/null @@ -1,59 +0,0 @@ -import { ActionFormData } from "@minecraft/server-ui"; -import { antiKnockBackHandler } from "./results/antiknockback"; -import { antiFallHandler } from "./results/antifall"; -import { antiFlyHandler } from "./results/antifly"; -import { invalidSprintHandler } from "./results/invalidsprint"; -import { speedAHandler } from "./results/speeda"; -import { antiScaffoldAHandler } from "./results/antiscaffolda"; -import { antiJesusAHandler } from "./results/antijesusa"; -export function movementui(player) { - const modulesmovementui = new ActionFormData(); - modulesmovementui.title("§4メニュー:移動系§4"); - modulesmovementui.button("ノックバック検知", "textures/items/diamond_chestplate"); - modulesmovementui.button("落下ダメ検知", "textures/items/diamond_boots"); - modulesmovementui.button("飛行検知", "textures/items/elytra"); - modulesmovementui.button("Sprint検知", "textures/items/diamond_boots"); - modulesmovementui.button("速さ検知", "textures/items/diamond_boots"); - modulesmovementui.button("Scaffold検知", "textures/blocks/scaffolding_top"); - modulesmovementui.button("水の上走ってるやつ検知", "textures/blocks/lava_placeholder"); - modulesmovementui - .show(player) - .then((movementResult) => { - switch (movementResult.selection) { - case 0: - antiKnockBackHandler(player); - break; - case 1: - antiFallHandler(player); - break; - case 2: - antiFlyHandler(player); - break; - case 3: - invalidSprintHandler(player); - break; - case 4: - speedAHandler(player); - break; - case 5: - antiScaffoldAHandler(player); - break; - case 6: - antiJesusAHandler(player); - break; - default: - break; - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antifall.js b/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antifall.js deleted file mode 100644 index 53595d1..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antifall.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTIFALL } from "../../../../modules/uiAntiFall"; -export function antiFallHandler(player) { - //Anti Fall - const modulesantifallui = new ModalFormData(); - const antifallABoolean = dynamicPropertyRegistry.get("antifalla_b"); - modulesantifallui.title("§4メニュー:Anti Fall§4"); - modulesantifallui.toggle("サバイバルでの落下ダメが無かったら検知します", antifallABoolean); - modulesantifallui - .show(player) - .then((antifallResult) => { - uiANTIFALL(antifallResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antifly.js b/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antifly.js deleted file mode 100644 index ac2ea26..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antifly.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTIFLY } from "../../../../modules/uiAntiFly"; -export function antiFlyHandler(player) { - //Anti Fly - const modulesantiflyui = new ModalFormData(); - const flyABoolean = dynamicPropertyRegistry.get("flya_b"); - modulesantiflyui.title("§4メニュー:Anti Fly§4"); - modulesantiflyui.toggle("よく飛んでるハエ【C】を検知します", flyABoolean); - modulesantiflyui - .show(player) - .then((antiflyResult) => { - uiANTIFLY(antiflyResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antijesusa.js b/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antijesusa.js deleted file mode 100644 index 33cbfd4..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antijesusa.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTIJESUS } from "../../../../modules/uiAntiJesus"; -export function antiJesusAHandler(player) { - //Jesus UI - const modulesantijesusui = new ModalFormData(); - const jesusaBoolean = dynamicPropertyRegistry.get("jesusa_b"); - modulesantijesusui.title("§4メニュー:Anti Jesus§4"); - modulesantijesusui.toggle("水の上やマグマの上を歩いていたら検知します", jesusaBoolean); - modulesantijesusui - .show(player) - .then((antijesusResult) => { - uiANTIJESUS(antijesusResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antiknockback.js b/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antiknockback.js deleted file mode 100644 index b5fdd74..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antiknockback.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTIKNOCKBACK } from "../../../../modules/uiAntiKnockback"; -export function antiKnockBackHandler(player) { - //Anti Knockback UI - const modulesantiknockbackui = new ModalFormData(); - const antikbBoolean = dynamicPropertyRegistry.get("antikb_b"); - modulesantiknockbackui.title("§4メニュー:Anti KnockBack§4"); - modulesantiknockbackui.toggle("プレイヤーがノックバックしなかったら検知します:", antikbBoolean); - modulesantiknockbackui - .show(player) - .then((antikbResult) => { - uiANTIKNOCKBACK(antikbResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antiscaffolda.js b/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antiscaffolda.js deleted file mode 100644 index 5945530..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/antiscaffolda.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTISCAFFOLD } from "../../../../modules/uiAntiScaffold"; -export function antiScaffoldAHandler(player) { - //AntiScaffold - const modulesantiscaffoldui = new ModalFormData(); - const antiScaffoldABoolean = dynamicPropertyRegistry.get("antiscaffolda_b"); - modulesantiscaffoldui.title("§4メニュー:Anti Scaffold§4"); - modulesantiscaffoldui.toggle("チーター御用達のScaffoldを検知します", antiScaffoldABoolean); - modulesantiscaffoldui - .show(player) - .then((antiscaffoldResult) => { - uiANTISCAFFOLD(antiscaffoldResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/invalidsprint.js b/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/invalidsprint.js deleted file mode 100644 index dcdedd1..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/invalidsprint.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { uiINVALIDSPRINT } from "../../../../modules/uiInvalidSprint"; -import { dynamicPropertyRegistry } from "../../../../../penrose/WorldInitializeAfterEvent/registry"; -export function invalidSprintHandler(player) { - //Invalid Sprint - const modulesinvalidsprintui = new ModalFormData(); - const invalidSprintABoolean = dynamicPropertyRegistry.get("invalidsprinta_b"); - modulesinvalidsprintui.title("§4メニュー:Invalid Sprint§4"); - modulesinvalidsprintui.toggle("不自然な動きを検知します", invalidSprintABoolean); - modulesinvalidsprintui - .show(player) - .then((invalidsprintResult) => { - uiINVALIDSPRINT(invalidsprintResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/speeda.js b/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/speeda.js deleted file mode 100644 index 31ff8d7..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/guiHandlerMovement/results/speeda.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiSPEED } from "../../../../modules/uiSpeed"; -export function speedAHandler(player) { - //SpeedA - const modulesspeedui = new ModalFormData(); - const speedABoolean = dynamicPropertyRegistry.get("speeda_b"); - modulesspeedui.title("§4メニュー:Speed§4"); - modulesspeedui.toggle("早すぎるスピードを検知します", speedABoolean); - modulesspeedui - .show(player) - .then((invalidsprintResult) => { - uiSPEED(invalidsprintResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/modulesui.js b/build/scripts/gui/guiHandler/guiHandlerModules/modulesui.js deleted file mode 100644 index 99fbc73..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/modulesui.js +++ /dev/null @@ -1,145 +0,0 @@ -import { ActionFormData } from "@minecraft/server-ui"; -import { gamemodesHandler } from "./results/gamemodes"; -import { movementui } from "./guiHandlerMovement/movementui"; -import { antiKillAuraHandler } from "./results/antikillaura"; -import { antiNukerAHandler } from "./results/antinuker"; -import { antiShulkerHandler } from "./results/antishulker"; -import { antiSpamHandler } from "./results/antispam"; -import { antiAutoClickerHandler } from "./results/antiautoclicker"; -import { badPacketsHandler } from "./results/badpackets"; -import { bedrockValidationHandler } from "./results/bedrockvalidation"; -import { antiCrasherHandler } from "./results/anticrasher"; -import { antiEnchantedArmorHandler } from "./results/enchantedarmor"; -import { illegalItemsHandler } from "./results/illegalitems"; -import { lagClearHandler } from "./results/lagclear"; -import { nameSpoofHandler } from "./results/namespoofing"; -import { opsHandler } from "./results/oneplayersleep"; -import { commandBlocksHandler } from "./results/commandblocks"; -import { reachHandler } from "./results/reach"; -import { salvageHandler } from "./results/salvage"; -import { spammersHandler } from "./results/spammers"; -import { worldBorderHandler } from "./results/worldborder"; -import { xrayHandler } from "./results/xray"; -import { hotbarHandler } from "./results/hotbar"; -import { afkHandler } from "./results/afk"; -import { antiPhaseAHandler } from "./results/antiphase"; -export function modulesui(player) { - //Modules ui - const modulesui = new ActionFormData(); - modulesui.title("§4アンチチート設定§4"); - modulesui.button("禁止するゲームモード", "textures/items/totem"); - modulesui.button("移動系", "textures/ui/move"); - modulesui.button("KillAura検知", "textures/items/diamond_sword"); - modulesui.button("Nukerを対策", "textures/blocks/tnt_side"); - modulesui.button("シュルカーを禁止", "textures/blocks/shulker_top_purple"); - modulesui.button("スパム", "textures/ui/mute_off"); - modulesui.button("AutoCliker検知", "textures/ui/cursor_gamecore"); - modulesui.button("Badpackets検知", "textures/ui/upload_glyph"); - modulesui.button("Bedrock Validationを設定", "textures/blocks/bedrock"); - modulesui.button("Anti Crasher検知", "textures/ui/Ping_Red"); - modulesui.button("エンチャントアーマーを無効化", "textures/items/diamond_leggings"); - modulesui.button("禁止アイテムを検知", "textures/items/netherite_pickaxe"); - modulesui.button("サーバー最適化", "textures/ui/interact"); - modulesui.button("Name spoofingを検知", "textures/items/fishing_rod_uncast"); - modulesui.button("一人寝たら朝になるよ!", "textures/items/bed_red"); - modulesui.button("ワールドでのコマブロを禁止", "textures/blocks/command_block"); - modulesui.button("リーチを確認", "textures/ui/crossout"); - modulesui.button("Salvage System【よくわからん】", "textures/blocks/smithing_table_front"); - modulesui.button("スパム設定", "textures/ui/mute_on"); - modulesui.button("ワールドボーダーを設定", "textures/blocks/barrier"); - modulesui.button("Xray誰がなんの鉱石手に入れたか分かる", "textures/blocks/diamond_ore"); - modulesui.button("ホットバーメッセージ", "textures/items/paper"); - modulesui.button("放置民キック", "textures/ui/keyboard_and_mouse_glyph_color"); - modulesui.button("壁抜け検知", "textures/blocks/end_portal"); - modulesui - .show(player) - .then((ModulesUIResult) => { - switch (ModulesUIResult.selection) { - case 0: - gamemodesHandler(player); - break; - case 1: - movementui(player); - break; - case 2: - antiKillAuraHandler(player); - break; - case 3: - antiNukerAHandler(player); - break; - case 4: - antiShulkerHandler(player); - break; - case 5: - antiSpamHandler(player); - break; - case 6: - antiAutoClickerHandler(player); - break; - case 7: - badPacketsHandler(player); - break; - case 8: - bedrockValidationHandler(player); - break; - case 9: - antiCrasherHandler(player); - break; - case 10: - antiEnchantedArmorHandler(player); - break; - case 11: - illegalItemsHandler(player); - break; - case 12: - lagClearHandler(player); - break; - case 13: - nameSpoofHandler(player); - break; - case 14: - opsHandler(player); - break; - case 15: - commandBlocksHandler(player); - break; - case 16: - reachHandler(player); - break; - case 17: - salvageHandler(player); - break; - case 18: - spammersHandler(player); - break; - case 19: - worldBorderHandler(player); - break; - case 20: - xrayHandler(player); - break; - case 21: - hotbarHandler(player); - break; - case 22: - afkHandler(player); - break; - case 23: - antiPhaseAHandler(player); - break; - default: - break; - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/afk.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/afk.js deleted file mode 100644 index 784f0c7..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/afk.js +++ /dev/null @@ -1,27 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import config from "../../../../data/config"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiAFK } from "../../../modules/uiAFK"; -export function afkHandler(player) { - const modulesafkui = new ModalFormData(); - const currentAFKConifg = config.modules.afk.minutes; - const afkBoolean = dynamicPropertyRegistry.get("afk_b"); - modulesafkui.title("§4メニュー:AFK§4"); - modulesafkui.toggle("放置しているユーザーをキック" + currentAFKConifg + " 一分:", afkBoolean); - modulesafkui - .show(player) - .then((afkResult) => { - uiAFK(afkResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/antiautoclicker.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/antiautoclicker.js deleted file mode 100644 index dc94612..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/antiautoclicker.js +++ /dev/null @@ -1,25 +0,0 @@ -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTIAUTOCLICKER } from "../../../modules/uiAntiAutoClicker"; -import { ModalFormData } from "@minecraft/server-ui"; -export function antiAutoClickerHandler(player) { - const autoClickerBoolean = dynamicPropertyRegistry.get("autoclicker_b"); - const modulesantiautoclickerui = new ModalFormData(); - modulesantiautoclickerui.title("§4メニュー:Anti AutoClicker§4"); - modulesantiautoclickerui.toggle("不自然な攻撃を検知します", autoClickerBoolean); - modulesantiautoclickerui - .show(player) - .then((antiautoclickerResult) => { - uiANTIAUTOCLICKER(antiautoclickerResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/anticrasher.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/anticrasher.js deleted file mode 100644 index 34af705..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/anticrasher.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTICRASHER } from "../../../modules/uiAntiCrasher"; -export function antiCrasherHandler(player) { - const modulesanticrasherui = new ModalFormData(); - const crasherABoolean = dynamicPropertyRegistry.get("crashera_b"); - modulesanticrasherui.title("§4メニュー:Anti Crasher§4"); - modulesanticrasherui.toggle("サーバークラッシュを防ぎます", crasherABoolean); - modulesanticrasherui - .show(player) - .then((anticrasherResult) => { - uiANTICRASHER(anticrasherResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/antikillaura.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/antikillaura.js deleted file mode 100644 index 9f3568d..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/antikillaura.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTIKILLAURA } from "../../../modules/uiAntiKillaura"; -export function antiKillAuraHandler(player) { - const modulesantikillaura = new ModalFormData(); - const antiKillAuraBoolean = dynamicPropertyRegistry.get("antikillaura_b"); - modulesantikillaura.title("§4メニュー:Anti KillAura§4"); - modulesantikillaura.toggle("360°から攻撃されたら100%検知されます", antiKillAuraBoolean); - modulesantikillaura - .show(player) - .then((antikillauraResult) => { - uiANTIKILLAURA(antikillauraResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/antinuker.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/antinuker.js deleted file mode 100644 index 1395547..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/antinuker.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTINUKER } from "../../../modules/uiAntiNuker"; -export function antiNukerAHandler(player) { - const modulesantinukerui = new ModalFormData(); - const antiNukerABoolean = dynamicPropertyRegistry.get("antinukera_b"); - modulesantinukerui.title("§4メニュー:Anti Nuker§4"); - modulesantinukerui.toggle("一括破壊を検知します【ほかのアドオンは除く】", antiNukerABoolean); - modulesantinukerui - .show(player) - .then((antinukerResult) => { - uiANTINUKER(antinukerResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/antiphase.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/antiphase.js deleted file mode 100644 index 2bb17e7..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/antiphase.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTIPHASE } from "../../../modules/uiAntiPhase"; -export function antiPhaseAHandler(player) { - const modulesantiphaseui = new ModalFormData(); - const antiPhaseBoolean = dynamicPropertyRegistry.get("antiphasea_b"); - modulesantiphaseui.title("§4メニュー:Anti Phase§4"); - modulesantiphaseui.toggle("ユーザーが壁抜けしているかを検知します", antiPhaseBoolean); - modulesantiphaseui - .show(player) - .then((antiphaseResult) => { - uiANTIPHASE(antiphaseResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/antishulker.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/antishulker.js deleted file mode 100644 index 0127668..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/antishulker.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTISHULKER } from "../../../modules/uiAntiShulker"; -export function antiShulkerHandler(player) { - const modulesantishulkerui = new ModalFormData(); - const antiShulkerBoolean = dynamicPropertyRegistry.get("antishulker_b"); - modulesantishulkerui.title("§4メニュー:Anti Shulker§4"); - modulesantishulkerui.toggle("シュルカーの使用を禁止します", antiShulkerBoolean); - modulesantishulkerui - .show(player) - .then((antishulkerResult) => { - uiANTISHULKER(antishulkerResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/antispam.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/antispam.js deleted file mode 100644 index 5bc06a4..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/antispam.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiANTISPAM } from "../../../modules/uiAntiSpam"; -export function antiSpamHandler(player) { - const modulesantispamui = new ModalFormData(); - const antiSpamBoolean = dynamicPropertyRegistry.get("antispam_b"); - modulesantispamui.title("§4メニュー:Anti Spam§4"); - modulesantispamui.toggle("二秒以内に連続でチャットしていると少しまってねの通知がきます:", antiSpamBoolean); - modulesantispamui - .show(player) - .then((antispamResult) => { - uiANTISPAM(antispamResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/badpackets.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/badpackets.js deleted file mode 100644 index 9bca7dc..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/badpackets.js +++ /dev/null @@ -1,27 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { uiBADPACKETS } from "../../../modules/uiBadpackets"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -export function badPacketsHandler(player) { - const modulesbadpacketsui = new ModalFormData(); - const badPackets1Boolean = dynamicPropertyRegistry.get("badpackets1_b"); - const badPackets2Boolean = dynamicPropertyRegistry.get("badpackets2_b"); - modulesbadpacketsui.title("§4メニュー:Badpackets§4"); - modulesbadpacketsui.toggle("各ブロードキャストでメッセージの長さをチェックします。", badPackets1Boolean); - modulesbadpacketsui.toggle("プレイヤーごとに無効な選択されたスロットをチェックします。", badPackets2Boolean); - modulesbadpacketsui - .show(player) - .then((badpacketsResult) => { - uiBADPACKETS(badpacketsResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/bedrockvalidation.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/bedrockvalidation.js deleted file mode 100644 index f6b6331..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/bedrockvalidation.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiBEDROCKVALIDATION } from "../../../modules/uiBedrockValidation"; -export function bedrockValidationHandler(player) { - const modulesbedrockvalidateui = new ModalFormData(); - const bedrockValidateBoolean = dynamicPropertyRegistry.get("bedrockvalidate_b"); - modulesbedrockvalidateui.title("§4メニュー:Bedrock Validation§4"); - modulesbedrockvalidateui.toggle("岩盤が無事かをチェックします", bedrockValidateBoolean); - modulesbedrockvalidateui - .show(player) - .then((bedrockvalidationResult) => { - uiBEDROCKVALIDATION(bedrockvalidationResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/commandblocks.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/commandblocks.js deleted file mode 100644 index d527eb7..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/commandblocks.js +++ /dev/null @@ -1,42 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { getScore } from "../../../../util"; -import { uiCOMMANDBLOCKS } from "../../../modules/uiCommandBlocks"; -export function commandBlocksHandler(player) { - const modulescommandblocksui = new ModalFormData(); - const cmdsscore = getScore("cmds", player); - const commandblocksscore = getScore("commandblocks", player); - let removecmdblocksBoolean; - Boolean; - let cmdoBoolean; - if (cmdsscore <= 0) { - cmdoBoolean = false; - } - if (cmdsscore >= 1) { - cmdoBoolean = true; - } - if (commandblocksscore <= 0) { - removecmdblocksBoolean = false; - } - if (commandblocksscore >= 1) { - removecmdblocksBoolean = true; - } - modulescommandblocksui.title("§4メニュー:Command Blocks§4"); - modulescommandblocksui.toggle("Override Command Blocks - commandblocksenabled gameruleを常に有効または無効にします:", cmdoBoolean); - modulescommandblocksui.toggle("アンチコマンドブロック(Anti Command Blocks) - 有効にすると、すべてのコマンドブロックを消します", removecmdblocksBoolean); - modulescommandblocksui - .show(player) - .then((commandblockResult) => { - uiCOMMANDBLOCKS(commandblockResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/enchantedarmor.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/enchantedarmor.js deleted file mode 100644 index dae8ac8..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/enchantedarmor.js +++ /dev/null @@ -1,36 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { getScore } from "../../../../util"; -import { uiENCHANTEDARMOR } from "../../../modules/uiEnchantedArmor"; -export function antiEnchantedArmorHandler(player) { - const modulesenchantedarmorui = new ModalFormData(); - const encharmorscore = getScore("encharmor", player); - let enchantedarmorBoolean; - /**get the score value and then check to see if its already enable or already disabled - * so we can then update the control boolean to disaply its current setting to the player - * in the menu. - */ - if (encharmorscore <= 0) { - enchantedarmorBoolean = false; - } - if (encharmorscore >= 1) { - enchantedarmorBoolean = true; - } - modulesenchantedarmorui.title("§4メニュー:Enchanted Armor§4"); - modulesenchantedarmorui.toggle("すべてのプレイヤーにからエンチャ防具を削除:", enchantedarmorBoolean); - modulesenchantedarmorui - .show(player) - .then((enchantedarmorResult) => { - uiENCHANTEDARMOR(enchantedarmorResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/gamemodes.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/gamemodes.js deleted file mode 100644 index f2ba223..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/gamemodes.js +++ /dev/null @@ -1,30 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiGAMEMODES } from "../../../modules/uiGamemodes"; -export function gamemodesHandler(player) { - //GameModes UI - const gamemodesui = new ModalFormData(); - const adventureGMBoolean = dynamicPropertyRegistry.get("adventuregm_b"); - const creativeGMBoolean = dynamicPropertyRegistry.get("creativegm_b"); - const survivalGMBoolean = dynamicPropertyRegistry.get("survivalgm_b"); - gamemodesui.title("§4ゲームモード§4"); - gamemodesui.toggle("アドベンチャーモードを無効:", adventureGMBoolean); - gamemodesui.toggle("クリエイティブモードを無効:", creativeGMBoolean); - gamemodesui.toggle("サバイバルモードを無効:", survivalGMBoolean); - gamemodesui - .show(player) - .then((gamemodeResult) => { - uiGAMEMODES(gamemodeResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/hotbar.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/hotbar.js deleted file mode 100644 index 621bb6d..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/hotbar.js +++ /dev/null @@ -1,29 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import config from "../../../../data/config"; -import { uiHOTBAR } from "../../../modules/uiHotbar"; -export function hotbarHandler(player) { - const moduleshotbarui = new ModalFormData(); - const hotbarBoolean = dynamicPropertyRegistry.get("hotbar_b"); - const CurrentHotbarConfig = config.modules.hotbar.message; - moduleshotbarui.title("§4メニュー:Hotbar§4"); - moduleshotbarui.textField("ホットバー: ", "", CurrentHotbarConfig); - moduleshotbarui.toggle("ホットバーメッセージを表示します:", hotbarBoolean); - moduleshotbarui.toggle("config.jsに保存されているメッセージに変更", false); - moduleshotbarui - .show(player) - .then((hotbarResult) => { - uiHOTBAR(hotbarResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/illegalitems.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/illegalitems.js deleted file mode 100644 index 2d9f9d4..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/illegalitems.js +++ /dev/null @@ -1,36 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiILLEGALITEMS } from "../../../modules/uiIllegaItems"; -export function illegalItemsHandler(player) { - //Illegal items this will cover a few modules so will group these into one UI. - const modulesillegalitemsui = new ModalFormData(); - const illegalItemsABoolean = dynamicPropertyRegistry.get("illegalitemsa_b"); - const illegalItemsBBoolean = dynamicPropertyRegistry.get("illegalitemsb_b"); - const illegalItemsCBoolean = dynamicPropertyRegistry.get("illegalitemsc_b"); - const illegalEnchantmentBoolean = dynamicPropertyRegistry.get("illegalenchantment_b"); - const illegalLoresBoolean = dynamicPropertyRegistry.get("illegallores_b"); - const stackBanBoolean = dynamicPropertyRegistry.get("stackban_b"); - modulesillegalitemsui.title("§4メニュー:Illegal Items§4"); - modulesillegalitemsui.toggle("不正なアイテムをインベントリに入れているプレイヤーをチェックする:", illegalItemsABoolean); - modulesillegalitemsui.toggle("不正アイテムを置いたプレーヤーをチェックする。:", illegalItemsBBoolean); - modulesillegalitemsui.toggle("不正な落とし物がないかチェックする:", illegalItemsCBoolean); - modulesillegalitemsui.toggle("違法なエンチャントが施されたアイテムをチェックする:", illegalEnchantmentBoolean); - modulesillegalitemsui.toggle("アイテムに不正な名前がないかチェックします:", illegalLoresBoolean); - modulesillegalitemsui.toggle("アイテムが64以上超えていたら検知します", stackBanBoolean); - modulesillegalitemsui - .show(player) - .then((illegalitemsResult) => { - uiILLEGALITEMS(illegalitemsResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/lagclear.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/lagclear.js deleted file mode 100644 index f404f0c..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/lagclear.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiLAGCLEAR } from "../../../modules/uiLagClear"; -export function lagClearHandler(player) { - //Lagclear - const moduleslaglearui = new ModalFormData(); - const clearLagBoolean = dynamicPropertyRegistry.get("clearlag_b"); - moduleslaglearui.title("§4メニュー:Clear Lag§4"); - moduleslaglearui.toggle("サーバーを最適化します", clearLagBoolean); - moduleslaglearui - .show(player) - .then((lagclearResult) => { - uiLAGCLEAR(lagclearResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/namespoofing.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/namespoofing.js deleted file mode 100644 index 2458add..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/namespoofing.js +++ /dev/null @@ -1,28 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiNAMESPOOFING } from "../../../modules/uiNameSpoofing"; -export function nameSpoofHandler(player) { - //Namespoofing - const modulesnamespoofingui = new ModalFormData(); - const nameSpoofABoolean = dynamicPropertyRegistry.get("namespoofa_b"); - const nameSpoofBBoolean = dynamicPropertyRegistry.get("namespoofb_b"); - modulesnamespoofingui.title("§4メニュー:Name spoofing§4"); - modulesnamespoofingui.toggle("ユーザー名が文字数制限を超えていないかチェックする。:", nameSpoofABoolean); - modulesnamespoofingui.toggle("ASCII以外の文字を含むユーザー名をチェックする。:", nameSpoofBBoolean); - modulesnamespoofingui - .show(player) - .then((namespoofingResult) => { - uiNAMESPOOFING(namespoofingResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/oneplayersleep.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/oneplayersleep.js deleted file mode 100644 index 00a6ac1..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/oneplayersleep.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiOPS } from "../../../modules/uiOnePlayerSleep"; -export function opsHandler(player) { - const modulesopsui = new ModalFormData(); - const opsBoolean = dynamicPropertyRegistry.get("ops_b"); - modulesopsui.title("§4メニュー:OPS§4"); - modulesopsui.toggle("レルムズ用複数人で寝なくても一人寝れば朝になります:", opsBoolean); - modulesopsui - .show(player) - .then((opsResult) => { - uiOPS(opsResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/reach.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/reach.js deleted file mode 100644 index 280ad9d..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/reach.js +++ /dev/null @@ -1,27 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiREACH } from "../../../modules/uiReach"; -export function reachHandler(player) { - const modulesreachui = new ModalFormData(); - const reachABoolean = dynamicPropertyRegistry.get("reacha_b"); - const reachBBoolean = dynamicPropertyRegistry.get("reachb_b"); - modulesreachui.title("§4メニュー:Reach§4"); - modulesreachui.toggle("遠くにブロックを設置しれいないかを検知:", reachABoolean); - modulesreachui.toggle("プレイヤーに対して攻撃範囲が伸びてないかを検知", reachBBoolean); - modulesreachui - .show(player) - .then((reachResult) => { - uiREACH(reachResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/salvage.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/salvage.js deleted file mode 100644 index 3e6c0c3..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/salvage.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiEXPSALVAGESYSTEM } from "../../../modules/uiExpSalvageSystem"; -export function salvageHandler(player) { - //New Slavage System - const modulesexpsavlagesystem = new ModalFormData(); - const salvageBoolean = dynamicPropertyRegistry.get("salvage_b"); - modulesexpsavlagesystem.title("§4メニュー:Salvage System§4"); - modulesexpsavlagesystem.toggle("良く分からないやつ", salvageBoolean); - modulesexpsavlagesystem - .show(player) - .then((salvagesystemResult) => { - uiEXPSALVAGESYSTEM(salvagesystemResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/spammers.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/spammers.js deleted file mode 100644 index af70a2b..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/spammers.js +++ /dev/null @@ -1,29 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiSPAMMER } from "../../../modules/uiSpammer"; -export function spammersHandler(player) { - const modulesspamui = new ModalFormData(); - const spammerABoolean = dynamicPropertyRegistry.get("spammera_b"); - const spammerBBoolean = dynamicPropertyRegistry.get("spammerb_b"); - const spammerCBoolean = dynamicPropertyRegistry.get("spammerc_b"); - modulesspamui.title("§4メニュー:Spam Modules§4"); - modulesspamui.toggle("歩きながらチャットしているか?を検知:", spammerABoolean); - modulesspamui.toggle("泳ぎながらチャットしているか?を検知:", spammerBBoolean); - modulesspamui.toggle("アイテムを使用又は食べながらチャットしているか?を検知:", spammerCBoolean); - modulesspamui - .show(player) - .then((spamResult) => { - uiSPAMMER(spamResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/worldborder.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/worldborder.js deleted file mode 100644 index a5feff5..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/worldborder.js +++ /dev/null @@ -1,31 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiWORLDBORDER } from "../../../modules/uiWorldborder"; -export function worldBorderHandler(player) { - const modulesworldborderui = new ModalFormData(); - const overWorldBorderBoolean = dynamicPropertyRegistry.get("worldborder_b"); - const overworldBorderNumber = dynamicPropertyRegistry.get("worldborder_n"); - const netherworldBorderNumber = dynamicPropertyRegistry.get("worldborder_nether_n"); - const endworldBorderNumber = dynamicPropertyRegistry.get("worldborder_end_n"); - modulesworldborderui.title("§4メニュー:World Border§4"); - modulesworldborderui.textField("現世でのワールドボーダー設定", "1000", String(overworldBorderNumber)); - modulesworldborderui.textField("ネザーでのワールドボーダー設定", "0", String(netherworldBorderNumber)); - modulesworldborderui.textField("エンドでのワールドボーダーの設定:", "0", String(endworldBorderNumber)); - modulesworldborderui.toggle("ワールドボーダーを有効無効を切り替える", overWorldBorderBoolean); - modulesworldborderui - .show(player) - .then((spamResult) => { - uiWORLDBORDER(spamResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/guiHandlerModules/results/xray.js b/build/scripts/gui/guiHandler/guiHandlerModules/results/xray.js deleted file mode 100644 index 2ebfd8c..0000000 --- a/build/scripts/gui/guiHandler/guiHandlerModules/results/xray.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../../../penrose/WorldInitializeAfterEvent/registry"; -import { uiXRAY } from "../../../modules/uiXray"; -export function xrayHandler(player) { - const modulesxtrayui = new ModalFormData(); - modulesxtrayui.title("§4メニュー:Xray§4"); - const xrayBoolean = dynamicPropertyRegistry.get("xraya_b"); - modulesxtrayui.toggle("ユーザーが掘った鉱石の場所が分かります", xrayBoolean); - modulesxtrayui - .show(player) - .then((xrayResult) => { - uiXRAY(xrayResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/results/chatChannelsMenu.js b/build/scripts/gui/guiHandler/results/chatChannelsMenu.js deleted file mode 100644 index 314f49e..0000000 --- a/build/scripts/gui/guiHandler/results/chatChannelsMenu.js +++ /dev/null @@ -1,27 +0,0 @@ -import { ActionFormData } from "@minecraft/server-ui"; -import { chatChannelsCreateMenuUI } from "../../playerui/chatChannels/uiChatChannelsCreateMenu"; -import { ChatChannelsJoinMenuUI } from "../../playerui/chatChannels/uiChatChannelsJoinMenu"; -import { ChatChannelsInviteMenuUI } from "../../playerui/chatChannels/uiChatChannelsInviteMenu"; -export function chatChannelMainMenu(player) { - const menu = new ActionFormData(); - menu.title("§4チャンネルメニュー!§4"); - menu.button("チャンネルを作る"); - menu.button("チャンネルに参加!"); - menu.button("プレイヤーを招待"); - menu.button("チャンネルから抜ける"); - menu.button("チャンネルを削除"); - menu.show(player).then((chatChannelsMenuUIResult) => { - switch (chatChannelsMenuUIResult.selection) { - case 0: - chatChannelsCreateMenuUI(player); - break; - case 1: - ChatChannelsJoinMenuUI(player); - break; - case 2: - ChatChannelsInviteMenuUI(player); - default: - break; - } - }); -} diff --git a/build/scripts/gui/guiHandler/results/deop.js b/build/scripts/gui/guiHandler/results/deop.js deleted file mode 100644 index 26b4b7a..0000000 --- a/build/scripts/gui/guiHandler/results/deop.js +++ /dev/null @@ -1,27 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiDEOP } from "../../moderation/uiDeop"; -export function deopHandler(player) { - // New window for deop - const deopgui = new ModalFormData(); - let onlineList = []; - deopgui.title("§4管理者権限剝奪§4"); - onlineList = Array.from(world.getPlayers(), (player) => player.name); - deopgui.dropdown(`\n§fユーザーを選択:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - deopgui - .show(player) - .then((opResult) => { - uiDEOP(opResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/results/location.js b/build/scripts/gui/guiHandler/results/location.js deleted file mode 100644 index 6403b4e..0000000 --- a/build/scripts/gui/guiHandler/results/location.js +++ /dev/null @@ -1,72 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { decryptString, sendMsgToPlayer } from "../../../util"; -import config from "../../../data/config"; -import { uiSAVEDLOCATIONS } from "../../playerui/uiSavedLocations"; -export function locationHandler(player) { - //No Opped Menu to show Saved Locations - const savedlocationsui = new ModalFormData(); - // Hash the coordinates for security - const salt = world.getDynamicProperty("crypt"); - const tags = player.getTags(); - const tagsLength = tags.length; - let counter = 0; - const Locations = []; - const coordsArray = []; - for (let i = 0; i < tagsLength; i++) { - if (tags[i].startsWith("1337")) { - // Decode it so we can verify it - tags[i] = decryptString(tags[i], salt); - // If invalid then skip it - if (tags[i].startsWith("LocationHome:") === false) { - continue; - } - // Split string into array - const coordinatesArray = tags[i].split(" "); - const coordArrayLength = coordinatesArray.length; - counter = ++counter; - for (let i = 0; i < coordArrayLength; i++) { - // Get their location from the array - coordsArray.push(coordinatesArray[i]); - if (coordinatesArray[i].includes("LocationHome:")) { - Locations.push(coordinatesArray[i].replace("LocationHome:", "")); - } - continue; - } - } - } - if (Locations.length === 0) { - /*No locations saved so it will crap its self! - So if there is no data we push a line to keep the array with at least 1 value. - If there are saved locations then it will continue as normal. - */ - Locations.push("保存されている座標はありません"); - } - savedlocationsui.title("§4座標保存§4"); - savedlocationsui.dropdown(`\n§r座標を選択してください新しく座標を作る際日本語では無く英語またはローマ字で保存してください例:home,ie,kouenn,niwa,等§r\n\n以下の座標が保存されています\n`, Locations); - savedlocationsui.toggle("選択した座標にTP【使う時オン】", false); - savedlocationsui.toggle("選択した座標を削除します【消すときだけオンにしてね】", false); - savedlocationsui.textField("ここの下に名前を入れると今いる座標が保存されます【例:home】", ""); - if (config.customcommands.sethome === true && config.customcommands.delhome === true && config.customcommands.listhome === true && config.customcommands.gohome === true) { - savedlocationsui - .show(player) - .then((savedlocationsResult) => { - uiSAVEDLOCATIONS(savedlocationsResult, Locations, player, coordsArray); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f セーブした座標が削除されました!`); - return; - } -} diff --git a/build/scripts/gui/guiHandler/results/op.js b/build/scripts/gui/guiHandler/results/op.js deleted file mode 100644 index 4e7ff85..0000000 --- a/build/scripts/gui/guiHandler/results/op.js +++ /dev/null @@ -1,41 +0,0 @@ -import { world } from "@minecraft/server"; -import { ActionFormData, ModalFormData } from "@minecraft/server-ui"; -import config from "../../../data/config"; -import { uiOP } from "../../moderation/uiOp"; -export function opHandler(player, uniqueId, salt, hash) { - // New window for op - let opgui; - let onlineList = []; - if (uniqueId === player.name) { - opgui = new ModalFormData(); - opgui.title("§4管理者§4"); - onlineList = Array.from(world.getPlayers(), (player) => player.name); - opgui.dropdown(`\n§fユーザーを指定:§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - } - else if (!config.encryption.password) { - opgui = new ActionFormData(); - opgui.title("§4管理者§4"); - opgui.button("OP権限取得", "textures/ui/op"); - } - else if (config.encryption.password) { - opgui = new ModalFormData(); - opgui.title("§4レルムズ用管理者§4"); - opgui.textField("パスワード:", ""); - } - opgui - .show(player) - .then((opResult) => { - uiOP(opResult, salt, hash, player, onlineList); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/results/prefix.js b/build/scripts/gui/guiHandler/results/prefix.js deleted file mode 100644 index c4e74d4..0000000 --- a/build/scripts/gui/guiHandler/results/prefix.js +++ /dev/null @@ -1,30 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiPREFIX } from "../../moderation/uiPrefix"; -export function prefixHandler(player) { - //Prefix ui - const prefixui = new ModalFormData(); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - prefixui.title("§4起動文字変更§4"); - prefixui.dropdown(`\n変えたい文字指定:\n\n以下のプレイヤーがオンラインです\n`, onlineList); - prefixui.textField(`\n文字:\n`, `新しい起動文字`, null); - prefixui.toggle(`\nリセット:`, false); - prefixui - .show(player) - .then((prefixResult) => { - //Prefix logic - uiPREFIX(prefixResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/results/report.js b/build/scripts/gui/guiHandler/results/report.js deleted file mode 100644 index 546e8eb..0000000 --- a/build/scripts/gui/guiHandler/results/report.js +++ /dev/null @@ -1,28 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { UIREPORTPLAYER } from "../../playerui/uiReport"; -export function reportHandler(player) { - //Non Opped player Report UI - const reportplayerui = new ModalFormData(); - reportplayerui.title("§4報告§4"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - reportplayerui.dropdown(`\n§r報告したいプレイヤーがを選択してください!バグなどは【FairImpala41312】がオンラインだと思うのでその人に送ってね!荒らしやチーターはその荒らしのユーザーをオンラインの中から指定してこの人荒らしなどの理由で報告してね具体的だと運営としてはうれしい§r\n\n以下のプレイヤーがオンラインです\n`, onlineList); - reportplayerui.textField("報告したい内容を入れてください", ""); - reportplayerui - .show(player) - .then((reportResult) => { - UIREPORTPLAYER(reportResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/results/stats.js b/build/scripts/gui/guiHandler/results/stats.js deleted file mode 100644 index 0088529..0000000 --- a/build/scripts/gui/guiHandler/results/stats.js +++ /dev/null @@ -1,27 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiSTATS } from "../../moderation/uiStats"; -export function statsHandler(player) { - //UI Stats - const statsui = new ModalFormData(); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - statsui.title("§4ユーザーログ§4"); - statsui.dropdown(`\n§fユーザーを指定§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - statsui - .show(player) - .then((statsResult) => { - uiSTATS(statsResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/guiHandler/results/tpr.js b/build/scripts/gui/guiHandler/results/tpr.js deleted file mode 100644 index d954c62..0000000 --- a/build/scripts/gui/guiHandler/results/tpr.js +++ /dev/null @@ -1,91 +0,0 @@ -import { world } from "@minecraft/server"; -import { ActionFormData, MessageFormData, ModalFormData } from "@minecraft/server-ui"; -import { getTeleportRequests } from "../../../commands/utility/tpr"; -import { uiTPR } from "../../moderation/uiTpr"; -import { uiTPRSEND } from "../../moderation/uiTprSend"; -export function tprHandler(player) { - //TPR ui - const tprui = new ActionFormData(); - //let onlineList: string[] = []; - // onlineList = Array.from(world.getPlayers(), (player) => player.name); - tprui.title("§4TPリクエスト§4"); - tprui.button("私宛のリクエスト", "textures/ui/mail_icon"); - tprui.button("TPリクエストを送る", "textures/ui/send_icon"); - tprui - .show(player) - .then((tprmenuResult) => { - if (tprmenuResult.selection === 0) { - let teleportRequests = []; - teleportRequests = getTeleportRequests(); - const requestIndex = teleportRequests.findIndex((r) => r.target === player); - const request = teleportRequests[requestIndex]; - let respons; - const toMinutes = new Date(request.expiresAt); - const tprinboxui = new MessageFormData(); - tprinboxui.title("私宛のリクエストを"); - tprinboxui.body(request.requester.name + " 下のボタンを使って、このリクエストを承認または拒否してください。 \n リクエスト一覧: " + toMinutes.getMinutes()); - tprinboxui.button1("TPを許可します"); - tprinboxui.button2("Tpを拒否します"); - tprinboxui - .show(player) - .then((tprInboxResult) => { - if (tprInboxResult.selection === 0) { - respons = "yes"; - uiTPR(request.requester.name, player, respons); - } - //beacuse for some reason the no button is 0 yet its the second control - if (tprInboxResult.selection === 1) { - respons = "no"; - uiTPR(request.requester.name, player, respons); - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - } - if (tprmenuResult.selection === 1) { - //show the ui to send a request. - const tprsendrequestxui = new ModalFormData(); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - tprsendrequestxui.title("§4TPリクエストを送る§4"); - tprsendrequestxui.dropdown(`\nTPリクエストを送りたいユーザーを指定\n\n以下のプレイヤーがオンラインです\n`, onlineList); - tprsendrequestxui - .show(player) - .then((tprSendRequestResult) => { - //Send Logic - uiTPRSEND(tprSendRequestResult, onlineList, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/moderation/uiAutoBan.js b/build/scripts/gui/moderation/uiAutoBan.js deleted file mode 100644 index 3b66647..0000000 --- a/build/scripts/gui/moderation/uiAutoBan.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -//import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import { AutoBan } from "../../penrose/TickEvent/ban/autoban.js"; -export function uiAUTOBAN(autobanResult, player) { - if (!autobanResult || autobanResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [autobanToggle] = autobanResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - const autoBanBoolean = dynamicPropertyRegistry.get("autoban_b"); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - if (autobanToggle === true && autoBanBoolean === false) { - // Allow - dynamicPropertyRegistry.set("autoban_b", true); - world.setDynamicProperty("autoban_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6autoban§f!`); - AutoBan(); - } - if (autobanToggle === false && autoBanBoolean === true) { - // Deny - dynamicPropertyRegistry.set("autoban_b", false); - world.setDynamicProperty("autoban_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4autoban§f!`); - } - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiBan.js b/build/scripts/gui/moderation/uiBan.js deleted file mode 100644 index 89c1375..0000000 --- a/build/scripts/gui/moderation/uiBan.js +++ /dev/null @@ -1,46 +0,0 @@ -import { world } from "@minecraft/server"; -//import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiBAN(banResult, onlineList, player) { - if (!banResult || banResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value, textField] = banResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f自分自身には実行できません`); - } - //make sure the player doesnt ban themselfs - if (member === player) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者には実行できません`); - } - // Make sure the reason is not blank. - if (!textField) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 理由なしでBANできません`); - return paradoxui(player); - } - try { - member.addTag("Reason:" + textField); - member.addTag("By:" + player.name); - member.addTag("isBanned"); - } - catch (error) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ユーザーをBANできませんでした! エラー内容: ${error}`); - return paradoxui(player); - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f が ${member.name}をBANしました§f. 理由: ${textField}`); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiChatranks.js b/build/scripts/gui/moderation/uiChatranks.js deleted file mode 100644 index 89dfe38..0000000 --- a/build/scripts/gui/moderation/uiChatranks.js +++ /dev/null @@ -1,81 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiCHATRANKS(notifyResult, onlineList, predefinedrank, player) { - if (!notifyResult || notifyResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value, predefinedrankvalue, customrank, ChatRanksToggle] = notifyResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - const chatRanksBoolean = dynamicPropertyRegistry.get("chatranks_b"); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 通知をオンにしてください`); - } - if (!customrank) { - try { - const memberscurrentags = member.getTags(); - let custom; - memberscurrentags.forEach((t) => { - if (t.startsWith("Rank:")) { - custom = t; - } - }); - if (member.hasTag(custom)) { - member.removeTag(custom); - } - } - catch (error) { - //This will throw if the player has no tags - //sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Something went wrong! Error: ${error}`); - } - member.addTag("Rank:" + predefinedrank[predefinedrankvalue]); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§fが ${member.name}のランクを更新した.`); - return paradoxui(player); - } - if (customrank) { - try { - const memberscurrentags = member.getTags(); - let custom; - memberscurrentags.forEach((t) => { - if (t.startsWith("Rank:")) { - custom = t; - } - }); - if (member.hasTag(custom)) { - member.removeTag(custom); - } - } - catch (error) { - // This will throw if the player has no tags that match. - //sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Something went wrong! Error: ${error}`); - } - member.addTag("Rank:" + customrank); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§fが ${member.name} のランクを更新した.`); - if (ChatRanksToggle === true && chatRanksBoolean === false) { - // Allow - dynamicPropertyRegistry.set("chatranks_b", true); - world.setDynamicProperty("chatranks_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6ChatRanks§f!`); - } - if (ChatRanksToggle === false && chatRanksBoolean === true) { - // Deny - dynamicPropertyRegistry.set("chatranks_b", false); - world.setDynamicProperty("chatranks_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4ChatRanks§f!`); - } - return paradoxui(player); - } - return paradoxui; -} diff --git a/build/scripts/gui/moderation/uiClearchat.js b/build/scripts/gui/moderation/uiClearchat.js deleted file mode 100644 index a22feec..0000000 --- a/build/scripts/gui/moderation/uiClearchat.js +++ /dev/null @@ -1,8 +0,0 @@ -import { sendMsg } from "../../util"; -import { paradoxui } from "../paradoxui"; -export function uiCLEARCHAT(player) { - for (let clear = 0; clear < 10; clear++) - sendMsg("@a", "\n".repeat(60)); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}がクリアチャットを実行した`); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiDeop.js b/build/scripts/gui/moderation/uiDeop.js deleted file mode 100644 index f42fe0b..0000000 --- a/build/scripts/gui/moderation/uiDeop.js +++ /dev/null @@ -1,42 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { crypto, sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import config from "../../data/config.js"; -//Function provided by Visual1mpact -export function uiDEOP(opResult, onlineList, player) { - if (!opResult || opResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value] = opResult.formValues; - // Need player object - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Check for hash/salt and validate password from member - const memberHash = member.getDynamicProperty("hash"); - const memberSalt = member.getDynamicProperty("salt"); - // Use either the operator's ID or the encryption password as the key - const key = config.encryption.password ? config.encryption.password : member.id; - // Generate the hash - const memberEncode = crypto(memberSalt, key) ?? null; - if (memberHash !== undefined && memberHash === memberEncode) { - member.removeDynamicProperty("hash"); - member.removeDynamicProperty("salt"); - dynamicPropertyRegistry.delete(member.id); - member.removeTag("paradoxOpped"); - if (player.name !== member.name) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${member.name}§f が管理者ではなくなりました.`); - } - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f 管理者ではなくなりました`); - return paradoxui(player); - } - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${member.name} Op権限がなかった。`); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiDespawner.js b/build/scripts/gui/moderation/uiDespawner.js deleted file mode 100644 index 0aaaee7..0000000 --- a/build/scripts/gui/moderation/uiDespawner.js +++ /dev/null @@ -1,105 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a despawner modal form. - * - * @name uiDESPAWNER - * @param {ModalFormResponse} despawnerResult - The result of the despawner modal form. - * @param {Player} player - The player who triggered the modal form. - */ -export function uiDESPAWNER(despawnerResult, player) { - handleUIDespawner(despawnerResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIDespawner(despawnerResult, player) { - if (!despawnerResult || despawnerResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [entityValue, DespawnAllToggle] = despawnerResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - // try to find the entity or despawn them all if requested - const filter = { - excludeTypes: ["player"], - }; - const filteredEntities = world.getDimension("overworld").getEntities(filter); - if (DespawnAllToggle === false) { - // Specified entity - let counter = 0; - let requestedEntity = ""; - for (const entity of filteredEntities) { - const filteredEntity = entity.typeId.replace("minecraft:", ""); - requestedEntity = entityValue.replace("minecraft:", ""); - // If an entity was specified then handle it here - if (filteredEntity === requestedEntity || filteredEntity === entityValue) { - counter = ++counter; - // Despawn this entity - entity.triggerEvent("paradox:kick"); - continue; - // If all entities were specified then handle this here - } - } - if (counter > 0) { - sendMsgToPlayer(player, ` §o§6|§f §4[§f${requestedEntity}§4]§f §6匹: §4x${counter}§f`); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 指定したモブが見つかりません!`); - } - } - if (DespawnAllToggle === true) { - const entityCount = {}; - for (const entity of filteredEntities) { - let filteredEntity = entity.typeId.replace("minecraft:", ""); - if (filteredEntity === "item") { - const itemContainer = entity.getComponent("item"); - const itemName = itemContainer.itemStack; - if (itemName !== undefined) { - filteredEntity = itemName.typeId.replace("minecraft:", ""); - } - } - if (!entityCount[filteredEntity]) { - entityCount[filteredEntity] = 1; - } - else { - entityCount[filteredEntity]++; - } - // Despawn this entity - entity.triggerEvent("paradox:kick"); - } - let totalCounter = 0; - let entityMessage = ""; - for (const entity in entityCount) { - if (entityCount.hasOwnProperty(entity)) { - const count = entityCount[entity]; - if (count > 0) { - entityMessage += ` §o§6|§f §4[§f${entity}§4]§f §6匹: §4x${count}§f\n`; - totalCounter += count; - } - } - } - if (totalCounter > 0) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f kill:`); - sendMsgToPlayer(player, entityMessage); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f モブが見つかりません`); - } - } - return paradoxui; -} diff --git a/build/scripts/gui/moderation/uiEwipe.js b/build/scripts/gui/moderation/uiEwipe.js deleted file mode 100644 index 519c664..0000000 --- a/build/scripts/gui/moderation/uiEwipe.js +++ /dev/null @@ -1,68 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for wiping ender chests. - * - * @name uiEWIPE - * @param {ModalFormResponse} ewipeResult - The result of the entity wipe modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the entity wipe modal form. - */ -export function uiEWIPE(ewipeResult, onlineList, player) { - handleUIEWipe(ewipeResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIEWipe(ewipeResult, onlineList, player) { - if (!ewipeResult || ewipeResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value] = ewipeResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // Make sure they don't punish themselves - if (member === player) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 自分自身には実行できません.`); - } - //Make sure they don't punish staff! - if (member.hasTag("paradoxOpped")) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - // There are 30 slots ranging from 0 to 29 - // Let's clear out that ender chest - for (let slot = 0; slot < 30; slot++) { - member.runCommand(`replaceitem entity @s slot.enderchest ${slot} air`); - } - // Notify staff and player that punishment has taken place - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§fアイテム欄が初期化されました!`); - // Use try/catch in case nobody has tag 'notify' as this will report 'no target selector' - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§fが ${member.name}'のアイテム欄を消しました`); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiFly.js b/build/scripts/gui/moderation/uiFly.js deleted file mode 100644 index e7bf662..0000000 --- a/build/scripts/gui/moderation/uiFly.js +++ /dev/null @@ -1,86 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -function mayflydisable(player, member) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> fly mode for ${player === member ? "themselves" : member.name}.`); -} -function mayflyenable(player, member) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> fly mode for ${player === member ? "themselves" : member.name}.`); -} -/** - * Handles the result of a modal form used for toggling flight mode. - * - * @name uiFLY - * @param {ModalFormResponse} flyResult - The result of the flight mode toggle modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the flight mode toggle modal form. - */ -export function uiFLY(flyResult, onlineList, player) { - handleUIFly(flyResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIFly(flyResult, onlineList, player) { - if (!flyResult || flyResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value] = flyResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - const membertag = member.getTags(); - if (!membertag.includes("noflying") && !membertag.includes("flying")) { - member - .runCommandAsync(`ability @s mayfly true`) - .then(() => { - member.addTag("flying"); - mayflyenable(player, member); - }) - .catch(() => { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Education Edition is disabled in this world.`); - }); - return; - } - if (membertag.includes("flying")) { - member.addTag("noflying"); - } - if (member.hasTag("noflying")) { - member - .runCommandAsync(`ability @s mayfly false`) - .then(() => { - member.removeTag("flying"); - mayflydisable(player, member); - member.removeTag("noflying"); - }) - .catch(() => { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Education Edition is disabled in this world.`); - }); - return; - } - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiFreeze.js b/build/scripts/gui/moderation/uiFreeze.js deleted file mode 100644 index a176228..0000000 --- a/build/scripts/gui/moderation/uiFreeze.js +++ /dev/null @@ -1,70 +0,0 @@ -import { world } from "@minecraft/server"; -import { MinecraftEffectTypes } from "../../node_modules/@minecraft/vanilla-data/lib/index"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for toggling freeze mode. - * - * @name uiFREEZE - * @param {ModalFormResponse} freezeResult - The result of the freeze mode toggle modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the freeze mode toggle modal form. - */ -export function uiFREEZE(freezeResult, onlineList, player) { - handleUIFreeze(freezeResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIFreeze(freezeResult, onlineList, player) { - if (!freezeResult || freezeResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value] = freezeResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - const boolean = member.hasTag("paradoxFreeze"); - if (boolean) { - member.removeTag("paradoxFreeze"); - member.runCommand(`effect @s clear`); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f あなたはフリーズから開放されました`); - sendMsg(`@a[tag=paradoxOpped]`, `${member.name}§f がフリーズから開放されたよ.`); - return; - } - if (!boolean) { - // Blindness - member.addEffect(MinecraftEffectTypes.Blindness, 1000000, { amplifier: 255, showParticles: true }); - // Mining Fatigue - member.addEffect(MinecraftEffectTypes.MiningFatigue, 1000000, { amplifier: 255, showParticles: true }); - // Weakness - member.addEffect(MinecraftEffectTypes.Weakness, 1000000, { amplifier: 255, showParticles: true }); - // Slowness - member.addEffect(MinecraftEffectTypes.Slowness, 1000000, { amplifier: 255, showParticles: true }); - member.addTag("paradoxFreeze"); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f あなたはフリーズしました`); - sendMsg(`@a[tag=paradoxOpped]`, `${member.name}§f がフリーズしました.`); - return; - } - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiInventory.js b/build/scripts/gui/moderation/uiInventory.js deleted file mode 100644 index bf86e8c..0000000 --- a/build/scripts/gui/moderation/uiInventory.js +++ /dev/null @@ -1,1413 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsgToPlayer } from "../../util"; -import { ActionFormData } from "@minecraft/server-ui"; -import { uiInvEditorMenu } from "./uiInventory/uiInvEditorMainMenu.js"; -/** - * Handles the result of a modal form used for managing player inventories. - * - * @name uiINVENTORY - * @param {ModalFormResponse} inventoryUIResult - The result of the inventory management modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the inventory management modal form. - */ -export function uiINVENTORY(inventoryUIResult, onlineList, player) { - handleUIInventory(inventoryUIResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIInventory(inventoryUIResult, onlineList, player) { - if (!inventoryUIResult || inventoryUIResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value] = inventoryUIResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - const inv = member.getComponent("inventory"); - const container = inv.container; - const itemArray = []; - const maxSlots = 36; // Maximum number of slots in the player's inventory - // Loop through the inventory and add items to the itemArray - for (let i = 0; i < maxSlots; i++) { - const item = container.getItem(i); - if (item?.typeId) { - itemArray.push(i, item.typeId.replace("minecraft:", ""), item.amount, item.typeId.replace("minecraft:", "")); - } - else { - itemArray.push(i, "無し", 0, "ui/slots_bg"); - } - } - // Map of all items/blocks and their texture paths - const textures = new Map([ - //default texture if the slot is empty or no texture is found in the map, this can happen as some blocks/items dont seem to have a - ["empty", "ui/slots_bg"], - //blocks - ["acacia_button", "blocks/planks_acacia"], - ["acacia_door", "blocks/door_acacia_upper"], - ["acacia_fence", "blocks/planks_acacia"], - ["acacia_fence_gate", "blocks/planks_acacia"], - ["acacia_hanging_sign", "blocks/acacia_hanging_sign"], - ["acacia_log", "blocks/log_acacia"], - ["acacia_pressure_plate", "blocks/planks_acacia"], - ["acacia_stairs", "blocks/planks_acacia"], - ["acacia_standing_sign", "items/sign_acacia"], - ["acacia_trapdoor", "blocks/acacia_trapdoor"], - ["acacia_wall_sign", "items/sign_acacia"], - ["activator_rail", "blocks/rail_activator"], - ["air", ""], - ["allow", "blocks/build_allow"], - ["amethyst_block", "blocks/amethyst_block"], - ["amethyst_cluster", "blocks/amethyst_cluster"], - ["ancient_debris", "blocks/ancient_debris_side"], - ["andesite_stairs", "blocks/stone_andesite"], - ["anvil", "blocks/anvil_top_damaged_0"], - ["azalea", "blocks/azalea_side"], - ["azalea_leaves", "blocks/azalea_leaves"], - ["azalea_leaves_flowered", "blocks/azalea_leaves_flowers"], - ["bamboo", "blocks/bamboo"], - ["bamboo_block", "blocks/bamboo_block"], - ["bamboo_button", "blocks/bamboo"], - ["bamboo_door", "items/bamboo_door"], - ["bamboo_double_slab", "blocks/bamboo"], - ["bamboo_fence", "blocks/bamboo_fence"], - ["bamboo_fence_gate", "blocks/bamboo_fence_gate"], - ["bamboo_hanging_sign", "blocks/bamboo_hanging_sign"], - ["bamboo_mosaic", "blocks/bamboo_mosaic"], - ["bamboo_mosaic_double_slab", "blocks/bamboo_mosaic"], - ["bamboo_mosaic_slab", "blocks/bamboo_mosaic"], - ["bamboo_mosaic_stairs", "blocks/bamboo_mosaic"], - ["bamboo_planks", "blocks/bamboo_planks"], - ["bamboo_pressure_plate", "blocks/bamboo_plank"], - ["bamboo_sapling", "blocks/bamboo_sapling"], - ["bamboo_slab", "blocks/bamboo_plank"], - ["bamboo_stairs", "blocks/bamboo_plank"], - ["bamboo_standing_sign", "items/bamboo_sign"], - ["bamboo_trapdoor", "blocks/bamboo_trapdoor"], - ["bamboo_wall_sign", "items/bamboo_sign"], - ["barrel", "blocks/barrel_side"], - ["barrier", "blocks/barrier"], - ["basalt", "blocks/basalt_side"], - ["beacon", "blocks/beacon"], - ["bed", "items/bed_red"], - ["bedrock", "blocks/bedrock"], - ["bee_nest", "blocks/bee_nest_side"], - ["beehive", "blocks/beehive_side"], - ["beetroot", "blocks/beetroot"], - ["bell", "blocks/beehive_side"], - ["big_dripleaf", "blocks/big_dripleaf_side1"], - ["birch_button", "blocks/planks_birch"], - ["birch_door", "blocks/door_birch_upper"], - ["birch_fence", "blocks/planks_birch"], - ["birch_fence_gate", "blocks/planks_birch"], - ["birch_hanging_sign", "blocks/birch_hanging_sign"], - ["birch_log", "log_birch"], - ["birch_pressure_plate", "blocks/planks_birch"], - ["birch_stairs", "blocks/planks_birch"], - ["birch_standing_sign", "items/sign_birch"], - ["birch_trapdoor", "blocks/birch_trapdoor"], - ["birch_wall_sign", "items/sign_birch"], - ["black_candle", "blocks/candles/black_candle"], - ["black_candle_cake", "blocks/candles/black_candle"], - ["black_carpet", "blocks/wool_colored_black"], - ["black_concrete", "blocks/concrete_black"], - ["black_glazed_terracotta", "blocks/glazed_terracotta_black"], - ["black_shulker_box", "blocks/shulker_top_black"], - ["black_wool", "blocks/wool_colored_black"], - ["blackstone", "blocks/blackstone"], - ["blackstone_double_slab", "blocks/blackstone"], - ["blackstone_slab", "blocks/blackstone"], - ["blackstone_stairs", "blocks/blackstone"], - ["blackstone_wall", "blocks/blackstone"], - ["blast_furnace", "blocks/blast_furnace_front_off"], - ["blue_candle", "blocks/candles/blue_candle"], - ["blue_candle_cake", "blocks/candles/blue_candle"], - ["blue_carpet", "blocks/wool_colored_blue"], - ["blue_concrete", "blocks/concrete_blue"], - ["blue_glazed_terracotta", "blocks/glazed_terracotta_blue"], - ["blue_ice", "blocks/blue_ice"], - ["blue_shulker_box", "blocks/shulker_top_blue"], - ["blue_wool", "blocks/wool_colored_blue"], - ["bone_block", "blocks/bone_block_side"], - ["bookshelf", "blocks/bookshelf"], - ["border_block", "blocks/border"], - ["brain_coral", "blocks/coral_fan_pink"], - ["brewing_stand", "blocks/brewing_stand"], - ["brick_block", "blocks/brick"], - ["brick_stairs", "blocks/brick"], - ["brown_candle", "blocks/candles/brown_candle"], - ["brown_candle_cake", "blocks/candles/brown_candle"], - ["brown_carpet", "blocks/wool_colored_brown"], - ["brown_concrete", "blocks/concrete_brown"], - ["brown_glazed_terracotta", "blocks/glazed_terracotta_brown"], - ["brown_mushroom", "blocks/mushroom_brown"], - ["brown_mushroom_block", "blocks/mushroom_brown"], - ["brown_shulker_box", "blocks/shulker_top_brown"], - ["brown_wool", "blocks/wool_colored_brown"], - ["bubble_column", "blocks/bubble_column_down_top_a"], - ["bubble_coral", "blocks/coral_fan_pink"], - ["budding_amethyst", "blocks/budding_amethyst"], - ["cactus", "blocks/cactus_side"], - ["cake", "blocks/cake"], - ["calcite", "blocks/calcite"], - ["calibrated_sculk_sensor", "blocks/calibrated_sculk_sensor_input_side"], - ["camera", "blocks/camera_side"], - ["campfire", "blocks/campfire"], - ["candle", "blocks/candle"], - ["candle_cake", "blocks/candle"], - ["carrots", "items/carrot"], - ["cartography_table", "blocks/cartography_table_side2"], - ["carved_pumpkin", "blocks/pumpkin_face_off"], - ["cauldron", "blocks/cauldron"], - ["cave_vines", "blocks/cave_vines_body"], - ["cave_vines_body_with_berries", "blocks/cave_vines_body_berries"], - ["cave_vines_head_with_berries", "blocks/cave_vines_head_berries"], - ["chain", "blocks/chain"], - ["chain_command_block", "blocks/chain_command_block_side_mipmap"], - ["chemical_heat", ""], - ["chemistry_table", ""], - ["cherry_button", "blocks/cherry_planks"], - ["cherry_door", "items/cherry_door"], - ["cherry_double_slab", "blocks/cherry_planks"], - ["cherry_fence", "blocks/cherry_planks"], - ["cherry_fence_gate", "blocks/cherry_planks"], - ["cherry_hanging_sign", "blocks/cherry_hanging_sign"], - ["cherry_leaves", "blocks/cherry_leaves"], - ["cherry_log", "blocks/cherry_log_side"], - ["cherry_planks", "blocks/cherry_planks"], - ["cherry_pressure_plate", "blocks/cherry_planks"], - ["cherry_sapling", "blocks/cherry_sapling"], - ["cherry_slab", "blocks/cherry_planks"], - ["cherry_stairs", "blocks/cherry_planks"], - ["cherry_standing_sign", "items/cherry_sign"], - ["cherry_trapdoor", "blocks/cherry_trapdoor"], - ["cherry_wall_sign", "items/cherry_sign"], - ["cherry_wood", "blocks/cherry_log_top"], - ["chest", "blocks/chest_front"], - ["chiseled_bookshelf", "blocks/chiseled_bookshelf_side"], - ["chiseled_deepslate", "blocks/deepslate/chiseled_deepslate"], - ["chiseled_nether_bricks", "blocks/chiseled_nether_bricks"], - ["chiseled_polished_blackstone", "blocks/chiseled_polished_blackstone"], - ["chorus_flower", "blocks/chorus_flower"], - ["chorus_plant", "blocks/chorus_plant"], - ["clay", "blocks/clay"], - ["client_request_placeholder_block", ""], - ["coal_block", "blocks/coal_block"], - ["coal_ore", "blocks/coal_ore"], - ["cobbled_deepslate", "blocks/deepslate/cobbled_deepslate"], - ["cobbled_deepslate_double_slab", "blocks/deepslate/cobbled_deepslate"], - ["cobbled_deepslate_slab", "blocks/deepslate/cobbled_deepslate"], - ["cobbled_deepslate_stairs", "blocks/deepslate/cobbled_deepslate"], - ["cobbled_deepslate_wall", "blocks/deepslate/cobbled_deepslate"], - ["cobblestone", "blocks/cobblestone"], - ["cobblestone_wall", "blocks/cobblestone"], - ["cocoa", "blocks/cocoa_stage_2"], - ["colored_torch_bp", ""], - ["colored_torch_rg", ""], - ["command_block", "blocks/command_block"], - ["composter", "blocks/composter_side"], - ["concrete_powder", "blocks/concrete_powder_gray"], - ["conduit", "blocks/conduit_open"], - ["copper_block", "blocks/copper_block"], - ["copper_ore", "blocks/copper_ore"], - ["coral_block", "blocks/coral_blue"], - ["coral_fan", "blocks/coral_fan_blue"], - ["coral_fan_dead", "blocks/coral_fan_blue_dead"], - ["coral_fan_hang", "blocks/coral_fan_blue"], - ["coral_fan_hang2", "blocks/coral_fan_pink"], - ["coral_fan_hang3", "blocks/coral_fan_yellow"], - ["cracked_deepslate_bricks", "blocks/deepslate/cracked_deepslate_bricks"], - ["cracked_deepslate_tiles", "blocks/deepslate/cracked_deepslate_tiles"], - ["cracked_nether_bricks", "blocks/cracked_nether_bricks"], - ["cracked_polished_blackstone_bricks", "blocks/cracked_polished_blackstone_bricks"], - ["crafting_table", "blocks/crafting_table_front"], - ["crimson_button", "blocks/huge_fungus/crimson_planks"], - ["crimson_door", "items/crimson_door"], - ["crimson_double_slab", "blocks/huge_fungus/crimson_planks"], - ["crimson_fence", "blocks/huge_fungus/crimson_planks"], - ["crimson_fence_gate", "blocks/huge_fungus/crimson_planks"], - ["crimson_fungus", "blocks/crimson_fungus"], - ["crimson_hanging_sign", "items/crimson_hanging_sign"], - ["crimson_hyphae", "blocks/huge_fungus/crimson_log_side"], - ["crimson_nylium", "blocks/crimson_nylium_side"], - ["crimson_planks", "blocks/huge_fungus/crimson_planks"], - ["crimson_pressure_plate", "blocks/huge_fungus/crimson_planks"], - ["crimson_roots", "blocks/crimson_roots"], - ["crimson_slab", "blocks/huge_fungus/crimson_planks"], - ["crimson_stairs", "blocks/huge_fungus/crimson_planks"], - ["crimson_standing_sign", "items/sign_crimson"], - ["crimson_stem", "blocks/huge_fungus/crimson_log_side"], - ["crimson_trapdoor", "blocks/crimson_trapdoor"], - ["crimson_wall_sign", "items/sign_crimson"], - ["crying_obsidian", "blocks/crying_obsidian"], - ["cut_copper", "blocks/cut_copper"], - ["cut_copper_slab", "blocks/cut_copper"], - ["cut_copper_stairs", "blocks/cut_copper"], - ["cyan_candle", "blocks/cyan_candle"], - ["cyan_candle_cake", "blocks/candles/cyan_candle"], - ["cyan_carpet", "blocks/wool_colored_cyan"], - ["cyan_concrete", "blocks/concrete_cyan"], - ["cyan_glazed_terracotta", "blocks/glazed_terracotta_cyan"], - ["cyan_shulker_box", "blocks/shulker_top_cyan"], - ["cyan_wool", "blocks/wool_colored_cyan"], - ["dark_oak_button", "blocks/planks_big_oak"], - ["dark_oak_door", "items/door_dark_oak"], - ["dark_oak_fence", "blocks/planks_big_oak"], - ["dark_oak_fence_gate", "blocks/planks_big_oak"], - ["dark_oak_hanging_sign", "items/dark_oak_hanging_sign"], - ["dark_oak_log", "blocks/log_big_oak"], - ["dark_oak_pressure_plate", "blocks/planks_big_oak"], - ["dark_oak_stairs", "blocks/planks_big_oak"], - ["dark_oak_trapdoor", "blocks/dark_oak_trapdoor"], - ["dark_prismarine_stairs", "blocks/prismarine_dark"], - ["darkoak_standing_sign", "items/sign_darkoak"], - ["darkoak_wall_sign", "items/sign_darkoak"], - ["daylight_detector", "blocks/daylight_detector_top"], - ["daylight_detector_inverted", "blocks/daylight_detector_inverted_top"], - ["dead_brain_coral", "blocks/coral_plant_purple_dead"], - ["dead_bubble_coral", "blocks/coral_plant_pink_dead"], - ["dead_fire_coral", "blocks/coral_plant_red_dead"], - ["dead_horn_coral", "blocks/coral_plant_yellow_dead"], - ["dead_tube_coral", "blocks/coral_plant_blue_dead"], - ["deadbush", "blocks/deadbush"], - ["decorated_pot", "blocks/decorated_pot_side"], - ["deepslate", "blocks/deepslate/deepslate"], - ["deepslate_brick_double_slab", "blocks/deepslate/deepslate_bricks"], - ["deepslate_brick_slab", "blocks/deepslate/deepslate_bricks"], - ["deepslate_brick_stairs", "blocks/deepslate/deepslate_bricks"], - ["deepslate_brick_wall", "blocks/deepslate/deepslate_bricks"], - ["deepslate_bricks", "blocks/deepslate/deepslate_bricks"], - ["deepslate_coal_ore", "blocks/deepslate/deepslate_coal_ore"], - ["deepslate_copper_ore", "blocks/deepslate/deepslate_copper_ore"], - ["deepslate_diamond_ore", "blocks/deepslate/deepslate_diamond_ore"], - ["deepslate_emerald_ore", "blocks/deepsalte/deepslate_emerald_ore"], - ["deepslate_gold_ore", "blocks/deepslate/deepslate_gold_ore"], - ["deepslate_iron_ore", "blocks/deepslate/deepslate_iron_ore"], - ["deepslate_lapis_ore", "blocks/deepslate/deepslate_lapis_ore"], - ["deepslate_redstone_ore", "blocks/deepslate/deepslate_redstone_ore"], - ["deepslate_tile_double_slab", "blocks/deepslate/deepslate_tiles"], - ["deepslate_tile_slab", "blocks/deepslate/deepslate_tiles"], - ["deepslate_tile_stairs", "blocks/deepslate/deepslate_tiles"], - ["deepslate_tile_wall", "blocks/deepslate/deepslate_tiles"], - ["deepslate_tiles", "blocks/deepslate/deepslate_tiles"], - ["deny", "blocks/build_deny"], - ["detector_rail", "blocks/rail_detector"], - ["diamond_block", "blocks/diamond_block"], - ["diamond_ore", "blocks/diamond_ore"], - ["diorite_stairs", "blocks/stone_diorite"], - ["dirt", "blocks/dirt"], - ["dirt_with_roots", "blocks/dirt_with_roots"], - ["dispenser", "blocks/dispenser_front_horizontal"], - ["double_cut_copper_slab", "blocks/cut_copper"], - ["double_plant", "blocks/double_plant_fern_carried"], - ["double_stone_block_slab", "blocks/stone_slab_side"], - ["double_stone_block_slab2", "blocks/red_sandstone_bottom"], - ["double_stone_block_slab3", "blocks/end_bricks"], - ["double_stone_block_slab4", "blocks/stonebrick"], - ["double_wooden_slab", "blocks/planks_oak"], - ["dragon_egg", "blocks/dragon_egg"], - ["dried_kelp_block", "blocks/dried_kelp_top"], - ["dripstone_block", "blocks/dripstone_block"], - ["dropper", "blocks/dropper_front_horizontal"], - ["emerald_block", "blocks/emerald_block"], - ["emerald_ore", "blocks/emerald_ore"], - ["enchanting_table", "blocks/enchanting_table_side"], - ["end_brick_stairs", "blocks/end_bricks"], - ["end_bricks", "blocks/end_bricks"], - ["end_gateway", "blocks/end_gateway"], - ["end_portal", "blocks/end_portal"], - ["end_portal_frame", "blocks/endframe_top"], - ["end_rod", "blocks/end_rod"], - ["end_stone", "blocks/end_stone"], - ["ender_chest", "blocks/ender_chest_front"], - ["exposed_copper", "blocks/exposed_copper"], - ["exposed_cut_copper", "blocks/exposed_cut_copper"], - ["exposed_cut_copper_slab", "blocks/exposed_cut_copper"], - ["exposed_cut_copper_stairs", "blocks/exposed_cut_copper"], - ["exposed_double_cut_copper_slab", "blocks/cut_copper"], - ["farmland", "blocks/farmland_dry"], - ["fence_gate", "blocks/planks_oak"], - ["fire", "blocks/fire_1_placeholder"], - ["fire_coral", "blocks/coral_fan_red"], - ["fletching_table", "blocks/fletcher_table_side1"], - ["flower_pot", "blocks/flower_pot"], - ["flowering_azalea", "blocks/flowering_azalea_side"], - ["flowing_lava", "blocks/lava_placeholder"], - ["flowing_water", "blocks/water_placeholder"], - ["frame", "blocks/itemframe_background"], - ["frog_spawn", "blocks/frogspawn"], - ["frosted_ice", "blocks/frosted_ice_0"], - ["furnace", "blocks/furnace_front_off"], - ["gilded_blackstone", "blocks/gilded_blackstone"], - ["glass", "blocks/glass"], - ["glass_pane", "blocks/glass_pane_top"], - ["glow_frame", "blocks/glow_item_frame"], - ["glow_lichen", "blocks/glow_lichen"], - ["glowingobsidian", "blocks/glowing_obsidian"], - ["glowstone", "blocks/glowstone"], - ["gold_block", "blocks/gold_block"], - ["gold_ore", "blocks/gold_ore"], - ["golden_rail", "blocks/rail_golden"], - ["granite_stairs", "blocks/stone_granite"], - ["grass", "blocks/grass_side_carried"], - ["grass_path", "blocks/grass_path_side"], - ["gravel", "blocks/gravel"], - ["gray_candle", "blocks/candles/gray_candle"], - ["gray_candle_cake", "blocks/candles/gray_candle"], - ["gray_carpet", "blocks/wool_colored_gray"], - ["gray_concrete", "blocks/concrete_gray"], - ["gray_glazed_terracotta", "blocks/glazed_terracotta_gray"], - ["gray_shulker_box", "blocks/shulker_top_gray"], - ["gray_wool", "blocks/wool_colored_gray"], - ["green_candle", "blocks/candles/green_candle"], - ["green_candle_cake", "blocks/candles/green_candle"], - ["green_carpet", "blocks/wool_colored_green"], - ["green_concrete", "blocks/concrete_green"], - ["green_glazed_terracotta", "blocks/glazed_terracotta_green"], - ["green_shulker_box", "blocks/shulker_top_green"], - ["green_wool", "blocks/wool_colored_green"], - ["grindstone", "blocks/grindstone_side"], - ["hanging_roots", "blocks/hanging_roots"], - ["hard_glass", "blocks/glass"], - ["hard_glass_pane", "blocks/glass_pane_top"], - ["hard_stained_glass", "blocks/glass_blue"], - ["hard_stained_glass_pane", "blocks/glass_pane_top_cyan"], - ["hardened_clay", "blocks/hardened_clay"], - ["hay_block", "blocks/hay_block_side"], - ["heavy_weighted_pressure_plate", "blocks/iron_block"], - ["honey_block", "blocks/honey_side"], - ["honeycomb_block", "blocks/honeycomb"], - ["hopper", "items/hopper"], - ["horn_coral", "blocks/coral_yellow"], - ["ice", "blocks/ice"], - ["infested_deepslate", "blocks/deepslate/deepslate"], - ["info_update", "misc/missing_texture"], - ["info_update2", "misc/missing_texture"], - ["invisible_bedrock", "blocks/bedrock"], - ["iron_bars", "blocks/iron_bars"], - ["iron_block", "blocks/iron_block"], - ["iron_door", "items/door_iron"], - ["iron_ore", "blocks/iron_ore"], - ["iron_trapdoor", "blocks/iron_trapdoor"], - ["jigsaw", "blocks/jigsaw_front"], - ["jukebox", "blocks/jukebox_top"], - ["jungle_button", "blocks/planks_jungle"], - ["jungle_door", "items/door_jungle"], - ["jungle_fence", "blocks/planks_jungle"], - ["jungle_fence_gate", "blocks/planks_jungle"], - ["jungle_hanging_sign", "items/jungle_hanging_sign"], - ["jungle_log", "blocks/log_jungle_top"], - ["jungle_pressure_plate", "blocks/planks_jungle"], - ["jungle_stairs", "blocks/planks_jungle"], - ["jungle_standing_sign", "items/sign_jungle"], - ["jungle_trapdoor", "blocks/jungle_trapdoor"], - ["jungle_wall_sign", "items/sign_jungle"], - ["kelp", "items/kelp"], - ["ladder", "blocks/ladder"], - ["lantern", "blocks/lantern"], - ["lapis_block", "blocks/lapis_block"], - ["lapis_ore", "blocks/lapis_ore"], - ["large_amethyst_bud", "blocks/large_amethyst_bud"], - ["lava", "blocks/lava_still"], - ["leaves", "blocks/leaves_oak_carried"], - ["leaves2", "blocks/leaves_acacia_carried"], - ["lectern", "blocks/lectern_base"], - ["lever", "blocks/lever"], - ["light_block", "items/light_block_0"], - ["light_blue_candle", "blocks/candles/light_blue_candle"], - ["light_blue_candle_cake", "blocks/candles/light_blue_candle"], - ["light_blue_carpet", "blocks/wool_colored_light_blue"], - ["light_blue_concrete", "blocks/concrete_light_blue"], - ["light_blue_glazed_terracotta", "blocks/glazed_terracotta_light_blue"], - ["light_blue_shulker_box", "blocks/shulker_top_light_blue"], - ["light_blue_wool", "blocks/wool_colored_light_blue"], - ["light_gray_candle", "block/candles/light_gray_candle"], - ["light_gray_candle_cake", "block/candles/light_gray_candle"], - ["light_gray_carpet", "blocks/wool_colored_light_gray"], - ["light_gray_concrete", "blocks/concrete_light_gray"], - ["light_gray_shulker_box", "blocks/shulker_top_light_gray"], - ["light_gray_wool", "blocks/wool_colored_light_gray"], - ["light_weighted_pressure_plate", "blocks/gold_block"], - ["lightning_rod", "blocks/lightning_rod"], - ["lime_candle", "blocks/candles/lime_candle"], - ["lime_candle_cake", "blocks/candles/lime_candle"], - ["lime_carpet", "blocks/wool_colored_lime"], - ["lime_concrete", "blocks/concrete_lime"], - ["lime_glazed_terracotta", "blocks/glazed_terracotta_lime"], - ["lime_shulker_box", "blocks/shulker_top_lime"], - ["lime_wool", "blocks/wool_colored_lime"], - ["lit_blast_furnace", "blocks/blast_furnace_front_on"], - ["lit_deepslate_redstone_ore", "blocks/deepsalte/deepslate_redstone_ore"], - ["lit_furnace", "blocks/furnace_front_on"], - ["lit_pumpkin", "blocks/pumpkin_face_on"], - ["lit_redstone_lamp", "blocks/redstone_lamp_on"], - ["lit_redstone_ore", "blocks/redstone_ore"], - ["lit_smoker", "blocks/smoker_front_on"], - ["lodestone", "blocks/lodestone_side"], - ["loom", "blocks/loom_front"], - ["magenta_candle", "blocks/candles/magenta_candle"], - ["magenta_candle_cake", "blocks/candles/magenta_candle"], - ["magenta_carpet", "blocks/wool_colored_magenta"], - ["magenta_concrete", "blocks/concrete_magenta"], - ["magenta_glazed_terracotta", "blocks/glazed_terracotta_magenta"], - ["magenta_shulker_box", "blocks/shulker_top_magenta"], - ["magenta_wool", "blocks/wool_colored_magenta"], - ["magma", "blocks/magma"], - ["mangrove_button", "blocks/mangrove_planks"], - ["mangrove_door", "items/mangrove_door"], - ["mangrove_double_slab", "blocks/mangrove_planks"], - ["mangrove_fence", "blocks/mangrove_planks"], - ["mangrove_fence_gate", "blocks/mangrove_planks"], - ["mangrove_hanging_sign", "items/mangrove_hanging_sign"], - ["mangrove_leaves", "blocks/mangrove_leaves_carried"], - ["mangrove_log", "blocks/mangrove_log_top"], - ["mangrove_planks", "blocks/mangrove_planks"], - ["mangrove_pressure_plate", "blocks/mangrove_planks"], - ["mangrove_propagule", "blocks/mangrove_propagule"], - ["mangrove_roots", "blocks/mangrove_roots_top"], - ["mangrove_slab", "blocks/mangrove_planks"], - ["mangrove_stairs", "blocks/mangrove_planks"], - ["mangrove_standing_sign", "items/mangrove_sign"], - ["mangrove_trapdoor", "blocks/mangrove_trapdoor"], - ["mangrove_wall_sign", "items/mangrove_sign"], - ["mangrove_wood", "blocks/stripped_mangrove_log_side"], - ["medium_amethyst_bud", "blocks/medium_amethyst_bud"], - ["melon_block", "blocks/melon_top"], - ["melon_stem", "blocks/melon_stem_disconnected"], - ["mob_spawner", "blocks/mob_spawner"], - ["monster_egg", "blocks/stone"], - ["moss_block", "blocks/moss_block"], - ["moss_carpet", "blocks/moss_block"], - ["mossy_cobblestone", "blocks/cobblestone_mossy"], - ["mossy_cobblestone_stairs", "blocks/cobblestone_mossy"], - ["mossy_stone_brick_stairs", "blocks/cobblestone_mossy"], - ["moving_block", "blocks/missing_tile"], - ["mud", "blocks/mud"], - ["mud_brick_double_slab", "blocks/mud_bricks"], - ["mud_brick_slab", "blocks/mud_bricks"], - ["mud_brick_stairs", "blocks/mud_bricks"], - ["mud_brick_wall", "blocks/mud_bricks"], - ["mud_bricks", "blocks/mud_bricks"], - ["muddy_mangrove_roots", "blocks/muddy_mangrove_roots_side"], - ["mycelium", "blocks/mycelium_side"], - ["nether_brick", "blocks/nether_brick"], - ["nether_brick_fence", "blocks/nether_brick"], - ["nether_brick_stairs", "blocks/nether_brick"], - ["nether_gold_ore", "blocks/nether_gold_ore"], - ["nether_sprouts", "blocks/nether_sprouts"], - ["nether_wart", "items/nether_wart"], - ["nether_wart_block", "blocks/nether_wart_block"], - ["netherite_block", "blocks/netherite_block"], - ["netherrack", "blocks/netherrack"], - ["normal_stone_stairs", "blocks/stone"], - ["noteblock", "blocks/noteblock"], - ["oak_fence", "blocks/planks_oak"], - ["oak_hanging_sign", "items/oak_hanging_sign"], - ["oak_log", "blocks/log_oak_top"], - ["oak_stairs", "blocks/planks_oak"], - ["observer", "blocks/observer_front"], - ["obsidian", "blocks/obsidian"], - ["ochre_froglight", "blocks/ochre_froglight_side"], - ["orange_candle", "blocks/candles/orange_candle"], - ["orange_candle_cake", "blocks/candles/orange_candle"], - ["orange_carpet", "blocks/wool_colored_orange"], - ["orange_concrete", "blocks/concrete_orange"], - ["orange_glazed_terracotta", "blocks/glazed_terracotta_orange"], - ["orange_shulker_box", "blocks/shulker_top_orange"], - ["orange_wool", "blocks/wool_colored_orange"], - ["oxidized_copper", "blocks/oxidized_copper"], - ["oxidized_cut_copper", "blocks/oxidized_cut_copper"], - ["oxidized_cut_copper_slab", "blocks/oxidized_cut_copper"], - ["oxidized_cut_copper_stairs", "blocks/oxidized_cut_copper"], - ["oxidized_double_cut_copper_slab", "blocks/oxidized_cut_copper"], - ["packed_ice", "blocks/ice_packed"], - ["packed_mud", "blocks/packed_mud"], - ["pearlescent_froglight", "blocks/pearlescent_froglight_side"], - ["pink_candle", "blocks/candles/pink_candle"], - ["pink_candle_cake", "blocks/candles/pink_candle"], - ["pink_carpet", "blocks/wool_colored_pink"], - ["pink_concrete", "blocks/concrete_pink"], - ["pink_glazed_terracotta", "blocks/glazed_terracotta_pink"], - ["pink_petals", "blocks/pink_petals"], - ["pink_shulker_box", "blocks/shulker_top_pink"], - ["pink_wool", "blocks/wool_colored_pink"], - ["piston", "blocks/piston_top_normal"], - ["piston_arm_collision", "blocks/piston_inner"], - ["pitcher_crop", "items/pitcher_pod"], - ["pitcher_plant", "blocks/pitcher_crop_top_stage_4"], - ["planks", "blocks/planks_oak"], - ["podzol", "blocks/dirt_podzol_side"], - ["pointed_dripstone", "blocks/pointed_dripstone_up_tip"], - ["polished_andesite_stairs", "blocks/stone_andesite"], - ["polished_basalt", "blocks/polished_basalt_side"], - ["polished_blackstone", "blocks/polished_blackstone"], - ["polished_blackstone_brick_double_slab", "blocks/polished_blackstone_bricks"], - ["polished_blackstone_brick_slab", "blocks/polished_blackstone_bricks"], - ["polished_blackstone_brick_stairs", "blocks/polished_blackstone_bricks"], - ["polished_blackstone_brick_wall", "blocks/polished_blackstone_bricks"], - ["polished_blackstone_bricks", "blocks/polished_blackstone_bricks"], - ["polished_blackstone_button", "blocks/polished_blackstone"], - ["polished_blackstone_double_slab", "blocks/polished_blackstone"], - ["polished_blackstone_pressure_plate", "blocks/polished_blackstone"], - ["polished_blackstone_slab", "blocks/polished_blackstone"], - ["polished_blackstone_stairs", "blocks/polished_blackstone"], - ["polished_blackstone_wall", "blocks/polished_blackstone"], - ["polished_deepslate", "blocks/deepslate/polished_deepslate"], - ["polished_deepslate_double_slab", "blocks/deepslate/polished_deepslate"], - ["polished_deepslate_slab", "blocks/deepslate/polished_deepslate"], - ["polished_deepslate_stairs", "blocks/deepslate/polished_deepslate"], - ["polished_deepslate_wall", "blocks/deepslate/polished_deepslate"], - ["polished_diorite_stairs", "blocks/stone_diorite_smooth"], - ["polished_granite_stairs", "blocks/stone_granite_smooth"], - ["portal", "blocks/portal"], - ["potatoes", "items/potato"], - ["powder_snow", "blocks/powder_snow"], - ["powered_comparator", "blocks/comparator_on"], - ["powered_repeater", "blocks/repeater_on"], - ["prismarine", "blocks/prismarine_rough"], - ["prismarine_bricks_stairs", "blocks/prismarine_bricks"], - ["prismarine_stairs", "blocks/prismarine_rough"], - ["pumpkin", "blocks/pumpkin_top"], - ["pumpkin_stem", "blocks/pumpkin_stem_disconnected"], - ["purple_candle", "blocks/candles/purple_candle"], - ["purple_candle_cake", "blocks/candles/purple_candle"], - ["purple_carpet", "blocks/wool_colored_purple"], - ["purple_concrete", "blocks/concrete_purple"], - ["purple_glazed_terracotta", "blocks/glazed_terracotta_purple"], - ["purple_shulker_box", "blocks/shulker_top_purple"], - ["purple_wool", "blocks/wool_colored_purple"], - ["purpur_block", "blocks/purpur_block"], - ["purpur_stairs", "blocks/purpur_block"], - ["quartz_block", "blocks/quartz_block_side"], - ["quartz_bricks", "blocks/quartz_bricks"], - ["quartz_ore", "blocks/quartz_ore"], - ["quartz_stairs", "blocks/quartz_block_side"], - ["rail", "blocks/rail_normal"], - ["raw_copper_block", "blocks/raw_copper_block"], - ["raw_gold_block", "blocks/raw_gold_block"], - ["raw_iron_block", "blocks/raw_iron_block"], - ["red_candle", "blocks/candles/red_candle"], - ["red_candle_cake", "blocks/candles/red_candle"], - ["red_carpet", "blocks/wool_coloured_red"], - ["red_concrete", "blocks/concrete_red"], - ["red_flower", "blocks/flower_rose"], - ["red_glazed_terracotta", "blocks/glazed_terracotta_red"], - ["red_mushroom", "blocks/mushroom_red"], - ["red_mushroom_block", "mushroom_block_skin_red"], - ["red_nether_brick", "blocks/red_nether_brick"], - ["red_nether_brick_stairs", "blocks/red_nether_brick"], - ["red_sandstone", "blocks/red_sandstone_normal"], - ["red_sandstone_stairs", "blocks/red_sandstone_normal"], - ["red_shulker_box", "blocks/shulker_top_red"], - ["red_wool", "blocks/wool_coloured_red"], - ["redstone_block", "blocks/redstone_block"], - ["redstone_lamp", "blocks/redstone_lamp_off"], - ["redstone_ore", "blocks/redstone_ore"], - ["redstone_torch", "blocks/redstone_torch_off"], - ["redstone_wire", "blocks/redstone_dust_line"], - ["reeds", "blocks/reeds"], - ["reinforced_deepslate", "blocks/reinforced_deepslate_top"], - ["repeating_command_block", "blocks/repeating_command_block_front_mipmap"], - ["reserved6", ""], - ["respawn_anchor", "blocks/respawn_anchor_top_off"], - ["sand", "blocks/sand"], - ["sandstone", "blocks/sandstone_normal"], - ["sandstone_stairs", "blocks/sandstone_normal"], - ["sapling", "blocks/sapling_oak"], - ["scaffolding", "blocks/scaffolding_top"], - ["sculk", "blocks/sculk"], - ["sculk_catalyst", "blocks/sculk_catalyst_top"], - ["sculk_sensor", "blocks/sculk_sensor_top"], - ["sculk_shrieker", "blocks/sculk_shrieker_top"], - ["sculk_vein", "blocks/sculk_vein"], - ["sea_lantern", "blocks/sea_lantern"], - ["sea_pickle", "blocks/sea_pickle"], - ["seagrass", "blocks/seagrass"], - ["shroomlight", "blocks/shroomlight"], - ["silver_glazed_terracotta", "blocks/glazed_terracotta_silver"], - //Skull texture is under and entity and would need a shader. - ["skull", ""], - ["slime", "blocks/slime"], - ["small_amethyst_bud", "blocks/small_amethyst_bud"], - ["small_dripleaf_block", "blocks/small_dripleaf_top"], - ["smithing_table", "blocks/smithing_table_front"], - ["smoker", "blocks/smoker_front_off"], - ["smooth_basalt", "blocks/smooth_basalt"], - ["smooth_quartz_stairs", "blocks/quartz_block_side"], - ["smooth_red_sandstone_stairs", "blocks/red_sandstone_smooth"], - ["smooth_sandstone_stairs", "blocks/sandstone_smooth"], - ["smooth_stone", "blocks/stone_slab_top"], - ["sniffer_egg", "items/sniffer_egg"], - ["snow", "blocks/snow"], - ["snow_layer", "blocks/snow"], - ["soul_campfire", "blocks/soul_campfire"], - ["soul_fire", "blocks/soul_fire_0"], - ["soul_lantern", "blocks/soul_lantern"], - ["soul_sand", "blocks/soul_sand"], - ["soul_soil", "blocks/soul_soil"], - ["soul_torch", "blocks/soul_torch"], - ["sponge", "blocks/sponge"], - ["spore_blossom", "blocks/spore_blossom"], - ["spruce_button", "blocks/planks_spruce"], - ["spruce_door", "items/door_spruce"], - ["spruce_fence", "blocks/planks_spruce"], - ["spruce_fence_gate", "blocks/planks_spruce"], - ["spruce_hanging_sign", "items/spruce_hanging_sign"], - ["spruce_log", "blocks/log_spruce_top"], - ["spruce_pressure_plate", "blocks/planks_spruce"], - ["spruce_stairs", "blocks/planks_spruce"], - ["spruce_standing_sign", "items/sign_spruce"], - ["spruce_trapdoor", "blocks/spruce_trapdoor"], - ["spruce_wall_sign", "items/sign_spruce"], - ["stained_glass", "blocks/glass_blue"], - ["stained_glass_pane", "blocks/glass_pane_top_blue"], - ["stained_hardened_clay", "blocks/hardened_clay_stained_blue"], - ["standing_banner", "entity\banner\banner_mojang"], - ["standing_sign", "items/sign_oak"], - ["sticky_piston", "blocks/piston_top_sticky"], - ["sticky_piston_arm_collision", "blocks/piston_inner"], - ["stone", "blocks/stone"], - ["stone_block_slab", "blocks/stone_slab_top"], - ["stone_block_slab2", "blocks/red_sandstone_bottom"], - ["stone_block_slab3", "blocks/end_stone"], - ["stone_block_slab4", "blocks/stonebrick"], - ["stone_brick_stairs", "blocks/stonebrick"], - ["stone_button", "blocks/stone"], - ["stone_pressure_plate", "blocks/stone"], - ["stone_stairs", "blocks/stone"], - ["stonebrick", "blocks/stonebrick"], - ["stonecutter", "blocks/stonecutter2_top"], - ["stonecutter_block", "blocks/stonecutter2_top"], - ["stripped_acacia_log", "blocks/stripped_acacia_log"], - ["stripped_bamboo_block", "blocks/stripped_bamboo_block"], - ["stripped_birch_log", "blocks/stripped_birch_log"], - ["stripped_cherry_log", "blocks/stripped_cherry_log_top"], - ["stripped_cherry_wood", "blocks/stripped_cherry_log_top"], - ["stripped_crimson_hyphae", "blocks/huge_fungus/stripped_crimson_stem_side"], - ["stripped_crimson_stem", "blocks/huge_fungus/stripped_crimson_stem_top"], - ["stripped_dark_oak_log", "blocks/stripped_dark_oak_log"], - ["stripped_jungle_log", "blocks/stripped_jungle_log"], - ["stripped_mangrove_log", "blocks/stripped_mangrove_log_top"], - ["stripped_mangrove_wood", "blocks/stripped_mangrove_log_side"], - ["stripped_oak_log", "blocks/stripped_oak_log"], - ["stripped_spruce_log", "blocks/stripped_spruce_log"], - ["stripped_warped_hyphae", "blocks/huge_fungus/stripped_warped_stem_side"], - ["stripped_warped_stem", "blocks/huge_fungus/stripped_warped_stem_top"], - ["structure_block", "blocks/structure_block"], - ["structure_void", "blocks/structure_void"], - ["suspicious_gravel", "blocks/suspicious_gravel_0"], - ["suspicious_sand", "blocks/suspicious_sand_0"], - ["sweet_berry_bush", "blocks/sweet_berry_bush_stage3"], - ["tallgrass", "blocks/tallgrass"], - ["target", "blocks/target_side"], - ["tinted_glass", "blocks/tinted_glass"], - ["tnt", "blocks/tnt_top"], - ["torch", "blocks/torch_on"], - ["torchflower", "blocks/torchflower"], - ["torchflower_crop", "blocks/torchflower_crop_stage_1"], - ["trapdoor", "blocks/trapdoor"], - ["trapped_chest", "blocks/trapped_chest_front"], - ["trip_wire", "blocks/trip_wire"], - ["tripwire_hook", "blocks/trip_wire_source"], - ["tube_coral", "blocks/coral_blue"], - ["tuff", "blocks/tuff"], - ["turtle_egg", "items/turtle_egg"], - ["twisting_vines", "blocks/twisting_vines_bottom"], - ["underwater_torch", ""], - ["undyed_shulker_box", "blocks/shulker_top_pink"], - ["unknown", ""], - ["unlit_redstone_torch", "blocks/redstone_torch_off"], - ["unpowered_comparator", "blocks/comparator_off"], - ["unpowered_repeater", "blocks/repeater_off"], - ["verdant_froglight", "blocks/verdant_froglight_top"], - ["vine", "blocks/vine"], - ["wall_banner", ""], - ["wall_sign", "items/sign"], - ["warped_button", "blocks/huge_fungus/warped_planks"], - ["warped_door", "items/warped_door"], - ["warped_double_slab", "blocks/huge_fungus/warped_plankss"], - ["warped_fence", "blocks/huge_fungus/warped_planks"], - ["warped_fence_gate", "blocks/huge_fungus/warped_planks"], - ["warped_fungus", "blocks/warped_fungus"], - ["warped_hanging_sign", "items/warped_hanging_sign"], - ["warped_hyphae", ""], - ["warped_nylium", "blocks/warped_nylium_side"], - ["warped_planks", "blocks/huge_fungus/warped_planks"], - ["warped_pressure_plate", "blocks/huge_fungus/warped_planks"], - ["warped_roots", "blocks/warped_roots"], - ["warped_slab", "blocks/huge_fungus/warped_planks"], - ["warped_stairs", "blocks/huge_fungus/warped_planks"], - ["warped_standing_sign", "items/sign_warped"], - ["warped_stem", "blocks/huge_fungus/warped_stem_top"], - ["warped_trapdoor", "blocks/huge_fungus/warped_trapdoor"], - ["warped_wall_sign", "items/sign_warped"], - ["warped_wart_block", "blocks/warped_wart_block"], - ["water", "blocks/water_still"], - ["waterlily", "blocks/waterlily"], - ["waxed_copper", "blocks/copper_block"], - ["waxed_cut_copper", "blocks/cut_copper"], - ["waxed_cut_copper_slab", "blocks/cut_copper"], - ["waxed_cut_copper_stairs", "blocks/cut_copper"], - ["waxed_double_cut_copper_slab", "blocks/cut_copper"], - ["waxed_exposed_copper", "blocks/exposed_copper"], - ["waxed_exposed_cut_copper", "blocks/exposed_cut_copper"], - ["waxed_exposed_cut_copper_slab", "blocks/exposed_cut_copper"], - ["waxed_exposed_cut_copper_stairs", "blocks/exposed_cut_copper"], - ["waxed_exposed_double_cut_copper_slab", "blocks/exposed_cut_copper"], - ["waxed_oxidized_copper", "blocks/oxidized_copper"], - ["waxed_oxidized_cut_copper", "blocks/oxidized_cut_copper"], - ["waxed_oxidized_cut_copper_slab", "blocks/oxidized_cut_copper"], - ["waxed_oxidized_cut_copper_stairs", "blocks/oxidized_cut_copper"], - ["waxed_oxidized_double_cut_copper_slab", "blocks/oxidized_cut_copper"], - ["waxed_weathered_copper", "blocks/weathered_copper"], - ["waxed_weathered_cut_copper", "blocks/weathered_cut_copper"], - ["waxed_weathered_cut_copper_slab", "blocks/weathered_cut_copper"], - ["waxed_weathered_cut_copper_stairs", "blocks/weathered_cut_copper"], - ["waxed_weathered_double_cut_copper_slab", "blocks/weathered_cut_copper"], - ["weathered_copper", "blocks/weathered_copper"], - ["weathered_cut_copper", "blocks/weathered_cut_copper"], - ["weathered_cut_copper_slab", "blocks/weathered_cut_copper"], - ["weathered_cut_copper_stairs", "blocks/weathered_cut_copper"], - ["weathered_double_cut_copper_slab", "blocks/weathered_cut_copper"], - ["web", "blocks/web"], - ["weeping_vines", "blocks/weeping_vines"], - ["wheat", "blocks/wheat_stage_7"], - ["white_candle", "blocks/candles/white_candle"], - ["white_candle_cake", "blocks/candles/white_candle"], - ["white_carpet", "blocks/wool_coloured_white"], - ["white_concrete", "blocks/concrete_white"], - ["white_glazed_terracotta", "blocks/glazed_terracotta_white"], - ["white_shulker_box", "blocks/shulker_top_white"], - ["white_wool", "blocks/wool_coloured_white"], - ["wither_rose", ""], - ["wood", "blocks/planks_oak"], - ["wooden_button", "blocks/planks_oak"], - ["wooden_door", "items/door_wood"], - ["wooden_pressure_plate", "blocks/planks_oak"], - ["wooden_slab", "blocks/planks_oak"], - ["yellow_candle", "blocks/candles/yellow_candle"], - ["yellow_candle_cake", "blocks/candles/yellow_candle"], - ["yellow_carpet", "blocks/wool_coloured_yellow"], - ["yellow_concrete", "blocks/concrete_yellow"], - ["yellow_flower", "blocks/flower_dandelion"], - ["yellow_glazed_terracotta", "blocks/glazed_terracotta_yellow"], - ["yellow_shulker_box", "blocks/shulker_top_yellow"], - ["yellow_wool", "blocks/wool_coloured_yellow"], - //items these have had the blocks excluded - ["acacia_boat", "items/boat_acacia"], - ["acacia_chest_boat", "items/acacia_chest_boat"], - ["acacia_sign", "items/sign_acacia"], - ["allay_spawn_egg", "items/egg_null"], - ["amethyst_shard", "items/amethyst_shard"], - ["angler_pottery_sherd", "items/angler_pottery_sherd"], - ["apple", "items/apple"], - ["archer_pottery_sherd", "items/archer_pottery_sherd"], - ["armor_stand", "items/armor_stand"], - ["arms_up_pottery_sherd", "items/arms_up_pottery_sherd"], - ["arrow", "items/arrow"], - ["axolotl_bucket", "items/bucket_axolotl"], - ["axolotl_spawn_egg", "items/egg_null"], - ["baked_potato", "items/potato_baked"], - ["bamboo_chest_raft", "items/bamboo_chest_raft"], - ["bamboo_raft", "items/bamboo_raft"], - ["bamboo_sign", "items/bamboo_sign"], - ["banner", ""], - ["banner_pattern", "items/banner_pattern"], - ["bat_spawn_egg", "items/egg_bat"], - ["bee_spawn_egg", "items/egg_bee"], - ["beef", "items/beef_raw"], - ["beetroot_seeds", "items/seeds_beetroot"], - ["beetroot_soup", "items/beetroot_soup"], - ["birch_boat", "items/boat_birch"], - ["birch_chest_boat", "items/birch_chest_boat"], - ["birch_sign", "items/sign_birch"], - ["black_dye", "items/dye_powder_black_new"], - ["blade_pottery_sherd", "items/blade_pottery_sherd"], - ["blaze_powder", "items/blaze_powder"], - ["blaze_rod", "items/blaze_rod"], - ["blaze_spawn_egg", "items/egg_blaze"], - ["blue_dye", "items/dye_powder_blue_new"], - ["boat", "items/boat"], - ["bone", "items/bone"], - ["bone_meal", "items/dye_powder_white"], - ["book", "items/book_normal"], - ["bordure_indented_banner_pattern", "items/banner_pattern"], - ["bow", "items/bow_standby"], - ["bowl", "items/bowl"], - ["bread", "items/bread"], - ["brewer_pottery_sherd", "items/brewer_pottery_sherd"], - ["brick", "items/brick"], - ["brown_dye", "items/dye_powder_brown_new"], - ["brush", "items/brush"], - ["bucket", "items/bucket_empty"], - ["burn_pottery_sherd", "items/burn_pottery_sherd"], - ["camel_spawn_egg", "items/egg_mule"], - ["carpet", "blocks/wool_coloured_white"], - ["carrot", "items/carrot"], - ["carrot_on_a_stick", "items/carrot_on_a_stick"], - ["cat_spawn_egg", "items/egg_cat"], - ["cave_spider_spawn_egg", "items/egg_spider"], - ["chainmail_boots", "items/chainmail_boots"], - ["chainmail_chestplate", "items/chainmail_chestplate"], - ["chainmail_helmet", "items/chainmail_helmet"], - ["chainmail_leggings", "items/chainmail_leggings"], - ["charcoal", "items/charcoal"], - ["cherry_boat", "items/cherry_boat"], - ["cherry_chest_boat", "items/cherry_chest_boat"], - ["cherry_sign", "items/cherry_sign"], - ["chest_boat", "items/oak_chest_boat"], - ["chest_minecart", "items/minecart_chest"], - ["chicken", "items/chicken_raw"], - ["chicken_spawn_egg", "items/chicken_cooked"], - ["chorus_fruit", "items/chorus_fruit"], - ["clay_ball", "items/clay_ball"], - ["clock", "items/clock_item"], - ["coal", "items/coal"], - ["coast_armor_trim_smithing_template", "items/coast_armor_trim_smithing_template"], - ["cocoa_beans", "blocks/cocoa_stage_2"], - ["cod", "items/fish_raw"], - ["cod_bucket", "items/bucket_cod"], - ["cod_spawn_egg", "items/egg_cod"], - ["command_block_minecart", "items/minecart_command_block"], - ["comparator", "items/comparator"], - ["compass", "items/compass_item"], - ["concrete", "blocks/blocks/concrete_white"], - ["cooked_beef", "items/beef_cooked"], - ["cooked_chicken", "items/chicken_cooked"], - ["cooked_cod", "items/fish_cooked"], - ["cooked_mutton", "items/mutton_cooked"], - ["cooked_porkchop", "items/porkchop_cooked"], - ["cooked_rabbit", "items/rabbit_cooked"], - ["cooked_salmon", "items/salmon_cooked"], - ["cookie", "items/cookie"], - ["copper_ingot", "items/copper_ingot"], - ["coral", "blocks/coral_fan_pink"], - ["cow_spawn_egg", "items/egg_cow"], - ["creeper_banner_pattern", "items/banner_pattern"], - ["creeper_spawn_egg", "items/egg_creeper"], - ["crimson_sign", "items/sign_crimson"], - ["crossbow", "items/crossbow_standby"], - ["cyan_dye", "items/dye_powder_cyan"], - ["danger_pottery_sherd", "items/danger_pottery_sherd"], - ["dark_oak_boat", "items/boat_dark_oak"], - ["dark_oak_chest_boat", "items/dark_oak_chest_boat"], - ["dark_oak_sign", "items/sign_oak"], - ["diamond", "items/diamond"], - ["diamond_axe", "items/diamond_axe"], - ["diamond_boots", "items/diamond_boots"], - ["diamond_chestplate", "items/diamond_chestplate"], - ["diamond_helmet", "items/diamond_helmet"], - ["diamond_hoe", "items/diamond_hoe"], - ["diamond_horse_armor", "items/diamond_horse_armor"], - ["diamond_leggings", "items/diamond_leggings"], - ["diamond_pickaxe", "items/diamond_pickaxe"], - ["diamond_shovel", "items/diamond_shovel"], - ["diamond_sword", "items/diamond_sword"], - ["disc_fragment_5", "items/disc_fragment_5"], - ["dolphin_spawn_egg", "items/egg_dolphin"], - ["donkey_spawn_egg", "items/egg_donkey"], - ["dragon_breath", "items/dragons_breath"], - ["dried_kelp", "items/dried_kelp"], - ["drowned_spawn_egg", "items/egg_drowned"], - ["dune_armor_trim_smithing_template", "items/dune_armor_trim_smithing_template"], - ["dye", "items/dye_red"], - ["echo_shard", "items/echo_shard"], - ["egg", "items/egg"], - ["elder_guardian_spawn_egg", "items/egg_elderguardian"], - ["elytra", "items/elytra"], - ["emerald", "items/emerald"], - ["empty_map", "items/map_empty"], - ["enchanted_book", "items/book_enchanted"], - ["enchanted_golden_apple", "items/apple_golden"], - ["end_crystal", "items/end_crystal"], - ["ender_dragon_spawn_egg", "blocks/dragon_egg"], - ["ender_eye", "items/ender_eye"], - ["ender_pearl", "items/ender_pearl"], - ["enderman_spawn_egg", "items/egg_enderman"], - ["endermite_spawn_egg", "items/egg_endermite"], - ["evoker_spawn_egg", "items/egg_evoker"], - ["experience_bottle", "items/experience_bottle"], - ["explorer_pottery_sherd", "items/explorer_pottery_sherd"], - ["eye_armor_trim_smithing_template", "items/eye_armor_trim_smithing_template"], - ["feather", "items/feather"], - ["fence", ""], - ["fermented_spider_eye", "items/spider_eye_fermented"], - ["field_masoned_banner_pattern", "items/banner_pattern"], - ["filled_map", "items/map_filled"], - ["fire_charge", "items/fireball"], - ["firework_rocket", "items/fireworks"], - ["firework_star", "items/fireworks_charge"], - ["fishing_rod", "items/fishing_rod_uncast"], - ["flint", "items/flint"], - ["flint_and_steel", "items/flint_and_steel"], - ["flower_banner_pattern", "items/banner_pattern"], - ["fox_spawn_egg", "items/egg_fox"], - ["friend_pottery_sherd", "items/friend_pottery_sherd"], - //Unable to locate a texture. - ["frog_spawn_egg", ""], - ["ghast_spawn_egg", "items/egg_ghast"], - ["ghast_tear", "items/ghast_tear"], - ["glass_bottle", "items/potion_bottle_empty"], - ["glass_bottle", "items/potion_bottle_empty"], - ["glistering_melon_slice", "items/melon_speckled"], - ["globe_banner_pattern", "items/banner_pattern"], - ["glow_berries", "items/glow_berries"], - ["glow_ink_sac", "items/dye_powder_glow"], - ["glow_squid_spawn_egg", "items/egg_glow_squid"], - ["glowstone_dust", "items/glowstone_dust"], - ["goat_horn", "items/goat_horn"], - ["goat_spawn_egg", "egg_goat"], - ["gold_ingot", "items/gold_ingot"], - ["gold_nugget", "items/gold_nugget"], - ["golden_apple", "items/apple_golden"], - ["golden_axe", "items/gold_axe"], - ["golden_boots", "items/gold_boots"], - ["golden_carrot", "items/carrot_golden"], - ["golden_chestplate", "items/gold_chestplate"], - ["golden_helmet", "items/gold_helmet"], - ["golden_hoe", "items/gold_hoe"], - ["golden_horse_armor", "items/gold_horse_armor"], - ["golden_leggings", "items/gold_leggings"], - ["golden_pickaxe", "items/gold_pickaxe"], - ["golden_shovel", "items/gold_shovel"], - ["golden_sword", "items/gold_sword"], - ["gray_dye", "items/dye_powder_grey"], - ["green_dye", "items/dye_powder_green"], - ["guardian_spawn_egg", "items/egg_guardian"], - ["gunpowder", "items/gunpowder"], - ["heart_of_the_sea", "items/heartofthesea_closed"], - ["heart_pottery_sherd", "items/heart_pottery_sherd"], - ["heartbreak_pottery_sherd", "items/heartbreak_pottery_sherd"], - ["hoglin_spawn_egg", "items/egg_hoglin"], - ["honey_bottle", "items/honey_bottle"], - ["honeycomb", "items/honeycomb"], - ["hopper_minecart", "items/minecart_hopper"], - ["horse_spawn_egg", "items/egg_horse"], - ["host_armor_trim_smithing_template", "items/host_armor_trim_smithing_template"], - ["howl_pottery_sherd", "items/howl_pottery_sherd"], - ["husk_spawn_egg", "items/egg_husk"], - ["ink_sac", "items/dye_powder_black"], - ["iron_axe", "items/iron_axe"], - ["iron_boots", "items/iron_boots"], - ["iron_chestplate", "items/iron_chestplate"], - ["iron_golem_spawn_egg", "items/egg_null"], - ["iron_helmet", "items/iron_helmet"], - ["iron_hoe", "items/iron_hoe"], - ["iron_horse_armor", "items/iron_horse_armor"], - ["iron_ingot", "items/iron_ingot"], - ["iron_leggings", "items/iron_leggings"], - ["iron_nugget", "items/iron_nugget"], - ["iron_pickaxe", "items/iron_pickaxe"], - ["iron_shovel", "items/iron_shovel"], - ["iron_sword", "items/iron_sword"], - ["jungle_boat", "items/boat_jungle"], - ["jungle_chest_boat", "items/jungle_chest_boat"], - ["jungle_sign", "items/sign_jungle"], - ["lapis_lazuli", "items/dye_powder_blue"], - ["lava_bucket", "items/bucket_lava"], - ["lead", "items/lead"], - ["leather", "items/leather"], - ["leather_boots", "items/leather_boots"], - ["leather_chestplate", "items/leather_chestplate"], - ["leather_helmet", "items/leather_helmet"], - ["leather_horse_armor", "items/leather_horse_armor"], - ["leather_leggings", "items/leather_leggings"], - ["light_blue_dye", "items/dye_powder_light_blue"], - ["light_gray_dye", "items/dye_powder_light_gray"], - ["lime_dye", "items/dye_powder_lime"], - ["lingering_potion", "items/potion_bottle_lingering"], - ["llama_spawn_egg", "items/egg_llama"], - ["lodestone_compass", "items/lodestonecompass_item"], - ["log", "blocks/log_big_oak"], - ["log2", "blocks/log_spruce"], - ["magenta_dye", "items/dye_powder_magenta"], - ["magma_cream", "items/magma_cream"], - ["magma_cube_spawn_egg", "items/egg_lava_slime"], - ["mangrove_boat", "items/mangrove_boat"], - ["mangrove_chest_boat", "items/mangrove_chest_boat"], - ["mangrove_sign", "items/mangrove_sign"], - ["melon_seeds", "items/seeds_melon"], - ["melon_slice", "items/melon"], - ["milk_bucket", "items/bucket_milk"], - ["minecart", "items/minecart_normal"], - ["miner_pottery_sherd", "items/miner_pottery_sherd"], - ["mojang_banner_pattern", "items/banner_pattern"], - ["mooshroom_spawn_egg", "items/egg_mushroomcow"], - ["mourner_pottery_sherd", "items/mourner_pottery_sherd"], - ["mule_spawn_egg", "items/egg_mule"], - ["mushroom_stew", "items/mushroom_stew"], - ["music_disc_11", "items/record_11"], - ["music_disc_13", "items/record_13"], - ["music_disc_5", "items/record_5"], - ["music_disc_blocks", "items/record_blocks"], - ["music_disc_cat", "items/record_cat"], - ["music_disc_chirp", "items/record_chirp"], - ["music_disc_far", "items/record_far"], - ["music_disc_mall", "items/record_mall"], - ["music_disc_mellohi", "items/record_mellohi"], - ["music_disc_otherside", "items/record_otherside"], - ["music_disc_pigstep", "items/record_pigstep"], - ["music_disc_relic", "items/music_disc_relic"], - ["music_disc_stal", "items/record_stal"], - ["music_disc_strad", "items/record_strad"], - ["music_disc_wait", "items/record_wait"], - ["music_disc_ward", "items/record_ward"], - ["mutton", "items/mutton_raw"], - ["name_tag", "items/name_tag"], - ["nautilus_shell", "items/nautilus"], - ["nether_star", "items/nether_star"], - ["netherbrick", "items/netherbrick"], - ["netherite_axe", "items/netherite_axe"], - ["netherite_boots", "items/netherite_boots"], - ["netherite_chestplate", "items/netherite_chestplate"], - ["netherite_helmet", "items/netherite_helmet"], - ["netherite_hoe", "items/netherite_hoe"], - ["netherite_ingot", "items/netherite_ingot"], - ["netherite_leggings", "items/netherite_leggings"], - ["netherite_pickaxe", "items/netherite_pickaxe"], - ["netherite_scrap", "items/netherite_scrap"], - ["netherite_shovel", "items/netherite_shovel"], - ["netherite_sword", "items/netherite_sword"], - ["netherite_upgrade_smithing_template", "items/netherite_upgrade_smithing_template"], - ["oak_boat", "items/boat_oak"], - ["oak_chest_boat", "items/oak_chest_boat"], - ["oak_sign", "items/sign_oak"], - ["ocelot_spawn_egg", "items/egg_ocelot"], - ["orange_dye", "items/dye_powder_orange"], - ["painting", "items/painting"], - ["panda_spawn_egg", "items/egg_panda"], - ["paper", "items/paper"], - ["parrot_spawn_egg", "items/egg_parrot"], - ["phantom_membrane", "items/phantom_membrane"], - ["phantom_spawn_egg", "items/egg_phantom"], - ["pig_spawn_egg", "items/egg_pig"], - ["piglin_banner_pattern", "items/banner"], - ["piglin_brute_spawn_egg", "items/egg_null"], - ["piglin_spawn_egg", "items/egg_null"], - ["pillager_spawn_egg", "items/egg_pillager"], - ["pink_dye", "items/dye_powder_pink"], - ["pitcher_pod", "items/pitcher_pod"], - ["plenty_pottery_sherd", "items/plenty_pottery_sherd"], - ["poisonous_potato", "items/potato_poisonous"], - ["polar_bear_spawn_egg", "items/egg_polarbear"], - ["popped_chorus_fruit", "items/chorus_fruit_popped"], - ["porkchop", "items/porkchop_raw"], - ["potato", "items/potato"], - ["potion", "items/potion_bottle_heal"], - ["powder_snow_bucket", "items/bucket_powder_snow"], - ["prismarine_crystals", "items/prismarine_crystals"], - ["prismarine_shard", "items/prismarine_shard"], - ["prize_pottery_sherd", "items/prize_pottery_sherd"], - ["pufferfish", "items/fish_pufferfish_raw"], - ["pufferfish_bucket", "items/bucket_pufferfish"], - ["pufferfish_spawn_egg", "items/egg_pufferfish"], - ["pumpkin_pie", "items/pumpkin_pie"], - ["pumpkin_seeds", "items/seeds_pumpjin"], - ["purple_dye", "dye_powder_purple"], - ["quartz", "items/quartz"], - ["rabbit", "items/rabbit_raw"], - ["rabbit_foot", "items/rabbit_foot"], - ["rabbit_hide", "items/rabbit_hide"], - ["rabbit_spawn_egg", "items/egg_rabbit"], - ["rabbit_stew", "items/rabbit_stew"], - ["raiser_armor_trim_smithing_template", "items/raiser_armor_trim_smithing_template"], - ["ravager_spawn_egg", "items/egg_ravanger"], - ["raw_copper", "items/raw_copper"], - ["raw_gold", "items/raw_gold"], - ["raw_iron", "items/raw_iron"], - ["recovery_compass", "items/compass_item"], - ["red_dye", "dye_powder_red"], - ["redstone", "items/redstone_dust"], - ["repeater", "items/repeater"], - ["rib_armor_trim_smithing_template", "items/rib_armor_trim_smithing_template"], - ["rotten_flesh", "items/rotten_flesh"], - ["saddle", "items/saddle"], - ["salmon", "items/fish_salmon_raw"], - ["salmon_bucket", "items/bucket_salmon"], - ["salmon_spawn_egg", "items/egg_salmon"], - ["scute", "items/turtle_shell_piece"], - ["sentry_armor_trim_smithing_template", "items/sentry_armor_trim_smithing_template"], - ["shaper_armor_trim_smithing_template", "items/shaper_armor_trim_smithing_template"], - ["sheaf_pottery_sherd", "items/sheaf_pottery_sherd"], - ["shears", "items/shears"], - ["sheep_spawn_egg", "items/egg_sheep"], - ["shelter_pottery_sherd", "items/shelter_pottery_sherd"], - ["shield", ""], - ["shulker_box", "blocks/shulker_top_undyed"], - ["shulker_shell", "items/shulker_shell"], - ["shulker_spawn_egg", "items/egg_shulker"], - ["silence_armor_trim_smithing_template", "items/silence_armor_trim_smithing_template"], - ["silverfish_spawn_egg", "items/egg_silverfish"], - ["skeleton_horse_spawn_egg", "items/egg_skeletonhorse"], - ["skeleton_spawn_egg", "items/egg_skeleton"], - ["skull_banner_pattern", "items/banner"], - ["skull_pottery_sherd", "items/skull_pottery_sherd"], - ["slime_ball", "items/slimeball"], - ["slime_spawn_egg", "items/egg_slime"], - ["sniffer_spawn_egg", "items/egg_sniffer"], - ["snort_pottery_sherd", "items/snort_pottery_sherd"], - ["snout_armor_trim_smithing_template", "items/snout_armor_trim_smithing_template"], - ["snow_golem_spawn_egg", "items/egg_null"], - ["snowball", "items/snowball"], - ["spawn_egg", "items/spawn_egg"], - ["spider_eye", "items/spider_eye"], - ["spider_spawn_egg", "items/egg_spider"], - ["spire_armor_trim_smithing_template", "items/spire_armor_trim_smithing_template"], - ["splash_potion", "items/potion_bottle_splash"], - ["spruce_boat", "items/boat_spruce"], - ["spruce_chest_boat", "items/spruce_chest_boat"], - ["spruce_sign", "items/sign_spruce"], - ["spyglass", "items/spyglass"], - ["squid_spawn_egg", "items/egg_squid"], - ["stick", "items/stick"], - ["stone_axe", "items/stone_axe"], - ["stone_hoe", "items/stone_hoe"], - ["stone_pickaxe", "items/stone_pickaxe"], - ["stone_shovel", "items/stone_shovel"], - ["stone_sword", "items/stone_sword"], - ["stray_spawn_egg", "items/egg_stray"], - ["strider_spawn_egg", "items/egg_strider"], - ["string", "items/string"], - ["sugar", "items/sugar"], - ["sugar_cane", "items/reeds"], - ["suspicious_stew", "items/suspicious_stew"], - ["sweet_berries", "items/sweet_berries"], - ["tadpole_bucket", "items/bucket_tadpole"], - ["tadpole_spawn_egg", "items/egg_tadpole"], - ["tide_armor_trim_smithing_template", "items/tide_armor_trim_smithing_template"], - ["tnt_minecart", "items/minecart_tnt"], - ["torchflower_seeds", "items/torchflower_seeds"], - ["totem_of_undying", "items/totem"], - ["trader_llama_spawn_egg", "items/egg_llama"], - ["trident", "items/trident"], - ["tropical_fish", "items/fish_clownfish_raw"], - ["tropical_fish_bucket", "items/bucket_tropical"], - ["tropical_fish_spawn_egg", "items/egg_clownfish"], - ["turtle_helmet", "items/turtle_helmet"], - ["turtle_spawn_egg", "items/egg_turtle"], - ["vex_armor_trim_smithing_template", "items/vex_armor_trim_smithing_template"], - ["vex_spawn_egg", "items/egg_vex"], - ["villager_spawn_egg", "items/egg_villager"], - ["vindicator_spawn_egg", "items/egg_vindicator"], - ["wandering_trader_spawn_egg", "items/egg_wanderingtrader"], - ["ward_armor_trim_smithing_template", "items/ward_armor_trim_smithing_template"], - ["warden_spawn_egg", "items/egg_warden"], - ["warped_fungus_on_a_stick", "items/warped_fungus_on_a_stick"], - ["warped_sign", "items/sign_warped"], - ["water_bucket", "items/bucket_water"], - ["wayfinder_armor_trim_smithing_template", "items/wayfinder_armor_trim_smithing_template"], - ["wheat_seeds", "items/wheat"], - ["white_dye", "items/dye_powder_white_new"], - ["wild_armor_trim_smithing_template", "items/wild_armor_trim_smithing_template"], - ["witch_spawn_egg", "items/egg_witch"], - ["wither_skeleton_spawn_egg", "items/egg_null"], - ["wither_spawn_egg", "items/egg_wither"], - ["wolf_spawn_egg", "items/egg_wolf"], - ["wooden_axe", "items/wood_axe"], - ["wooden_hoe", "items/wood_hoe"], - ["wooden_pickaxe", "items/wood_pickaxe"], - ["wooden_shovel", "items/wood_shovel"], - ["wooden_sword", "items/wood_sword"], - ["wool", "blocks/coloured_wool_white"], - ["writable_book", "items/book_writeable"], - ["yellow_dye", "items/dye_powder_yellow"], - ["zoglin_spawn_egg", "items/egg_null"], - ["zombie_horse_spawn_egg", "items/egg_zombiehorse"], - ["zombie_pigman_spawn_egg", "items/egg_pigzombie"], - ["zombie_spawn_egg", "items/egg_zombie"], - ["zombie_villager_spawn_egg", "egg_zombievillager"], - ]); - // Update the fourth value (texture) in the itemArray - const itemArrayLength = itemArray.length; - for (let i = 0; i < itemArrayLength; i += 4) { - const type = itemArray[i + 3]; - const texture = textures.get(type.toString()) || "ui/slots_bg"; - itemArray[i + 3] = texture; - } - // Output the updated itemArray(Debugging) - console.log(itemArray); - //once the loop is done then move to the next part - const playerInventory = new ActionFormData(); - playerInventory.title("§4" + member.nameTag + "のインベントリ!!" + "§4"); - playerInventory.body("UserID 【<" + member.id + ">】"); - playerInventory.button(itemArray[1] + "を" + itemArray[2] + "個持っています", "textures/" + itemArray[3]); ////0 - playerInventory.button(itemArray[5] + " を " + itemArray[6] + "個持っています", "textures/" + itemArray[7]); //1 - playerInventory.button(itemArray[9] + " を " + itemArray[10] + "個持っています", "textures/" + itemArray[11]); //2 - playerInventory.button(itemArray[13] + " を " + itemArray[14] + "個持っています", "textures/" + itemArray[15]); //3 - playerInventory.button(itemArray[17] + " を " + itemArray[18] + "個持っています", "textures/" + itemArray[19]); //4 - playerInventory.button(itemArray[21] + " を " + itemArray[22] + "個持っています", "textures/" + itemArray[23]); //5 - playerInventory.button(itemArray[25] + " を " + itemArray[26] + "個持っています", "textures/" + itemArray[27]); //6 - playerInventory.button(itemArray[29] + " を " + itemArray[30] + "個持っています", "textures/" + itemArray[31]); //7 - playerInventory.button(itemArray[33] + " を " + itemArray[34] + "個持っています", "textures/" + itemArray[35]); //8 - playerInventory.button(itemArray[37] + " を " + itemArray[38] + "個持っています", "textures/" + itemArray[39]); //9 - playerInventory.button(itemArray[41] + " を " + itemArray[42] + "個持っています", "textures/" + itemArray[43]); //10 - playerInventory.button(itemArray[45] + " を " + itemArray[46] + "個持っています", "textures/" + itemArray[47]); //11 - playerInventory.button(itemArray[49] + " を " + itemArray[50] + "個持っています", "textures/" + itemArray[51]); //12 - playerInventory.button(itemArray[53] + " を " + itemArray[54] + "個持っています", "textures/" + itemArray[55]); //13 - playerInventory.button(itemArray[57] + " を " + itemArray[58] + "個持っています", "textures/" + itemArray[59]); //14 - playerInventory.button(itemArray[61] + " を " + itemArray[62] + "個持っています", "textures/" + itemArray[63]); //15 - playerInventory.button(itemArray[65] + " を " + itemArray[66] + "個持っています", "textures/" + itemArray[67]); //16 - playerInventory.button(itemArray[69] + " を " + itemArray[70] + "個持っています", "textures/" + itemArray[71]); //17 - playerInventory.button(itemArray[73] + " を " + itemArray[74] + "個持っています", "textures/" + itemArray[75]); //18 - playerInventory.button(itemArray[77] + " を " + itemArray[78] + "個持っています", "textures/" + itemArray[79]); //19 - playerInventory.button(itemArray[81] + " を " + itemArray[82] + "個持っています", "textures/" + itemArray[83]); //20 - playerInventory.button(itemArray[85] + " を " + itemArray[86] + "個持っています", "textures/" + itemArray[87]); //21 - playerInventory.button(itemArray[89] + " を " + itemArray[90] + "個持っています", "textures/" + itemArray[91]); //22 - playerInventory.button(itemArray[93] + " を " + itemArray[94] + "個持っています", "textures/" + itemArray[95]); //23 - playerInventory.button(itemArray[97] + " を " + itemArray[98] + "個持っています", "textures/" + itemArray[99]); //24 - playerInventory.button(itemArray[101] + " を " + itemArray[102] + "個持っています", "textures/" + itemArray[103]); //25 - playerInventory.button(itemArray[105] + " を " + itemArray[106] + "個持っています", "textures/" + itemArray[107]); //26 - playerInventory.button(itemArray[109] + " を " + itemArray[110] + "個持っています", "textures/" + itemArray[111]); //27 - playerInventory.button(itemArray[113] + " を " + itemArray[114] + "個持っています", "textures/" + itemArray[115]); //28 - playerInventory.button(itemArray[117] + " を " + itemArray[118] + "個持っています", "textures/" + itemArray[119]); //29 - playerInventory.button(itemArray[121] + " を " + itemArray[122] + "個持っています", "textures/" + itemArray[123]); //30 - playerInventory.button(itemArray[125] + " を " + itemArray[126] + "個持っています", "textures/" + itemArray[127]); //31 - playerInventory.button(itemArray[129] + " を " + itemArray[130] + "個持っています", "textures/" + itemArray[131]); //32 - playerInventory.button(itemArray[133] + " を " + itemArray[134] + "個持っています", "textures/" + itemArray[135]); //33 - playerInventory.button(itemArray[137] + " を " + itemArray[138] + "個持っています", "textures/" + itemArray[139]); //34 - playerInventory.button(itemArray[141] + " を " + itemArray[142] + "個持っています", "textures/" + itemArray[143]); //35 - playerInventory - .show(player) - .then((playerInventoryResult) => { - if (playerInventoryResult.selection === 0) { - uiInvEditorMenu(player, member, 0); - } - if (playerInventoryResult.selection === 1) { - uiInvEditorMenu(player, member, 1); - } - if (playerInventoryResult.selection === 2) { - uiInvEditorMenu(player, member, 2); - } - if (playerInventoryResult.selection === 3) { - uiInvEditorMenu(player, member, 3); - } - if (playerInventoryResult.selection === 4) { - uiInvEditorMenu(player, member, 4); - } - if (playerInventoryResult.selection === 5) { - uiInvEditorMenu(player, member, 5); - } - if (playerInventoryResult.selection === 6) { - uiInvEditorMenu(player, member, 6); - } - if (playerInventoryResult.selection === 7) { - uiInvEditorMenu(player, member, 7); - } - if (playerInventoryResult.selection === 8) { - uiInvEditorMenu(player, member, 8); - } - if (playerInventoryResult.selection === 9) { - uiInvEditorMenu(player, member, 9); - } - if (playerInventoryResult.selection === 10) { - uiInvEditorMenu(player, member, 10); - } - if (playerInventoryResult.selection === 11) { - uiInvEditorMenu(player, member, 11); - } - if (playerInventoryResult.selection === 12) { - uiInvEditorMenu(player, member, 12); - } - if (playerInventoryResult.selection === 13) { - uiInvEditorMenu(player, member, 13); - } - if (playerInventoryResult.selection === 14) { - uiInvEditorMenu(player, member, 14); - } - if (playerInventoryResult.selection === 15) { - uiInvEditorMenu(player, member, 15); - } - if (playerInventoryResult.selection === 16) { - uiInvEditorMenu(player, member, 16); - } - if (playerInventoryResult.selection === 17) { - uiInvEditorMenu(player, member, 17); - } - if (playerInventoryResult.selection === 18) { - uiInvEditorMenu(player, member, 18); - } - if (playerInventoryResult.selection === 19) { - uiInvEditorMenu(player, member, 19); - } - if (playerInventoryResult.selection === 20) { - uiInvEditorMenu(player, member, 20); - } - if (playerInventoryResult.selection === 21) { - uiInvEditorMenu(player, member, 21); - } - if (playerInventoryResult.selection === 22) { - uiInvEditorMenu(player, member, 22); - } - if (playerInventoryResult.selection === 23) { - uiInvEditorMenu(player, member, 23); - } - if (playerInventoryResult.selection === 24) { - uiInvEditorMenu(player, member, 24); - } - if (playerInventoryResult.selection === 25) { - uiInvEditorMenu(player, member, 25); - } - if (playerInventoryResult.selection === 26) { - uiInvEditorMenu(player, member, 26); - } - if (playerInventoryResult.selection === 27) { - uiInvEditorMenu(player, member, 27); - } - if (playerInventoryResult.selection === 28) { - uiInvEditorMenu(player, member, 28); - } - if (playerInventoryResult.selection === 29) { - uiInvEditorMenu(player, member, 29); - } - if (playerInventoryResult.selection === 30) { - uiInvEditorMenu(player, member, 31); - } - if (playerInventoryResult.selection === 32) { - uiInvEditorMenu(player, member, 32); - } - if (playerInventoryResult.selection === 33) { - uiInvEditorMenu(player, member, 33); - } - if (playerInventoryResult.selection === 34) { - uiInvEditorMenu(player, member, 34); - } - if (playerInventoryResult.selection === 35) { - uiInvEditorMenu(player, member, 35); - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/moderation/uiInventory/uiInvEditorHelpMenu.js b/build/scripts/gui/moderation/uiInventory/uiInvEditorHelpMenu.js deleted file mode 100644 index 44f4fb7..0000000 --- a/build/scripts/gui/moderation/uiInventory/uiInvEditorHelpMenu.js +++ /dev/null @@ -1,27 +0,0 @@ -import { ActionFormData } from "@minecraft/server-ui"; -import { uiInvEditorMenu } from "./uiInvEditorMainMenu"; -export function uiInvEditorHelpMenu(player, targetPlayer, itemSlot) { - const helpMenu = new ActionFormData(); - helpMenu.title("§4使い方一覧§4"); - helpMenu.body("§6エンチャメニュー§r\nこのメニューでは、エンチャントの追加と削除ができます。.\n§6名前を付ける\n§rこのメニューでは、現在選択されているアイテムの名前を変更することができます。このメニューでは、アイテム名を入力することで、アイテムを入れ替えることができます。また、アイテム名を入力することで、空のインベントリスロットを選択しているプレイヤーにアイテムを渡すこともできます。 アイテムを他のプレイヤーに転送したい場合は、ドロップダウンから自分の名前を選択してください。自分のインベントリで次に空いているアイテムスロットを確認します。"); - helpMenu.button("戻る"); - helpMenu - .show(player) - .then((InvEditorMenuUIResult) => { - if (InvEditorMenuUIResult.selection == 0) { - //Return to the main menu - uiInvEditorMenu(player, targetPlayer, itemSlot); - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/moderation/uiInventory/uiInvEditorMainMenu.js b/build/scripts/gui/moderation/uiInventory/uiInvEditorMainMenu.js deleted file mode 100644 index 6f4ce8e..0000000 --- a/build/scripts/gui/moderation/uiInventory/uiInvEditorMainMenu.js +++ /dev/null @@ -1,71 +0,0 @@ -import { ActionFormData } from "@minecraft/server-ui"; -import { uiItemEditorEnchantmentsMenu } from "./uiItemEditorEnchantmentsMenu"; -import { uiItemEditorNameMenu } from "./uiInvEditorNameMenu"; -import { uiItemEditorReplaceMenu } from "./uiInvEditorReplaceMenu"; -import { uiItemEditorTransferMenu } from "./uiInvEditorTransferMenu"; -import { uiInvEditorHelpMenu } from "./uiInvEditorHelpMenu"; -import { inventoryHandler } from "../../guiHandler/guiHandlerModeration/results/inventoryui"; -import { uiItemEditorStats } from "./uiItemEditorStats"; -import { uiItemEditorRepairMenu } from "./uiInvEditorRepairItemMenu"; -export function uiInvEditorMenu(player, targetPlayer, itemSlot) { - const menu = new ActionFormData(); - menu.title("§4インベントリ:メインメニュー§4"); - const inv = targetPlayer.getComponent("inventory"); - const container = inv.container; - const item = container.getItem(itemSlot); - menu.body("§r現在のユーザーのインベントリ§6" + targetPlayer.name + "\n" + "§r現在指定されているアイテム=> §6" + item.typeId.replace("minecraft:", "")); - menu.button("アイテムステータス"); - menu.button("エンチャ付与"); - menu.button("名前を付ける"); - menu.button("消去又は置き換える"); - menu.button("自分のインベントリに移動"); - menu.button("アイテムの耐久性"); - menu.button("プレイヤーリストに戻る"); - menu.button("ヘルプメニュー"); - menu.show(player) - .then((InvEditorMenuUIResult) => { - if (InvEditorMenuUIResult.selection == 0) { - //items stats - uiItemEditorStats(player, targetPlayer, itemSlot); - } - if (InvEditorMenuUIResult.selection == 1) { - //enchantments - uiItemEditorEnchantmentsMenu(player, targetPlayer, itemSlot); - } - if (InvEditorMenuUIResult.selection == 2) { - //Naming and Lore - uiItemEditorNameMenu(player, targetPlayer, itemSlot); - } - if (InvEditorMenuUIResult.selection == 3) { - //Replace Or Delete Item - uiItemEditorReplaceMenu(player, targetPlayer, itemSlot); - } - if (InvEditorMenuUIResult.selection == 4) { - //Delete or Transfer Item - uiItemEditorTransferMenu(player, targetPlayer, itemSlot); - } - if (InvEditorMenuUIResult.selection == 5) { - //Repair set item durability - uiItemEditorRepairMenu(player, targetPlayer, itemSlot); - } - if (InvEditorMenuUIResult.selection == 6) { - //Show the player the players list screen - inventoryHandler(player); - } - if (InvEditorMenuUIResult.selection == 7) { - //Show the player the help screen. - uiInvEditorHelpMenu(player, targetPlayer, itemSlot); - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/moderation/uiInventory/uiInvEditorNameMenu.js b/build/scripts/gui/moderation/uiInventory/uiInvEditorNameMenu.js deleted file mode 100644 index 6177aa5..0000000 --- a/build/scripts/gui/moderation/uiInventory/uiInvEditorNameMenu.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { uiItemEditorName } from "./uiItemEditor"; -export function uiItemEditorNameMenu(player, targetPlayer, itemSlot) { - const itemEditor = new ModalFormData(); - itemEditor.title("§4インベントリ:名前の変更をアイテム置き換え§4"); - itemEditor.toggle("名前を変える", false); - itemEditor.textField("名前", "最強の剣"); - itemEditor.toggle("アイテムの説明", false); - itemEditor.textField("説明内容", "例:攻撃力1,防御力0"); - itemEditor - .show(player) - .then((InvEditorUIResult) => { - uiItemEditorName(InvEditorUIResult, player, targetPlayer, itemSlot); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/moderation/uiInventory/uiInvEditorRepairItemMenu.js b/build/scripts/gui/moderation/uiInventory/uiInvEditorRepairItemMenu.js deleted file mode 100644 index 9cf71ff..0000000 --- a/build/scripts/gui/moderation/uiInventory/uiInvEditorRepairItemMenu.js +++ /dev/null @@ -1,24 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { uiItemEditorRepair } from "./uiItemEditor"; -export function uiItemEditorRepairMenu(player, targetPlayer, itemSlot) { - handleUIitemEditorRepairMenu(player, targetPlayer, itemSlot).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIitemEditorRepairMenu(player, targetPlayer, itemSlot) { - const repairMenu = new ModalFormData(); - //Show the stats for the item. - repairMenu.title("§4アイテムの修理§4"); - repairMenu.toggle("修理!", false); - repairMenu.show(player).then((InvEditorMenuUIResult) => { - uiItemEditorRepair(InvEditorMenuUIResult, player, targetPlayer, itemSlot); - }); - } -} diff --git a/build/scripts/gui/moderation/uiInventory/uiInvEditorReplaceMenu.js b/build/scripts/gui/moderation/uiInventory/uiInvEditorReplaceMenu.js deleted file mode 100644 index cba0c86..0000000 --- a/build/scripts/gui/moderation/uiInventory/uiInvEditorReplaceMenu.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { uiItemEditorReplace } from "./uiItemEditor"; -export function uiItemEditorReplaceMenu(player, targetPlayer, itemSlot) { - const itemEditor = new ModalFormData(); - itemEditor.title("§4インベントリ:アイテム置き換えと消去§4"); - itemEditor.toggle("アイテムを置き換え", false); - itemEditor.textField("置き換えるアイテムの名前", "例:wooden_sword"); - itemEditor.toggle("アイテムを消す", false); - itemEditor - .show(player) - .then((InvEditorUIResult) => { - uiItemEditorReplace(InvEditorUIResult, player, targetPlayer, itemSlot); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/moderation/uiInventory/uiInvEditorTransferMenu.js b/build/scripts/gui/moderation/uiInventory/uiInvEditorTransferMenu.js deleted file mode 100644 index 2f13739..0000000 --- a/build/scripts/gui/moderation/uiInventory/uiInvEditorTransferMenu.js +++ /dev/null @@ -1,28 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { uiItemEditorTransfer } from "./uiItemEditor"; -export function uiItemEditorTransferMenu(player, targetPlayer, itemSlot) { - const itemEditor = new ModalFormData(); - itemEditor.title("§4インベントリ:アイテム移動§4"); - itemEditor.toggle("アイテムを自分のインベントリに移動させる"); - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - itemEditor.dropdown(`\n§fプレイヤーを選択して下さい§f\n\n以下のプレイヤーがオンラインです\n`, onlineList); - itemEditor.toggle("アイテムをコピー", false); - itemEditor - .show(player) - .then((InvEditorUIResult) => { - uiItemEditorTransfer(InvEditorUIResult, onlineList, player, targetPlayer, itemSlot); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/moderation/uiInventory/uiItemEditor.js b/build/scripts/gui/moderation/uiInventory/uiItemEditor.js deleted file mode 100644 index 5e37c6a..0000000 --- a/build/scripts/gui/moderation/uiInventory/uiItemEditor.js +++ /dev/null @@ -1,241 +0,0 @@ -import { world, ItemStack, Enchantment } from "@minecraft/server"; -import { sendMsgToPlayer } from "../../../util"; -import { uiInvEditorMenu } from "./uiInvEditorMainMenu"; -/** - * Handles the result of a modal form used for transferring an item from the targeted player's inventory to the selected player's inventory. - * - * @name uiItemEditorTransfer - * @param {ModalFormResponse} InvEditorUIResult - The result of the inventory editor modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the inventory management modal form. - * @param targetPlayer - The player who has been targeted. - * @param itemSlot - the item slot number of the targeted player. - */ -export function uiItemEditorTransfer(InvEditorUIResult, onlineList, player, targetPlayer, itemSlot) { - handleUIitemEditorTransfer(InvEditorUIResult, onlineList, player, targetPlayer, itemSlot).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIitemEditorTransfer(InvEditorUIResult, onlineList, player, targetPlayer, itemSlot) { - if (!InvEditorUIResult || InvEditorUIResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [transferToggle, value, duplicateToggle] = InvEditorUIResult.formValues; - //Member is used when transferring an Item. - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (transferToggle == true) { - //Member is the player the item is being transferred to - const targetPlayerinv = targetPlayer.getComponent("inventory"); - const memberPlayerinv = member.getComponent("inventory"); - let freeSlot; - const maxSlots = 36; // Maximum number of slots in the player's inventory - // Loop through the inventory and add items to the itemArray - for (let i = 0; i < maxSlots; i++) { - const item = memberPlayerinv.container.getItem(i); - if (item?.typeId) { - } - else { - freeSlot = i; - break; - } - } - targetPlayerinv.container.moveItem(itemSlot, freeSlot, memberPlayerinv.container); - } - if (duplicateToggle == true) { - //Member is the player the item is being transferred to - const targetPlayerinv = targetPlayer.getComponent("inventory"); - const memberPlayerinv = member.getComponent("inventory"); - let freeSlot; - const maxSlots = 36; // Maximum number of slots in the player's inventory - // Loop through the inventory and add items to the itemArray - for (let i = 0; i < maxSlots; i++) { - const item = memberPlayerinv.container.getItem(i); - if (item?.typeId) { - } - else { - freeSlot = i; - break; - } - } - const item = targetPlayerinv.container.getItem(itemSlot); - memberPlayerinv.container.setItem(freeSlot, item); - } - // Present the Main Menu screen again. - uiInvEditorMenu(player, targetPlayer, itemSlot); - } -} -/** - * Handles the result of a modal form used for adding or removing enchantments to the selected item from the targeted player's inventory - * @name uiItemEditorEnchantments - * @param {ModalFormResponse} InvEditorUIResult - The result of the inventory editor modal form. - * @param {Player} player - The player who triggered the inventory management modal form. - * @param targetPlayer - The player who has been targeted. - * @param itemSlot - the item slot number of the targeted player. - */ -export function uiItemEditorEnchantments(InvEditorUIResult, player, targetPlayer, itemSlot) { - handleUIitemEditorEnchantments(InvEditorUIResult, player, targetPlayer, itemSlot).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIitemEditorEnchantments(InvEditorUIResult, player, targetPlayer, itemSlot) { - const [enchantToggle, txtEnchant, txtEnchantValue, removeEnchantToggle, txtRemovEnchant] = InvEditorUIResult.formValues; - const inv = targetPlayer.getComponent("inventory"); - const container = inv.container; - const item = container.getItem(itemSlot); - //Are we adding enchantments? - if (enchantToggle == true) { - if (item) { - const enchantmentsComponent = item.getComponent("minecraft:enchantments"); - const enchantmentList = enchantmentsComponent.enchantments; - const addedCustomEnchantment = enchantmentList.addEnchantment(new Enchantment(txtEnchant.toString(), parseInt(txtEnchantValue.toString()))); - enchantmentsComponent.enchantments = enchantmentList; - container.setItem(itemSlot, item); - if (!addedCustomEnchantment) { - sendMsgToPlayer(player, "エンチャを適応できません: " + item.typeId + " エンチャ=>: " + txtEnchant + ", " + txtEnchantValue); - } - } - } - if (removeEnchantToggle == true) { - //Are we removing enchantments? - const enchantmentsComponent = item.getComponent("minecraft:enchantments"); - const enchantmentList = enchantmentsComponent.enchantments; - enchantmentList.removeEnchantment(txtRemovEnchant.toString()); - enchantmentsComponent.enchantments = enchantmentList; - container.setItem(itemSlot, item); - } - // Present the Main Menu screen again. - uiInvEditorMenu(player, targetPlayer, itemSlot); - } -} -/** - * Handles the result of a modal form used for renaming or editing the lore the selected item from the targeted player's inventory - * @name uiItemEditorName - * @param {ModalFormResponse} InvEditorUIResult - The result of the inventory editor modal form. - * @param {Player} player - The player who triggered the inventory management modal form. - * @param targetPlayer - The player who has been targeted. - * @param itemSlot - the item slot number of the targeted player. - */ -export function uiItemEditorName(InvEditorUIResult, player, targetPlayer, itemSlot) { - handleUIitemEditorName(InvEditorUIResult, player, targetPlayer, itemSlot).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIitemEditorName(InvEditorUIResult, player, targetPlayer, itemSlot) { - const [renameToggle, txtRename, loreToggle, txtLore] = InvEditorUIResult.formValues; - const inv = targetPlayer.getComponent("inventory"); - const container = inv.container; - const item = container.getItem(itemSlot); - //Are we renaming the item? - if (renameToggle == true) { - item.nameTag = txtRename.toString(); - container.setItem(itemSlot, item); - } - if (loreToggle == true) { - const loreArray = txtLore.toString().split(","); - item.setLore(loreArray); - container.setItem(itemSlot, item); - } - // Present the Main Menu screen again. - uiInvEditorMenu(player, targetPlayer, itemSlot); - } -} -/** - * Handles the result of a modal form used for replacing or deleting the selected item from the targeted player's inventory - * @name uiItemEditorReplace - * @param {ModalFormResponse} InvEditorUIResult - The result of the inventory editor modal form. - * @param {Player} player - The player who triggered the inventory management modal form. - * @param targetPlayer - The player who has been targeted. - * @param itemSlot - the item slot number of the targeted player. - */ -export function uiItemEditorReplace(InvEditorUIResult, player, targetPlayer, itemSlot) { - handleUIitemEditorReplace(InvEditorUIResult, player, targetPlayer, itemSlot).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIitemEditorReplace(InvEditorUIResult, player, targetPlayer, itemSlot) { - const [replaceToggle, txtReplace, deleteToggle] = InvEditorUIResult.formValues; - const inv = targetPlayer.getComponent("inventory"); - const container = inv.container; - //Are we replacing the item? - if (replaceToggle === true) { - const itemStack = new ItemStack("minecraft:" + txtReplace); - container.setItem(itemSlot, itemStack); - } - if (deleteToggle == true) { - container.setItem(itemSlot); - } - // Present the Main Menu screen again. - uiInvEditorMenu(player, targetPlayer, itemSlot); - } -} -/** - * Handles the result of a modal form used for repairing the selected item from the targeted player's inventory - * @name uiItemEditorRepair - * @param {ModalFormResponse} InvEditorUIResult - The result of the inventory editor modal form. - * @param {Player} player - The player who triggered the inventory management modal form. - * @param targetPlayer - The player who has been targeted. - * @param itemSlot - the item slot number of the targeted player. - */ -export function uiItemEditorRepair(InvEditorUIResult, player, targetPlayer, itemSlot) { - handleUIitemEditorRepair(InvEditorUIResult, player, targetPlayer, itemSlot).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIitemEditorRepair(InvEditorUIResult, player, targetPlayer, itemSlot) { - const [repairToggle] = InvEditorUIResult.formValues; - const inv = targetPlayer.getComponent("inventory"); - const container = inv.container; - const item = container.getItem(itemSlot); - //Current Damage values - const durability = item.getComponent("minecraft:durability"); - if (repairToggle == true) { - durability.damage = 0; - container.setItem(itemSlot, item); - } - // Present the Main Menu screen again. - uiInvEditorMenu(player, targetPlayer, itemSlot); - } -} diff --git a/build/scripts/gui/moderation/uiInventory/uiItemEditorEnchantmentsMenu.js b/build/scripts/gui/moderation/uiInventory/uiItemEditorEnchantmentsMenu.js deleted file mode 100644 index 6e4ed94..0000000 --- a/build/scripts/gui/moderation/uiInventory/uiItemEditorEnchantmentsMenu.js +++ /dev/null @@ -1,27 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { uiItemEditorEnchantments } from "./uiItemEditor"; -export function uiItemEditorEnchantmentsMenu(player, targetPlayer, itemSlot) { - const itemEditor = new ModalFormData(); - itemEditor.title("§4インベントリ:エンチャントメニュー§4"); - itemEditor.toggle("エンチャントを追加", false); - itemEditor.textField("エンチャ内容", "例:knockback"); - itemEditor.textField("エンチャ レベル", "例:3"); - itemEditor.toggle("エンチャ消去", false); - itemEditor.textField("消すエンチャ内容", "例:knockback"); - itemEditor - .show(player) - .then((InvEditorUIResult) => { - uiItemEditorEnchantments(InvEditorUIResult, player, targetPlayer, itemSlot); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/moderation/uiInventory/uiItemEditorStats.js b/build/scripts/gui/moderation/uiInventory/uiItemEditorStats.js deleted file mode 100644 index dea11d7..0000000 --- a/build/scripts/gui/moderation/uiInventory/uiItemEditorStats.js +++ /dev/null @@ -1,63 +0,0 @@ -import { ActionFormData } from "@minecraft/server-ui"; -import { uiInvEditorMenu } from "./uiInvEditorMainMenu"; -export function uiItemEditorStats(player, targetPlayer, itemSlot) { - handleUIitemEditorStats(player, targetPlayer, itemSlot).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIitemEditorStats(player, targetPlayer, itemSlot) { - const inv = targetPlayer.getComponent("inventory"); - const container = inv.container; - const item = container.getItem(itemSlot); - //get the enchantment data. - const enchantmentsComponent = item.getComponent("minecraft:enchantments"); - const enchantmentList = enchantmentsComponent.enchantments; - const enchantmentNames = []; - const iterator = enchantmentList[Symbol.iterator](); - let iteratorResult = iterator.next(); - while (!iteratorResult.done) { - const enchantment = iteratorResult.value; - enchantmentNames.push("§6" + enchantment.type.id + ": §5" + enchantment.level.toString()); - iteratorResult = iterator.next(); - } - //format the array data so that is shows correctly in the UI - const formattedEnchantments = enchantmentNames.join("\n"); - // Get the lore data for the item - const currentItemLore = item.getLore(); - const formattedLore = currentItemLore.join("\n"); - const statsMenu = new ActionFormData(); - //Current Damage values - const durability = item.getComponent("minecraft:durability"); - const maxDurability = durability.maxDurability; - let currentDamage = durability.damage; - //Show the stats for the item. - statsMenu.title("§4インベントリ:アイテムステータス§4"); - statsMenu.body("現在のオンラインリスト: §6" + - targetPlayer.name + - "\n" + - "§rアイテムを指定: §6" + - item.typeId.replace("minecraft:", "") + - "§r\n\n現在のエンチャント: \n" + - formattedEnchantments + - "\n\n§rアイテム説明欄: \n" + - formattedLore + - "\n\n耐久性: §6" + - (currentDamage = maxDurability - currentDamage) + - "/" + - maxDurability); - statsMenu.button("戻る"); - statsMenu.show(player).then((InvEditorMenuUIResult) => { - if (InvEditorMenuUIResult.selection == 0) { - //Return to the main menu - uiInvEditorMenu(player, targetPlayer, itemSlot); - } - }); - } -} diff --git a/build/scripts/gui/moderation/uiKick.js b/build/scripts/gui/moderation/uiKick.js deleted file mode 100644 index 80a874a..0000000 --- a/build/scripts/gui/moderation/uiKick.js +++ /dev/null @@ -1,54 +0,0 @@ -import { world } from "@minecraft/server"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for kicking players. - * - * @name uiKICK - * @param {ModalFormResponse} banResult - The result of the kick player modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the kick player modal form. - */ -export function uiKICK(banResult, onlineList, player) { - handleUIKick(banResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIKick(banResult, onlineList, player) { - if (!banResult || banResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value, reason] = banResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - return paradoxui(player); - } - // make sure they dont kick themselves - if (member === player) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者にしか実行できません`); - return paradoxui(player); - } - player.runCommandAsync(`kick "${member.name}" §f\n\n${reason}`).catch((error) => { - console.warn(`${new Date()} | ` + error); - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f キックできませんでした`); - }); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f が ${member.name}をキック§f. 理由: ${reason}`); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiLockdown.js b/build/scripts/gui/moderation/uiLockdown.js deleted file mode 100644 index e679aeb..0000000 --- a/build/scripts/gui/moderation/uiLockdown.js +++ /dev/null @@ -1,72 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { crypto, sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import config from "../../data/config.js"; -/** - * Handles the result of a modal form used for initiating a server lockdown. - * - * @name uiLOCKDOWN - * @param {ModalFormResponse} lockdownResult - The result of the lockdown modal form. - * @param {Player} player - The player who triggered the lockdown modal form. - */ -export function uiLOCKDOWN(lockdownResult, player) { - handleUILockdown(lockdownResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUILockdown(lockdownResult, player) { - if (!lockdownResult || lockdownResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [reason, LockdownToggle] = lockdownResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - if (LockdownToggle === true) { - // Lock it down - const players = world.getPlayers(); - for (const pl of players) { - // Check for hash/salt and validate password - const hash = pl.getDynamicProperty("hash"); - const salt = pl.getDynamicProperty("salt"); - // Use either the operator's ID or the encryption password as the key - const key = config.encryption.password ? config.encryption.password : pl.id; - // Generate the hash - const encode = crypto?.(salt, key); - if (hash !== undefined && encode === hash) { - continue; - } - // Kick players from server - pl.runCommandAsync(`kick ${pl.name} §f\n\n${reason}`).catch(() => { - // Despawn players from server - pl.triggerEvent("paradox:kick"); - }); - } - // Shutting it down - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f サーバーがメンテナンス中です`); - dynamicPropertyRegistry.set("lockdown_b", true); - world.setDynamicProperty("lockdown_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Lockdown§f!`); - } - //Disable - if (LockdownToggle === false) { - dynamicPropertyRegistry.set("lockdown_b", false); - world.setDynamicProperty("lockdown_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Lockdown§f!`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f メンテナンス終了しました`); - } - return paradoxui; -} diff --git a/build/scripts/gui/moderation/uiManagePlayerSavedLocations.js b/build/scripts/gui/moderation/uiManagePlayerSavedLocations.js deleted file mode 100644 index 69bbf80..0000000 --- a/build/scripts/gui/moderation/uiManagePlayerSavedLocations.js +++ /dev/null @@ -1,118 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry"; -import { decryptString, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui"; -export function uiManagePlayerSavedLocations(managePlayerSavedLocationsUIResult, onlineList, player) { - handleUImanagePlayerSavedLocations(managePlayerSavedLocationsUIResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUImanagePlayerSavedLocations(managePlayerSavedLocationsUIResult, onlineList, player) { - const [value] = managePlayerSavedLocationsUIResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - //Grab the selected player saved locations. - const salt = world.getDynamicProperty("crypt"); - const tags = member.getTags(); - const tagsLength = tags.length; - let counter = 0; - const Locations = []; - const coordsArray = []; - for (let i = 0; i < tagsLength; i++) { - if (tags[i].startsWith("1337")) { - // Decode it so we can verify it - tags[i] = decryptString(tags[i], salt); - // If invalid then skip it - if (tags[i].startsWith("LocationHome:") === false) { - continue; - } - // Split string into array - const coordinatesArray = tags[i].split(" "); - const coordArrayLength = coordinatesArray.length; - counter = ++counter; - for (let i = 0; i < coordArrayLength; i++) { - // Get their location from the array - coordsArray.push(coordinatesArray[i]); - if (coordinatesArray[i].includes("LocationHome:")) { - Locations.push(coordinatesArray[i].replace("LocationHome:", "")); - } - continue; - } - } - } - if (Locations.length === 0) { - /*No locations saved so it will crap its self! - So if there is no data we push a line to keep the array with at least 1 value. - If there are saved locations then it will continue as normal. - */ - Locations.push("このプレイヤーは座標を保存していません"); - } - /*no we have the selected player and have the locations in an array we will build a UI - to show the player, where they can then remove the location if needed. - */ - const managePlayerSavedLocationsUI = new ModalFormData(); - managePlayerSavedLocationsUI.title(`§4メニュー - §6${member.name}'の座標`); - managePlayerSavedLocationsUI.dropdown(`\n§f座標を選択:§f\n\n以下の座標が保存されています\n`, Locations); - managePlayerSavedLocationsUI.toggle("座標を消去", false); - managePlayerSavedLocationsUI - .show(player) - .then((managePlayerSavedLocationsUIResult) => { - const [selectedLocationvalue, deleteToggle] = managePlayerSavedLocationsUIResult.formValues; - if (deleteToggle == true) { - const salt = world.getDynamicProperty("crypt"); - // Find and delete this saved home location - let encryptedString = ""; - const tags = member.getTags(); - const tagsLength = tags.length; - for (let i = 0; i < tagsLength; i++) { - if (tags[i].startsWith("1337")) { - encryptedString = tags[i]; - // Decode it so we can verify it - tags[i] = decryptString(tags[i], salt); - } - if (tags[i].startsWith("LocationHome:" && Locations[selectedLocationvalue] + " X", 13)) { - member.removeTag(encryptedString); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${member.name}の座標を消去しました 消去した座標=> 【'${Locations[selectedLocationvalue]}'】!`); - break; - } - } - return paradoxui(player); - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/moderation/uiMute.js b/build/scripts/gui/moderation/uiMute.js deleted file mode 100644 index bdc261c..0000000 --- a/build/scripts/gui/moderation/uiMute.js +++ /dev/null @@ -1,67 +0,0 @@ -import { world } from "@minecraft/server"; -//import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for muting players. - * - * @name uiMUTE - * @param {ModalFormResponse} muteResult - The result of the mute player modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the mute player modal form. - */ -export function uiMUTE(muteResult, onlineList, player) { - handleUIMute(muteResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIMute(muteResult, onlineList, player) { - if (!muteResult || muteResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value, reason] = muteResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to mute players!.`); - } - // Make sure they dont mute themselves - if (member === player) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 自分自身には実行できません`); - } - // Make sure staff dont mute staff - if (member.hasTag("paradoxOpped")) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者には実行できません.`); - } - // If not already muted then tag - if (!member.hasTag("isMuted")) { - member.addTag("isMuted"); - } - else { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f このプレイヤーは既にミュート済みです.`); - } - // If Education Edition is enabled then legitimately mute them - member.runCommandAsync(`ability @s mute true`); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f あなたはミュートされています 理由: ${reason}`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f が ${member.name}をミュートしました§f. 理由: ${reason}`); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiNotify.js b/build/scripts/gui/moderation/uiNotify.js deleted file mode 100644 index 32e7e2d..0000000 --- a/build/scripts/gui/moderation/uiNotify.js +++ /dev/null @@ -1,54 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiNOTIFY(notifyResult, onlineList, player) { - if (!notifyResult || notifyResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value, Enabled] = notifyResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 通知をオンにしてください`); - } - if (Enabled === true) { - try { - if (member.hasTag("nonotify")) { - member.removeTag("nonotify"); - } - member.addTag("notify"); - } - catch (error) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Something went wrong! Error: ${error}`); - paradoxui(player); - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> notifications.`); - paradoxui(player); - } - if (Enabled === false) { - try { - if (member.hasTag("notify")) { - member.removeTag("notify"); - } - member.addTag("nonotify"); - } - catch (error) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Something went wrong! Error: ${error}`); - paradoxui(player); - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> notifications.`); - paradoxui(player); - } - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiOp.js b/build/scripts/gui/moderation/uiOp.js deleted file mode 100644 index 7bc36cd..0000000 --- a/build/scripts/gui/moderation/uiOp.js +++ /dev/null @@ -1,86 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { crypto, isValidUUID, sendMsg, sendMsgToPlayer, UUID } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import config from "../../data/config.js"; -//Function provided by Visual1mpact -export function uiOP(opResult, salt, hash, player, onlineList) { - if (!opResult || opResult.canceled) { - // Handle canceled form or undefined result - return; - } - if (!hash || !salt || (hash !== crypto?.(salt, config.encryption.password || player.id) && isValidUUID(salt))) { - if (!config.encryption.password) { - if (!player.isOp()) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - return paradoxui(player); - } - } - } - if ("formValues" in opResult) { - // It's a ModalFormResponse - const [value] = opResult.formValues; - // Try to find the player requested - let targetPlayer; - if (onlineList.length > 0) { - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - targetPlayer = pl; - break; - } - } - } - else { - targetPlayer = player; - if (config.encryption.password !== value) { - // Incorrect password - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f パスワードが違います. 管理者しか実行できません.`); - } - } - if (targetPlayer) { - const targetHash = targetPlayer.getDynamicProperty("hash"); - if (targetHash === undefined) { - const targetSalt = UUID.generate(); - targetPlayer.setDynamicProperty("salt", targetSalt); - // Use either the operator's ID or the encryption password as the key - const targetKey = config.encryption.password ? config.encryption.password : targetPlayer.id; - // Generate the hash - const newHash = crypto?.(targetSalt, targetKey); - targetPlayer.setDynamicProperty("hash", newHash); - dynamicPropertyRegistry.set(targetPlayer.id, targetPlayer.name); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限を ${targetPlayer.name}に与えた`); - sendMsgToPlayer(targetPlayer, `§f§4[§6Paradox§4]§f 管理者になりました`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${targetPlayer.name}§f 新しい管理者が来たよ!.`); - targetPlayer.addTag("paradoxOpped"); - return paradoxui(player); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${targetPlayer.name} 既に管理者です`); - return paradoxui(player); - } - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 見つかりませんでした ${targetPlayer.name}.`); - return paradoxui(player); - } - } - else if ("selection" in opResult) { - // It's an ActionFormResponse - if (opResult.selection === 0) { - // player wants to change their own password - const targetSalt = UUID.generate(); - const newHash = crypto?.(targetSalt, player.id); - player.setDynamicProperty("hash", newHash); - player.setDynamicProperty("salt", targetSalt); - player.addTag("paradoxOpped"); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者になりました`); - dynamicPropertyRegistry.set(player.id, player.name); - return paradoxui(player); - } - return paradoxui(player); - } - else { - return paradoxui(player); - } -} diff --git a/build/scripts/gui/moderation/uiPrefix.js b/build/scripts/gui/moderation/uiPrefix.js deleted file mode 100644 index de49b6d..0000000 --- a/build/scripts/gui/moderation/uiPrefix.js +++ /dev/null @@ -1,61 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -function resetPrefix(player) { - const sanitize = player.getTags(); - for (const tag of sanitize) { - if (tag.startsWith("Prefix:")) { - player.removeTag(tag); - config.customcommands.prefix = "!"; - } - } - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Prefix has been reset!`); -} -export function uiPREFIX(prefixResult, onlineList, player) { - if (!prefixResult || prefixResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value, textField, toggle] = prefixResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者権限がないと実行できません!!`); - } - if (textField.length && !toggle) { - /** - * Make sure we are not attempting to set a prefix that can break commands - */ - if (textField === "/") { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f'/' を使用することはできません!`); - return paradoxui; - } - // Change Prefix command under conditions - if (textField.length <= 1 && textField.length >= 1) { - resetPrefix(member); - config.customcommands.prefix = textField; - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 起動文字を '${textField}'変更 ${member.name}`); - member.addTag("Prefix:" + textField); - } - else { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 設定できるのは二文字までです!`); - } - } - // Reset has been toggled - if (toggle) { - resetPrefix(player); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f リセットしました ${member.name}!`); - } - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiPunish.js b/build/scripts/gui/moderation/uiPunish.js deleted file mode 100644 index 9b1f85e..0000000 --- a/build/scripts/gui/moderation/uiPunish.js +++ /dev/null @@ -1,81 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for player punishments. - * - * @name uiPUNISH - * @param {ModalFormResponse} punishResult - The result of the player punishment modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the player punishment modal form. - */ -export function uiPUNISH(punishResult, onlineList, player) { - handleUIPunish(punishResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIPunish(punishResult, onlineList, player) { - if (!punishResult || punishResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value] = punishResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to use punish.`); - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // Make sure they don't punish themselves - if (member === player) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者には実行できません.`); - } - //Make sure they don't punish staff! - if (member.hasTag("paradoxOpped")) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者には無効です.`); - } - // There are 30 slots ranging from 0 to 29 - // Let's clear out that ender chest - for (let slot = 0; slot < 30; slot++) { - member.runCommand(`replaceitem entity @s slot.enderchest ${slot} air`); - } - // Get requested player's inventory so we can wipe it out - const inventoryContainer = member.getComponent("minecraft:inventory"); - const inventory = inventoryContainer.container; - for (let i = 0; i < inventory.size; i++) { - const inventory_item = inventory.getItem(i); - if (!inventory_item) { - continue; - } - try { - inventory.setItem(i, undefined); - } - catch { } - } - // Notify staff and player that punishment has taken place - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f アイテム欄が消去されました`); - // Use try/catch in case nobody has tag 'notify' as this will report 'no target selector' - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§fが ${member.name}のアイテム欄を消しました§f`); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiRules.js b/build/scripts/gui/moderation/uiRules.js deleted file mode 100644 index 17a5202..0000000 --- a/build/scripts/gui/moderation/uiRules.js +++ /dev/null @@ -1,44 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import { onJoinrules } from "../PlayerSpawnAfterEvent/rules/rules.js"; -export function uiRULES(banResult, player) { - if (!banResult || banResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [EnabledRules, EnableKick] = banResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure the rules.`); - } - const showrulesBoolean = dynamicPropertyRegistry.get("showrules_b"); - const KickOnDeclineBoolean = dynamicPropertyRegistry.get("kickondecline_b"); - if (EnabledRules === true && showrulesBoolean === false) { - dynamicPropertyRegistry.set("showrules_b", true); - world.setDynamicProperty("showrules_b", true); - //remember to call the function! - onJoinrules(); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6showrules§f!`); - } - if (EnabledRules === false && showrulesBoolean === true) { - dynamicPropertyRegistry.set("showrules_b", false); - world.setDynamicProperty("showrules_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4showrules§f!`); - } - if (EnableKick === true && KickOnDeclineBoolean === false) { - dynamicPropertyRegistry.set("kickondecline_b", true); - world.setDynamicProperty("kickondecline_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §4KickOnDecline§f!`); - } - if (EnableKick === false && KickOnDeclineBoolean === true) { - dynamicPropertyRegistry.set("kickondecline_b", false); - world.setDynamicProperty("kickondecline_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4KickOnDecline§f!`); - } - //show the main ui to the player one complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiStats.js b/build/scripts/gui/moderation/uiStats.js deleted file mode 100644 index f5f854d..0000000 --- a/build/scripts/gui/moderation/uiStats.js +++ /dev/null @@ -1,128 +0,0 @@ -import { ItemStack, world } from "@minecraft/server"; -import { MinecraftEnchantmentTypes } from "../../node_modules/@minecraft/vanilla-data/lib/index"; -import { ActionFormData } from "@minecraft/server-ui"; -import { allscores, getGamemode, getScore } from "../../util"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiSTATS(statsResult, onlineList, player) { - if (!statsResult || statsResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value] = statsResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f The player is not online.`); - return; - } - const uniqueId = dynamicPropertyRegistry.get(player?.id); - if (uniqueId !== player.name) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - return; - } - const allObjectives = allscores; - const reportBody = [ - `§6ログ ${member.name}§f\n\n`, - `§fゲームモード:§6 ${getGamemode(member)}\n`, - `§f座標: §4X= ${member.location.x.toFixed(0)} §2Y= ${member.location.y.toFixed(0)} §3Z= ${member.location.z.toFixed(0)}\n`, - `§f§4--------------------------------§f\n`, - `§6${member.name}'の検知回数 §f\n`, - ]; - switch (true) { - case member.hasTag("paradoxFreeze"): - reportBody.push(`§f§4[§6Paradox§4]§f §6${member.name}§f フリーズ 検知内容=> ${member.hasTag("freezeAura") ? "AntiKillAura" : member.hasTag("freezeNukerA") ? "AntiNukerA" : member.hasTag("freezeScaffoldA") ? "AntiScaffoldA" : "Staff"}`); - break; - case member.hasTag("flying"): - reportBody.push(`§f§4[§6Paradox§4]§f §6${member.name}§f 飛行有効`); - break; - case member.hasTag("vanish"): - reportBody.push(`§f§4[§6Paradox§4]§f §6${member.name}§f 透明化有効`); - break; - } - allObjectives.forEach((objective) => { - const score = getScore(objective, member); - if (score > 0) { - reportBody.push(`§f§4[§6${objective.replace("vl", "").toUpperCase()}§4]§f number of Violations: ${score}\n`); - } - }); - reportBody.push(`§f§4--------------------------------§f\n`); - const equipment = member.getComponent("equipment_inventory"); - const helmet = equipment.getEquipment("head"); - const chest = equipment.getEquipment("chest"); - const legs = equipment.getEquipment("legs"); - const feet = equipment.getEquipment("feet"); - const mainhand = equipment.getEquipment("mainhand"); - const offhand = equipment.getEquipment("offhand"); - const materialColors = { - golden: "§6", - iron: "§7", - diamond: "§b", - leather: "§e", - chainmail: "§8", - turtle: "§a", - netherite: "§4", - elytra: "§5", - none: "§f", // white - }; - for (const [verification, armorType] of [ - [helmet, "帽子"], - [chest, "服"], - [legs, "ズボン"], - [feet, "靴"], - [mainhand, "メインハンド"], - [offhand, "オフハンド"], - ]) { - if (!(verification instanceof ItemStack)) { - continue; - } - const enchantedEquipment = verification.getComponent("enchantments"); - const enchantList = enchantedEquipment.enchantments; - if (!enchantList) { - continue; - } - let isEnchanted = false; - for (const enchant in MinecraftEnchantmentTypes) { - const enchantNumber = enchantList.hasEnchantment(MinecraftEnchantmentTypes[enchant]); - if (enchantNumber > 0) { - isEnchanted = true; - } - } - let materialType = verification.typeId.split(":")[1].replace(/_\w+/, ""); - if (armorType === "Mainhand" || armorType === "Offhand") { - materialType = verification.typeId.split(":")[1]; - } - const materialColor = materialColors[materialType] || materialColors["none"]; - reportBody.push(`§f${armorType}: ${isEnchanted ? "§aEnchanted§f" : "§4Unenchanted§f"} || ${materialColor}${materialType}\n`); - } - const ResultsUI = new ActionFormData(); - ResultsUI.title("§4Paradox - Report for §4" + member.name); - const tempstring = reportBody.toString().replaceAll(",", ""); - ResultsUI.body(tempstring); - ResultsUI.button("Close"); - ResultsUI.show(player) - .then(() => { - //Simply re show the main UI - paradoxui(player); - return; - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - //return player; -} diff --git a/build/scripts/gui/moderation/uiTpa.js b/build/scripts/gui/moderation/uiTpa.js deleted file mode 100644 index 5cf43c7..0000000 --- a/build/scripts/gui/moderation/uiTpa.js +++ /dev/null @@ -1,55 +0,0 @@ -import { world } from "@minecraft/server"; -//import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsgToPlayer, setTimer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiTPA(tpaResult, onlineList, player) { - if (!tpaResult || tpaResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value, toggleToTarget, toggleTargetTo] = tpaResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // Check to make sure they player hasnt enabled both options - if (toggleTargetTo === true && toggleToTarget === true) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You cant enable both options`); - return paradoxui(player); - } - //check to make sure the player 以下の機能が有効です!=> at least one option. - if (toggleTargetTo === false && toggleToTarget === false) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You must enable one option.`); - return paradoxui(player); - } - if (toggleToTarget === true) { - // tp the op to the target - // Let's teleport you to that player - setTimer(player.id); - player.teleport(member.location, { dimension: member.dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - // Let you know that you have been teleported - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Tp ${player.name} to ${member.name}`); - } - if (toggleTargetTo === true) { - //tp the target to the op - setTimer(member.id); - member.teleport(player.location, { dimension: player.dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Tp ${member.name} to ${player.name}`); - } - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiTpr.js b/build/scripts/gui/moderation/uiTpr.js deleted file mode 100644 index e812832..0000000 --- a/build/scripts/gui/moderation/uiTpr.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -import { TeleportRequestHandler } from "../../commands/utility/tpr"; -import { sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui"; -export function uiTPR(requester, player, respons) { - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(requester.toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - // Let's complete this tpr request - if (respons === "yes") { - const event = { - sender: player, - message: "approve", - }; - TeleportRequestHandler(event, ["approve"]); - } - if (respons === "no") { - const event = { - sender: player, - message: "denied", - }; - TeleportRequestHandler(event, ["denied"]); - } - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiTprSend.js b/build/scripts/gui/moderation/uiTprSend.js deleted file mode 100644 index 94c15b6..0000000 --- a/build/scripts/gui/moderation/uiTprSend.js +++ /dev/null @@ -1,31 +0,0 @@ -import { world } from "@minecraft/server"; -import { getPrefix, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import { TeleportRequestHandler } from "../../commands/utility/tpr.js"; -export function uiTPRSEND(tprSendRequestResult, onlineList, player) { - if (!tprSendRequestResult || tprSendRequestResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value] = tprSendRequestResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - //send the request to be teleported based off the player and the member requested. - const prefix = getPrefix(player); - const event = { - sender: player, - message: prefix + "tpr " + member.name, - }; - TeleportRequestHandler(event, [member.name]); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiUnban.js b/build/scripts/gui/moderation/uiUnban.js deleted file mode 100644 index eead5e0..0000000 --- a/build/scripts/gui/moderation/uiUnban.js +++ /dev/null @@ -1,26 +0,0 @@ -import { queueUnban } from "../../commands/moderation/unban.js"; -//import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiUNBAN(unbanResult, player) { - if (!unbanResult || unbanResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [textField, deleteUnban] = unbanResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f自分自身には実行できません`); - } - if (deleteUnban === true) { - queueUnban.delete(textField); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${textField} はBAN解除リストから削除されました!`); - } - // Add player to queue - queueUnban.add(textField); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${textField} が禁止解除のリストに追加`); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiUnmute.js b/build/scripts/gui/moderation/uiUnmute.js deleted file mode 100644 index c0f3fdc..0000000 --- a/build/scripts/gui/moderation/uiUnmute.js +++ /dev/null @@ -1,59 +0,0 @@ -import { world } from "@minecraft/server"; -//import config from "../../data/config.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for unmuting players. - * - * @name uiUNMUTE - * @param {ModalFormResponse} muteResult - The result of the player unmute modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the player unmute modal form. - */ -export function uiUNMUTE(muteResult, onlineList, player) { - handleUIUnmute(muteResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIUnmute(muteResult, onlineList, player) { - if (!muteResult || muteResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value, reason] = muteResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to mute players!.`); - } - // If muted then un tag - if (member.hasTag("isMuted")) { - member.removeTag("isMuted"); - } - else { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 既にミュートされています.`); - } - // If Education Edition is enabled then legitimately unmute them - member.runCommandAsync(`ability @s mute false`); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f ミュート解除. 理由: ${reason}`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f が${member.name}のミュートを解除§f. 理由: ${reason}`); - return paradoxui(player); -} diff --git a/build/scripts/gui/moderation/uiVanish.js b/build/scripts/gui/moderation/uiVanish.js deleted file mode 100644 index 9ade92c..0000000 --- a/build/scripts/gui/moderation/uiVanish.js +++ /dev/null @@ -1,74 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for toggling player vanish mode. - * - * @name uiVANISH - * @param {ModalFormResponse} vanishResult - The result of the player vanish mode toggle modal form. - * @param {string[]} onlineList - The list of online player names. - * @param {Player} player - The player who triggered the player vanish mode toggle modal form. - */ -export function uiVANISH(vanishResult, onlineList, player) { - handleUIVanish(vanishResult, onlineList, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIVanish(vanishResult, onlineList, player) { - if (!vanishResult || vanishResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value] = vanishResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません.`); - } - // Are they online? - if (!member) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - } - if (member.hasTag("vanish")) { - member.addTag("novanish"); - } - if (member.hasTag("novanish")) { - member.removeTag("vanish"); - } - if (member.hasTag("novanish")) { - member.triggerEvent("unvanish"); - member.runCommandAsync(`effect @s clear`); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f 透明化解除`); - sendMsg(`@a[tag=paradoxOpped]`, `${member.name}§f 透明化無効.`); - } - if (!member.hasTag("novanish")) { - member.addTag("vanish"); - } - if (member.hasTag("vanish") && !member.hasTag("novanish")) { - member.triggerEvent("vanish"); - sendMsgToPlayer(member, `§f§4[§6Paradox§4]§f 透明化!`); - sendMsg(`@a[tag=paradoxOpped]`, `${member.name}§f が透明化`); - } - if (member.hasTag("novanish")) { - member.removeTag("novanish"); - } - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAFK.js b/build/scripts/gui/modules/uiAFK.js deleted file mode 100644 index e269934..0000000 --- a/build/scripts/gui/modules/uiAFK.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -import { AFK } from "../../penrose/TickEvent/afk/afk.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiAFK(afkResult, player) { - if (!afkResult || afkResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [afkToggle] = afkResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure AFK`); - } - if (afkToggle === true) { - // Allow - dynamicPropertyRegistry.set("afk_b", true); - world.setDynamicProperty("afk_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AFK§f!`); - AFK(); - } - if (afkToggle === false) { - // Deny - dynamicPropertyRegistry.set("afk_b", false); - world.setDynamicProperty("afk_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AFK§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiAutoClicker.js b/build/scripts/gui/modules/uiAntiAutoClicker.js deleted file mode 100644 index 9cb33c9..0000000 --- a/build/scripts/gui/modules/uiAntiAutoClicker.js +++ /dev/null @@ -1,54 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import { AutoClicker } from "../../penrose/EntityHitEntityAfterEvent/autoclicker"; -/** - * Handles the result of a modal form used for toggling anti-auto clicker mode. - * - * @name uiANTIAUTOCLICKER - * @param {ModalFormResponse} antiautoclickerResult - The result of the anti-auto clicker mode toggle modal form. - * @param {Player} player - The player who triggered the anti-auto clicker mode toggle modal form. - */ -export function uiANTIAUTOCLICKER(antiautoclickerResult, player) { - handleUIAntiAutoClicker(antiautoclickerResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIAntiAutoClicker(antiautoclickerResult, player) { - if (!antiautoclickerResult || antiautoclickerResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiAutoClickerToggle] = antiautoclickerResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Auto Clicker`); - } - if (AntiAutoClickerToggle === true) { - // Allow - dynamicPropertyRegistry.set("autoclicker_b", true); - world.setDynamicProperty("autoclicker_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AutoClicker§f!`); - AutoClicker(); - } - if (AntiAutoClickerToggle === false) { - // Deny - dynamicPropertyRegistry.set("autoclicker_b", false); - world.setDynamicProperty("autoclicker_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AutoClicker§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiCrasher.js b/build/scripts/gui/modules/uiAntiCrasher.js deleted file mode 100644 index d892473..0000000 --- a/build/scripts/gui/modules/uiAntiCrasher.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -import { CrasherA } from "../../penrose/TickEvent/crasher/crasher_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiANTICRASHER(anticrasherResult, player) { - if (!anticrasherResult || anticrasherResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiCrasherToggle] = anticrasherResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Crasher`); - } - if (AntiCrasherToggle === true) { - // Allow - dynamicPropertyRegistry.set("crashera_b", true); - world.setDynamicProperty("crashera_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6CrasherA§f!`); - CrasherA(); - } - if (AntiCrasherToggle === false) { - // Deny - dynamicPropertyRegistry.set("crashera_b", false); - world.setDynamicProperty("crashera_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4CrasherA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiFall.js b/build/scripts/gui/modules/uiAntiFall.js deleted file mode 100644 index be73a81..0000000 --- a/build/scripts/gui/modules/uiAntiFall.js +++ /dev/null @@ -1,54 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { paradoxui } from "../paradoxui.js"; -import { sendMsgToPlayer, sendMsg } from "../../util.js"; -import { AntiFallA } from "../../penrose/TickEvent/antifalla/antifall_a.js"; -/** - * Handles the result of a modal form used for toggling anti-fall mode. - * - * @name uiANTIFALL - * @param {ModalFormResponse} antifallResult - The result of the anti-fall mode toggle modal form. - * @param {Player} player - The player who triggered the anti-fall mode toggle modal form. - */ -export function uiANTIFALL(antifallResult, player) { - handleUIAntiFall(antifallResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIAntiFall(antifallResult, player) { - if (!antifallResult || antifallResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiFallToggle] = antifallResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anit Fall`); - } - if (AntiFallToggle === true) { - // Allow - dynamicPropertyRegistry.set("antifalla_b", true); - world.setDynamicProperty("antifalla_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiFallA§f!`); - AntiFallA(); - } - if (AntiFallToggle === false) { - // Deny - dynamicPropertyRegistry.set("antifalla_b", false); - world.setDynamicProperty("antifalla_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiFallA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiFly.js b/build/scripts/gui/modules/uiAntiFly.js deleted file mode 100644 index d8edd6f..0000000 --- a/build/scripts/gui/modules/uiAntiFly.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { paradoxui } from "../paradoxui.js"; -import { sendMsgToPlayer, sendMsg } from "../../util.js"; -import { FlyA } from "../../penrose/TickEvent/fly/fly_a.js"; -export function uiANTIFLY(antiflyResult, player) { - if (!antiflyResult || antiflyResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiFlyToggle] = antiflyResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Fly`); - } - if (AntiFlyToggle === true) { - // Allow - dynamicPropertyRegistry.set("flya_b", true); - world.setDynamicProperty("flya_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6FlyA§f!`); - FlyA(); - } - if (AntiFlyToggle === false) { - // Deny - dynamicPropertyRegistry.set("flya_b", false); - world.setDynamicProperty("flya_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4FlyA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiJesus.js b/build/scripts/gui/modules/uiAntiJesus.js deleted file mode 100644 index e5e925e..0000000 --- a/build/scripts/gui/modules/uiAntiJesus.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -import { JesusA } from "../../penrose/TickEvent/jesus/jesus_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiANTIJESUS(antijesusResult, player) { - if (!antijesusResult || antijesusResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiJesusToggle] = antijesusResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Jesus`); - } - if (AntiJesusToggle === true) { - // Allow - dynamicPropertyRegistry.set("jesusa_b", true); - world.setDynamicProperty("jesusa_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6JesusA§f!`); - JesusA(); - } - if (AntiJesusToggle === false) { - // Deny - dynamicPropertyRegistry.set("jesusa_b", false); - world.setDynamicProperty("jesusa_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4JesusA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiKillaura.js b/build/scripts/gui/modules/uiAntiKillaura.js deleted file mode 100644 index 6c31049..0000000 --- a/build/scripts/gui/modules/uiAntiKillaura.js +++ /dev/null @@ -1,54 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import { KillAura } from "../../penrose/EntityHitEntityAfterEvent/killaura"; -/** - * Handles the result of a modal form used for toggling anti-kill aura mode. - * - * @name uiANTIKILLAURA - * @param {ModalFormResponse} antikillauraResult - The result of the anti-kill aura mode toggle modal form. - * @param {Player} player - The player who triggered the anti-kill aura mode toggle modal form. - */ -export function uiANTIKILLAURA(antikillauraResult, player) { - handleUIAntiKillAura(antikillauraResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIAntiKillAura(antikillauraResult, player) { - if (!antikillauraResult || antikillauraResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiKillAuraToggle] = antikillauraResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Killaura`); - } - if (AntiKillAuraToggle === false) { - // Deny - dynamicPropertyRegistry.set("antikillaura_b", false); - world.setDynamicProperty("antikillaura_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiKillAura§f!`); - } - else if (AntiKillAuraToggle === true) { - // Allow - dynamicPropertyRegistry.set("antikillaura_b", true); - world.setDynamicProperty("antikillaura_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiKillAura§f!`); - KillAura(); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiKnockback.js b/build/scripts/gui/modules/uiAntiKnockback.js deleted file mode 100644 index 6f88697..0000000 --- a/build/scripts/gui/modules/uiAntiKnockback.js +++ /dev/null @@ -1,54 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import { AntiKnockbackA } from "../../penrose/TickEvent/knockback/antikb_a.js"; -/** - * Handles the result of a modal form used for toggling anti-knockback mode. - * - * @name uiANTIKNOCKBACK - * @param {ModalFormResponse} antiknockbackResult - The result of the anti-knockback mode toggle modal form. - * @param {Player} player - The player who triggered the anti-knockback mode toggle modal form. - */ -export function uiANTIKNOCKBACK(antiknockbackResult, player) { - handleUIAntiKnockback(antiknockbackResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIAntiKnockback(antiknockbackResult, player) { - if (!antiknockbackResult || antiknockbackResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiKnockBackToggle] = antiknockbackResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Knockback`); - } - if (AntiKnockBackToggle === true) { - // Allow - dynamicPropertyRegistry.set("antikb_b", true); - world.setDynamicProperty("antikb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti Knockback§f!`); - AntiKnockbackA(); - } - if (AntiKnockBackToggle === false) { - // Deny - dynamicPropertyRegistry.set("antikb_b", false); - world.setDynamicProperty("antikb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti Knockback§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiNuker.js b/build/scripts/gui/modules/uiAntiNuker.js deleted file mode 100644 index 3bd6316..0000000 --- a/build/scripts/gui/modules/uiAntiNuker.js +++ /dev/null @@ -1,33 +0,0 @@ -import { world } from "@minecraft/server"; -import { NukerA } from "../../penrose/BlockBreakAfterEvent/nuker/nuker_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiANTINUKER(antinukerResult, player) { - if (!antinukerResult || antinukerResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiNukerToggle] = antinukerResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Nuker`); - } - if (AntiNukerToggle === true) { - // Allow - dynamicPropertyRegistry.set("antinukera_b", true); - world.setDynamicProperty("antinukera_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiNukerA§f!`); - NukerA(); - } - if (AntiNukerToggle === false) { - dynamicPropertyRegistry.set("antinukera_b", false); - world.setDynamicProperty("antinukera_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiNukerA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiPhase.js b/build/scripts/gui/modules/uiAntiPhase.js deleted file mode 100644 index 990dee1..0000000 --- a/build/scripts/gui/modules/uiAntiPhase.js +++ /dev/null @@ -1,33 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import { AntiPhaseA } from "../../penrose/TickEvent/phase/phase_a.js"; -export function uiANTIPHASE(antiphaseResult, player) { - if (!antiphaseResult || antiphaseResult.canceled) { - // Handle canceled form or undefined result - return; - } - // Get Dynamic Property Boolean - const [AntiPhaseToggle] = antiphaseResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Phase`); - } - if (AntiPhaseToggle === true) { - // Allow - dynamicPropertyRegistry.set("antiphasea_b", true); - world.setDynamicProperty("antiphasea_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiPhaseA§f!`); - AntiPhaseA(); - } - if (AntiPhaseToggle === false) { - dynamicPropertyRegistry.set("antiphasea_b", false); - world.setDynamicProperty("antiphasea_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiPhaseA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiScaffold.js b/build/scripts/gui/modules/uiAntiScaffold.js deleted file mode 100644 index 2d56d61..0000000 --- a/build/scripts/gui/modules/uiAntiScaffold.js +++ /dev/null @@ -1,54 +0,0 @@ -import { world } from "@minecraft/server"; -import { ScaffoldA } from "../../penrose/BlockPlaceAfterEvent/scaffold/scaffold_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for toggling anti-scaffold mode. - * - * @name uiANTISCAFFOLD - * @param {ModalFormResponse} antiscaffoldResult - The result of the anti-scaffold mode toggle modal form. - * @param {Player} player - The player who triggered the anti-scaffold mode toggle modal form. - */ -export function uiANTISCAFFOLD(antiscaffoldResult, player) { - handleUIAntiScaffold(antiscaffoldResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIAntiScaffold(antiscaffoldResult, player) { - if (!antiscaffoldResult || antiscaffoldResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiScaffoldToggle] = antiscaffoldResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Scaffold`); - } - if (AntiScaffoldToggle === true) { - // Allow - dynamicPropertyRegistry.set("antiscaffolda_b", true); - world.setDynamicProperty("antiscaffolda_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6AntiScaffoldA§f!`); - ScaffoldA(); - } - if (AntiScaffoldToggle === false) { - // Deny - dynamicPropertyRegistry.set("antiscaffolda_b", false); - world.setDynamicProperty("antiscaffolda_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4AntiScaffoldA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiShulker.js b/build/scripts/gui/modules/uiAntiShulker.js deleted file mode 100644 index 156a37a..0000000 --- a/build/scripts/gui/modules/uiAntiShulker.js +++ /dev/null @@ -1,32 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiANTISHULKER(antishulkerResult, player) { - if (!antishulkerResult || antishulkerResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiShulkerToggle] = antishulkerResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Shulker`); - } - if (AntiShulkerToggle === true) { - // Allow - dynamicPropertyRegistry.set("antishulker_b", true); - world.setDynamicProperty("antishulker_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti-Shulkers§f!`); - } - if (AntiShulkerToggle === false) { - // Deny - dynamicPropertyRegistry.set("antishulker_b", false); - world.setDynamicProperty("antishulker_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti-Shulkers§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiAntiSpam.js b/build/scripts/gui/modules/uiAntiSpam.js deleted file mode 100644 index 72f2fba..0000000 --- a/build/scripts/gui/modules/uiAntiSpam.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -import { beforeAntiSpam } from "../../penrose/ChatSendBeforeEvent/chat/antispam.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiANTISPAM(antispamResult, player) { - if (!antispamResult || antispamResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AntiSpamToggle] = antispamResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Anti Spam`); - } - if (AntiSpamToggle === true) { - /// Allow - dynamicPropertyRegistry.set("antispam_b", true); - world.setDynamicProperty("antispam_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti Spam§f!`); - beforeAntiSpam(); - } - if (AntiSpamToggle === false) { - // Deny - dynamicPropertyRegistry.set("antispam_b", false); - world.setDynamicProperty("antispam_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti Spam§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiBadpackets.js b/build/scripts/gui/modules/uiBadpackets.js deleted file mode 100644 index d91f623..0000000 --- a/build/scripts/gui/modules/uiBadpackets.js +++ /dev/null @@ -1,50 +0,0 @@ -import { world } from "@minecraft/server"; -import { BadPackets1 } from "../../penrose/ChatSendBeforeEvent/spammer/badpackets_1.js"; -import { BadPackets2 } from "../../penrose/TickEvent/badpackets2/badpackets2.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiBADPACKETS(badpacketsResult, player) { - if (!badpacketsResult || badpacketsResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [BadPackets1Toggle, BadPackets2Toggle] = badpacketsResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - const badPackets1Boolean = dynamicPropertyRegistry.get("badpackets1_b"); - const badPackets2Boolean = dynamicPropertyRegistry.get("badpackets2_b"); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Badpackets`); - } - if (BadPackets1Toggle === true && badPackets1Boolean === false) { - // Allow - dynamicPropertyRegistry.set("badpackets1_b", true); - world.setDynamicProperty("badpackets1_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Badpackets1§f!`); - BadPackets1(); - } - if (BadPackets1Toggle === false && badPackets1Boolean === true) { - // Deny - dynamicPropertyRegistry.set("badpackets1_b", false); - world.setDynamicProperty("badpackets1_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Badpackets1§f!`); - } - if (BadPackets2Toggle === true && badPackets2Boolean === false) { - // Allow - dynamicPropertyRegistry.set("badpackets2_b", true); - world.setDynamicProperty("badpackets2_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Badpackets2§f!`); - BadPackets2(); - } - if (BadPackets2Toggle === false && badPackets2Boolean === true) { - // Deny - dynamicPropertyRegistry.set("badpackets2_b", false); - world.setDynamicProperty("badpackets2_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Badpackets2§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiBedrockValidation.js b/build/scripts/gui/modules/uiBedrockValidation.js deleted file mode 100644 index 795afbc..0000000 --- a/build/scripts/gui/modules/uiBedrockValidation.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -import { BedrockValidate } from "../../penrose/TickEvent/bedrock/bedrockvalidate.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiBEDROCKVALIDATION(bedrockvalidationResult, player) { - if (!bedrockvalidationResult || bedrockvalidationResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [BedrockValidationToggle] = bedrockvalidationResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Bedrock Validation`); - } - if (BedrockValidationToggle === true) { - // Allow - dynamicPropertyRegistry.set("bedrockvalidate_b", true); - world.setDynamicProperty("bedrockvalidate_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6BedrockValidate§f!`); - BedrockValidate(); - } - if (BedrockValidationToggle === false) { - // Deny - dynamicPropertyRegistry.set("bedrockvalidate_b", false); - world.setDynamicProperty("bedrockvalidate_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4BedrockValidate§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiCommandBlocks.js b/build/scripts/gui/modules/uiCommandBlocks.js deleted file mode 100644 index e41a106..0000000 --- a/build/scripts/gui/modules/uiCommandBlocks.js +++ /dev/null @@ -1,79 +0,0 @@ -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { getScore, sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for toggling command blocks mode. - * - * @name uiCOMMANDBLOCKS - * @param {ModalFormResponse} commandblocksResult - The result of the command blocks mode toggle modal form. - * @param {Player} player - The player who triggered the command blocks mode toggle modal form. - */ -export function uiCOMMANDBLOCKS(commandblocksResult, player) { - handleUICommandBlocks(commandblocksResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUICommandBlocks(commandblocksResult, player) { - if (!commandblocksResult || commandblocksResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [CommandBlockOverrideToggle, RemoveCommandBlocksToggle] = commandblocksResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - //get the current scores - const cmdsscore = getScore("cmds", player); - const commandblocksscore = getScore("commandblocks", player); - let removecmdblocksBoolean; - Boolean; - let cmdoBoolean; - if (cmdsscore <= 0) { - cmdoBoolean = false; - } - if (cmdsscore >= 1) { - cmdoBoolean = true; - } - if (commandblocksscore <= 0) { - removecmdblocksBoolean = false; - } - if (commandblocksscore >= 1) { - removecmdblocksBoolean = true; - } - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Command Blocks`); - } - if (CommandBlockOverrideToggle === true && cmdoBoolean === false) { - // Allow - player.runCommand(`scoreboard players set paradox:config cmds 1`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has set CommandBlocksEnabled as §6enabled§f!`); - } - if (CommandBlockOverrideToggle === false && cmdoBoolean === true) { - // Deny - player.runCommand(`scoreboard players set paradox:config cmds 2`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has set CommandBlocksEnabled as §4disabled§f!`); - } - player.runCommand(`scoreboard players operation @a cmds = paradox:config cmds`); - if (RemoveCommandBlocksToggle === true && removecmdblocksBoolean === false) { - // Allow - player.runCommand(`scoreboard players set paradox:config commandblocks 1`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti Command Blocks§f!`); - } - if (RemoveCommandBlocksToggle === false && removecmdblocksBoolean === true) { - // Deny - player.runCommand(`scoreboard players set paradox:config commandblocks 0`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti Command Blocks§f!`); - } - player.runCommand(`scoreboard players operation @a commandblocks = paradox:config commandblocks`); - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiEnchantedArmor.js b/build/scripts/gui/modules/uiEnchantedArmor.js deleted file mode 100644 index 884f863..0000000 --- a/build/scripts/gui/modules/uiEnchantedArmor.js +++ /dev/null @@ -1,50 +0,0 @@ -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -/** - * Handles the result of a modal form used for toggling enchanted armor mode. - * - * @name uiENCHANTEDARMOR - * @param {ModalFormResponse} enchantedarmorResult - The result of the enchanted armor mode toggle modal form. - * @param {Player} player - The player who triggered the enchanted armor mode toggle modal form. - */ -export function uiENCHANTEDARMOR(enchantedarmorResult, player) { - handleUIEnchantedArmor(enchantedarmorResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleUIEnchantedArmor(enchantedarmorResult, player) { - if (!enchantedarmorResult || enchantedarmorResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [EnchantedArmorToggle] = enchantedarmorResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Enchanted Armor`); - } - if (EnchantedArmorToggle === true) { - // Allow - player.runCommand(`scoreboard players set paradox:config encharmor 1`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Anti Enchanted Armor§f!`); - } - if (EnchantedArmorToggle === false) { - // Deny - player.runCommand(`scoreboard players set paradox:config encharmor 0`); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Anti Enchanted Armor§f!`); - } - player.runCommand(`scoreboard players operation @a encharmor = paradox:config encharmor`); - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiExpSalvageSystem.js b/build/scripts/gui/modules/uiExpSalvageSystem.js deleted file mode 100644 index b7dc8c9..0000000 --- a/build/scripts/gui/modules/uiExpSalvageSystem.js +++ /dev/null @@ -1,32 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiEXPSALVAGESYSTEM(expsalvagesystemResult, player) { - if (!expsalvagesystemResult || expsalvagesystemResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [ExpSalvageSystemToggle] = expsalvagesystemResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Exp Salvage System`); - } - if (ExpSalvageSystemToggle === true) { - // Allow - dynamicPropertyRegistry.set("salvage_b", true); - world.setDynamicProperty("salvage_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6Salvage§f!`); - } - if (ExpSalvageSystemToggle === false) { - // Deny - dynamicPropertyRegistry.set("salvage_b", false); - world.setDynamicProperty("salvage_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4Salvage§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiGamemodes.js b/build/scripts/gui/modules/uiGamemodes.js deleted file mode 100644 index 1c39cb4..0000000 --- a/build/scripts/gui/modules/uiGamemodes.js +++ /dev/null @@ -1,94 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -import { Adventure } from "../../penrose/TickEvent/gamemode/adventure.js"; -import { Creative } from "../../penrose/TickEvent/gamemode/creative.js"; -import { Survival } from "../../penrose/TickEvent/gamemode/survival.js"; -export function uiGAMEMODES(gamemodeResult, player) { - if (!gamemodeResult || gamemodeResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [AdventureGM, CreativeGM, SurvivalGM] = gamemodeResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - const adventureGMBoolean = dynamicPropertyRegistry.get("adventuregm_b"); - const creativeGMBoolean = dynamicPropertyRegistry.get("creativegm_b"); - const survivalGMBoolean = dynamicPropertyRegistry.get("survivalgm_b"); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure gamemodes`); - } - if (AdventureGM === true && CreativeGM === true && SurvivalGM === true) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You cant disable all gamemodes!`); - } - //Adventure gamemode - if (AdventureGM === true && adventureGMBoolean === false) { - // Allow - dynamicPropertyRegistry.set("adventuregm_b", true); - world.setDynamicProperty("adventuregm_b", true); - // Make sure at least one is allowed since this could cause serious issues if all were locked down - // We will allow Adventure Mode in this case - if (survivalGMBoolean === true && creativeGMBoolean === true) { - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f Since all gamemodes were disallowed, Adventure mode has been enabled.`); - Adventure(); - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has disallowed §4Gamemode 2 (Adventure)§f to be used!`); - Adventure(); - } - if (AdventureGM === false && adventureGMBoolean === true) { - // Deny - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has allowed §6Gamemode 2 (Adventure)§f to be used!`); - } - //Creative gamemode - if (CreativeGM === true && creativeGMBoolean === false) { - // Allow - dynamicPropertyRegistry.set("creativegm_b", true); - world.setDynamicProperty("creativegm_b", true); - // Make sure at least one is allowed since this could cause serious issues if all were locked down - // We will allow Adventure Mode in this case - if (adventureGMBoolean === true && survivalGMBoolean === false) { - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f Since all gamemodes were disallowed, Adventure mode has been enabled.`); - Adventure(); - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has disallowed §4Gamemode 1 (Creative)§f to be used!`); - Creative(); - } - if (CreativeGM === false && creativeGMBoolean === true) { - // Deny - dynamicPropertyRegistry.set("creativegm_b", false); - world.setDynamicProperty("creativegm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has allowed §6Gamemode 1 (Creative)§f to be used!`); - } - if (SurvivalGM === true && survivalGMBoolean === false) { - // Allow - dynamicPropertyRegistry.set("survivalgm_b", true); - world.setDynamicProperty("survivalgm_b", true); - // Make sure at least one is allowed since this could cause serious issues if all were locked down - // We will allow Adventure Mode in this case - if (adventureGMBoolean === true && creativeGMBoolean === true) { - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f Since all gamemodes were disallowed, Adventure mode has been enabled.`); - Adventure(); - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has disallowed §4Gamemode 0 (Survival)§f to be used!`); - Survival(); - } - if (SurvivalGM === false && survivalGMBoolean === true) { - // Deny - dynamicPropertyRegistry.set("survivalgm_b", false); - world.setDynamicProperty("survivalgm_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has allowed §6Gamemode 0 (Survival)§f to be used!`); - } - //show the main ui to the player one complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiHotbar.js b/build/scripts/gui/modules/uiHotbar.js deleted file mode 100644 index b997427..0000000 --- a/build/scripts/gui/modules/uiHotbar.js +++ /dev/null @@ -1,50 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { Hotbar } from "../../penrose/TickEvent/hotbar/hotbar.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -const configMessageBackup = new WeakMap(); -// Dummy object -const dummy = []; -export function uiHOTBAR(hotbarResult, player) { - if (!hotbarResult || hotbarResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [HotbarMessage, HotbarToggle, HotbarRestDefaultMessageToggle] = hotbarResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure the hotbar`); - } - if (configMessageBackup.has(dummy) === false) { - configMessageBackup.set(dummy, config.modules.hotbar.message); - } - if (HotbarToggle === true && HotbarRestDefaultMessageToggle === false) { - // Allow - dynamicPropertyRegistry.set("hotbar_b", true); - world.setDynamicProperty("hotbar_b", true); - config.modules.hotbar.message = HotbarMessage; - sendMsg("@a[tag=paradoxOpped]", `${player.name} 以下の機能が有効です!=> §6Hotbar`); - Hotbar(); - } - if (HotbarToggle === false) { - // Deny - dynamicPropertyRegistry.set("hotbar_b", false); - world.setDynamicProperty("hotbar_b", false); - sendMsg("@a[tag=paradoxOpped]", `${player.name} 以下の機能が無効です!=> §6Hotbar`); - } - if (HotbarToggle === false && HotbarRestDefaultMessageToggle === true) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You need to enable the hotbar toggle to reset the message!`); - return paradoxui(player); - } - if (HotbarToggle === true && HotbarRestDefaultMessageToggle === true) { - config.modules.hotbar.message = configMessageBackup.get(dummy); - Hotbar(); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiIllegaItems.js b/build/scripts/gui/modules/uiIllegaItems.js deleted file mode 100644 index d1998c7..0000000 --- a/build/scripts/gui/modules/uiIllegaItems.js +++ /dev/null @@ -1,109 +0,0 @@ -import { world } from "@minecraft/server"; -import { IllegalItemsB } from "../../penrose/BlockPlaceAfterEvent/illegalitems/illegalitems_b.js"; -import { IllegalItemsA } from "../../penrose/TickEvent/illegalitems/illegalitems_a.js"; -import { IllegalItemsC } from "../../penrose/TickEvent/illegalitems/illegalitems_c.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiILLEGALITEMS(illegalitemsResult, player) { - if (!illegalitemsResult || illegalitemsResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [IllegalItemsAToggle, IllegalItemsBToggle, IllegalItemsCToggle, IllegalEnchanmentsToggle, IllegalLoreToggle, IllegalStackBanToggle] = illegalitemsResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Illegal Items`); - } - const illegalItemsABoolean = dynamicPropertyRegistry.get("illegalitemsa_b"); - const illegalItemsBBoolean = dynamicPropertyRegistry.get("illegalitemsb_b"); - const illegalItemsCBoolean = dynamicPropertyRegistry.get("illegalitemsc_b"); - const illegalEnchantmentBoolean = dynamicPropertyRegistry.get("illegalenchantment_b"); - const illegalLoresBoolean = dynamicPropertyRegistry.get("illegallores_b"); - const stackBanBoolean = dynamicPropertyRegistry.get("stackban_b"); - if (IllegalItemsAToggle === true && illegalItemsABoolean === false) { - // Allow - dynamicPropertyRegistry.set("illegalitemsa_b", true); - world.setDynamicProperty("illegalitemsa_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalItemsA§f!`); - IllegalItemsA(); - } - if (IllegalItemsAToggle === false && illegalItemsABoolean === true) { - dynamicPropertyRegistry.set("illegalitemsa_b", false); - world.setDynamicProperty("illegalitemsa_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalItemsA§f!`); - } - if (IllegalItemsBToggle === true && illegalItemsBBoolean === false) { - // Allow - dynamicPropertyRegistry.set("illegalitemsb_b", true); - world.setDynamicProperty("illegalitemsb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalItemsB§f!`); - IllegalItemsB(); - } - if (IllegalItemsBToggle === false && illegalItemsBBoolean === true) { - // Deny - dynamicPropertyRegistry.set("illegalitemsb_b", false); - world.setDynamicProperty("illegalitemsb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalItemsB§f!`); - } - if (IllegalItemsCToggle === true && illegalItemsCBoolean === false) { - // Allow - dynamicPropertyRegistry.set("illegalitemsc_b", true); - world.setDynamicProperty("illegalitemsc_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalItemsC§f!`); - IllegalItemsC(); - } - if (IllegalItemsCToggle === false && illegalItemsABoolean === true) { - // Deny - dynamicPropertyRegistry.set("illegalitemsc_b", false); - world.setDynamicProperty("illegalitemsc_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalItemsC§f!`); - } - if (IllegalEnchanmentsToggle === true && illegalEnchantmentBoolean === false) { - dynamicPropertyRegistry.set("illegalenchantment_b", true); - world.setDynamicProperty("illegalenchantment_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalEnchantments§f!`); - } - if (IllegalEnchanmentsToggle === false && illegalEnchantmentBoolean === true) { - dynamicPropertyRegistry.set("illegalenchantment_b", false); - world.setDynamicProperty("illegalenchantment_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalEnchantments§f!`); - } - if (IllegalLoreToggle === true && illegalLoresBoolean === false) { - // Allow - dynamicPropertyRegistry.set("illegallores_b", true); - world.setDynamicProperty("illegallores_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6IllegalLores§f!`); - } - if (IllegalLoreToggle === false && illegalLoresBoolean === true) { - // Deny - dynamicPropertyRegistry.set("illegallores_b", false); - world.setDynamicProperty("illegallores_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4IllegalLores§f!`); - } - //Check to make sure that Illegal Items are on - if (!IllegalItemsAToggle === true && !IllegalItemsAToggle === true && !IllegalItemsBToggle === true && IllegalStackBanToggle === true) { - // Turn it off just incase! - dynamicPropertyRegistry.set("stackban_b", false); - world.setDynamicProperty("stackban_b", false); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You need to enable Illegal Items to use this feature.`); - return paradoxui(player); - } - if (IllegalStackBanToggle === true && stackBanBoolean === false) { - // Allow - dynamicPropertyRegistry.set("stackban_b", true); - world.setDynamicProperty("stackban_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6StackBans§f!`); - } - if (IllegalStackBanToggle === false && stackBanBoolean === true) { - // Deny - dynamicPropertyRegistry.set("stackban_b", false); - world.setDynamicProperty("stackban_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4StackBans§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiInvalidSprint.js b/build/scripts/gui/modules/uiInvalidSprint.js deleted file mode 100644 index c47cde5..0000000 --- a/build/scripts/gui/modules/uiInvalidSprint.js +++ /dev/null @@ -1,33 +0,0 @@ -import { world } from "@minecraft/server"; -import { InvalidSprintA } from "../../penrose/TickEvent/invalidsprint/invalidsprint_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiINVALIDSPRINT(invalidsprintResult, player) { - if (!invalidsprintResult || invalidsprintResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [InvalidSprintToggle] = invalidsprintResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Invalid Sprint`); - } - if (InvalidSprintToggle === true) { - // Allow - dynamicPropertyRegistry.set("invalidsprinta_b", true); - world.setDynamicProperty("invalidsprinta_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6InvalidSprintA§f!`); - InvalidSprintA(); - } - if (InvalidSprintToggle === false) { - dynamicPropertyRegistry.set("invalidsprinta_b", false); - world.setDynamicProperty("invalidsprinta_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4InvalidSprintA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiLagClear.js b/build/scripts/gui/modules/uiLagClear.js deleted file mode 100644 index 8236c69..0000000 --- a/build/scripts/gui/modules/uiLagClear.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -import { ClearLag } from "../../penrose/TickEvent/clearlag/clearlag.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiLAGCLEAR(lagclearResult, player) { - if (!lagclearResult || lagclearResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [LagClearToggle] = lagclearResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Clear Lag`); - } - if (LagClearToggle === true) { - // Allow - dynamicPropertyRegistry.set("clearlag_b", true); - world.setDynamicProperty("clearlag_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6ClearLag§f!`); - ClearLag(); - } - if (LagClearToggle === false) { - // Deny - dynamicPropertyRegistry.set("clearlag_b", false); - world.setDynamicProperty("clearlag_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4ClearLag§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiNameSpoofing.js b/build/scripts/gui/modules/uiNameSpoofing.js deleted file mode 100644 index 8000b99..0000000 --- a/build/scripts/gui/modules/uiNameSpoofing.js +++ /dev/null @@ -1,50 +0,0 @@ -import { world } from "@minecraft/server"; -import { NamespoofA } from "../../penrose/TickEvent/namespoof/namespoof_a.js"; -import { NamespoofB } from "../../penrose/TickEvent/namespoof/namespoof_b.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiNAMESPOOFING(namespoofingResult, player) { - if (!namespoofingResult || namespoofingResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [NameSpoofAToggle, NameSpoofBToggle] = namespoofingResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - const nameSpoofABoolean = dynamicPropertyRegistry.get("namespoofa_b"); - const nameSpoofBBoolean = dynamicPropertyRegistry.get("namespoofb_b"); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Name Spoofing`); - } - if (NameSpoofAToggle === true && nameSpoofABoolean === false) { - // Allow - dynamicPropertyRegistry.set("namespoofa_b", true); - world.setDynamicProperty("namespoofa_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6NamespoofA§f!`); - NamespoofA(); - } - if (NameSpoofAToggle === false && nameSpoofABoolean === true) { - // Deny - dynamicPropertyRegistry.set("namespoofa_b", false); - world.setDynamicProperty("namespoofa_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4NamespoofA§f!`); - } - if (NameSpoofBToggle === true && nameSpoofBBoolean === false) { - // Allow - dynamicPropertyRegistry.set("namespoofb_b", true); - world.setDynamicProperty("namespoofb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6NamespoofB§f!`); - NamespoofB; - } - if (NameSpoofBToggle === false && nameSpoofBBoolean === true) { - // Deny - dynamicPropertyRegistry.set("namespoofb_b", false); - world.setDynamicProperty("namespoofb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4NamespoofB§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiOnePlayerSleep.js b/build/scripts/gui/modules/uiOnePlayerSleep.js deleted file mode 100644 index c40c6da..0000000 --- a/build/scripts/gui/modules/uiOnePlayerSleep.js +++ /dev/null @@ -1,33 +0,0 @@ -import { world } from "@minecraft/server"; -import { OPS } from "../../penrose/TickEvent/oneplayersleep/oneplayersleep.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiOPS(opsResult, player) { - if (!opsResult || opsResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [OnePlayerSleepToggle] = opsResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure OPS`); - } - if (OnePlayerSleepToggle === true) { - dynamicPropertyRegistry.set("ops_b", true); - world.setDynamicProperty("ops_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6OPS§f!`); - OPS(); - } - if (OnePlayerSleepToggle === false) { - // Deny - dynamicPropertyRegistry.set("ops_b", false); - world.setDynamicProperty("ops_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4OPS§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiReach.js b/build/scripts/gui/modules/uiReach.js deleted file mode 100644 index 579bc0b..0000000 --- a/build/scripts/gui/modules/uiReach.js +++ /dev/null @@ -1,50 +0,0 @@ -import { world } from "@minecraft/server"; -import { ReachA } from "../../penrose/BlockPlaceAfterEvent/reach/reach_a.js"; -import { ReachB } from "../../penrose/EntityHitEntityAfterEvent/reach_b.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiREACH(reachResult, player) { - if (!reachResult || reachResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [ReachAToggle, ReachBToggle] = reachResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - const reachABoolean = dynamicPropertyRegistry.get("reacha_b"); - const reachBBoolean = dynamicPropertyRegistry.get("reachb_b"); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Reach`); - } - if (ReachAToggle === true && reachABoolean === false) { - // Allow - dynamicPropertyRegistry.set("reacha_b", true); - world.setDynamicProperty("reacha_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6ReachA§f!`); - ReachA(); - } - if (ReachAToggle === false && reachABoolean === true) { - // Deny - dynamicPropertyRegistry.set("reacha_b", false); - world.setDynamicProperty("reacha_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4ReachA§f!`); - } - if (ReachBToggle === true && reachBBoolean === false) { - // Allow - dynamicPropertyRegistry.set("reachb_b", true); - world.setDynamicProperty("reachb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6ReachB§f!`); - ReachB(); - } - if (ReachBToggle === false && reachBBoolean === true) { - // Deny - dynamicPropertyRegistry.set("reachb_b", false); - world.setDynamicProperty("reachb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4ReachB§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiSpammer.js b/build/scripts/gui/modules/uiSpammer.js deleted file mode 100644 index 1fbfe6d..0000000 --- a/build/scripts/gui/modules/uiSpammer.js +++ /dev/null @@ -1,65 +0,0 @@ -import { world } from "@minecraft/server"; -import { SpammerA } from "../../penrose/ChatSendBeforeEvent/spammer/spammer_a.js"; -import { SpammerB } from "../../penrose/ChatSendBeforeEvent/spammer/spammer_b.js"; -import { SpammerC } from "../../penrose/ChatSendBeforeEvent/spammer/spammer_c.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiSPAMMER(spamResult, player) { - if (!spamResult || spamResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [SpammerAToggle, SpammerBToggle, SpammerCToggle] = spamResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - const spammerABoolean = dynamicPropertyRegistry.get("spammera_b"); - const spammerBBoolean = dynamicPropertyRegistry.get("spammerb_b"); - const spammerCBoolean = dynamicPropertyRegistry.get("spammerc_b"); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Spammer`); - } - if (SpammerAToggle === true && spammerABoolean === false) { - // Allow - dynamicPropertyRegistry.set("spammera_b", true); - world.setDynamicProperty("spammera_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6SpammerA§f!`); - SpammerA(); - } - if (SpammerAToggle === false && spammerABoolean === true) { - //Deny - dynamicPropertyRegistry.set("spammera_b", false); - world.setDynamicProperty("spammera_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4SpammerA§f!`); - } - if (SpammerBToggle === true && spammerBBoolean === false) { - // Allow - dynamicPropertyRegistry.set("spammerb_b", true); - world.setDynamicProperty("spammerb_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6SpammerB§f!`); - SpammerB(); - } - if (SpammerBToggle === false && spammerBBoolean === true) { - // Deny - dynamicPropertyRegistry.set("spammerb_b", false); - world.setDynamicProperty("spammerb_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4SpammerB§f!`); - } - if (SpammerCToggle === true && spammerCBoolean === false) { - // Allow - dynamicPropertyRegistry.set("spammerc_b", true); - world.setDynamicProperty("spammerc_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6SpammerC§f!`); - SpammerC(); - } - if (SpammerCToggle === false && spammerCBoolean === true) { - // Deny - dynamicPropertyRegistry.set("spammerc_b", false); - world.setDynamicProperty("spammerc_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4SpammerC§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiSpeed.js b/build/scripts/gui/modules/uiSpeed.js deleted file mode 100644 index 2ff9464..0000000 --- a/build/scripts/gui/modules/uiSpeed.js +++ /dev/null @@ -1,33 +0,0 @@ -import { world } from "@minecraft/server"; -import { SpeedA } from "../../penrose/TickEvent/speed/speed_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util.js"; -import { paradoxui } from "../paradoxui.js"; -export function uiSPEED(speedResult, player) { - if (!speedResult || speedResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [SpeedToggle] = speedResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure SpeedA`); - } - if (SpeedToggle === true) { - // Allow - dynamicPropertyRegistry.set("speeda_b", true); - world.setDynamicProperty("speeda_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6SpeedA§f!`); - SpeedA(); - } - if (SpeedToggle === false) { - // Deny - dynamicPropertyRegistry.set("speeda_b", false); - world.setDynamicProperty("speeda_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4SpeedA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiWorldborder.js b/build/scripts/gui/modules/uiWorldborder.js deleted file mode 100644 index 7d448e0..0000000 --- a/build/scripts/gui/modules/uiWorldborder.js +++ /dev/null @@ -1,44 +0,0 @@ -import { world } from "@minecraft/server"; -import { WorldBorder } from "../../penrose/TickEvent/worldborder/worldborder.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiWORLDBORDER(worldborderResult, player) { - if (!worldborderResult || worldborderResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [OverworldValueTextfield, NetherValueTextfield, EndValueTextfield, WorldBorderToggle] = worldborderResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure World Borders`); - } - if (WorldBorderToggle === true) { - dynamicPropertyRegistry.set("worldborder_b", true); - dynamicPropertyRegistry.set("worldborder_n", Math.abs(Number(OverworldValueTextfield))); - dynamicPropertyRegistry.set("worldborder_nether_n", Math.abs(Number(NetherValueTextfield))); - dynamicPropertyRegistry.set("worldborder_end_n", Math.abs(Number(EndValueTextfield))); - world.setDynamicProperty("worldborder_b", true); - world.setDynamicProperty("worldborder_n", Math.abs(Number(OverworldValueTextfield))); - world.setDynamicProperty("worldborder_nether_n", Math.abs(Number(NetherValueTextfield))); - world.setDynamicProperty("worldborder_end_n", Math.abs(Number(EndValueTextfield))); - WorldBorder(); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f has set the §6World Border§f! Overworld: ${OverworldValueTextfield} Nether: ${NetherValueTextfield} End: ${EndValueTextfield}`); - } - if (WorldBorderToggle === false) { - dynamicPropertyRegistry.set("worldborder_b", false); - dynamicPropertyRegistry.set("worldborder_n", 0); - dynamicPropertyRegistry.set("worldborder_nether_n", 0); - dynamicPropertyRegistry.set("worldborder_end_n", 0); - world.setDynamicProperty("worldborder_b", false); - world.setDynamicProperty("worldborder_n", 0); - world.setDynamicProperty("worldborder_nether_n", 0); - world.setDynamicProperty("worldborder_end_n", 0); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> the §6World Border§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/modules/uiXray.js b/build/scripts/gui/modules/uiXray.js deleted file mode 100644 index 5c68024..0000000 --- a/build/scripts/gui/modules/uiXray.js +++ /dev/null @@ -1,34 +0,0 @@ -import { world } from "@minecraft/server"; -import { XrayA } from "../../penrose/BlockBreakAfterEvent/xray/xray_a.js"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -import { paradoxui } from "../paradoxui.js"; -export function uiXRAY(xrayResult, player) { - if (!xrayResult || xrayResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [XrayToggle] = xrayResult.formValues; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Get Dynamic Property Boolean - // Make sure the user has permissions to run the command - if (uniqueId !== player.name) { - return sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 管理者しか実行できません to configure Xray`); - } - if (XrayToggle === true) { - // Allow - dynamicPropertyRegistry.set("xraya_b", true); - world.setDynamicProperty("xraya_b", true); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が有効です!=> §6XrayA§f!`); - XrayA(); - } - if (XrayToggle === false) { - // Deny - dynamicPropertyRegistry.set("xraya_b", false); - world.setDynamicProperty("xraya_b", false); - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${player.name}§f 以下の機能が無効です!=> §4XrayA§f!`); - } - //show the main ui to the player once complete. - return paradoxui(player); -} diff --git a/build/scripts/gui/paradoxui.js b/build/scripts/gui/paradoxui.js deleted file mode 100644 index 4f930c0..0000000 --- a/build/scripts/gui/paradoxui.js +++ /dev/null @@ -1,144 +0,0 @@ -import { ActionFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../penrose/WorldInitializeAfterEvent/registry"; -import versionFile from "../version.js"; -import { opHandler } from "./guiHandler/results/op"; -import { tprHandler } from "./guiHandler/results/tpr"; -import { deopHandler } from "./guiHandler/results/deop"; -import { locationHandler } from "./guiHandler/results/location"; -import { moderationui } from "./guiHandler/guiHandlerModeration/moderationui"; -import { reportHandler } from "./guiHandler/results/report"; -import { modulesui } from "./guiHandler/guiHandlerModules/modulesui"; -import { prefixHandler } from "./guiHandler/results/prefix"; -import { statsHandler } from "./guiHandler/results/stats"; -import { chatChannelMainMenu } from "./guiHandler/results/chatChannelsMenu"; -import { managePlayerSavedLocationsHandler } from "./guiHandler/guiHandlerModeration/results/managePlayersSavedLocations"; -import { inventoryHandler } from "./guiHandler/guiHandlerModeration/results/inventoryui"; -/** - * @name paradoxui - * @param {Player} player - Player object - */ -export function paradoxui(player) { - handleParadoxUI(player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} -async function handleParadoxUI(player) { - const maingui = new ActionFormData(); - const hash = player.getDynamicProperty("hash"); - const salt = player.getDynamicProperty("salt"); - const uniqueId = dynamicPropertyRegistry.get(player?.id); - maingui.title("§4メニュー§4"); - maingui.body("§eこのメニューではTPリクエストや座標を保存そして報告機能が使えます!§e\n" + "§fVersion: §2" + versionFile.version); - if (uniqueId !== player.name) { - maingui.button("管理者", "textures/ui/op"); - maingui.button("TPリクエスト!", "textures/blocks/portal_placeholder"); - maingui.button("座標保存", "textures/items/compass_item"); - maingui.button("報告!", "textures/items/paper"); - maingui.button("制作途中【一時的に報告に置き換わります】", "textures/ui/mute_off"); - } - else { - maingui.button("オペレーター", "textures/ui/op"); - maingui.button("権限剝奪", "textures/items/ender_pearl"); - maingui.button("管理者メニュー", "textures/items/book_normal"); - maingui.button("アンチチート設定", "textures/blocks/command_block"); - maingui.button("起動文字変更", "textures/ui/UpdateGlyph"); - maingui.button("TPリクエスト", "textures/blocks/portal_placeholder"); - maingui.button("座標保存", "textures/items/compass_item"); - maingui.button("ユーザーログ", "textures/items/book_normal"); - maingui.button("報告!", "textures/items/paper"); - maingui.button("インベントリ確認", "textures/blocks/chest_front"); - maingui.button("パーティー", "textures/ui/mute_off"); - maingui.button("ユーザーの座標管理", "textures/items/compass_item"); - } - maingui - .show(player) - .then((result) => { - const isUnique = uniqueId !== player.name; - if (isUnique) { - switch (result.selection) { - case 0: - opHandler(player, uniqueId, salt, hash); - break; - case 1: - tprHandler(player); - break; - case 2: - locationHandler(player); - break; - case 3: - reportHandler(player); - break; - case 4: - chatChannelMainMenu(player); - default: - // Handle other selections for isUnique case - break; - } - } - else { - switch (result.selection) { - case 0: - opHandler(player, uniqueId, salt, hash); - break; - case 1: - deopHandler(player); - break; - case 2: - moderationui(player); - break; - case 3: - modulesui(player); - break; - case 4: - prefixHandler(player); - break; - case 5: - tprHandler(player); - break; - case 6: - locationHandler(player); - break; - case 7: - statsHandler(player); - break; - case 8: - reportHandler(player); - break; - case 9: - inventoryHandler(player); - break; - case 10: - chatChannelMainMenu(player); - break; - case 11: - managePlayerSavedLocationsHandler(player); - break; - default: - // Handle other selections for non-isUnique case - break; - } - } - if (result.canceled && result.cancelationReason === "UserBusy") { - paradoxui(player); - } - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/playerui/chatChannels/uiChatChannels.js b/build/scripts/gui/playerui/chatChannels/uiChatChannels.js deleted file mode 100644 index a41d462..0000000 --- a/build/scripts/gui/playerui/chatChannels/uiChatChannels.js +++ /dev/null @@ -1,231 +0,0 @@ -import { world } from "@minecraft/server"; -import { MessageFormData } from "@minecraft/server-ui"; -import { chatChannels, createChatChannel, deleteChatChannel, getPlayerById, getPlayerByName, getPlayerChannel, handOverChannelOwnership, inviteToChatChannel, playerChannelMap, sendMsgToPlayer, switchChatChannel } from "../../../util"; -export function uiChatChannelCreate(ChatChannelCreateUIResult, player) { - handleUIChatChannelCreate(ChatChannelCreateUIResult, player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIChatChannelCreate(ChatChannelCreateUIResult, player) { - const [txtChannelName, txtChannelPassword] = ChatChannelCreateUIResult.formValues; - const existingChannelName = getPlayerChannel(player.id); - if (existingChannelName) { - const msgUI = new MessageFormData(); - msgUI.title("§4Create Channel Error§4"); - msgUI.body(`§f すでにチャットチャンネルに入っています! 参加チャンネル=> §6(${existingChannelName}). §fまずは今いるチャンネルから抜けてください`); - msgUI.button1("OK"); - msgUI.show(player); - } - else { - const channelName = txtChannelName; - const password = txtChannelPassword; // Optional password argument - const createResult = createChatChannel(channelName.toString(), password.toString(), player.id); - const msgUI = new MessageFormData(); - msgUI.title("§4Chat Channel Created§4"); - msgUI.body(`§f§4[§6Paradox§4]§f Chat channel '${channelName}' ${createResult ? "§2created." : "§6already exists."}`); - msgUI.button1("OK"); - } - } -} -export function uiChatChannelJoin(ChatChannelJoinUIResult, player, channelDropdownData) { - handleUIChatChannelJoin(ChatChannelJoinUIResult, player, channelDropdownData).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIChatChannelJoin(ChatChannelJoinUIResult, player, channelDropdownData) { - const [ddChannelName, txtChannelPassword] = ChatChannelJoinUIResult.formValues; - const existingChannelName = getPlayerChannel(player.id); - if (existingChannelName) { - const msgUI = new MessageFormData(); - msgUI.title("§4Join Channel Error§4"); - msgUI.body("§f すでにチャットチャンネルに入っています! 参加チャンネル=> §6(${existingChannelName}). §fまずは今いるチャンネルから抜けてください"); - msgUI.button1("OK"); - msgUI.show(player); - } - else { - const selectedNumber = ddChannelName; //Presented as a Number not the dropdown value the player sees - let selectedChannelName = ""; //This will be used to store the extracted data. - for (const item of channelDropdownData) { - if (parseInt(item.value) === selectedNumber) { - const commaIndex = item.text.indexOf(","); // We need the channel name before the comma - if (commaIndex !== -1) { - selectedChannelName = item.text.substring(0, commaIndex).trim(); - } - else { - selectedChannelName = item.text.trim(); // if no comma is found trim the entire text. - } - break; - } - } - //Join code extracted from visuals chat commands. I have added a uiMessage to store any errors or if the player is added to the channel. - const passwordToJoin = txtChannelPassword.toString(); // Optional password argument - const newChannel = switchChatChannel(player.id, selectedChannelName, passwordToJoin); - let uiMessage = ""; - if (newChannel === "wrong_password") { - uiMessage = `§6パスワードが違います §f'${selectedChannelName}'.`; - } - else if (newChannel === "already_in_channel") { - uiMessage = `§6 すでにチャットチャンネルに入っています! 参加チャンネル=>. Please leave your current channel first.`; - } - else if (newChannel !== false) { - const joinedPlayer = getPlayerById(player.id); - const joinedPlayerName = joinedPlayer ? joinedPlayer.name : "Unknown Player"; - const joinMessage = `§f§4[§6Paradox§4]§f §6${joinedPlayerName}§f joined the chat channel.`; - const channel = chatChannels[selectedChannelName]; - uiMessage = `§f You have been added to §2${selectedChannelName}.`; - channel.members.forEach((memberId) => { - const member = getPlayerById(memberId); - if (member && member !== joinedPlayer) { - sendMsgToPlayer(member, joinMessage); - } - }); - } - else { - uiMessage = `§6Unable to join chat channel §r${selectedChannelName}, please try again.`; - } - const msgUI = new MessageFormData(); - msgUI.title("§4Chat Channel Created§4"); - msgUI.body(uiMessage); - msgUI.button1("OK"); - msgUI.show(player); - } - } -} -export function uiChatChannelInvite(ChatChannelJoinUIResult, player, channelDropdownData, onlineList) { - handleUIChatChannelInvite(ChatChannelJoinUIResult, player, channelDropdownData, onlineList).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIChatChannelInvite(ChatChannelInviteUIResult, player, channelDropdownData, onlineList) { - const [ddChannelName, ddMember] = ChatChannelInviteUIResult.formValues; - // const existingChannelName = getPlayerChannel(player.id); - let uiMessage = ""; - const selectedNumber = ddChannelName; //Presented as a Number not the dropdown value the player sees - let selectedChannelName = ""; //This will be used to store the extracted data. - for (const item of channelDropdownData) { - if (parseInt(item.value) === selectedNumber) { - const commaIndex = item.text.indexOf(","); // We need the channel name before the comma - if (commaIndex !== -1) { - selectedChannelName = item.text.substring(0, commaIndex).trim(); - } - else { - selectedChannelName = item.text.trim(); // if no comma is found trim the entire text. - } - break; - } - } - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[ddMember].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - //Invite code from visuals command chat channels - const channelNameToInvite = selectedChannelName; - const playerToInvite = member.name; - if (!playerToInvite) { - uiMessage = `§6 Something went wrong did you select a player to invite, please try again.`; - } - const joinedPlayer = getPlayerByName(playerToInvite); - if (playerToInvite) { - const inviteResult = inviteToChatChannel(playerToInvite, channelNameToInvite); - if (inviteResult) { - uiMessage = `§fInvited ${playerToInvite} to join chat channel '${channelNameToInvite}'.`; - const joinedPlayerName = joinedPlayer ? joinedPlayer.name : "Unknown Player"; - const joinMessage = `§f§4[§6Paradox§4]§f §6${joinedPlayerName}§f joined the chat channel.`; - const channel = chatChannels[channelNameToInvite]; - channel.members.forEach((memberId) => { - const member = getPlayerById(memberId); - if (member && member !== joinedPlayer) { - sendMsgToPlayer(member, joinMessage); - } - }); - sendMsgToPlayer(joinedPlayer, `§f§4[§6Paradox§4]§f ${player.name} invited you to channel '${channelNameToInvite}'.`); - } - else { - uiMessage = `§6f ${playerToInvite} is already in a chat channel.`; - } - } - else { - uiMessage = `§6Player '${playerToInvite}' not found.`; - } - const msgUI = new MessageFormData(); - msgUI.title("§4Chat Channel Invite§4"); - msgUI.body(uiMessage); - msgUI.button1("OK"); - msgUI.show(player); - } -} -export function uiChatChannelLeave(ChatChannelLeaveUIResult, player, channelDropdownData) { - handleUIChatChannelLeave(ChatChannelLeaveUIResult, player, channelDropdownData).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - async function handleUIChatChannelLeave(ChatChannelLeaveUIResult, player, channelDropdownData) { - //const [ddChannelName] = ChatChannelLeaveUIResult.formValues; - const channelNameToLeave = getPlayerChannel(player.id); - if (!channelNameToLeave) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You are not in any chat channel.`); - return; - } - const channelToLeave = chatChannels[channelNameToLeave]; - const isOwner = channelToLeave.owner === player.id; - // Remove the player from the channel - channelToLeave.members.delete(player.id); - playerChannelMap[player.id] = null; - // Inform all remaining members in the channel that the player left - const leavingPlayer = getPlayerById(player.id); - const leavingPlayerName = leavingPlayer ? leavingPlayer.name : "Unknown Player"; - const leaveMessage = `§f§4[§6Paradox§4]§f §6${leavingPlayerName}§f left the chat channel.`; - channelToLeave.members.forEach((memberId) => { - const member = getPlayerById(memberId); - if (member) { - sendMsgToPlayer(member, leaveMessage); - } - }); - if (isOwner) { - // If the leaving player is the owner, transfer ownership to another member - const newOwnerId = Array.from(channelToLeave.members)[0]; // Get the first member as new owner - if (newOwnerId) { - handOverChannelOwnership(channelNameToLeave, getPlayerById(player.id), getPlayerById(newOwnerId).name); - const newOwnerObject = getPlayerById(newOwnerId); - sendMsgToPlayer(newOwnerObject, `§f§4[§6Paradox§4]§f Ownership of chat channel '${channelNameToLeave}' transferred to '${newOwnerObject.name}'.`); - } - else { - // If no other members, delete the channel - deleteChatChannel(channelNameToLeave, channelToLeave.password); - } - } - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Left the chat channel '${channelNameToLeave}'.`); - } -} diff --git a/build/scripts/gui/playerui/chatChannels/uiChatChannelsCreateMenu.js b/build/scripts/gui/playerui/chatChannels/uiChatChannelsCreateMenu.js deleted file mode 100644 index ca21ec9..0000000 --- a/build/scripts/gui/playerui/chatChannels/uiChatChannelsCreateMenu.js +++ /dev/null @@ -1,23 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { uiChatChannelCreate } from "./uiChatChannels"; -export function chatChannelsCreateMenuUI(player) { - const menu = new ModalFormData(); - menu.title("§4メニュー:チャンネル作成§4"); - menu.textField("チャンネル名前: ", "Test"); - menu.textField("パスワード:", "Password123"); - menu.show(player) - .then((chatChannelsCreateResult) => { - uiChatChannelCreate(chatChannelsCreateResult, player); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/playerui/chatChannels/uiChatChannelsInviteMenu.js b/build/scripts/gui/playerui/chatChannels/uiChatChannelsInviteMenu.js deleted file mode 100644 index 849f8f7..0000000 --- a/build/scripts/gui/playerui/chatChannels/uiChatChannelsInviteMenu.js +++ /dev/null @@ -1,38 +0,0 @@ -import { world } from "@minecraft/server"; -import { ModalFormData } from "@minecraft/server-ui"; -import { listChatChannels } from "../../../util"; -import { uiChatChannelInvite } from "./uiChatChannels"; -export function ChatChannelsInviteMenuUI(player) { - const menu = new ModalFormData(); - menu.title("§4メニュー:招待§4"); - const channelsList = listChatChannels(); - //Get the current channels - const channelDropdownData = channelsList.map((channel) => ({ - text: `${channel.channelName}, §fパスワード: ${channel.hasPassword === "Yes" ? "§aYes" : "§cNo"}`, - value: channel.channelName, - })); - if (channelDropdownData.length === 0) { - channelDropdownData.push({ text: "§6既存のチャンネルはない", value: "" }); - } - //Get the current players online - let onlineList = []; - onlineList = Array.from(world.getPlayers(), (player) => player.name); - menu.dropdown(`\n§f指定したプレイヤーを招待:§f\n\nプレイヤーがオンラインです\n`, onlineList); - menu.dropdown(`\n§f招待するチャンネル:\n\n`, channelDropdownData); - //menu.textField("Channel Password: ", ""); - menu.show(player) - .then((chatChannelsInviteResult) => { - uiChatChannelInvite(chatChannelsInviteResult, player, channelDropdownData, onlineList); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/playerui/chatChannels/uiChatChannelsJoinMenu.js b/build/scripts/gui/playerui/chatChannels/uiChatChannelsJoinMenu.js deleted file mode 100644 index 682a9c5..0000000 --- a/build/scripts/gui/playerui/chatChannels/uiChatChannelsJoinMenu.js +++ /dev/null @@ -1,32 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { listChatChannels } from "../../../util"; -import { uiChatChannelJoin } from "./uiChatChannels"; -export function ChatChannelsJoinMenuUI(player) { - const menu = new ModalFormData(); - menu.title("§4メニュー:参加§4"); - const channelsList = listChatChannels(); - const channelDropdownData = channelsList.map((channel) => ({ - text: `${channel.channelName}, §fパスワード: ${channel.hasPassword === "Yes" ? "§aYes" : "§cNo"}`, - value: channel.channelName, - })); - if (channelDropdownData.length === 0) { - channelDropdownData.push({ text: "§6既存のチャンネルはない", value: "" }); - } - menu.dropdown(`\n§fチャンネルを選択:\n\n`, channelDropdownData); - menu.textField("パスワード: ", ""); - menu.show(player) - .then((chatChannelsJoinResult) => { - uiChatChannelJoin(chatChannelsJoinResult, player, channelDropdownData); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/playerui/chatChannels/uiChatChannelsLeaveMenu.js b/build/scripts/gui/playerui/chatChannels/uiChatChannelsLeaveMenu.js deleted file mode 100644 index 96622ae..0000000 --- a/build/scripts/gui/playerui/chatChannels/uiChatChannelsLeaveMenu.js +++ /dev/null @@ -1,31 +0,0 @@ -import { ModalFormData } from "@minecraft/server-ui"; -import { listChatChannels } from "../../../util"; -import { uiChatChannelLeave } from "./uiChatChannels"; -export function chatChannelsLeaveMenuUI(player) { - const menu = new ModalFormData(); - const channelsList = listChatChannels(); - const channelDropdownData = channelsList.map((channel) => ({ - text: `${channel.channelName}, §fパスワード: ${channel.hasPassword === "Yes" ? "§aYes" : "§cNo"}`, - value: channel.channelName, - })); - if (channelDropdownData.length === 0) { - channelDropdownData.push({ text: "§6既存のチャンネルはない", value: "" }); - } - menu.title("§4メニュー:チャンネルから抜ける§4"); - menu.dropdown(`\n§fチャンネルを選択:\n\n`, channelDropdownData); - menu.show(player) - .then((chatChannelsLeaveResult) => { - uiChatChannelLeave(chatChannelsLeaveResult, player, channelDropdownData); - }) - .catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -} diff --git a/build/scripts/gui/playerui/uiReport.js b/build/scripts/gui/playerui/uiReport.js deleted file mode 100644 index 08262b7..0000000 --- a/build/scripts/gui/playerui/uiReport.js +++ /dev/null @@ -1,31 +0,0 @@ -import { world } from "@minecraft/server"; -import { sendMsg, sendMsgToPlayer } from "../../util"; -export function UIREPORTPLAYER(reportplayerResult, onlineList, player) { - if (!reportplayerResult || reportplayerResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [value, reason] = reportplayerResult.formValues; - let member = undefined; - const players = world.getPlayers(); - for (const pl of players) { - if (pl.name.toLowerCase().includes(onlineList[value].toLowerCase().replace(/"|\\|@/g, ""))) { - member = pl; - break; - } - } - if (!member) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f !report §f`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f プレイヤーが存在しない又はオフラインです`); - return; - } - // Make sure they dont report themselves - if (member === player) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f自分自身には実行できません.`); - return; - } - sendMsgToPlayer(player, `§r§4[§6Paradox§4]§r ${member.name}§rが報告されました報告内容=> ${reason}`); - sendMsg("@a[tag=notify]", `§r§4[§6Paradox§4]§r ${player.name}§r が ${member.name}§r宛てに報告しました!報告内容=> ${reason}`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 報告内容を相手に送信できました`); - return; -} diff --git a/build/scripts/gui/playerui/uiSavedLocations.js b/build/scripts/gui/playerui/uiSavedLocations.js deleted file mode 100644 index 6f9a235..0000000 --- a/build/scripts/gui/playerui/uiSavedLocations.js +++ /dev/null @@ -1,113 +0,0 @@ -import { world } from "@minecraft/server"; -import config from "../../data/config.js"; -import { decryptString, encryptString, sendMsgToPlayer, setTimer } from "../../util.js"; -import { paradoxui } from "../paradoxui.js"; -export function uiSAVEDLOCATIONS(savedlocationsResult, Locations, player, coordArray) { - if (!savedlocationsResult || savedlocationsResult.canceled) { - // Handle canceled form or undefined result - return; - } - const [selectedLocationvalue, teleportToSelectedLocation, deleteSelectedLocation, newLocationName] = savedlocationsResult.formValues; - let x; - let y; - let z; - let dimension; - const coordArrayLength = coordArray.length; - for (let i = 0; i < coordArrayLength; i++) { - if (coordArray[i].includes("LocationHome:" && Locations[selectedLocationvalue])) { - x = parseInt(coordArray[i + 1].replace("X:", "")); - y = parseInt(coordArray[i + 2].replace("Y:", "")); - z = parseInt(coordArray[i + 3].replace("Z:", "")); - dimension = coordArray[i + 4].replace("Dimension:", ""); - } - continue; - } - if (teleportToSelectedLocation && deleteSelectedLocation === true) { - //If both toggles are enabled the message bellow will be sent to the player and the UI will be dispalyed. - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f TPと消去は同時に使えません`); - return paradoxui(player); - } - if (teleportToSelectedLocation === true) { - //Teleport the player to the location set in the dropdown. - setTimer(player.id); - player.teleport({ x: x, y: y, z: z }, { dimension: world.getDimension(dimension), rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f TPしました`); - return player; - } - if (deleteSelectedLocation === true) { - const salt = world.getDynamicProperty("crypt"); - // Find and delete this saved home location - let encryptedString = ""; - const tags = player.getTags(); - const tagsLength = tags.length; - for (let i = 0; i < tagsLength; i++) { - if (tags[i].startsWith("1337")) { - encryptedString = tags[i]; - // Decode it so we can verify it - tags[i] = decryptString(tags[i], salt); - } - if (tags[i].startsWith("LocationHome:" && Locations[selectedLocationvalue] + " X", 13)) { - player.removeTag(encryptedString); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 座標を消去しました'${Locations[selectedLocationvalue]}'!`); - break; - } - } - } - if (newLocationName) { - //A value was entered execute the code bellow. - //First check to make sure the same location name entered doesnt already exist - let counter = 0; - const coordArrayLength = coordArray.length; - for (let i = 0; i < coordArrayLength; i++) { - //Count how many tags already exist based on the array. - if (coordArray[i].includes("LocationHome:")) { - counter = ++counter; - } - if (coordArray[i].includes("LocationHome:" + newLocationName)) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 同じ名前の座標があります.`); - return paradoxui(player); - } - //Check to make sure they havent exceeded the max locations in config.js - if (counter >= config.modules.setHome.max && config.modules.setHome.enabled) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${config.modules.setHome.max} 保存可能回数を超えています`); - return paradoxui(player); - } - continue; - } - // Get current location of the player. - const { x, y, z } = player.location; - const currentX = x.toFixed(0); - const currentY = y.toFixed(0); - const currentZ = z.toFixed(0); - let currentDimension; - //save boolean to make sure we can save the location. - let doSave; - // Hash the coordinates for security - const salt = world.getDynamicProperty("crypt"); - //Check to make sure there are no spaces in the name that has been entered. - if (typeof newLocationName === "string" && newLocationName.includes(" ")) { - doSave = false; - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 空白を入れないでね`); - return paradoxui(player); - } - // Save which dimension they were in - if (player.dimension.id === "minecraft:overworld") { - currentDimension = "overworld"; - doSave = true; - } - if (player.dimension.id === "minecraft:nether") { - currentDimension = "nether"; - doSave = true; - } - if (player.dimension.id === "minecraft:the_end") { - doSave = true; - } - if (doSave === true) { - const decryptedLocationString = `LocationHome:${newLocationName} X:${currentX} Y:${currentY} Z:${currentZ} Dimension:${currentDimension}`; - const security = encryptString(decryptedLocationString, salt); - player.addTag(security); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f 新しい座標を保存しました.`); - } - } - return paradoxui(player); -} diff --git a/build/scripts/gui/showrules/showrules.js b/build/scripts/gui/showrules/showrules.js deleted file mode 100644 index 647ae77..0000000 --- a/build/scripts/gui/showrules/showrules.js +++ /dev/null @@ -1,78 +0,0 @@ -import { world, system } from "@minecraft/server"; -import config from "../../data/config.js"; -import { sendMsgToPlayer } from "../../util.js"; -import { MessageFormData } from "@minecraft/server-ui"; -import { dynamicPropertyRegistry } from "../../penrose/WorldInitializeAfterEvent/registry.js"; -import { kickablePlayers } from "../../kickcheck.js"; -const playersAwaitingResponse = new Set(); -/** - * Event handler for player login - */ -function onPlayerLeave(event) { - playersAwaitingResponse.delete(event.playerId); -} -async function showrules(id) { - const showrulesBoolean = dynamicPropertyRegistry.get("showrules_b"); - const KickOnDeclineBoolean = dynamicPropertyRegistry.get("kickondecline_b"); - if (showrulesBoolean === false) { - playersAwaitingResponse.clear(); - world.afterEvents.playerLeave.unsubscribe(onPlayerLeave); - system.clearRun(id); - return; - } - const filter = new Object(); - filter.tags = ["ShowRulesOnJoin"]; - const [cfgrule1, cfgrule2, cfgrule3, cfgrule4, cfgrule5] = [config.modules.showrules.rule1, config.modules.showrules.rule2, config.modules.showrules.rule3, config.modules.showrules.rule4, config.modules.showrules.rule5]; - const CompleteRules = `${cfgrule1}\n${cfgrule2}\n${cfgrule3}\n${cfgrule4}\n${cfgrule5}`; - const players = world.getPlayers(filter); - const promises = players.map(async (player) => { - if (playersAwaitingResponse.has(player.id)) { - // Player is already being shown the rules, skip this player. - return; - } - const form = new MessageFormData(); - form.title("サーバールール"); - form.body(CompleteRules); - form.button1("はい"); - form.button2("いいえ"); - const r = await form.show(player); - if (r.selection === 0) { - playersAwaitingResponse.delete(player.id); // Player has responded, remove from set. - player.removeTag("ShowRulesOnJoin"); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ルールを呼んでくれてありがとう!! ${player.name}.`); - return; - } - if (r.selection === 1) { - playersAwaitingResponse.delete(player.id); // Player has responded, remove from set. - if (KickOnDeclineBoolean === true) { - const reason = "ルールに同意してくれなかった為キックされました"; - player.runCommandAsync(`kick "${player.name}" §f\n\n${reason}`).catch(() => { - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - }); - } - return; - } - if (r.canceled) { - playersAwaitingResponse.delete(player.id); // Player has responded, remove from set. - } - }); - await Promise.all(promises); -} -export function ShowRules() { - // Subscribe to the player leave event - world.afterEvents.playerLeave.subscribe(onPlayerLeave); - const showrulesId = system.runInterval(() => { - showrules(showrulesId).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }, 230); -} diff --git a/build/scripts/kickcheck.js b/build/scripts/kickcheck.js deleted file mode 100644 index 5f818be..0000000 --- a/build/scripts/kickcheck.js +++ /dev/null @@ -1,9 +0,0 @@ -import { world } from "@minecraft/server"; -export const kickablePlayers = new WeakSet(); -world.beforeEvents.dataDrivenEntityTriggerEvent.subscribe((evd) => { - const { id, entity } = evd; - if (entity.id !== "minecraft:player" || id !== "paradox:kick") - return; - if (!kickablePlayers.has(entity)) - evd.cancel = true; -}); diff --git a/build/scripts/paradox.js b/build/scripts/paradox.js deleted file mode 100644 index e4b7544..0000000 --- a/build/scripts/paradox.js +++ /dev/null @@ -1,138 +0,0 @@ -// Import ChatSendBefore Events -import { BadPackets1 } from "./penrose/ChatSendBeforeEvent/spammer/badpackets_1.js"; -import { SpammerA } from "./penrose/ChatSendBeforeEvent/spammer/spammer_a.js"; -import { SpammerB } from "./penrose/ChatSendBeforeEvent/spammer/spammer_b.js"; -import { SpammerC } from "./penrose/ChatSendBeforeEvent/spammer/spammer_c.js"; -import { BeforePrefixCommand } from "./penrose/ChatSendBeforeEvent/chat/beforeprefixcommand.js"; -import { beforeChatFilter } from "./penrose/ChatSendBeforeEvent/chat/chatfilter.js"; -import { beforeAntiSpam } from "./penrose/ChatSendBeforeEvent/chat/antispam.js"; -// Import Tick Events -import { ServerBan } from "./penrose/TickEvent/ban/serverban.js"; -import { CrasherA } from "./penrose/TickEvent/crasher/crasher_a.js"; -import { NamespoofA } from "./penrose/TickEvent/namespoof/namespoof_a.js"; -import { NamespoofB } from "./penrose/TickEvent/namespoof/namespoof_b.js"; -import { BedrockValidate } from "./penrose/TickEvent/bedrock/bedrockvalidate.js"; -import { JesusA } from "./penrose/TickEvent/jesus/jesus_a.js"; -import { SpeedA } from "./penrose/TickEvent/speed/speed_a.js"; -import { IllegalItemsA } from "./penrose/TickEvent/illegalitems/illegalitems_a.js"; -import { InvalidSprintA } from "./penrose/TickEvent/invalidsprint/invalidsprint_a.js"; -import { FlyA } from "./penrose/TickEvent/fly/fly_a.js"; -import { AntiKnockbackA } from "./penrose/TickEvent/knockback/antikb_a.js"; -import { NoPerms } from "./penrose/TickEvent/noperms/nopermission.js"; -import { WorldBorder } from "./penrose/TickEvent/worldborder/worldborder.js"; -import { Vanish } from "./penrose/TickEvent/vanish/vanish.js"; -import { Survival } from "./penrose/TickEvent/gamemode/survival.js"; -import { Adventure } from "./penrose/TickEvent/gamemode/adventure.js"; -import { Creative } from "./penrose/TickEvent/gamemode/creative.js"; -import { IllegalItemsC } from "./penrose/TickEvent/illegalitems/illegalitems_c.js"; -import { OPS } from "./penrose/TickEvent/oneplayersleep/oneplayersleep.js"; -import { Hotbar } from "./penrose/TickEvent/hotbar/hotbar.js"; -import { VerifyPermission } from "./penrose/TickEvent/noperms/verifypermission.js"; -import { BadPackets2 } from "./penrose/TickEvent/badpackets2/badpackets2.js"; -import { ClearLag } from "./penrose/TickEvent/clearlag/clearlag.js"; -import { AntiFallA } from "./penrose/TickEvent/antifalla/antifall_a.js"; -import { AutoBan } from "./penrose/TickEvent/ban/autoban.js"; -import { freeze, freezeJoin, freezeLeave } from "./penrose/TickEvent/freeze/freeze.js"; -import { AFK } from "./penrose/TickEvent/afk/afk.js"; -import { AntiPhaseA } from "./penrose/TickEvent/phase/phase_a.js"; -// Import BlockBreakAfter Events -import { XrayA } from "./penrose/BlockBreakAfterEvent/xray/xray_a.js"; -import { NukerA } from "./penrose/BlockBreakAfterEvent/nuker/nuker_a.js"; -// Import PlayerSpawnAfter Events -import { onJoin } from "./penrose/PlayerSpawnAfterEvent/onjoin/onjoin.js"; -import { GlobalBanList } from "./penrose/PlayerSpawnAfterEvent/ban/globalbanlist.js"; -import { hashCode } from "./penrose/PlayerSpawnAfterEvent/hash/hash.js"; -import { onJoinrules } from "./gui/PlayerSpawnAfterEvent/rules/rules.js"; -// Import BlockPlaceAfter Events -import { ScaffoldA } from "./penrose/BlockPlaceAfterEvent/scaffold/scaffold_a.js"; -import { IllegalItemsB } from "./penrose/BlockPlaceAfterEvent/illegalitems/illegalitems_b.js"; -import { ReachA } from "./penrose/BlockPlaceAfterEvent/reach/reach_a.js"; -// Import EntityHitEntityAfter Events -import { ReachB } from "./penrose/EntityHitEntityAfterEvent/reach_b.js"; -import { KillAura } from "./penrose/EntityHitEntityAfterEvent/killaura.js"; -// Import WorldInitializeAfter Events -import { Registry } from "./penrose/WorldInitializeAfterEvent/registry.js"; -// Import SystemBefore Events -import { WatchDog } from "./penrose/SystemEvent/watchdog.js"; -// Import ChatSendAfter Events -import { AfterPrefixCommand } from "./penrose/ChatSendAfterEvent/chat/afterprefixcommand.js"; -import { TpRequestListener } from "./commands/utility/tpr.js"; -import { afterAntiSpam } from "./penrose/ChatSendAfterEvent/chat/antispam.js"; -import { afterChatFilter } from "./penrose/ChatSendAfterEvent/chat/chatfilter.js"; -// Import EntityDieAfter Events -import { DeathCoordinates } from "./penrose/EntityDieAfterEvent/death_coordinates.js"; -// Import PlayerLeaveAfter Events -import { onChannelLeave } from "./commands/utility/channel.js"; -// Custom -import config from "./data/config.js"; -// WorldInitializeAfter Events -Registry(); -// ChatSendBefore Events -BadPackets1(); -SpammerA(); -SpammerB(); -SpammerC(); -beforeAntiSpam(); -BeforePrefixCommand(); -beforeChatFilter(); -// ChatSendAfter Events -AfterPrefixCommand(); -TpRequestListener(); -afterAntiSpam(); -afterChatFilter(); -// Tick Events -ClearLag(); -BadPackets2(); -VerifyPermission; -OPS(); -Hotbar(); -NoPerms; -Vanish; -IllegalItemsC(); -Survival(); -Adventure(); -Creative(); -WorldBorder(); -ServerBan; -CrasherA(); -NamespoofA(); -NamespoofB(); -BedrockValidate(); -JesusA(); -SpeedA(); -IllegalItemsA(); -InvalidSprintA(); -FlyA(); -AntiKnockbackA(); -AntiFallA(); -AutoBan(); -AFK(); -AntiPhaseA(); -if (config.customcommands.freeze || config.modules.antiKillAura || config.modules.antinukerA) { - freeze; - freezeLeave(); - freezeJoin(); -} -// BlockBreakAfter Events -XrayA(); -NukerA(); -// playerSpawnAfter Events -onJoin(); -GlobalBanList(); -hashCode(); -onJoinrules(); // GUI -// BlockPlaceAfter Events -ScaffoldA(); -IllegalItemsB(); -ReachA(); -// EntityHitEntityAfter Events -ReachB(); -KillAura(); -// EntityDieAfter Events -DeathCoordinates(); -// SystemBefore Events -WatchDog(); -// playerLeaveAfter Events -if (config.customcommands.channel === true) { - onChannelLeave(); -} diff --git a/build/scripts/penrose/BlockBreakAfterEvent/nuker/nuker_a.js b/build/scripts/penrose/BlockBreakAfterEvent/nuker/nuker_a.js deleted file mode 100644 index 53b64ce..0000000 --- a/build/scripts/penrose/BlockBreakAfterEvent/nuker/nuker_a.js +++ /dev/null @@ -1,250 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -import { MinecraftEffectTypes } from "../../../node_modules/@minecraft/vanilla-data/lib/index.js"; -const lastBreakTime = new Map(); -const breakCounter = new Map(); -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - const playerName = event.playerId; - lastBreakTime.delete(playerName); - breakCounter.delete(playerName); -} -async function nukera(object) { - const antiNukerABoolean = dynamicPropertyRegistry.get("antinukera_b"); - if (antiNukerABoolean === false) { - lastBreakTime.clear(); - breakCounter.clear(); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - world.afterEvents.blockBreak.unsubscribe(nukera); - return; - } - const { block, player, dimension, brokenBlockPermutation } = object; - const { x, y, z } = block.location; - const uniqueId = dynamicPropertyRegistry.get(player?.id); - if (uniqueId === player.name) { - return; - } - // Ignore vegetation - const vegetation = [ - /** - * Leaves - * - * Oak, Spruce, Birch, Jungle, Acacia, Dark Oak, - * Azalea, Flowering Azalea, Mangrove, Cherry. - */ - "minecraft:leaves", - "minecraft:leaves2", - "minecraft:azalea_leaves", - "minecraft:azalea_leaves_flowered", - "minecraft:cherry_leaves", - "minecraft:mangrove_leaves", - /** - * Saplings - * - * Oak, Sapling, Birch, Jungle, Acacia, Dark Oak, - * Azalea, Flowering Azalea, Mangove Propagule, Cherry, - * Bamboo. - */ - "minecraft:bamboo_sapling", - "minecraft:sapling", - "minecraft:cherry_sapling", - /** - * Flowers - * - * Allium, Azure Bluet, Blue Orchid, Cornflower, Dandelion, - * Lilac, Lily of the Valley, Orange Tulip, Oxeye Daisy, - * Peony, Pink Tulip, Poppy, Red Tulip, Rose Bush, Sunflower, - * White Tulip, Wither Rose, Chorus. - */ - "minecraft:yellow_flower", - "minecraft:red_flower", - "minecraft:chorus_flower", - "minecraft:flowering_azalea", - "minecraft:azalea_leaves_flowered", - "minecraft:wither_rose", - /** - * Mushrooms - * - * Brown Mushroom, Brown Mushroom Block, Mushroom Stem, - * Red Mushroom, Red Mushroom Block. - */ - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "minecraft:brown_mushroom_block", - "minecraft:red_mushroom_block", - /** - * Crops - * - * Bamboo, Cactus, Carved Pumpkin, Hay Bale, - * Melon, Pumpkin, Sugar Cane, Potatoes, Carrots - * Beetroot, Wheat. - */ - "minecraft:melon_block", - "minecraft:melon_stem", - "minecraft:potatoes", - "minecraft:pumpkin", - "minecraft:carved_pumpkin", - "minecraft:pumpkin_stem", - "minecraft:beetroot", - "minecraft:bamboo", - "minecraft:wheat", - "minecraft:carrots", - "minecraft:reeds", - /** - * Cave Plants - * - * Big Dripleaf, Glow Lichen, Hanging Roots, - * Moss Block, Moss Carpet, Small Dripleaf, - * Spore Blossom, Cave Vines. - */ - "minecraft:glow_lichen", - "minecraft:small_dripleaf_block", - "minecraft:big_dripleaf", - "minecraft:cave_vines", - "minecraft:cave_vines_body_with_berries", - "minecraft:cave_vines_head_with_berries", - "minecraft:moss_block", - "minecraft:moss_carpet", - "minecraft:hanging_roots", - "minecraft:spore_blossom", - "minecraft:glow_berries", - /** - * Shrubbery - * - * Dead Bush, Fern, Grass, Large Fern, - * Lily Pad, Tall Grass, Vines - */ - "minecraft:double_plant", - "minecraft:tallgrass", - "minecraft:deadbush", - "minecraft:vine", - "minecraft:twisting_vines", - "minecraft:weeping_vines", - "minecraft:chorus_plant", - /** - * Nether - * - * Crimson Fungus, Warped Fungus, Nether Wart, - * Nether Sprouts, Crimson Roots, Warped Roots. - */ - "minecraft:crimson_fungus", - "minecraft:warped_fungus", - "minecraft:nether_wart", - "minecraft:nether_sprouts", - "minecraft:crimson_roots", - "minecraft:warped_roots", - /** - * Water Plants - * - * Water Lily, Sea Grass, Kelp - */ - "minecraft:waterlily", - "minecraft:seagrass", - "minecraft:kelp", - /** - * Miscellaneous - * - * Blocks that I am too lazy to sort out right now - */ - "minecraft:cocoa", - "minecraft:cactus", - "minecraft:azalea", - "minecraft:sweet_berry_bush", - "minecraft:sweet_berries", - ]; - const efficiencyLevels = { - 0: 0.625, - 1: 0.5, - 2: 0.375, - 3: 0.25, - 4: 0.125, - 5: 0.0625, // Efficiency V - }; - const now = Date.now(); - const lastBreak = lastBreakTime.get(player.id); - const counter = breakCounter.get(player.id) || 0; - const hand = player.selectedSlot; - const inventory = player.getComponent("inventory"); - const container = inventory.container; - const item = container.getItem(hand); - const itemEnchantmentComponent = item?.getComponent("enchantments"); - const itemEfficiencyLevel = itemEnchantmentComponent?.enchantments?.getEnchantment("efficiency")?.level || 0; - const requiredTimeDifference = efficiencyLevels[itemEfficiencyLevel]; - const timeDifferenceInSeconds = (now - lastBreak) / 1000; - if (vegetation.indexOf(brokenBlockPermutation.type.id) === -1 && lastBreak && timeDifferenceInSeconds < requiredTimeDifference) { - if (counter >= 3) { - const blockLoc = dimension.getBlock({ x: x, y: y, z: z }); - const blockID = brokenBlockPermutation.clone(); - flag(player, "Nuker", "A", "Break", null, null, null, null, false); - blockLoc.setPermutation(blockID); - lastBreakTime.delete(player.id); - breakCounter.delete(player.id); - player.runCommandAsync(`kill @e[x=${x},y=${y},z=${z},r=10,c=1,type=item]`); - // Apply effects or actions for three or more consecutive block breaks - player.addEffect(MinecraftEffectTypes.Blindness, 1000000, { amplifier: 255, showParticles: true }); - player.addEffect(MinecraftEffectTypes.MiningFatigue, 1000000, { amplifier: 255, showParticles: true }); - player.addEffect(MinecraftEffectTypes.Weakness, 1000000, { amplifier: 255, showParticles: true }); - player.addEffect(MinecraftEffectTypes.Slowness, 1000000, { amplifier: 255, showParticles: true }); - const hasFreezeTag = player.hasTag("paradoxFreeze"); - const hasNukerFreeze = player.hasTag("freezeNukerA"); - if (!hasFreezeTag) { - player.addTag("paradoxFreeze"); - } - if (!hasNukerFreeze) { - player.addTag("freezeNukerA"); - } - return; - } - else { - breakCounter.set(player.id, counter + 1); - } - } - else { - lastBreakTime.set(player.id, now); - breakCounter.set(player.id, 1); - } -} -function freeze(id) { - const antiNukerABoolean = dynamicPropertyRegistry.get("antinukera_b"); - if (antiNukerABoolean === false) { - system.clearRun(id); - return; - } - const filter = { - tags: ["freezeNukerA"], - excludeTags: ["freezeAura", "freezeScaffoldA"], - }; - const players = world.getPlayers(filter); - for (const player of players) { - if (!player) { - return; - } - const tagBoolean = player.hasTag("paradoxFreeze"); - if (!tagBoolean) { - player.removeTag("freezeNukerA"); - return; - } - player.onScreenDisplay.setTitle("§f§4[§6server§4]§f違法なツールを検知したためフリーズされました", { subtitle: "§f検知内容=> §4[§6AntiNukerA§4]§f", fadeInDuration: 0, fadeOutDuration: 0, stayDuration: 60 }); - } -} -const NukerA = () => { - world.afterEvents.blockBreak.subscribe((object) => { - nukera(object).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }); - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - const id = system.runInterval(() => { - freeze(id); - }, 20); -}; -export { NukerA }; diff --git a/build/scripts/penrose/BlockBreakAfterEvent/xray/xray_a.js b/build/scripts/penrose/BlockBreakAfterEvent/xray/xray_a.js deleted file mode 100644 index 8a6732e..0000000 --- a/build/scripts/penrose/BlockBreakAfterEvent/xray/xray_a.js +++ /dev/null @@ -1,94 +0,0 @@ -import { world } from "@minecraft/server"; -import { xrayblocks } from "../../../data/xray.js"; -import { sendMsg } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -// Define different thresholds for different ore categories -const XRAY_THRESHOLD_COMMON = 5; -const XRAY_THRESHOLD_UNCOMMON = 4; -const XRAY_THRESHOLD_RARE = 3; -const XRAY_THRESHOLD_VERY_RARE = 2; -// Use a global variable to store xrayData map -const xrayData = new Map(); -// Use a global variable to store the number of blocks broken within the last minute -const blocksBrokenCount = new Map(); -function isXraySuspicious(playerId, blockId) { - const data = xrayData.get(playerId); - if (!data) - return false; - const currentTime = Date.now(); - const timeSinceLastNotify = currentTime - data.lastNotifyTime; - // Determine the threshold based on the block being broken - let threshold = 0; - if (blockId in xrayblocks) { - if (blockId === "minecraft:iron_ore" || - blockId === "minecraft:gold_ore" || - blockId === "minecraft:lapis_ore" || - blockId === "minecraft:deepslate_iron_ore" || - blockId === "minecraft:deepslate_gold_ore" || - blockId === "minecraft:deepslate_lapis_ore") { - threshold = XRAY_THRESHOLD_COMMON; - } - else if (blockId === "minecraft:redstone_ore" || blockId === "minecraft:deepslate_redstone_ore") { - threshold = XRAY_THRESHOLD_UNCOMMON; - } - else if (blockId === "minecraft:diamond_ore" || blockId === "minecraft:emerald_ore" || blockId === "minecraft:deepslate_diamond_ore" || blockId === "minecraft:deepslate_emerald_ore") { - threshold = XRAY_THRESHOLD_RARE; - } - else if (blockId === "minecraft:ancient_debris") { - threshold = XRAY_THRESHOLD_VERY_RARE; - } - } - return blocksBrokenCount.get(playerId) >= threshold && timeSinceLastNotify <= 60000; -} -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - const playerId = event.playerId; - xrayData.delete(playerId); - blocksBrokenCount.delete(playerId); -} -function xraya(object) { - // Get Dynamic Property - const xrayBoolean = dynamicPropertyRegistry.get("xraya_b"); - // Unsubscribe if disabled in-game - if (xrayBoolean === false) { - xrayData.clear(); - blocksBrokenCount.clear(); - world.afterEvents.blockBreak.unsubscribe(xraya); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - return; - } - // Properties from class - const { player, brokenBlockPermutation } = object; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - return; - } - // Player coordinates - const { x, y, z } = player.location; - if (brokenBlockPermutation.type.id in xrayblocks) { - const playerId = player.id; - if (!xrayData.has(playerId)) { - xrayData.set(playerId, { lastNotifyTime: 0 }); - } - if (!blocksBrokenCount.has(playerId)) { - blocksBrokenCount.set(playerId, 0); - } - const playerData = xrayData.get(playerId); - // Increment the count for the player - blocksBrokenCount.set(playerId, (blocksBrokenCount.get(playerId) || 0) + 1); - // Reset the timer whenever we add new ore data - playerData.lastNotifyTime = Date.now(); - if (isXraySuspicious(playerId, brokenBlockPermutation.type.id)) { - sendMsg(`@a[tag=notify]`, `§f§4[§6Paradox§4]§f §4[Xray]§f ${player.name}§f§6 が §f${blocksBrokenCount.get(playerId)}x ${brokenBlockPermutation.type.id.replace("minecraft:", "")}§6 at X=§f${x.toFixed(0)}§6 Y=§f${y.toFixed(0)}§6 Z=§f${z.toFixed(0)}を見つけました`); - // Reset the count after notifying - blocksBrokenCount.set(playerId, 0); - } - } -} -const XrayA = () => { - world.afterEvents.blockBreak.subscribe(xraya); - world.afterEvents.playerLeave.subscribe(onPlayerLogout); // Subscribe to player logout events -}; -export { XrayA }; diff --git a/build/scripts/penrose/BlockPlaceAfterEvent/illegalitems/illegalitems_b.js b/build/scripts/penrose/BlockPlaceAfterEvent/illegalitems/illegalitems_b.js deleted file mode 100644 index 784912e..0000000 --- a/build/scripts/penrose/BlockPlaceAfterEvent/illegalitems/illegalitems_b.js +++ /dev/null @@ -1,349 +0,0 @@ -import { world, ItemStack } from "@minecraft/server"; -import { illegalitems } from "../../../data/itemban.js"; -import config from "../../../data/config.js"; -import { flag, titleCase, sendMsgToPlayer, sendMsg } from "../../../util.js"; -import { kickablePlayers } from "../../../kickcheck.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -import { illegalItemsBWhitelist } from "../../../data/illegalItemsB_whitelist.js"; -// Create a map of player objects and their enchantment presence -const enchantmentPresenceMap = new Map(); -// Create a map of player objects and their enchantment data -const enchantmentDataMap = new Map(); -// Create a map of player objects and their inventory slot value -const inventorySlotMap = new Map(); -// Create a map of player objects and their ItemStack data -const itemStackDataMap = new Map(); -// Create a map of player objects and their unverified ItemStack -const unverifiedItemMap = new Map(); -function rip(player, inventory_item, enchData, block, nested = false) { - let reason; - if (block) { - reason = nested ? `Illegal Item B (Nested ${block.type.id.replace("minecraft:", "")})` : `Illegal Item B (${block.type.id.replace("minecraft:", "")})`; - } - else if (enchData) { - const { id, level } = enchData; - reason = `Illegal Item B (${inventory_item.typeId.replace("minecraft:", "")}: ${id}=${level})`; - } - else { - reason = `Illegal Item B (${inventory_item.typeId.replace("minecraft:", "")}=${inventory_item.amount})`; - } - try { - player.addTag(`Reason:${reason}`); - player.addTag("By:Paradox"); - player.addTag("isBanned"); - } - catch (error) { - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - } -} -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - enchantmentPresenceMap.delete(event.playerId); - enchantmentDataMap.delete(event.playerId); - inventorySlotMap.delete(event.playerId); - itemStackDataMap.delete(event.playerId); - unverifiedItemMap.delete(event.playerId); -} -async function illegalitemsb(object) { - // Get Dynamic Property - const illegalItemsBBoolean = dynamicPropertyRegistry.get("illegalitemsb_b"); - const salvageBoolean = dynamicPropertyRegistry.get("salvage_b"); - const illegalLoresBoolean = dynamicPropertyRegistry.get("illegallores_b"); - const illegalEnchantmentBoolean = dynamicPropertyRegistry.get("illegalenchantment_b"); - const antiShulkerBoolean = dynamicPropertyRegistry.get("antishulker_b"); - const stackBanBoolean = dynamicPropertyRegistry.get("stackban_b"); - // Unsubscribe if disabled in-game - if (illegalItemsBBoolean === false) { - resetMaps(); // Clear the maps - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - world.afterEvents.blockPlace.unsubscribe(illegalitemsb); - return; - } - // Properties from class - const { block, player } = object; - // Block coordinates - const { x, y, z } = block.location; - // Get the player's unique ID from the "dynamicPropertyRegistry" object - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // If the player has permission (i.e., their unique ID matches their name), skip to the next player - if (uniqueId === player.name) { - return; - } - // Check if placed item is illegal - if (illegalitems.has(block.typeId) && !illegalItemsBWhitelist.has(block.typeId)) { - player.runCommandAsync(`fill ${x} ${y} ${z} ${x} ${y} ${z} air [] replace air`); - flag(player, "IllegalItems", "B", "Exploit", null, null, null, null, null); - return rip(player, null, null, block); - } - // Get the block's inventory - const blockInventory = block.getComponent("minecraft:inventory"); - const blockContainer = blockInventory?.container; - const blockIdentifiers = ["ender_chest", "shulker"]; - let isFlagged = false; - let isAdjacent = false; - // Check if container illegally contains nested items if not an ender chest or shulker box - if (!blockIdentifiers.some((id) => block.typeId.indexOf(id) !== -1)) { - if (blockContainer) { - // Cache the block's inventory size - const blockContainerSize = blockContainer.size; - // Iterate through each slot in the block's container - for (let i = 0; i < blockContainerSize; i++) { - // Get the item in the current slot - const blockItemStack = blockContainer.getItem(i); - const itemStackId = blockItemStack?.typeId; - if (!itemStackId) { - continue; - } - // Check if its a chest adjacent to another chest - if (block.typeId === "minecraft:chest" || block.typeId === "minecraft:trapped_chest") { - const adjacentBlocks = [ - { dx: 1, dy: 0, dz: 0 }, - { dx: -1, dy: 0, dz: 0 }, - { dx: 0, dy: 1, dz: 0 }, - { dx: 0, dy: -1, dz: 0 }, - { dx: 0, dy: 0, dz: 1 }, - { dx: 0, dy: 0, dz: -1 }, // south - ]; - for (const { dx, dy, dz } of adjacentBlocks) { - const blockUp = world.getDimension("overworld").getBlock({ x: block.location.x + dx, y: block.location.y + dy, z: block.location.z + dz }); - if (blockUp.typeId === "minecraft:chest" || blockUp.typeId === "minecraft:trapped_chest") { - // The new chest is adjacent to an existing chest - isAdjacent = true; - break; - } - } - } - if (isAdjacent) { - break; - } - // Nested item has been found so flag it and remove the block from the world - player.runCommandAsync(`fill ${x} ${y} ${z} ${x} ${y} ${z} air [] replace air`); - flag(player, "IllegalItems", "B", "Exploit", null, null, null, null, null); - rip(player, null, null, block, true); - isFlagged = true; - break; - } - } - if (isFlagged) { - return; - } - } - if (blockIdentifiers.some((id) => block.typeId.indexOf(id) !== -1) || isAdjacent) { - // Check shulker boxes and ender chests for illegal nested items - if (blockContainer) { - // Cache the block's inventory size - const blockContainerSize = blockContainer.size; - // Iterate through each slot in the player's container - for (let i = 0; i < blockContainerSize; i++) { - // Get the item in the current slot - const blockItemStack = blockContainer.getItem(i); - const itemStackId = blockItemStack?.typeId; - if (!itemStackId) { - continue; - } - // Anti Shulker Boxes - if (antiShulkerBoolean && itemStackId.includes("shulker")) { - blockContainer.setItem(i); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${block.typeId.replace("minecraft:", "")} from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Shulker Boxes are not allowed!`); - continue; - } - // Illegal Stacks - const currentStack = blockItemStack.amount; - const maxStack = blockItemStack.maxAmount; - if (stackBanBoolean && currentStack > maxStack) { - blockContainer.setItem(i); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${itemStackId.replace("minecraft:", "")} x ${currentStack} from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Illegal Stacks are not allowed!`); - rip(player, blockItemStack, null, block); - isFlagged = true; - break; - } - // If the item is in the "illegalitems" object, remove it from the block's inventory and run the "rip" function on it - if (itemStackId in illegalitems) { - blockContainer.setItem(i); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${itemStackId.replace("minecraft:", "")} from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Illegal Items are not allowed!`); - rip(player, blockItemStack, null, block); - isFlagged = true; - break; - } - // Illegal Lores - if (illegalLoresBoolean && !config.modules.illegalLores.exclude.includes(String(blockItemStack.getLore()))) { - blockContainer.setItem(i); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${itemStackId.replace("minecraft:", "")} with lore from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Item with illegal lores are not allowed!`); - rip(player, blockItemStack, null, block); - isFlagged = true; - break; - } - // Illegal Enchantments - if (illegalEnchantmentBoolean) { - const enchantmentComponent = blockItemStack.getComponent("minecraft:enchantments"); - const enchantmentData = enchantmentComponent.enchantments; - // Update the enchantment presence and data maps for each enchantment type - const iterator = enchantmentData[Symbol.iterator](); - let iteratorResult = iterator.next(); - while (!iteratorResult.done) { - const enchantment = iteratorResult.value; - enchantmentPresenceMap.get(player.id).set(enchantment, true); - enchantmentDataMap.get(player.id).set(enchantment, enchantmentData); - inventorySlotMap.get(player.id).set(enchantment, i); - itemStackDataMap.get(player.id).set(enchantment, blockItemStack); - iteratorResult = iterator.next(); - } - } - // Salvage System - if (salvageBoolean) { - const uniqueItems = ["minecraft:potion", "minecraft:splash_potion", "minecraft:lingering_potion", "minecraft:skull", "minecraft:planks", "minecraft:banner"]; - if (!uniqueItems.includes(itemStackId)) { - const verifiedItemName = blockItemStack.nameTag; - if (!verifiedItemName) { - unverifiedItemMap.set(player.id, new Map()); - } - const playerMap = unverifiedItemMap.get(player.id); - playerMap.set(i, blockItemStack); - } - } - } - if (isFlagged) { - return; - } - } - } - // Iterate through the enchantment presence map to perform any necessary operations - if (illegalEnchantmentBoolean) { - let isPresent = false; - for (const [enchantment, present] of enchantmentPresenceMap.get(player.id)) { - if (present) { - // Do something with the present enchantment and its data - const itemStackData = itemStackDataMap.get(player.id).get(enchantment); - const enchantmentData = enchantmentDataMap.get(player.id).get(enchantment); - const getEnchantment = enchantmentData.getEnchantment(enchantment.type); - const currentLevel = getEnchantment.level; - const maxLevel = getEnchantment.type.maxLevel; - // Create new ItemStack to validate enchantments - const newItemStack = new ItemStack(itemStackData.typeId); - // Get the new enchantment component from the new ItemStack - const newEnchantmentComponent = newItemStack.getComponent("minecraft:enchantments"); - // Get the new enchantment data from the new ItemStack component - const newEnchantmentData = newEnchantmentComponent.enchantments; - // Verify if enchantment type is allowed on the item - const canAddEnchantBoolean = newEnchantmentData.canAddEnchantment(getEnchantment); - // Flag for illegal enchantments - if (currentLevel > maxLevel || currentLevel < 0 || !canAddEnchantBoolean) { - const itemSlot = inventorySlotMap.get(player.id).get(enchantment); - const enchData = { - id: getEnchantment.type.id, - level: currentLevel, - }; - const itemStackId = blockContainer.getItem(itemSlot); - blockContainer.setItem(itemSlot); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${itemStackId.typeId.replace("minecraft:", "")} with Illegal Enchantments from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Item with illegal Enchantments are not allowed!`); - enchantmentPresenceMap.clear(); - enchantmentDataMap.clear(); - inventorySlotMap.clear(); - unverifiedItemMap.clear(); // Clear this map since we won't get that far to prevent memory leaks - itemStackDataMap.clear(); - rip(player, itemStackId, enchData, block); - break; - } - isPresent = true; - } - } - // Clear these populated maps if Salvage System is disabled to prevent memory leaks - if (isPresent && !salvageBoolean) { - enchantmentPresenceMap.clear(); - enchantmentDataMap.clear(); - inventorySlotMap.clear(); - itemStackDataMap.clear(); - } - } - // Salvage System - if (salvageBoolean) { - let salvagedList = false; - // Iterate over the unverifiedItemMap - for (const [slot, itemStackData] of unverifiedItemMap.get(player.id)) { - // Create a new name tag for the item - const newNameTag = titleCase(itemStackData.typeId.replace("minecraft:", "")); - // Create a new ItemStack with the same type as the original item - const applyCustomProperties = new ItemStack(itemStackData.typeId); - // Get the original enchantment component from the item - const originalEnchantmentComponent = itemStackData.getComponent("minecraft:enchantments"); - // Get the original enchantment data from the component - const originalEnchantmentData = originalEnchantmentComponent.enchantments; - // Get the new enchantment component from the new ItemStack - const newEnchantmentComponent = applyCustomProperties.getComponent("minecraft:enchantments"); - // Get the new enchantment data from the new ItemStack component - const newEnchantmentData = newEnchantmentComponent.enchantments; - // Iterate over the original enchantment data - const iterator = originalEnchantmentData[Symbol.iterator](); - let iteratorResult = iterator.next(); - while (!iteratorResult.done) { - // Get the enchantment from the iterator - const enchantment = iteratorResult.value; - // Check if the enchantment is legal - if (!illegalEnchantmentBoolean) { - // Get the enchantment from the original enchantment data - const getEnchantment = originalEnchantmentData.getEnchantment(enchantment.type); - // Check if the new ItemStack can have the enchantment added - const canAddEnchantBoolean = newEnchantmentData.canAddEnchantment(getEnchantment); - // If it can, add the enchantment to the new enchantment data - if (canAddEnchantBoolean) { - newEnchantmentData.addEnchantment(enchantment); - // Sets enchantment list to enchantment of new instance - newEnchantmentComponent.enchantments = newEnchantmentData; - } - } - else { - // Add the enchantment to the new enchantment data - newEnchantmentData.addEnchantment(enchantment); - // Sets enchantment list to enchantment of new instance - newEnchantmentComponent.enchantments = newEnchantmentData; - } - // Get the next item from the iterator - iteratorResult = iterator.next(); - salvagedList = true; - } - // Set the name tag and lore of the new ItemStack - applyCustomProperties.nameTag = newNameTag; - applyCustomProperties.setLore(itemStackData.getLore()); - // Set the new ItemStack in the player's container in the specified slot - blockContainer.setItem(slot, applyCustomProperties); - } - // Clear these populated maps to prevent memory leaks - if (salvagedList) { - unverifiedItemMap.clear(); - enchantmentPresenceMap.clear(); - enchantmentDataMap.clear(); - inventorySlotMap.clear(); - itemStackDataMap.clear(); - } - } -} -function resetMaps() { - enchantmentPresenceMap.clear(); - enchantmentDataMap.clear(); - inventorySlotMap.clear(); - itemStackDataMap.clear(); - unverifiedItemMap.clear(); -} -const IllegalItemsB = () => { - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - world.afterEvents.blockPlace.subscribe((object) => { - illegalitemsb(object).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }); -}; -export { IllegalItemsB }; diff --git a/build/scripts/penrose/BlockPlaceAfterEvent/reach/reach_a.js b/build/scripts/penrose/BlockPlaceAfterEvent/reach/reach_a.js deleted file mode 100644 index 8bbd190..0000000 --- a/build/scripts/penrose/BlockPlaceAfterEvent/reach/reach_a.js +++ /dev/null @@ -1,151 +0,0 @@ -import { world, Player, system, MinecraftBlockTypes, Block } from "@minecraft/server"; -import config from "../../../data/config.js"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -// Store the previous locations and velocities of player and block -const previousData = new Map(); -function recordPlayerData(entity) { - // Check if the entity is a Player - if (entity instanceof Player) { - // Store the current location and velocity of the player - const location = { ...entity.location }; - // Check if the y component of the view direction is positive - if (entity.getViewDirection().y > 0) { - const headLocation = entity.getHeadLocation(); - location.x = headLocation.x; - location.y = headLocation.y; - location.z = headLocation.z; - } - previousData.set(entity.id, { - location: location, - velocity: { ...entity.getVelocity() }, - }); - } - else if (entity instanceof Block) { - // Store the current location and velocity of the player - previousData.set(entity.typeId, { - location: { ...entity.location }, - velocity: { x: 0, y: 0, z: 0 }, - }); - } -} -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - if (typeof event === "string") { - const playerName = event; - previousData.delete(playerName); - } - else { - const playerName = event.playerId; - previousData.delete(playerName); - } -} -function reacha(object) { - // Get Dynamic Property - const reachABoolean = dynamicPropertyRegistry.get("reacha_b"); - // Unsubscribe if disabled in-game and stop the interval - if (reachABoolean === false) { - previousData.clear(); - stopLocationRecordingInterval(); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - world.afterEvents.blockPlace.unsubscribe(reacha); - return; - } - // Properties from class - const { block, player, dimension } = object; - // If not a player entity or a block then ignore - if (!(player instanceof Player) || !(block instanceof Block)) { - return; - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - return; - } - // Get the previous recorded data of block and player - const previousblockData = previousData.get(block); - const previousplayerData = previousData.get(player.id); - if (previousblockData && previousplayerData && isWithinReach(previousblockData, previousplayerData, block.location, player.location)) { - // Update the recorded data for block and player - recordPlayerData(block); - recordPlayerData(player.id); - return; - } - // Reset the reach distance after each hit - resetReachDistance(player); - // Calculate the actual reach distance with velocities - const reachDistance = calculateReachDistanceWithVelocity(previousplayerData, previousblockData, player.location, block.location); - // Round down the reachDistance to the nearest integer - const roundedReachDistance = Math.floor(reachDistance); - if (roundedReachDistance > config.modules.reachA.reach) { - // Flagging is done, now we can remove the player entity from previousData - onPlayerLogout(player.id); - dimension.getBlock(block.location).setType(MinecraftBlockTypes.air); - flag(player, "Reach", "A", "Placement", null, null, "reach", reachDistance.toFixed(2), false); - } - // Flagging is done, now we can remove the player entity from previousData - onPlayerLogout(player.id); -} -function isWithinReach(previousblockData, previousplayerData, currentblockLocation, currentplayerLocation) { - if (!previousblockData || !previousplayerData) { - return false; - } - // Calculate the distance squared between the previous and current locations of block and player - const blockDistanceSquared = calculateDistanceSquared(previousblockData.location, currentblockLocation); - const playerDistanceSquared = calculateDistanceSquared(previousplayerData.location, currentplayerLocation); - // Compare the distances with the allowed distance squared - const allowedDistanceSquared = config.modules.reachA.reach; - return blockDistanceSquared <= allowedDistanceSquared && playerDistanceSquared <= allowedDistanceSquared; -} -function calculateDistanceSquared(position1, position2) { - const dx = position2.x - position1.x; - const dy = position2.y - position1.y; - const dz = position2.z - position1.z; - return dx * dx + dy * dy + dz * dz; -} -function calculateReachDistanceWithVelocity(previousplayerData, previousblockData, currentplayerLocation, currentblockLocation) { - if (!previousplayerData) { - // Use the current damaging entity location as the previous location if not available - previousplayerData = { - location: { ...currentplayerLocation }, - velocity: { x: 0, y: 0, z: 0 }, - }; - } - if (!previousblockData) { - // Use the current hit entity location as the previous location if not available - previousblockData = { - location: { ...currentblockLocation }, - velocity: { x: 0, y: 0, z: 0 }, - }; - } - // Incorporate velocities into the reach distance calculation - const dx = currentblockLocation.x + previousblockData.velocity.x - previousplayerData.location.x - previousplayerData.velocity.x; - const dy = currentblockLocation.y + previousblockData.velocity.y - previousplayerData.location.y - previousplayerData.velocity.y; - const dz = currentblockLocation.z + previousblockData.velocity.z - previousplayerData.location.z - previousplayerData.velocity.z; - return Math.sqrt(dx * dx + dy * dy + dz * dz); -} -function resetReachDistance(player) { - // Reset the previous location and velocity of the player to the current location and velocity - recordPlayerData(player); -} -// Interval ID to stop the recording -let locationRecordingInterval; -function startLocationRecordingInterval() { - locationRecordingInterval = system.runInterval(() => { - const players = world.getAllPlayers(); - for (const player of players) { - recordPlayerData(player); - } - }, 20); -} -function stopLocationRecordingInterval() { - system.clearRun(locationRecordingInterval); -} -const ReachA = () => { - // Subscribe to the tick event to record player locations and velocities - startLocationRecordingInterval(); - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - world.afterEvents.blockPlace.subscribe(reacha); -}; -export { ReachA }; diff --git a/build/scripts/penrose/BlockPlaceAfterEvent/scaffold/scaffold_a.js b/build/scripts/penrose/BlockPlaceAfterEvent/scaffold/scaffold_a.js deleted file mode 100644 index ba162e8..0000000 --- a/build/scripts/penrose/BlockPlaceAfterEvent/scaffold/scaffold_a.js +++ /dev/null @@ -1,87 +0,0 @@ -import { world, MinecraftBlockTypes, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function freeze(id) { - const antiScaffoldABoolean = dynamicPropertyRegistry.get("antiscaffolda_b"); - if (antiScaffoldABoolean === false) { - system.clearRun(id); - return; - } - const filter = { - tags: ["freezeScaffoldA"], - excludeTags: ["freezeAura", "freezeNukerA"], - }; - const players = world.getPlayers(filter); - for (const player of players) { - if (!player) { - return; - } - const tagBoolean = player.hasTag("paradoxFreeze"); - if (!tagBoolean) { - player.removeTag("freezeScaffoldA"); - return; - } - player.onScreenDisplay.setTitle("§f§4[§6Paradox§4]違法なツールを検知したためフリーズされました", { subtitle: "§f検知内容=> §4[§6AntiScaffoldA§4]§f", fadeInDuration: 0, fadeOutDuration: 0, stayDuration: 60 }); - } -} -function isBlockInFrontAndBelowPlayer(blockLocation, playerLocation) { - // Calculate the difference in coordinates between the block and player - const dx = blockLocation.x - playerLocation.x; - const dy = blockLocation.y - playerLocation.y; - const dz = blockLocation.z - playerLocation.z; - // You can adjust these thresholds based on your requirements - // For example, you might want to consider a block in front and below if it's within a certain range. - const xThreshold = 1.0; - const yThreshold = -0.5; // Consider the block below and front if it's a certain distance between the player - const zThreshold = -0.5; - return dx <= xThreshold && dy >= yThreshold && dy <= yThreshold && dz >= zThreshold; -} -async function scaffolda(object) { - // Get Dynamic Property - const antiScaffoldABoolean = dynamicPropertyRegistry.get("antiscaffolda_b"); - // Unsubscribe if disabled in-game - if (antiScaffoldABoolean === false) { - world.afterEvents.blockPlace.unsubscribe(scaffolda); - return; - } - // Properties from class - const { block, player, dimension } = object; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - return; - } - // Cache player location - const playerLocation = player.location; - // Cache block location - const blockLocation = block.location; - // Check if the block is in front and below the player - if (isBlockInFrontAndBelowPlayer(blockLocation, playerLocation)) { - // Check rotation and validate if its an integer and not a float - const rot = player.getRotation(); - if (rot.x % 1 === 0) { - dimension.getBlock(blockLocation).setType(MinecraftBlockTypes.air); - flag(player, "Scaffold", "A", "Placement", null, null, null, null, false); - } - } -} -const ScaffoldA = () => { - world.afterEvents.blockPlace.subscribe((object) => { - scaffolda(object).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }); - const id = system.runInterval(() => { - freeze(id); - }, 20); -}; -export { ScaffoldA }; diff --git a/build/scripts/penrose/ChatSendAfterEvent/chat/afterprefixcommand.js b/build/scripts/penrose/ChatSendAfterEvent/chat/afterprefixcommand.js deleted file mode 100644 index 7beba89..0000000 --- a/build/scripts/penrose/ChatSendAfterEvent/chat/afterprefixcommand.js +++ /dev/null @@ -1,9 +0,0 @@ -import { world } from "@minecraft/server"; -import { handleCommandAfterSend } from "../../../commands/handler.js"; -function afterprefixcommand(msg) { - handleCommandAfterSend(msg); -} -const AfterPrefixCommand = () => { - world.afterEvents.chatSend.subscribe(afterprefixcommand); -}; -export { AfterPrefixCommand }; diff --git a/build/scripts/penrose/ChatSendAfterEvent/chat/antispam.js b/build/scripts/penrose/ChatSendAfterEvent/chat/antispam.js deleted file mode 100644 index 95fc0ee..0000000 --- a/build/scripts/penrose/ChatSendAfterEvent/chat/antispam.js +++ /dev/null @@ -1,53 +0,0 @@ -import { world } from "@minecraft/server"; -import { kickablePlayers } from "../../../kickcheck"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry"; -function extractTagInfo(message) { - const tagPrefix = ";tag:"; - const tagInfo = message.split(tagPrefix)[1]; - if (tagInfo) { - const [playerName, reason, by, isBanned] = tagInfo.split(","); - return { - playerName, - reason: reason.split(":")[1], - by: by.split(":")[1], - isBanned: isBanned === "isBanned" ? "isBanned" : undefined, - }; - } - return null; -} -function afterantispam(msg) { - // Get Dynamic Property - const antiSpamBoolean = dynamicPropertyRegistry.get("antispam_b"); - // Unsubscribe if disabled in-game - if (antiSpamBoolean === false) { - world.afterEvents.chatSend.unsubscribe(afterantispam); - return; - } - // Store player object - const player = msg.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Ignore those with permissions - if (uniqueId === player.name) { - return; - } - // Extract tag information from the message - const tagInfo = extractTagInfo(msg.message); - // Check if the message contains tag information - if (tagInfo && tagInfo.playerName === player.name) { - // Add tags to the player - try { - player.addTag(`Reason:${tagInfo.reason}`); - player.addTag(`By:${tagInfo.by}`); - player.addTag(tagInfo.isBanned); - } - catch { - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - } - } -} -const afterAntiSpam = () => { - world.afterEvents.chatSend.subscribe(afterantispam); -}; -export { afterAntiSpam }; diff --git a/build/scripts/penrose/ChatSendAfterEvent/chat/chatfilter.js b/build/scripts/penrose/ChatSendAfterEvent/chat/chatfilter.js deleted file mode 100644 index e2eec7e..0000000 --- a/build/scripts/penrose/ChatSendAfterEvent/chat/chatfilter.js +++ /dev/null @@ -1,75 +0,0 @@ -import { world } from "@minecraft/server"; -import { chatChannels, decryptString, getPlayerById, getPlayerChannel, sendMsg } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -const afterChatFilter = () => { - // Subscribe to the 'afterChat' event - world.afterEvents.chatSend.subscribe((msg) => { - // Destructure 'message' and 'sender' properties from the 'msg' object - const { message, sender: player } = msg; - // Retrieve the 'chatranks_b' dynamic property - const chatRanksBoolean = dynamicPropertyRegistry.get("chatranks_b"); - // Get the channel name associated with the player - const channelName = getPlayerChannel(player.id); - if (chatRanksBoolean === true) { - // Format the chat message - const formattedMessage = decryptString(message, player.id); - msg.message = formattedMessage; - // Set 'sendToTargets' flag to false - msg.sendToTargets = false; - if (!msg.sendToTargets) { - if (channelName) { - // Retrieve player objects of members in the same channel - const channelMembers = chatChannels[channelName].members; - const targetPlayers = []; - // Iterate through channel members - for (const memberID of channelMembers) { - const player = getPlayerById(memberID); - if (player !== null) { - targetPlayers.push(player.name); - } - } - // Send the formatted chat message to target players - if (targetPlayers.length > 0) { - sendMsg(targetPlayers, formattedMessage); - // Clear targetPlayers array after use - targetPlayers.length = 0; - } - } - else { - // Send the formatted chat message to all players - sendMsg("@a", formattedMessage); - } - // Set 'sendToTargets' flag to true - msg.sendToTargets = true; - } - return; - } - // Process chat message when 'chatRanksBoolean' is false - if (channelName) { - // Set 'sendToTargets' flag to false - msg.sendToTargets = false; - // Format the chat message - const formattedMessage = decryptString(message, player.id); - msg.message = formattedMessage; - // Retrieve player objects of members in the same channel - const channelMembers = chatChannels[channelName].members; - const targetPlayers = []; - // Iterate through channel members - for (const memberID of channelMembers) { - const player = getPlayerById(memberID); - if (player !== null) { - targetPlayers.push(player.name); - } - } - // Send the formatted chat message to target players - if (targetPlayers.length > 0) { - sendMsg(targetPlayers, formattedMessage); - // Clear targetPlayers array after use - targetPlayers.length = 0; - } - // Set 'sendToTargets' flag to true - msg.sendToTargets = true; - } - }); -}; -export { afterChatFilter }; diff --git a/build/scripts/penrose/ChatSendBeforeEvent/chat/antispam.js b/build/scripts/penrose/ChatSendBeforeEvent/chat/antispam.js deleted file mode 100644 index 4cc1597..0000000 --- a/build/scripts/penrose/ChatSendBeforeEvent/chat/antispam.js +++ /dev/null @@ -1,90 +0,0 @@ -import { world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -import { sendMsgToPlayer } from "../../../util.js"; -const spamTime = 2 * 1000; // The time frame during which the player's messages will be counted. -const offenseCount = 5; // Total strikes until you are kicked out. -const strikeReset = 30 * 1000; // The time frame until the strike is reduced -const lastChanceWarning = "Final warning: Continued rapid messaging will result in a ban."; -const warningMessages = [ - "Please refrain from sending messages too quickly.", - "Messaging too frequently may result in disruptions.", - "Slow down your messaging pace to maintain chat quality.", - "Sending messages rapidly can lead to temporary restrictions.", - "Avoid spamming the chat with quick messages.", - "Remember to allow some time between messages.", - "Excessive messaging speed can lead to chat limitations.", - "Maintain a reasonable pace while using the chat.", - "Help keep the chat readable by sending messages thoughtfully.", - "Keep in mind that messaging too quickly might be limited.", -]; -const chatRecords = new Map(); -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - const playerName = event.playerId; - chatRecords.delete(playerName); -} -function getRandomWarningMessage() { - const randomIndex = Math.floor(Math.random() * warningMessages.length); - return warningMessages[randomIndex]; -} -function beforeantispam(msg) { - // Get Dynamic Property - const antiSpamBoolean = dynamicPropertyRegistry.get("antispam_b"); - // Unsubscribe if disabled in-game - if (antiSpamBoolean === false) { - chatRecords.clear(); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - world.beforeEvents.chatSend.unsubscribe(beforeantispam); - return; - } - // Store player object - const player = msg.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Ignore those with permissions - if (uniqueId !== player.name) { - const now = Date.now(); - let chatRecord = chatRecords.get(player.id); - if (!chatRecord) { - // Initialize a new chat record for the player - chatRecord = { count: 0, lastTime: now, offense: 0, lastOffenseTime: now }; - chatRecords.set(player.id, chatRecord); - chatRecord = chatRecords.get(player.id); - } - if (now - chatRecord.lastTime > spamTime) { - // Reset count if time frame has expired - chatRecord.count = 0; - } - else if (now !== chatRecord.lastTime) { - // Send a random warning message - if (chatRecord.offense === offenseCount - 2) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${lastChanceWarning}`); - } - else { - const randomWarningMessage = getRandomWarningMessage(); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f ${randomWarningMessage}`); - } - msg.sendToTargets = true; - chatRecord.offense++; - chatRecord.lastOffenseTime = now; - } - chatRecord.count++; - chatRecord.lastTime = now; - chatRecords.set(player.id, chatRecord); - if (chatRecord.offense >= offenseCount) { - msg.sendToTargets = true; - chatRecords.delete(player.id); - // Add tag information to the message - msg.message = `;tag:${player.name},Reason:Spamming,By:Paradox,isBanned`; - } - else if (chatRecord.offense > 0 && now - chatRecord.lastOffenseTime >= strikeReset) { - chatRecord.offense--; - chatRecord.lastOffenseTime = now; - } - } -} -const beforeAntiSpam = () => { - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - world.beforeEvents.chatSend.subscribe(beforeantispam); -}; -export { beforeAntiSpam }; diff --git a/build/scripts/penrose/ChatSendBeforeEvent/chat/beforeprefixcommand.js b/build/scripts/penrose/ChatSendBeforeEvent/chat/beforeprefixcommand.js deleted file mode 100644 index 921dc05..0000000 --- a/build/scripts/penrose/ChatSendBeforeEvent/chat/beforeprefixcommand.js +++ /dev/null @@ -1,10 +0,0 @@ -import { world } from "@minecraft/server"; -import { commandHandler } from "../../../commands/handler.js"; -function beforeprefixcommand(msg) { - const player = msg.sender; - commandHandler(player, msg); -} -const BeforePrefixCommand = () => { - world.beforeEvents.chatSend.subscribe(beforeprefixcommand); -}; -export { BeforePrefixCommand }; diff --git a/build/scripts/penrose/ChatSendBeforeEvent/chat/chatfilter.js b/build/scripts/penrose/ChatSendBeforeEvent/chat/chatfilter.js deleted file mode 100644 index 209556a..0000000 --- a/build/scripts/penrose/ChatSendBeforeEvent/chat/chatfilter.js +++ /dev/null @@ -1,39 +0,0 @@ -import { world } from "@minecraft/server"; -import { encryptString, getPlayerChannel, sendMsgToPlayer } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -const beforeChatFilter = () => { - // Subscribe to the 'beforeChat' event - world.beforeEvents.chatSend.subscribe((msg) => { - const { message, sender: player } = msg; - // Retrieve the 'chatranks_b' dynamic property - const chatRanksBoolean = dynamicPropertyRegistry.get("chatranks_b"); - // Get the channel name associated with the player - const channelName = getPlayerChannel(player.id); - // Check if chat ranks are enabled - if (!msg.sendToTargets && chatRanksBoolean === true) { - // Check if the player is muted - if (player.hasTag("isMuted")) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You are currently muted.`); - msg.cancel = true; // Cancel the chat message - return; - } - // Get the player's tags and find their rank - const tags = player.getTags(); - const rankTag = tags.find((tag) => tag.startsWith("Rank:")) || "Rank:Member"; - const rank = rankTag.replace("Rank:", "").replaceAll("--", "§4][§6"); - // Format the chat message with the rank - const formattedMessage = `§4[§6${rank}§4] §7${player.name}: §r${message}`; - // Encrypt and update the message - msg.message = encryptString(channelName ? `§4[§6${channelName}§4] §7${player.name}: §r${message}` : formattedMessage, player.id); - msg.sendToTargets = true; // Send the message to targets - } - else if (!msg.sendToTargets && channelName) { - // Format the chat message for channel - const formattedMessage = `§4[§6${channelName}§4] §f<${player.name}> §r${message}`; - // Encrypt and update the message - msg.message = encryptString(formattedMessage, player.id); - msg.sendToTargets = true; // Send the message to targets - } - }); -}; -export { beforeChatFilter }; diff --git a/build/scripts/penrose/ChatSendBeforeEvent/spammer/badpackets_1.js b/build/scripts/penrose/ChatSendBeforeEvent/spammer/badpackets_1.js deleted file mode 100644 index 1b3e57c..0000000 --- a/build/scripts/penrose/ChatSendBeforeEvent/spammer/badpackets_1.js +++ /dev/null @@ -1,29 +0,0 @@ -import { world } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import config from "../../../data/config.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function badpackets1(msg) { - // Get Dynamic Property - const badPackets1Boolean = dynamicPropertyRegistry.get("badpackets1_b"); - // Unsubscribe if disabled in-game - if (badPackets1Boolean === false) { - world.afterEvents.chatSend.unsubscribe(badpackets1); - return; - } - const player = msg.sender; - const message = msg.message.toLowerCase(); - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - return; - } - // BadPackets/1 = chat message length check - if (message.length > config.modules.badpackets1.maxlength || message.length < config.modules.badpackets1.minLength) { - flag(player, "BadPackets", "1", "messageLength", null, null, "Characters", String(message.length), false); - } -} -const BadPackets1 = () => { - world.afterEvents.chatSend.subscribe(badpackets1); -}; -export { BadPackets1 }; diff --git a/build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_a.js b/build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_a.js deleted file mode 100644 index a098a25..0000000 --- a/build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_a.js +++ /dev/null @@ -1,27 +0,0 @@ -import { world } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function spammera(msg) { - // Get Dynamic Property - const spammerABoolean = dynamicPropertyRegistry.get("spammera_b"); - // Unsubscribe if disabled in-game - if (spammerABoolean === false) { - world.afterEvents.chatSend.unsubscribe(spammera); - return; - } - const player = msg.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - return; - } - // Spammer/A = checks if someone sends a message while moving and on ground - if (player.hasTag("moving") && player.isOnGround && !player.isJumping) { - flag(player, "Spammer", "A", "Movement", null, null, null, null, true); - } -} -const SpammerA = () => { - world.afterEvents.chatSend.subscribe(spammera); -}; -export { SpammerA }; diff --git a/build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_b.js b/build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_b.js deleted file mode 100644 index 3e1998a..0000000 --- a/build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_b.js +++ /dev/null @@ -1,27 +0,0 @@ -import { world } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function spammerb(msg) { - // Get Dynamic Property - const spammerBBoolean = dynamicPropertyRegistry.get("spammerb_b"); - // Unsubscribe if disabled in-game - if (spammerBBoolean === false) { - world.afterEvents.chatSend.unsubscribe(spammerb); - return; - } - const player = msg.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - return; - } - // Spammer/B = checks if someone sends a message while swinging their hand - if (player.hasTag("left")) { - flag(player, "Spammer", "B", "Combat", null, null, null, null, false); - } -} -const SpammerB = () => { - world.afterEvents.chatSend.subscribe(spammerb); -}; -export { SpammerB }; diff --git a/build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_c.js b/build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_c.js deleted file mode 100644 index d5742d6..0000000 --- a/build/scripts/penrose/ChatSendBeforeEvent/spammer/spammer_c.js +++ /dev/null @@ -1,27 +0,0 @@ -import { world } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function spammerc(msg) { - // Get Dynamic Property - const spammerCBoolean = dynamicPropertyRegistry.get("spammerc_b"); - // Unsubscribe if disabled in-game - if (spammerCBoolean === false) { - world.afterEvents.chatSend.unsubscribe(spammerc); - return; - } - const player = msg.sender; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - return; - } - // Spammer/C = checks if someone sends a message while using an item - if (player.hasTag("right")) { - flag(player, "Spammer", "C", "Misc", null, null, null, null, false); - } -} -const SpammerC = () => { - world.afterEvents.chatSend.subscribe(spammerc); -}; -export { SpammerC }; diff --git a/build/scripts/penrose/EntityDieAfterEvent/death_coordinates.js b/build/scripts/penrose/EntityDieAfterEvent/death_coordinates.js deleted file mode 100644 index ffa5c71..0000000 --- a/build/scripts/penrose/EntityDieAfterEvent/death_coordinates.js +++ /dev/null @@ -1,14 +0,0 @@ -import { world, Player } from "@minecraft/server"; -import { sendMsgToPlayer } from "../../util"; -function deathcoordinates(event) { - const { deadEntity } = event; - if (!(deadEntity instanceof Player)) { - return; - } - const { x, y, z } = deadEntity.location; - sendMsgToPlayer(deadEntity, `§f§4[§6Paradox§4]§f 以前死んだ場所=>§l§3X§f: ${x.toFixed(0)}, §l§6Y§f: ${y.toFixed(0)}, §l§2Z§f: ${z.toFixed(0)}.`); -} -const DeathCoordinates = () => { - world.afterEvents.entityDie.subscribe(deathcoordinates); -}; -export { DeathCoordinates }; diff --git a/build/scripts/penrose/EntityHitEntityAfterEvent/autoclicker.js b/build/scripts/penrose/EntityHitEntityAfterEvent/autoclicker.js deleted file mode 100644 index ef0b87d..0000000 --- a/build/scripts/penrose/EntityHitEntityAfterEvent/autoclicker.js +++ /dev/null @@ -1,91 +0,0 @@ -import { world, Player, system } from "@minecraft/server"; -import { MinecraftEntityTypes } from "../../node_modules/@minecraft/vanilla-data/lib/index"; -import { dynamicPropertyRegistry } from "../WorldInitializeAfterEvent/registry"; -import { flag } from "../../util"; -/** - * Get a player's clicks per second - * @param player - The player whose clicks per second to get - * @returns The number of clicks per second - */ -function getPlayerCPS(player) { - const timestamp = new Date().getTime(); - const clicks = player["clicks"] ?? []; - // Remove clicks that are over 1 second old - while (clicks.length > 0 && timestamp - clicks[0].timestamp >= 1000) { - clicks.shift(); - } - player["clicks"] = clicks; - return clicks.length; -} -/** - * Validate players' clicks per second against a maximum and raise flag if exceeded - * @param id - The ID of the timeout run - * @param max - The maximum allowed clicks per second - */ -function cpsValidation(id, max) { - // Get Dynamic Property for autoclicker - const autoclickerBoolean = dynamicPropertyRegistry.get("autoclicker_b"); - // Unsubscribe if autoclicker is disabled in-game - if (autoclickerBoolean === false) { - system.clearRun(id); - return; - } - // Get all players in the world - const players = world.getPlayers(); - // Check each player's clicks per second and raise a flag if it's too high - for (const player of players) { - const current = getPlayerCPS(player); - if (current > max) { - flag(player, "Autoclicker", "A", "Combat", null, null, "CPS", current.toString(), false); - } - } -} -/** - * Track player clicks and update click object with new timestamp on each hit - * @param event - The EntityHitAfterEvent object - */ -function autoclicker(event) { - // Get Dynamic Property for autoclicker - const autoclickerBoolean = dynamicPropertyRegistry.get("autoclicker_b"); - // Unsubscribe if autoclicker is disabled in-game - if (autoclickerBoolean === false) { - world.afterEvents.entityHitEntity.unsubscribe(autoclicker); - return; - } - const { damagingEntity } = event; - // If it's not a player then ignore - if (!(damagingEntity instanceof Player)) { - return; - } - // Explicitly casting the entity variable to PlayerWithClicks - const playerWithClicks = damagingEntity; - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(damagingEntity?.id); - // Skip if they have permission - if (uniqueId === damagingEntity.name) { - return; - } - const modifiedTypeId = damagingEntity.typeId.replace("minecraft:", ""); - // If the entity hit is a player, update their click object with a new timestamp - if (modifiedTypeId === MinecraftEntityTypes.Player) { - const timestamp = new Date().getTime(); - const clicks = playerWithClicks["clicks"] ?? []; - // Remove clicks that are over 1 second old - while (clicks.length > 0 && timestamp - clicks[0].timestamp >= 1000) { - clicks.shift(); - } - clicks.unshift({ timestamp }); - playerWithClicks["clicks"] = clicks; - } -} -// Define the AutoClicker function -const AutoClicker = () => { - const maxCPS = 30; - // Subscribe to the entityHit event to track player clicks - world.afterEvents.entityHitEntity.subscribe(autoclicker); - // Set an interval to run the CPS validation function every 20 ticks - const id = system.runInterval(() => { - cpsValidation(id, maxCPS); - }, 20); -}; -export { AutoClicker }; diff --git a/build/scripts/penrose/EntityHitEntityAfterEvent/killaura.js b/build/scripts/penrose/EntityHitEntityAfterEvent/killaura.js deleted file mode 100644 index 7f2e57b..0000000 --- a/build/scripts/penrose/EntityHitEntityAfterEvent/killaura.js +++ /dev/null @@ -1,104 +0,0 @@ -import { world, Player, system } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../WorldInitializeAfterEvent/registry"; -import { flag } from "../../util"; -import { MinecraftEffectTypes } from "../../node_modules/@minecraft/vanilla-data/lib/index"; -function isAttackingFromOutsideView(player1, player2) { - if (!player1 || !player2) { - return false; // Invalid player objects - } - // Calculate the distance between the two players - const distance = Math.sqrt(Math.pow(player2.location.x - player1.location.x, 2) + Math.pow(player2.location.y - player1.location.y, 2) + Math.pow(player2.location.z - player1.location.z, 2)); - // Check if the distance is greater than or equal to 2 blocks - if (distance >= 2) { - // Get the view direction vector of player1 - const player1ViewDir = player1.getViewDirection(); - // Calculate the vector from player1 to player2 - const player1ToPlayer2 = { - x: player2.location.x - player1.location.x, - y: player2.location.y - player1.location.y, - z: player2.location.z - player1.location.z, - }; - // Calculate the dot product - const dotProduct2 = player1ViewDir.x * player1ToPlayer2.x + player1ViewDir.y * player1ToPlayer2.y + player1ViewDir.z * player1ToPlayer2.z; - // Calculate the magnitude of the vector - const player1ToPlayer2Magnitude = Math.sqrt(player1ToPlayer2.x * player1ToPlayer2.x + player1ToPlayer2.y * player1ToPlayer2.y + player1ToPlayer2.z * player1ToPlayer2.z); - // Normalize the dot product - const normalizedDotProduct2 = dotProduct2 / (player1ToPlayer2Magnitude * Math.sqrt(player1ViewDir.x * player1ViewDir.x + player1ViewDir.y * player1ViewDir.y + player1ViewDir.z * player1ViewDir.z)); - // Convert dot product to angle in degrees - const angle2 = Math.acos(normalizedDotProduct2) * (180 / Math.PI); - // Check if angle2 is greater than 90 degrees - return angle2 > 90; - } - return false; -} -function killaura(obj) { - // Get Dynamic Property - const antiKillAuraBoolean = dynamicPropertyRegistry.get("antikillaura_b"); - // Unsubscribe if disabled in-game - if (antiKillAuraBoolean === false) { - world.afterEvents.entityHitEntity.unsubscribe(killaura); - return; - } - // Properties from class - const { damagingEntity, hitEntity } = obj; - // If not a player entity then ignore - if (!(hitEntity instanceof Player) || !(damagingEntity instanceof Player)) { - return; - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(damagingEntity?.id); - // Skip if they have permission - if (uniqueId === damagingEntity.name) { - return; - } - const angleBoolean = isAttackingFromOutsideView(damagingEntity, hitEntity); - if (angleBoolean) { - // Entity is facing hitEntity at an angle greater than 90 degrees - flag(damagingEntity, "KillAura", "A", "Combat", null, null, null, null, false); - // Blindness - damagingEntity.addEffect(MinecraftEffectTypes.Blindness, 1000000, { amplifier: 255, showParticles: true }); - // Mining Fatigue - damagingEntity.addEffect(MinecraftEffectTypes.MiningFatigue, 1000000, { amplifier: 255, showParticles: true }); - // Weakness - damagingEntity.addEffect(MinecraftEffectTypes.Weakness, 1000000, { amplifier: 255, showParticles: true }); - // Slowness - damagingEntity.addEffect(MinecraftEffectTypes.Slowness, 1000000, { amplifier: 255, showParticles: true }); - const boolean = damagingEntity.hasTag("paradoxFreeze"); - const hasAuraFreeze = damagingEntity.hasTag("freezeAura"); - if (!boolean) { - damagingEntity.addTag("paradoxFreeze"); - } - if (!hasAuraFreeze) { - damagingEntity.addTag("freezeAura"); - } - } -} -function freeze(id) { - const antiKillAuraBoolean = dynamicPropertyRegistry.get("antikillaura_b"); - if (antiKillAuraBoolean === false) { - system.clearRun(id); - return; - } - const filter = { - tags: ["freezeAura"], - excludeTags: ["freezeNukerA", "freezeScaffoldA"], - }; - const players = world.getPlayers(filter); - for (const player of players) { - if (!player) { - return; - } - const tagBoolean = player.hasTag("paradoxFreeze"); - if (!tagBoolean) { - player.removeTag("freezeAura"); - return; - } - player.onScreenDisplay.setTitle("§f§4[§6Paradox§4]違法なツールを検知したためフリーズされました", { subtitle: "§f検知内容=> §4[§6AntiKillAura§4]§f", fadeInDuration: 0, fadeOutDuration: 0, stayDuration: 60 }); - } -} -export const KillAura = () => { - world.afterEvents.entityHitEntity.subscribe(killaura); - const id = system.runInterval(() => { - freeze(id); - }, 20); -}; diff --git a/build/scripts/penrose/EntityHitEntityAfterEvent/reach_b.js b/build/scripts/penrose/EntityHitEntityAfterEvent/reach_b.js deleted file mode 100644 index c6368a2..0000000 --- a/build/scripts/penrose/EntityHitEntityAfterEvent/reach_b.js +++ /dev/null @@ -1,134 +0,0 @@ -import { world, Player, system } from "@minecraft/server"; -import config from "../../data/config.js"; -import { flag } from "../../util.js"; -import { dynamicPropertyRegistry } from "../WorldInitializeAfterEvent/registry.js"; -// Store the previous locations and velocities of hitEntity and damagingEntity -const previousData = new Map(); -function recordPlayerData(player) { - // Store the current location and velocity of the player - previousData.set(player.id, { - location: { ...player.location }, - velocity: { ...player.getVelocity() }, - }); -} -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - if (typeof event === "string") { - const playerName = event; - previousData.delete(playerName); - } - else { - const playerName = event.playerId; - previousData.delete(playerName); - } -} -function reachb(object) { - // Get Dynamic Property - const reachBBoolean = dynamicPropertyRegistry.get("reachb_b"); - // Unsubscribe if disabled in-game and stop the interval - if (reachBBoolean === false) { - previousData.clear(); - stopLocationRecordingInterval(); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - world.afterEvents.entityHitEntity.unsubscribe(reachb); - return; - } - // Properties from class - const { hitEntity, damagingEntity } = object; - // If not a player entity then ignore - if (!(hitEntity instanceof Player) || !(damagingEntity instanceof Player)) { - return; - } - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(damagingEntity?.id); - // Skip if they have permission - if (uniqueId === damagingEntity.name) { - return; - } - // Get the previous recorded data of hitEntity and damagingEntity - const previousHitEntityData = previousData.get(hitEntity.id); - const previousDamagingEntityData = previousData.get(damagingEntity.id); - if (previousHitEntityData && previousDamagingEntityData && isWithinReach(previousHitEntityData, previousDamagingEntityData, hitEntity.location, damagingEntity.location)) { - // Update the recorded data for hitEntity and damagingEntity - recordPlayerData(hitEntity); - recordPlayerData(damagingEntity); - return; - } - // Reset the reach distance after each hit - resetReachDistance(damagingEntity); - // Calculate the actual reach distance with velocities - const reachDistance = calculateReachDistanceWithVelocity(previousDamagingEntityData, previousHitEntityData, damagingEntity.location, hitEntity.location); - // Round down the reachDistance to the nearest integer - const roundedReachDistance = Math.floor(reachDistance); - if (roundedReachDistance > config.modules.reachB.reach) { - // Flagging is done, now we can remove the player entity from previousData - onPlayerLogout(damagingEntity.id); - onPlayerLogout(hitEntity.id); - flag(damagingEntity, "Reach", "B", "Attack", null, null, "reach", reachDistance.toFixed(2), false); - } - // Flagging is done, now we can remove the player entity from previousData - onPlayerLogout(damagingEntity.id); - onPlayerLogout(hitEntity.id); -} -function isWithinReach(previousHitEntityData, previousDamagingEntityData, currentHitEntityLocation, currentDamagingEntityLocation) { - if (!previousHitEntityData || !previousDamagingEntityData) { - return false; - } - // Calculate the distance squared between the previous and current locations of hitEntity and damagingEntity - const hitEntityDistanceSquared = calculateDistanceSquared(previousHitEntityData.location, currentHitEntityLocation); - const damagingEntityDistanceSquared = calculateDistanceSquared(previousDamagingEntityData.location, currentDamagingEntityLocation); - // Compare the distances with the allowed distance squared - const allowedDistanceSquared = config.modules.reachB.reach; - return hitEntityDistanceSquared <= allowedDistanceSquared && damagingEntityDistanceSquared <= allowedDistanceSquared; -} -function calculateDistanceSquared(position1, position2) { - const dx = position2.x - position1.x; - const dy = position2.y - position1.y; - const dz = position2.z - position1.z; - return dx * dx + dy * dy + dz * dz; -} -function calculateReachDistanceWithVelocity(previousDamagingEntityData, previousHitEntityData, currentDamagingEntityLocation, currentHitEntityLocation) { - if (!previousDamagingEntityData) { - // Use the current damaging entity location as the previous location if not available - previousDamagingEntityData = { - location: { ...currentDamagingEntityLocation }, - velocity: { x: 0, y: 0, z: 0 }, - }; - } - if (!previousHitEntityData) { - // Use the current hit entity location as the previous location if not available - previousHitEntityData = { - location: { ...currentHitEntityLocation }, - velocity: { x: 0, y: 0, z: 0 }, - }; - } - // Incorporate velocities into the reach distance calculation - const dx = currentHitEntityLocation.x + previousHitEntityData.velocity.x - previousDamagingEntityData.location.x - previousDamagingEntityData.velocity.x; - const dy = currentHitEntityLocation.y + previousHitEntityData.velocity.y - previousDamagingEntityData.location.y - previousDamagingEntityData.velocity.y; - const dz = currentHitEntityLocation.z + previousHitEntityData.velocity.z - previousDamagingEntityData.location.z - previousDamagingEntityData.velocity.z; - return Math.sqrt(dx * dx + dy * dy + dz * dz); -} -function resetReachDistance(player) { - // Reset the previous location and velocity of the player to the current location and velocity - recordPlayerData(player); -} -// Interval ID to stop the recording -let locationRecordingInterval; -function startLocationRecordingInterval() { - locationRecordingInterval = system.runInterval(() => { - const players = world.getAllPlayers(); - for (const player of players) { - recordPlayerData(player); - } - }, 20); -} -function stopLocationRecordingInterval() { - system.clearRun(locationRecordingInterval); -} -const ReachB = () => { - // Subscribe to the tick event to record player locations and velocities - startLocationRecordingInterval(); - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - world.afterEvents.entityHitEntity.subscribe(reachb); -}; -export { ReachB }; diff --git a/build/scripts/penrose/PlayerSpawnAfterEvent/ban/globalbanlist.js b/build/scripts/penrose/PlayerSpawnAfterEvent/ban/globalbanlist.js deleted file mode 100644 index 4dedc58..0000000 --- a/build/scripts/penrose/PlayerSpawnAfterEvent/ban/globalbanlist.js +++ /dev/null @@ -1,29 +0,0 @@ -import { world } from "@minecraft/server"; -import { banplayer } from "../../../data/globalban.js"; -import { banMessage } from "../../../util.js"; -// Create a Set to store the names of globally banned players -const bannedPlayers = new Set(banplayer.map((player) => player.name)); -function banHammerTime(object) { - /** - * We only want to execute this when it's a player's initial spawn - */ - if (!object.initialSpawn) { - return; - } - const player = object.player; - // Check if the player who is joining is on the global ban list, and kick them out if they are - if (bannedPlayers.has(player.name)) { - const playerTags = player.getTags(); - if (!playerTags.includes("By:Paradox Anticheat")) { - player.addTag("By:Paradox Anticheat"); - } - if (!playerTags.includes("Reason:You are globally banned from Paradox!")) { - player.addTag("Reason:You are globally banned from Paradox!"); - } - banMessage(player); - } -} -const GlobalBanList = () => { - world.afterEvents.playerSpawn.subscribe(banHammerTime); -}; -export { GlobalBanList }; diff --git a/build/scripts/penrose/PlayerSpawnAfterEvent/hash/hash.js b/build/scripts/penrose/PlayerSpawnAfterEvent/hash/hash.js deleted file mode 100644 index e5f1e02..0000000 --- a/build/scripts/penrose/PlayerSpawnAfterEvent/hash/hash.js +++ /dev/null @@ -1,35 +0,0 @@ -import { world } from "@minecraft/server"; -import { crypto } from "../../../util"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry"; -import config from "../../../data/config"; -function verification(object) { - // Properties from class - const { initialSpawn, player } = object; - if (initialSpawn === false) { - return; - } - // Check for hash/salt and validate password - const hash = player.getDynamicProperty("hash"); - const salt = player.getDynamicProperty("salt"); - // Use either the operator's ID or the encryption password as the key - const key = config.encryption.password ? config.encryption.password : player.id; - // Generate the hash - const encode = crypto?.(salt, key); - if (encode === hash) { - // Store as an element using player scoreboard id to uniquely identify them - dynamicPropertyRegistry.set(player.id, player.name); - return; - } - else { - player.removeDynamicProperty("hash"); - player.removeDynamicProperty("salt"); - const hasTag = player.hasTag("paradoxOpped"); - if (hasTag) { - player.removeTag("paradoxOpped"); - } - } -} -const hashCode = () => { - world.afterEvents.playerSpawn.subscribe(verification); -}; -export { hashCode }; diff --git a/build/scripts/penrose/PlayerSpawnAfterEvent/onjoin/onjoin.js b/build/scripts/penrose/PlayerSpawnAfterEvent/onjoin/onjoin.js deleted file mode 100644 index ee51557..0000000 --- a/build/scripts/penrose/PlayerSpawnAfterEvent/onjoin/onjoin.js +++ /dev/null @@ -1,74 +0,0 @@ -import { world } from "@minecraft/server"; -import { onJoinPrimaryData, onJoinSecondaryData } from "../../../data/onjoindata.js"; -import { getPrefix, setScore, setTimer } from "../../../util.js"; -import { kickablePlayers } from "../../../kickcheck.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -async function onJoinTime(object) { - /** - * This is to give the player a grace period - * in case they previously died and spawned again - */ - setTimer(object.player.id, true); - /** - * We only want to execute this when it's a players initial spawn - */ - let player; - if (object.initialSpawn === true) { - player = object.player; - } - else { - return; - } - // Get Dynamic Property - const lockdownBoolean = dynamicPropertyRegistry.get("lockdown_b"); - // Lock down the server if enabled - if (lockdownBoolean) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - if (uniqueId === player.name) { - return; - } - const reason = "Under Maintenance! Sorry for the inconvenience."; - // Kick players from server - player.runCommandAsync(`kick "${player.name}" §f\n\n${reason}`).catch(() => { - // Despawn players from server - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - }); - return; - } - // We execute each command in the list - for (let i = 0; i < onJoinPrimaryData.length; i++) { - // Create the objective - const verifyObjective = world.scoreboard.getObjective(onJoinPrimaryData[i]); - if (!verifyObjective) { - world.scoreboard.addObjective(onJoinPrimaryData[i], onJoinPrimaryData[i]); - setScore(player, onJoinPrimaryData[i], 0, true); - } - } - // We execute each command in the list - for (let i = 0; i < onJoinSecondaryData.length; i++) { - player.runCommandAsync(`${onJoinSecondaryData[i]}`).catch(() => { - // Certain things like "ability" will cause errors if not enabled properly. - // We ignore those errors since they are expected and have no impact. - }); - } - // Set up custom prefix - getPrefix(player); -} -const onJoin = () => { - world.afterEvents.playerSpawn.subscribe((object) => { - onJoinTime(object).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }); -}; -export { onJoin }; diff --git a/build/scripts/penrose/SystemEvent/watchdog.js b/build/scripts/penrose/SystemEvent/watchdog.js deleted file mode 100644 index af3b74f..0000000 --- a/build/scripts/penrose/SystemEvent/watchdog.js +++ /dev/null @@ -1,10 +0,0 @@ -import { system } from "@minecraft/server"; -function watchdog(terminator) { - // Cancel watchdog from shutting down server/realm - terminator.cancel = true; -} -const WatchDog = () => { - // Listen to watchdog - system.beforeEvents.watchdogTerminate.subscribe(watchdog); -}; -export { WatchDog }; diff --git a/build/scripts/penrose/TickEvent/afk/afk.js b/build/scripts/penrose/TickEvent/afk/afk.js deleted file mode 100644 index 93d2841..0000000 --- a/build/scripts/penrose/TickEvent/afk/afk.js +++ /dev/null @@ -1,123 +0,0 @@ -import { PlayerJoinAfterEvent, system, world } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry"; -import config from "../../../data/config"; -const inactiveThreshold = config.modules.afk.minutes * 60 * 1000; // minutes in milliseconds -const playerActivityMap = new Map(); // Map to store player activity timestamps -// Function to check for AFK players and remove them -function checkAndRemoveAFKPlayers(id) { - // Get Dynamic Property - const afkBoolean = dynamicPropertyRegistry.get("afk_b"); - // Unsubscribe if disabled in-game - if (!afkBoolean) { - playerActivityMap.clear(); - world.afterEvents.playerJoin.unsubscribe(onPlayerLogin); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - system.clearRun(id); - return; - } - const currentTime = Date.now(); - const onlinePlayers = world.getPlayers(); - for (const player of onlinePlayers) { - // Get the player's unique ID from the "dynamicPropertyRegistry" object - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // If the player has permission (i.e., their unique ID matches their name), skip to the next player - if (uniqueId === player.name) { - continue; - } - const velocity = player.getVelocity(); - const lastActivityTime = playerActivityMap.get(player.id); // Get the last activity time for the player - // Calculate the accumulated time since the last activity - const accumulatedTime = currentTime - lastActivityTime; - // Define the tolerance percentage (1% in this case) - const tolerancePercentage = 0.01; - // Calculate the lower bound for the 1 percent tolerance - const lowerBound = Math.max(inactiveThreshold - inactiveThreshold * tolerancePercentage, 0); - if (isPlayerAFK(velocity) && lastActivityTime && accumulatedTime > lowerBound) { - const kickMessage = "You were kicked for being AFK!"; - player.runCommandAsync(`kick "${player.name}" §f\n\n${kickMessage}`).catch(() => { - player.triggerEvent("paradox:kick"); - }); - } - } -} -// Function to update player activity timestamp more frequently -function updatePlayerActivityFrequently(id) { - // Get Dynamic Property - const afkBoolean = dynamicPropertyRegistry.get("afk_b"); - // Unsubscribe if disabled in-game - if (!afkBoolean) { - playerActivityMap.clear(); - world.afterEvents.playerJoin.unsubscribe(onPlayerLogin); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - system.clearRun(id); - return; - } - const onlinePlayers = world.getPlayers(); - for (const player of onlinePlayers) { - updatePlayerActivity(player); - } -} -// Function to update player activity timestamp -function updatePlayerActivity(player) { - // Extract the actual player object from PlayerJoinAfterEvent - const actualPlayer = player instanceof PlayerJoinAfterEvent ? world.getPlayers({ name: player.playerName })[0] : player; - // Check if the player is valid (not null or undefined) - if (!actualPlayer) { - return; - } - // Get the player's velocity - const velocity = actualPlayer.getVelocity(); - // Get the current timestamp in milliseconds - const currentTime = Date.now(); - // Get the last activity timestamp from the playerActivityMap - const lastActivityTime = playerActivityMap.get(actualPlayer.id); - // Check if lastActivityTime is not set (i.e., the player's activity is being tracked for the first time) - if (lastActivityTime === undefined) { - playerActivityMap.set(actualPlayer.id, currentTime); // Set the initial activity timestamp - } - else if (!isPlayerAFK(velocity)) { - // Update the player's activity timestamp in the playerActivityMap - playerActivityMap.set(actualPlayer.id, currentTime); // Update with the current timestamp - } -} -// Function to check if the player is AFK based on their velocity -function isPlayerAFK(velocity) { - return velocity.x === 0 && velocity.y === 0 && velocity.z === 0; -} -/** - * Event handler for player login - */ -function onPlayerLogin(event) { - updatePlayerActivity(event); -} -/** - * Event handler for player logout - */ -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - playerActivityMap.delete(event.playerId); -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function AFK() { - const afkCheckIntervalTicks = config.modules.afk.minutes * 60 * 20; - // Subscribe to player login and logout events - world.afterEvents.playerJoin.subscribe(onPlayerLogin); - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - // Initialize player activity timestamps for online players when the script starts - const onlinePlayers = world.getPlayers(); - for (const player of onlinePlayers) { - updatePlayerActivity(player); - } - // Start the timer to check for AFK players at regular intervals - const checkAfkIntervalId = system.runInterval(() => { - checkAndRemoveAFKPlayers(checkAfkIntervalId); - }, afkCheckIntervalTicks); // Check every minute - // Start the timer to update player activity more frequently - const updateActivityIntervalId = system.runInterval(() => { - updatePlayerActivityFrequently(updateActivityIntervalId); - }, 20); // Update every second -} diff --git a/build/scripts/penrose/TickEvent/antifalla/antifall_a.js b/build/scripts/penrose/TickEvent/antifalla/antifall_a.js deleted file mode 100644 index cb0a253..0000000 --- a/build/scripts/penrose/TickEvent/antifalla/antifall_a.js +++ /dev/null @@ -1,72 +0,0 @@ -import { world, GameMode, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function antifalla(id) { - // Get Dynamic Property - const antifallABoolean = dynamicPropertyRegistry.get("antifalla_b"); - // Unsubscribe if disabled in-game - if (!antifallABoolean) { - system.clearRun(id); - return; - } - //exclude players who are in creative. - const gm = { - excludeGameModes: [GameMode.creative, GameMode.spectator], - }; - const filteredPlayers = world.getPlayers(gm); - const airBlocksToCheck = new Set([ - //check for a half block that the player maybe standing on if its a lower slab - { dx: 0, dy: -0.5, dz: 0 }, - { dx: 0, dy: -1, dz: 0 }, - { dx: 1, dy: -1, dz: 0 }, - { dx: -1, dy: -1, dz: 0 }, - { dx: 0, dy: -1, dz: 1 }, - { dx: 0, dy: -0.5, dz: 1 }, - { dx: 0, dy: -1, dz: -1 }, - { dx: 0, dy: -0.5, dz: -1 }, - { dx: 1, dy: -1, dz: 1 }, - { dx: 1, dy: -0.5, dz: 1 }, - { dx: 1, dy: -1, dz: -1 }, - { dx: 1, dy: -0.5, dz: -1 }, - { dx: -1, dy: -1, dz: 1 }, - { dx: -1, dy: -0.5, dz: 1 }, - { dx: -1, dy: -1, dz: -1 }, - { dx: -1, dy: -0.5, dz: -1 }, - ]); - for (const player of filteredPlayers) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - const { x, y, z } = player.location; - const vy = player.getVelocity().y; - let allBlocksAreAir = true; - for (const offset of airBlocksToCheck) { - const offsetVector = { x: x + offset.dx, y: y + offset.dy, z: z + offset.dz }; - let block; - try { - block = player?.dimension?.getBlock(offsetVector) || undefined; - } - catch { } - if (!block || !block.isAir()) { - allBlocksAreAir = false; - break; - } - } - if (allBlocksAreAir && vy === 0) { - flag(player, "AntiFall", "A", "Exploit", null, null, null, null, false); - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function AntiFallA() { - const antiFallAId = system.runInterval(() => { - antifalla(antiFallAId); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/antivoid/antivoid.js b/build/scripts/penrose/TickEvent/antivoid/antivoid.js deleted file mode 100644 index 96832f0..0000000 --- a/build/scripts/penrose/TickEvent/antivoid/antivoid.js +++ /dev/null @@ -1,68 +0,0 @@ -import { world, GameMode, system } from "@minecraft/server"; -//import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -var savedValue; -var flagPlayer = false; -var isFlying = false; -function antiVoid(id) { - //exclude players who are in creative. - const gm = { - excludeGameModes: [GameMode.creative, GameMode.spectator], - }; - const filteredPlayers = world.getPlayers(gm); - for (const player of filteredPlayers) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - let lastFallingCord; - let lastSavedCord; - if (player.isFalling == true) { - lastFallingCord = player.location.y; - saveOrGetValue("save", lastFallingCord); - flagPlayer = false; - isFlying = false; - console.log(lastFallingCord); - } - if (player.isFlying) { - isFlying = true; - } - if (player.isOnGround == true) { - // @ts-ignore - lastSavedCord = saveOrGetValue("get"); - if (player.location.y - lastSavedCord >= 3 && isFlying == false) { - if (flagPlayer == false) { - console.log("Player has been flagged for AntiVoid Expliot"); - flagPlayer = true; - } - } - } - } - // @ts-ignore - function saveOrGetValue(action, value) { - if (action === "save") { - // Save the value - savedValue = value; - } - else if (action === "get") { - // Retrieve the saved value - return savedValue; - } - else { - // Handle invalid action - console.error('Invalid action. Use "save" or "get".'); - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function antiVoida() { - const antiVoidId = system.runInterval(() => { - antiVoid(antiVoidId); - }, 5); -} diff --git a/build/scripts/penrose/TickEvent/badpackets2/badpackets2.js b/build/scripts/penrose/TickEvent/badpackets2/badpackets2.js deleted file mode 100644 index 109b457..0000000 --- a/build/scripts/penrose/TickEvent/badpackets2/badpackets2.js +++ /dev/null @@ -1,31 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function badpackets2(id) { - // Get Dynamic Property - const badPackets2Boolean = dynamicPropertyRegistry.get("badpackets2_b"); - // Unsubscribe if disabled in-game - if (badPackets2Boolean === false) { - system.clearRun(id); - return; - } - // run as each player - const players = world.getPlayers(); - for (const player of players) { - // Invalid slot - if (player.selectedSlot < 0 || player.selectedSlot > 8) { - flag(player, "BadPackets", "2", "Exploit", null, null, "selectedSlot", `${player.selectedSlot}`, false); - player.selectedSlot = 0; - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function BadPackets2() { - const badPackets2Id = system.runInterval(() => { - badpackets2(badPackets2Id); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/ban/autoban.js b/build/scripts/penrose/TickEvent/ban/autoban.js deleted file mode 100644 index f61756f..0000000 --- a/build/scripts/penrose/TickEvent/ban/autoban.js +++ /dev/null @@ -1,50 +0,0 @@ -import { system, world } from "@minecraft/server"; -import { kickablePlayers } from "../../../kickcheck"; -import { allscores, getScore } from "../../../util"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry"; -import config from "../../../data/config"; -const configTicks = config.modules.autoBan.banHammerInterval; -function rip(player, reason) { - // Tag with reason and by who - try { - player.addTag(`Reason:${reason}`); - player.addTag("By:Paradox"); - player.addTag("isBanned"); - // Despawn if we cannot kick the player - } - catch (error) { - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - } -} -function autoban(id) { - const autoBanBoolean = dynamicPropertyRegistry.get("autoban_b"); - // Unsubscribe if disabled in-game - if (autoBanBoolean === false) { - system.clearRun(id); - return; - } - const scores = allscores; - const players = world.getPlayers(); - players.forEach((player) => { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - return; - } - scores.forEach((score) => { - const playerScore = getScore(score, player); - if (playerScore > 1000) { - const reReason = score.replace("vl", "").toUpperCase() + " 検知内容=>: " + playerScore; - return rip(player, reReason); - } - }); - }); -} -export function AutoBan() { - const autoBanId = system.runInterval(() => { - autoban(autoBanId); - //set ticks to 6000 for 5 minutes. - }, configTicks); -} diff --git a/build/scripts/penrose/TickEvent/ban/serverban.js b/build/scripts/penrose/TickEvent/ban/serverban.js deleted file mode 100644 index 75996d9..0000000 --- a/build/scripts/penrose/TickEvent/ban/serverban.js +++ /dev/null @@ -1,53 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { allscores, banMessage, getScore, sendMsg, sendMsgToPlayer, setScore } from "../../../util.js"; -import { queueUnban } from "../../../commands/moderation/unban.js"; -function serverban() { - const filter = { - tags: ["isBanned"], - }; - const filteredPlayers = world.getPlayers(filter); - // run as each player - for (const player of filteredPlayers) { - if (queueUnban.has(player.name)) { - // Remove tag - player.removeTag("isBanned"); - const tags = player.getTags(); - // This removes old ban stuff - tags.forEach((t) => { - if (t.startsWith("Reason:")) { - player.removeTag(t); - } - if (t.startsWith("By:")) { - player.removeTag(t); - } - }); - // Remove player from queue - queueUnban.delete(player.name); - //clear violations - const scores = allscores; - scores.forEach((objective) => { - const score = getScore(objective, player); - //if the player has a violation then we reset the score. - if (score > 0) { - //reset the score - setScore(player, objective, 0); - } - }); - // Let staff and player know they are unbanned - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You have been unbanned.`); - sendMsg(`@a[tag=paradoxOpped]`, `§f§4[§6Paradox§4]§f ${player.name} has been unbanned.`); - continue; - } - // Ban message - else - banMessage(player); - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export const ServerBan = system.runInterval(() => { - serverban(); -}, 40); diff --git a/build/scripts/penrose/TickEvent/bedrock/bedrockvalidate.js b/build/scripts/penrose/TickEvent/bedrock/bedrockvalidate.js deleted file mode 100644 index d767856..0000000 --- a/build/scripts/penrose/TickEvent/bedrock/bedrockvalidate.js +++ /dev/null @@ -1,58 +0,0 @@ -import { world, system } from "@minecraft/server"; -import config from "../../../data/config.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -async function bedrockvalidate(id) { - const bedrockValidateBoolean = dynamicPropertyRegistry.get("bedrockvalidate_b"); - if (bedrockValidateBoolean === false) { - system.clearRun(id); - return; - } - const dimensions = { - overworld: { - dimension: world.getDimension("overworld"), - command1: "fill ~-5 -64 ~-5 ~5 -64 ~5 bedrock", - command2: "fill ~-4 -59 ~-4 ~4 319 ~4 air [] replace bedrock", - command3: undefined, - config: config.modules.bedrockValidate.overworld, - }, - nether: { - dimension: world.getDimension("nether"), - command1: "fill ~-5 0 ~-5 ~5 0 ~5 bedrock", - command2: "fill ~-5 127 ~-5 ~5 127 ~5 bedrock", - command3: "fill ~-5 5 ~-5 ~5 120 ~5 air [] replace bedrock", - config: config.modules.bedrockValidate.nether, - }, - }; - const players = world.getPlayers(); - for (const player of players) { - const uniqueId = dynamicPropertyRegistry.get(player?.id); - if (uniqueId === player.name) { - continue; - } - for (const { dimension, command1, command2, command3, config } of Object.values(dimensions)) { - if (player?.dimension === dimension && config) { - await Promise.all([player?.runCommandAsync(command1), player?.runCommandAsync(command2), command3 && player?.runCommandAsync(command3)]); - } - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function BedrockValidate() { - const bedrockValidateId = system.runInterval(() => { - bedrockvalidate(bedrockValidateId).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/clearlag/clearlag.js b/build/scripts/penrose/TickEvent/clearlag/clearlag.js deleted file mode 100644 index ff1cbde..0000000 --- a/build/scripts/penrose/TickEvent/clearlag/clearlag.js +++ /dev/null @@ -1,92 +0,0 @@ -import config from "../../../data/config.js"; -import { world, system } from "@minecraft/server"; -import { sendMsg } from "../../../util.js"; -import { clearItems } from "../../../data/clearlag.js"; -import { kickablePlayers } from "../../../kickcheck.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -const cooldownTimer = new WeakMap(); -// Just a dummy object to use with set/get -const object = { cooldown: "String" }; -const countdown = { - days: config.modules.clearLag.days, - hours: config.modules.clearLag.hours, - minutes: config.modules.clearLag.minutes, - seconds: config.modules.clearLag.seconds, -}; -let warned = false; // variable to track whether the 60 second warning has been displayed -let clearLagId = null; -function clearEntityItems() { - const filter = { type: "item" }; - const entitiesCache = world.getDimension("overworld").getEntities(filter); - for (const entity of entitiesCache) { - const itemName = entity.getComponent("item"); - if (itemName.typeId in clearItems) { - entity.kill(); - } - } -} -function clearEntities() { - const entityException = ["minecraft:ender_dragon", "minecraft:shulker", "minecraft:hoglin", "minecraft:zoglin", "minecraft:piglin_brute", "minecraft:evocation_illager", "minecraft:vindicator", "minecraft:elder_guardian"]; - const filter = { families: ["monster"] }; - const entitiesCache = world.getDimension("overworld").getEntities(filter); - for (const entity of entitiesCache) { - // Ignore entity - if (entityException.includes(entity.typeId) || entity.nameTag) { - continue; - } - kickablePlayers.add(entity); - entity.triggerEvent("paradox:kick"); - } -} -function clearLag(id) { - // Get Dynamic Property - const clearLagBoolean = dynamicPropertyRegistry.get("clearlag_b"); - // Unsubscribe if disabled in-game - if (clearLagBoolean === false) { - system.clearRun(id); - return; - } - let cooldownVerify = cooldownTimer.get(object); - if (!cooldownVerify) { - cooldownVerify = Date.now(); - cooldownTimer.set(object, cooldownVerify); - } - const msSettings = countdown.days * 24 * 60 * 60 * 1000 + countdown.hours * 60 * 60 * 1000 + countdown.minutes * 60 * 1000 + countdown.seconds * 1000; - const timeLeft = msSettings - (Date.now() - cooldownVerify); - if (timeLeft <= 0) { - clearEntityItems(); - clearEntities(); - cooldownTimer.delete(object); - sendMsg("@a", `§f§4[§6Paradox§4]§f Server lag has been cleared!`); - warned = false; // reset the warned variable so that the 60 second warning will display again next time - } - else if (timeLeft <= 60000 && timeLeft > 0 && !warned) { - if (timeLeft === 60000) { - sendMsg("@a", `§f§4[§6Paradox§4]§f Server lag will be cleared in 1 minute!`); - } - else { - const secondsLeft = Math.ceil(timeLeft / 1000); - const countdownMsg = secondsLeft === 1 ? "second" : "seconds"; - sendMsg("@a", `§f§4[§6Paradox§4]§f Server lag will be cleared in ${secondsLeft} ${countdownMsg}!`); - } - warned = true; - } - else if (timeLeft <= 5000 && timeLeft > 0) { - const secondsLeft = Math.ceil(timeLeft / 1000); - const countdownMsg = secondsLeft === 1 ? "second" : "seconds"; - sendMsg("@a", `§f§4[§6Paradox§4]§f Server lag will be cleared in ${secondsLeft} ${countdownMsg}!`); - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function ClearLag() { - if (clearLagId !== null) { - system.clearRun(clearLagId); - } - clearLagId = system.runInterval(() => { - clearLag(clearLagId); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/crasher/crasher_a.js b/build/scripts/penrose/TickEvent/crasher/crasher_a.js deleted file mode 100644 index 628ef1f..0000000 --- a/build/scripts/penrose/TickEvent/crasher/crasher_a.js +++ /dev/null @@ -1,40 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { kickablePlayers } from "../../../kickcheck.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function crashera(id) { - // Get Dynamic Property - const crasherABoolean = dynamicPropertyRegistry.get("crashera_b"); - // Unsubscribe if disabled in-game - if (crasherABoolean === false) { - system.clearRun(id); - return; - } - // run as each player - const players = world.getPlayers(); - for (const player of players) { - // Crasher/A = invalid pos check - if (Math.abs(player.location.x) > 30000000 || Math.abs(player.location.y) > 30000000 || Math.abs(player.location.z) > 30000000) { - flag(player, "Crasher", "A", "Exploit", null, null, null, null, true); - try { - player.addTag("Reason:Crasher"); - player.addTag("By:Paradox"); - player.addTag("isBanned"); - } - catch (error) { - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - } - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function CrasherA() { - const crasherAId = system.runInterval(() => { - crashera(crasherAId); - }); -} diff --git a/build/scripts/penrose/TickEvent/fly/fly_a.js b/build/scripts/penrose/TickEvent/fly/fly_a.js deleted file mode 100644 index 3bbe3d7..0000000 --- a/build/scripts/penrose/TickEvent/fly/fly_a.js +++ /dev/null @@ -1,128 +0,0 @@ -import { world, GameMode, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -const playersOldCoordinates = new Map(); -const playersAirTimeStart = new Map(); -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - const playerName = event.playerId; - playersOldCoordinates.delete(playerName); - playersAirTimeStart.delete(playerName); -} -function flya(id) { - // Get Dynamic Property - const flyABoolean = dynamicPropertyRegistry.get("flya_b"); - // Unsubscribe if disabled in-game - if (flyABoolean === false) { - playersOldCoordinates.clear(); - playersAirTimeStart.clear(); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - system.clearRun(id); - return; - } - // Exclude creative, and spectator gamemode - const gm = { - excludeGameModes: [GameMode.creative, GameMode.spectator], - }; - const filteredPlayers = world.getPlayers(gm); - // run as each player who are in survival - for (const player of filteredPlayers) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - const jumpCheck = player.isJumping; - if (jumpCheck && !playersAirTimeStart.has(player.id)) { - playersAirTimeStart.set(player.id, Date.now()); - } - const groundCheck = player.isOnGround; - if (groundCheck) { - playersAirTimeStart.set(player.id, Date.now()); - continue; - } - const glideCheck = player.isGliding; - if (glideCheck) { - playersAirTimeStart.set(player.id, Date.now()); - continue; - } - const fallCheck = player.isFalling; - if (fallCheck) { - // Player is falling, subtract a specified amount of time from the air time - const airTimeStart = playersAirTimeStart.get(player.id); - if (airTimeStart) { - const newAirTimeStart = Math.max(airTimeStart - 500, 0); // Subtract 500 milliseconds (adjust as needed) and ensure it's not negative - playersAirTimeStart.set(player.id, newAirTimeStart); - } - continue; - } - const waterCheck = player.isInWater || player.isSwimming; - if (waterCheck) { - // Player is falling, ignore them - playersAirTimeStart.set(player.id, Date.now()); - continue; - } - if (!jumpCheck && playersAirTimeStart.has(player.id)) { - const airTime = Date.now() - playersAirTimeStart.get(player.id); - if (airTime >= 4000) { - const velocity = player.getVelocity(); - const horizontalVelocity = { x: velocity.x, y: 0, z: velocity.z }; - const xyVelocity = Math.hypot(horizontalVelocity.x, horizontalVelocity.y).toFixed(4); - const zyVelocity = Math.hypot(horizontalVelocity.z, horizontalVelocity.y).toFixed(4); - if (Number(xyVelocity) > 0 || Number(zyVelocity) > 0) { - const oldPlayerCoords = playersOldCoordinates.get(player.id); - const playerX = Math.trunc(player.location.x); - const playerY = Math.trunc(player.location.y); - const playerZ = Math.trunc(player.location.z); - playersOldCoordinates.set(player.id, { x: playerX, y: playerY, z: playerZ }); - if (oldPlayerCoords) { - let isSurroundedByAir = true; - for (let x = -1; x <= 1; x++) { - for (let y = -1; y <= 1; y++) { - for (let z = -1; z <= 1; z++) { - const block = player.dimension.getBlock({ x: player.location.x + x, y: player.location.y + y, z: player.location.z + z }); - if (block.typeId !== "minecraft:air") { - isSurroundedByAir = false; - break; - } - } - } - } - if (isSurroundedByAir) { - try { - // Use try/catch since variables for cords could return undefined if player is loading in - // and they meet the conditions. An example is them flagging this, logging off, then logging - // back on again. - player.teleport({ x: oldPlayerCoords.x, y: oldPlayerCoords.y, z: oldPlayerCoords.z }, { - dimension: player.dimension, - rotation: { x: 0, y: 0 }, - facingLocation: { x: 0, y: 0, z: 0 }, - checkForBlocks: false, - keepVelocity: false, - }); - } - catch (error) { } - flag(player, "Fly", "A", "Exploit", null, null, null, null, false); - } - } - } - const playerAnimation = player.isOnGround || player.isInWater || player.isSwimming; - if (playerAnimation) { - playersAirTimeStart.delete(player.id); - } - } - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function FlyA() { - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - const flyAId = system.runInterval(() => { - flya(flyAId); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/freeze/freeze.js b/build/scripts/penrose/TickEvent/freeze/freeze.js deleted file mode 100644 index 93cf277..0000000 --- a/build/scripts/penrose/TickEvent/freeze/freeze.js +++ /dev/null @@ -1,162 +0,0 @@ -import { world, system, Vector } from "@minecraft/server"; -import { decryptString, encryptString, sendMsg, setTimer } from "../../../util"; -import { MinecraftEffectTypes } from "../../../node_modules/@minecraft/vanilla-data/lib/index"; -function freezePlayer(player) { - // Record the player's original location - const originalLocation = player.location; - const originalDimension = player.dimension.id; - setTimer(player.id); - // Teleport the player to the freezing location - player.teleport(new Vector(originalLocation.x, 245, originalLocation.z), { - dimension: world.getDimension("overworld"), - rotation: player.getRotation(), - facingLocation: player.getViewDirection(), - checkForBlocks: false, - keepVelocity: false, - }); - // Create prison around the player - player.runCommand(`fill ${originalLocation.x + 2} ${245 + 2} ${originalLocation.z + 2} ${originalLocation.x - 2} ${245 - 1} ${originalLocation.z - 2} barrier [] hollow`); - // Encrypt the data - const encryptData = encryptString(`${originalLocation.x},${originalLocation.y},${originalLocation.z},${originalDimension.replace("minecraft:", "")}`, player.id); - // Store original location and dimension in a tag - player.addTag(`paradoxFreezeData:${encryptData}`); -} -function unfreezePlayer(player) { - if (!player) { - return; // Player object is undefined or null - } - // Retrieve the tag - const freezeTag = player.getTags().find((tag) => tag.startsWith("paradoxFreezeData:")); - if (freezeTag) { - // Decrypt data - const decryptData = decryptString(freezeTag.replace("paradoxFreezeData:", ""), player.id); - const freezeTagDecrypt = `paradoxFreezeData:${decryptData}`; - // Parse the tag to extract location and dimension information - const tagParts = freezeTagDecrypt.split(":"); - if (tagParts.length === 2) { - const locationAndDimension = tagParts[1].split(","); - if (locationAndDimension.length === 4) { - const originalX = parseFloat(locationAndDimension[0]); - const originalY = parseFloat(locationAndDimension[1]); - const originalZ = parseFloat(locationAndDimension[2]); - const originalDimensionName = locationAndDimension[3]; - player.removeTag(freezeTag); - // Remove the prison blocks - player.runCommand(`fill ${originalX + 2} ${245 + 2} ${originalZ + 2} ${originalX - 2} ${245 - 1} ${originalZ - 2} air [] hollow`); - setTimer(player.id); - // Teleport the player back to their original location - player.teleport(new Vector(originalX, originalY, originalZ), { - dimension: world.getDimension(originalDimensionName), - rotation: player.getRotation(), - facingLocation: player.getViewDirection(), - checkForBlocks: false, - keepVelocity: false, - }); - } - } - } -} -// Function to periodically check and freeze players -const freezePlayers = () => { - const filter = { - tags: ["paradoxFreeze"], - }; - const players = world.getPlayers(filter); - for (const player of players) { - const hasFreezeTag = player.hasTag("paradoxFreeze"); - const hasAuraTag = player.hasTag("freezeAura"); - const hasNukerTag = player.hasTag("freezeNukerA"); - const hasScaffoldTag = player.hasTag("freezeScaffoldA"); - if (!hasFreezeTag) { - // Player doesn't have the freeze tag, unfreeze them - unfreezePlayer(player); - } - else { - // Player has the freeze tag, freeze or update them - let freezeDataTag = player.getTags().find((tag) => tag.startsWith("paradoxFreezeData:")); - if (freezeDataTag) { - // Decrypt data - const decryptData = decryptString(freezeDataTag.replace("paradoxFreezeData:", ""), player.id); - freezeDataTag = `paradoxFreezeData:${decryptData}`; - // Process data - const freezeData = freezeDataTag.split(":")[1]; - const [originalX, originalY, originalZ, originalDimension] = freezeData.split(",").map((value, index) => (index === 3 ? value : parseFloat(value))); - // Check if the player has moved and teleport if necessary - const { x, y, z } = player.location; - if (Math.floor(x) !== Math.floor(originalX) || Math.floor(y) !== Math.floor(originalY) || Math.floor(z) !== Math.floor(originalZ) || player.dimension.id !== originalDimension) { - player.teleport(new Vector(originalX, originalY, originalZ), { - dimension: world.getDimension(originalDimension), - rotation: player.getRotation(), - facingLocation: player.getViewDirection(), - checkForBlocks: false, - keepVelocity: false, - }); - } - // Check and apply effects if not already present - const effects = [MinecraftEffectTypes.Blindness, MinecraftEffectTypes.MiningFatigue, MinecraftEffectTypes.Weakness, MinecraftEffectTypes.Slowness]; - for (const typeEffect of effects) { - if (!player.getEffect(typeEffect)) { - player.addEffect(typeEffect, 1000000, { amplifier: 255, showParticles: true }); - } - } - } - else { - // Player has the freeze tag but no freeze data tag, freeze them - freezePlayer(player); - } - const combinations = { - "111": "§f検知内容=> §4[§6NA§4]§f§4[§6KA§4]§f§4[§6AS§4]§f", - "110": "§f検知内容=> §4[§6NA§4]§f§4[§6KA§4]§f", - "101": "§f検知内容=> §4[§6NA§4]§f§4[§6AS§4]§f", - "011": "§f検知内容=> §4[§6KA§4]§f§4[§6AS§4]§f", - "000": "§f検知内容=> §4[§6Command§4]§f", // Other cases - }; - const combinationKey = (hasAuraTag ? "1" : "0") + (hasNukerTag ? "1" : "0") + (hasScaffoldTag ? "1" : "0"); - const title = { subtitle: combinations[combinationKey] || combinations["000"] }; - player.onScreenDisplay.setTitle("§f§4[§6Paradox§4]違法なツールを検知したためフリーズされました", { - ...title, - fadeInDuration: 0, - fadeOutDuration: 0, - stayDuration: 60, - }); - } - } - // Unfreeze players who no longer have the "paradoxFreeze" tag - const clearFilter = { - excludeTags: ["paradoxFreeze"], - }; - const clearPlayers = world.getPlayers(clearFilter); - for (const player of clearPlayers) { - if (!player.hasTag("paradoxFreeze")) { - unfreezePlayer(player); - } - } -}; -// Subscribe to the playerLeave event to handle frozen players leaving -export const freezeLeave = () => { - world.afterEvents.playerLeave.subscribe((event) => { - const playerId = event.playerId; - const hasFreezeTag = world - .getPlayers() - .find((player) => player.id === playerId) - ?.hasTag("paradoxFreeze"); - if (hasFreezeTag) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${event.playerName}§f was frozen and left the server.`); - } - }); -}; -// Subscribe to the playerJoin event to handle frozen players returning -export const freezeJoin = () => { - world.afterEvents.playerJoin.subscribe((event) => { - const playerId = event.playerId; - const hasFreezeTag = world - .getPlayers() - .find((player) => player.id === playerId) - ?.hasTag("paradoxFreeze"); - if (hasFreezeTag) { - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${event.playerName}§f was frozen and returned to the server.`); - } - }); -}; -// Run the freezePlayers function every 3 seconds -export const freeze = system.runInterval(freezePlayers, 60); // 20 ticks = 1 second diff --git a/build/scripts/penrose/TickEvent/gamemode/adventure.js b/build/scripts/penrose/TickEvent/gamemode/adventure.js deleted file mode 100644 index fb956d0..0000000 --- a/build/scripts/penrose/TickEvent/gamemode/adventure.js +++ /dev/null @@ -1,68 +0,0 @@ -import { world, GameMode, system } from "@minecraft/server"; -import { getScore, sendMsg, setScore } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -async function adventure(id) { - // Get Dynamic Property - const adventureGMBoolean = dynamicPropertyRegistry.get("adventuregm_b"); - const creativeGMBoolean = dynamicPropertyRegistry.get("creativegm_b"); - const survivalGMBoolean = dynamicPropertyRegistry.get("survivalgm_b"); - // Unsubscribe if disabled in-game - if (adventureGMBoolean === false) { - system.clearRun(id); - return; - } - const filter = { - gameMode: GameMode.adventure, - }; - const filteredPlayers = world.getPlayers(filter); - // Run as each player - for (const player of filteredPlayers) { - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - // Make sure they didn't enable all of them in config.js as this will have a negative impact - if (survivalGMBoolean === true && creativeGMBoolean === true) { - // Default to adventure for safety - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - } - // Are they in adventure? Fix it. - if (survivalGMBoolean === true && creativeGMBoolean === false) { - // Creative is allowed so set them to creative - player.runCommandAsync(`gamemode c`); - } - if (survivalGMBoolean === false && creativeGMBoolean === true) { - // Survival is allowed so set them to survival - player.runCommandAsync(`gamemode survival`); - } - // If both are allowed then default to survival - if (survivalGMBoolean === false && creativeGMBoolean === false) { - // Survival is allowed so set them to survival - player.runCommandAsync(`gamemode survival`); - } - setScore(player, "gamemodevl", 1, true); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f ${player.name} §6has tried to change their gamemode §7(Gamemode_A)§6.§4 VL= ${getScore("gamemodevl", player)}`); - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function Adventure() { - const adventureId = system.runInterval(() => { - adventure(adventureId).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines[1].trim(); - console.error("Error originated from:", sourceInfo); - } - } - }); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/gamemode/creative.js b/build/scripts/penrose/TickEvent/gamemode/creative.js deleted file mode 100644 index 30308a2..0000000 --- a/build/scripts/penrose/TickEvent/gamemode/creative.js +++ /dev/null @@ -1,69 +0,0 @@ -import { world, GameMode, system } from "@minecraft/server"; -import { getScore, sendMsg, setScore } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -async function creative(id) { - // Get Dynamic Property - const adventureGMBoolean = dynamicPropertyRegistry.get("adventuregm_b"); - const creativeGMBoolean = dynamicPropertyRegistry.get("creativegm_b"); - const survivalGMBoolean = dynamicPropertyRegistry.get("survivalgm_b"); - // Unsubscribe if disabled in-game - if (creativeGMBoolean === false) { - system.clearRun(id); - return; - } - const filter = { - gameMode: GameMode.creative, - }; - const filteredPlayers = world.getPlayers(filter); - // Run as each player - for (const player of filteredPlayers) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - // Make sure they didn't enable all of them in config.js as this will have a negative impact - if (survivalGMBoolean === true && adventureGMBoolean === true) { - // Default to adventure for safety - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - } - // Are they in creative? Fix it. - if (survivalGMBoolean === true && adventureGMBoolean === false) { - // Adventure is allowed so set them to adventure - player.runCommandAsync(`gamemode a`); - } - if (survivalGMBoolean === false && adventureGMBoolean === true) { - // Survival is allowed so set them to survival - player.runCommandAsync(`gamemode survival`); - } - // If both are allowed then default to survival - if (survivalGMBoolean === false && adventureGMBoolean === false) { - // Survival is allowed so set them to survival - player.runCommandAsync(`gamemode survival`); - } - setScore(player, "gamemodevl", 1, true); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f ${player.name} §6has tried to change their gamemode §7(Gamemode_C)§6.§4 VL= ${getScore("gamemodevl", player)}`); - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function Creative() { - const creativeId = system.runInterval(() => { - creative(creativeId).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/gamemode/survival.js b/build/scripts/penrose/TickEvent/gamemode/survival.js deleted file mode 100644 index 3b7e3ee..0000000 --- a/build/scripts/penrose/TickEvent/gamemode/survival.js +++ /dev/null @@ -1,69 +0,0 @@ -import { world, GameMode, system } from "@minecraft/server"; -import { getScore, sendMsg, setScore } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -async function survival(id) { - // Get Dynamic Property - const adventureGMBoolean = dynamicPropertyRegistry.get("adventuregm_b"); - const creativeGMBoolean = dynamicPropertyRegistry.get("creativegm_b"); - const survivalGMBoolean = dynamicPropertyRegistry.get("survivalgm_b"); - // Unsubscribe if disabled in-game - if (survivalGMBoolean === false) { - system.clearRun(id); - return; - } - const filter = { - gameMode: GameMode.survival, - }; - const filteredPlayers = world.getPlayers(filter); - // Run as each player - for (const player of filteredPlayers) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - // Make sure they didn't enable all of them in config.js as this will have a negative impact - if (adventureGMBoolean === true && creativeGMBoolean === true) { - // Default to adventure for safety - dynamicPropertyRegistry.set("adventuregm_b", false); - world.setDynamicProperty("adventuregm_b", false); - } - // Are they in survival? Fix it. - if (adventureGMBoolean === true && creativeGMBoolean === false) { - // Creative is allowed so set them to creative - player.runCommandAsync(`gamemode c`); - } - if (adventureGMBoolean === false && creativeGMBoolean === true) { - // Adventure is allowed so set them to adventure - player.runCommandAsync(`gamemode a`); - } - // If both are allowed then default to adventure - if (adventureGMBoolean === false && creativeGMBoolean === false) { - // Adventure is allowed so set them to adventure - player.runCommandAsync(`gamemode a`); - } - setScore(player, "gamemodevl", 1, true); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f ${player.name} §6has tried to change their gamemode §7(Gamemode_S)§6.§4 VL= ${getScore("gamemodevl", player)}`); - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function Survival() { - const survivalId = system.runInterval(() => { - survival(survivalId).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/hotbar/hotbar.js b/build/scripts/penrose/TickEvent/hotbar/hotbar.js deleted file mode 100644 index 20fc569..0000000 --- a/build/scripts/penrose/TickEvent/hotbar/hotbar.js +++ /dev/null @@ -1,42 +0,0 @@ -import { world, system } from "@minecraft/server"; -import config from "../../../data/config.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -async function hotbar(id) { - // Get Dynamic Property - const hotbarBoolean = dynamicPropertyRegistry.get("hotbar_b"); - // Unsubscribe if disabled in-game - if (hotbarBoolean === false) { - system.clearRun(id); - return; - } - let hotbarMessage; - const filter = { - excludeTags: ["vanish"], - }; - const filteredPlayers = world.getPlayers(filter); - // run as each player - for (const player of filteredPlayers) { - hotbarMessage = config.modules.hotbar.message; - player.onScreenDisplay.setActionBar(hotbarMessage); - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function Hotbar() { - const hotbarId = system.runInterval(() => { - hotbar(hotbarId).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }); -} diff --git a/build/scripts/penrose/TickEvent/illegalitems/illegalitems_a.js b/build/scripts/penrose/TickEvent/illegalitems/illegalitems_a.js deleted file mode 100644 index df050c1..0000000 --- a/build/scripts/penrose/TickEvent/illegalitems/illegalitems_a.js +++ /dev/null @@ -1,291 +0,0 @@ -import { world, ItemStack, system } from "@minecraft/server"; -import config from "../../../data/config.js"; -import { illegalitems } from "../../../data/itemban.js"; -import { kickablePlayers } from "../../../kickcheck.js"; -import { sendMsg, sendMsgToPlayer, titleCase } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -// Create a map of player objects and their enchantment presence -const enchantmentPresenceMap = new Map(); -// Create a map of player objects and their enchantment data -const enchantmentDataMap = new Map(); -// Create a map of player objects and their inventory slot value -const inventorySlotMap = new Map(); -// Create a map of player objects and their ItemStack data -const itemStackDataMap = new Map(); -// Create a map of player objects and their unverified ItemStack -const unverifiedItemMap = new Map(); -// Create a map to store the previous empty slots count for each player -const previousEmptySlotsCount = new Map(); -function rip(player, inventory_item, enchData, lore = false) { - let reason; - if (enchData) { - const { id, level } = enchData; - reason = `Illegal Item A (${inventory_item.typeId.replace("minecraft:", "")}: ${id}=${level})`; - } - else { - reason = `Illegal Item A (${inventory_item.typeId.replace("minecraft:", "")}=${inventory_item.amount})`; - if (lore) { - reason += " (Lore)"; - } - } - try { - player.addTag(`Reason:${reason}`); - player.addTag("By:Paradox"); - player.addTag("isBanned"); - } - catch (error) { - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - } -} -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - enchantmentPresenceMap.delete(event.playerId); - enchantmentDataMap.delete(event.playerId); - inventorySlotMap.delete(event.playerId); - itemStackDataMap.delete(event.playerId); - unverifiedItemMap.delete(event.playerId); - previousEmptySlotsCount.delete(event.playerId); -} -function illegalitemsa(id) { - // Get Dynamic Property - const illegalItemsABoolean = dynamicPropertyRegistry.get("illegalitemsa_b"); - const illegalEnchantmentBoolean = dynamicPropertyRegistry.get("illegalenchantment_b"); - const stackBanBoolean = dynamicPropertyRegistry.get("stackban_b"); - const antiShulkerBoolean = dynamicPropertyRegistry.get("antishulker_b"); - const illegalLoresBoolean = dynamicPropertyRegistry.get("illegallores_b"); - const salvageBoolean = dynamicPropertyRegistry.get("salvage_b"); - // Unsubscribe if disabled in-game - if (illegalItemsABoolean === false) { - const allPlayers = world.getPlayers({ tags: ["illegalitemsA"] }); - for (const player of allPlayers) { - player.removeTag("illegalitemsA"); - } - resetMaps(); // Clear the maps - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - system.clearRun(id); - return; - } - // Retrieve all players with the "illegalitemsA" tag from the "world" object - const allPlayers = world.getPlayers(); - // Iterate through each player - for (const player of allPlayers) { - // Get the player's unique ID from the "dynamicPropertyRegistry" object - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // If the player has permission (i.e., their unique ID matches their name), skip to the next player - if (uniqueId === player.name) { - continue; - } - // Get the player's inventory - const playerInventory = player.getComponent("minecraft:inventory"); - const playerContainer = playerInventory.container; - // Cache the player's inventory size - const playerContainerSize = playerContainer.size; - // Get the current empty slots count - const currentEmptySlotsCount = playerContainer.emptySlotsCount; - // Check if the empty slots count has changed - if (currentEmptySlotsCount !== previousEmptySlotsCount.get(player.id)) { - // Update the previous empty slots count for the player - previousEmptySlotsCount.set(player.id, currentEmptySlotsCount); - // Iterate through each slot in the player's container - for (let i = 0; i < playerContainerSize; i++) { - // Get the item in the current slot - const playerItemStack = playerContainer.getItem(i); - const itemStackId = playerItemStack?.typeId; - if (!itemStackId) { - continue; - } - // Anti Shulker Boxes - if (antiShulkerBoolean && itemStackId.includes("shulker")) { - playerContainer.setItem(i); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${itemStackId.replace("minecraft:", "")} from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Shulker Boxes are not allowed!`); - continue; - } - // Illegal Stacks - const currentStack = playerItemStack.amount; - const maxStack = playerItemStack.maxAmount; - if (stackBanBoolean && currentStack > maxStack) { - playerContainer.setItem(i); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${itemStackId.replace("minecraft:", "")} x ${currentStack} from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Illegal Stacks are not allowed!`); - rip(player, playerItemStack); - break; - } - // If the item is in the "illegalitems" object, remove it from the player's inventory and run the "rip" function on it - if (illegalitems.has(itemStackId)) { - playerContainer.setItem(i); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${itemStackId.replace("minecraft:", "")} from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Illegal Items are not allowed!`); - rip(player, playerItemStack); - break; - } - // Illegal Lores - if (illegalLoresBoolean && !config.modules.illegalLores.exclude.includes(String(playerItemStack.getLore()))) { - playerContainer.setItem(i); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${itemStackId.replace("minecraft:", "")} with lore from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Item with illegal lores are not allowed!`); - rip(player, playerItemStack, null, true); - break; - } - // Illegal Enchantments - if (illegalEnchantmentBoolean) { - const enchantmentComponent = playerItemStack.getComponent("minecraft:enchantments"); - const enchantmentData = enchantmentComponent.enchantments; - // Update the enchantment presence and data maps for each enchantment type - const iterator = enchantmentData[Symbol.iterator](); - let iteratorResult = iterator.next(); - while (!iteratorResult.done) { - const enchantment = iteratorResult.value; - enchantmentPresenceMap.get(player.id).set(enchantment, true); - enchantmentDataMap.get(player.id).set(enchantment, enchantmentData); - inventorySlotMap.get(player.id).set(enchantment, i); - itemStackDataMap.get(player.id).set(enchantment, playerItemStack); - iteratorResult = iterator.next(); - } - } - // Salvage System - if (salvageBoolean) { - const uniqueItems = ["minecraft:potion", "minecraft:splash_potion", "minecraft:lingering_potion", "minecraft:skull", "minecraft:planks", "minecraft:banner"]; - if (!uniqueItems.includes(itemStackId)) { - const verifiedItemName = playerItemStack.nameTag; - if (!verifiedItemName) { - unverifiedItemMap.set(player.id, new Map()); - } - const playerMap = unverifiedItemMap.get(player.id); - playerMap.set(i, playerItemStack); - } - } - } - // Iterate through the enchantment presence map to perform any necessary operations - if (illegalEnchantmentBoolean) { - let isPresent = false; - for (const [enchantment, present] of enchantmentPresenceMap.get(player.id)) { - if (present) { - // Do something with the present enchantment and its data - const itemStackData = itemStackDataMap.get(player.id).get(enchantment); - const enchantmentData = enchantmentDataMap.get(player.id).get(enchantment); - const getEnchantment = enchantmentData.getEnchantment(enchantment.type); - const currentLevel = getEnchantment.level; - const maxLevel = getEnchantment.type.maxLevel; - // Create new ItemStack to validate enchantments - const newItemStack = new ItemStack(itemStackData.typeId); - // Get the new enchantment component from the new ItemStack - const newEnchantmentComponent = newItemStack.getComponent("minecraft:enchantments"); - // Get the new enchantment data from the new ItemStack component - const newEnchantmentData = newEnchantmentComponent.enchantments; - // Verify if enchantment type is allowed on the item - const canAddEnchantBoolean = newEnchantmentData.canAddEnchantment(getEnchantment); - // Flag for illegal enchantments - if (currentLevel > maxLevel || currentLevel < 0 || !canAddEnchantBoolean) { - const itemSlot = inventorySlotMap.get(player.id).get(enchantment); - const enchData = { - id: getEnchantment.type.id, - level: currentLevel, - }; - const itemStackId = playerContainer.getItem(itemSlot); - playerContainer.setItem(itemSlot); - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f Removed ${itemStackId.typeId.replace("minecraft:", "")} with Illegal Enchantments from ${player.name}.`); - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f Item with illegal Enchantments are not allowed!`); - enchantmentPresenceMap.clear(); - enchantmentDataMap.clear(); - inventorySlotMap.clear(); - unverifiedItemMap.clear(); // Clear this map since we won't get that far to prevent memory leaks - itemStackDataMap.clear(); - rip(player, itemStackId, enchData); - break; - } - isPresent = true; - } - } - // Clear these populated maps if Salvage System is disabled to prevent memory leaks - if (isPresent && !salvageBoolean) { - enchantmentPresenceMap.clear(); - enchantmentDataMap.clear(); - inventorySlotMap.clear(); - itemStackDataMap.clear(); - } - } - // Salvage System - if (salvageBoolean) { - let salvagedList = false; - // Iterate over the unverifiedItemMap - for (const [slot, itemStackData] of unverifiedItemMap.get(player.id)) { - // Create a new name tag for the item - const newNameTag = titleCase(itemStackData.typeId.replace("minecraft:", "")); - // Create a new ItemStack with the same type as the original item - const applyCustomProperties = new ItemStack(itemStackData.typeId); - // Get the original enchantment component from the item - const originalEnchantmentComponent = itemStackData.getComponent("minecraft:enchantments"); - // Get the original enchantment data from the component - const originalEnchantmentData = originalEnchantmentComponent.enchantments; - // Get the new enchantment component from the new ItemStack - const newEnchantmentComponent = applyCustomProperties.getComponent("minecraft:enchantments"); - // Get the new enchantment data from the new ItemStack component - const newEnchantmentData = newEnchantmentComponent.enchantments; - // Iterate over the original enchantment data - const iterator = originalEnchantmentData[Symbol.iterator](); - let iteratorResult = iterator.next(); - while (!iteratorResult.done) { - // Get the enchantment from the iterator - const enchantment = iteratorResult.value; - // Check if the enchantment is legal - if (!illegalEnchantmentBoolean) { - // Get the enchantment from the original enchantment data - const getEnchantment = originalEnchantmentData.getEnchantment(enchantment.type); - // Check if the new ItemStack can have the enchantment added - const canAddEnchantBoolean = newEnchantmentData.canAddEnchantment(getEnchantment); - // If it can, add the enchantment to the new enchantment data - if (canAddEnchantBoolean) { - newEnchantmentData.addEnchantment(enchantment); - // Sets enchantment list to enchantment of new instance - newEnchantmentComponent.enchantments = newEnchantmentData; - } - } - else { - // Add the enchantment to the new enchantment data - newEnchantmentData.addEnchantment(enchantment); - // Sets enchantment list to enchantment of new instance - newEnchantmentComponent.enchantments = newEnchantmentData; - } - // Get the next item from the iterator - iteratorResult = iterator.next(); - salvagedList = true; - } - // Set the name tag and lore of the new ItemStack - applyCustomProperties.nameTag = newNameTag; - applyCustomProperties.setLore(itemStackData.getLore()); - // Set the new ItemStack in the player's container in the specified slot - playerContainer.setItem(slot, applyCustomProperties); - } - // Clear these populated maps to prevent memory leaks - if (salvagedList) { - unverifiedItemMap.clear(); - enchantmentPresenceMap.clear(); - enchantmentDataMap.clear(); - inventorySlotMap.clear(); - itemStackDataMap.clear(); - } - } - } - } -} -function resetMaps() { - enchantmentPresenceMap.clear(); - enchantmentDataMap.clear(); - inventorySlotMap.clear(); - itemStackDataMap.clear(); - unverifiedItemMap.clear(); - previousEmptySlotsCount.clear(); -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function IllegalItemsA() { - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - const illegalItemsAId = system.runInterval(() => { - illegalitemsa(illegalItemsAId); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/illegalitems/illegalitems_c.js b/build/scripts/penrose/TickEvent/illegalitems/illegalitems_c.js deleted file mode 100644 index be0bbbb..0000000 --- a/build/scripts/penrose/TickEvent/illegalitems/illegalitems_c.js +++ /dev/null @@ -1,57 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { illegalitems } from "../../../data/itemban.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function illegalitemsc(id) { - // Get Dynamic Property - const illegalItemsCBoolean = dynamicPropertyRegistry.get("illegalitemsc_b"); - const antiShulkerBoolean = dynamicPropertyRegistry.get("antishulker_b"); - const shulkerItems = ["minecraft:shulker_box", "minecraft:undyed_shulker_box"]; - // Unsubscribe if disabled in-game - if (illegalItemsCBoolean === false) { - system.clearRun(id); - return; - } - const filter = { - type: "item", - }; - const filteredEntities = world.getDimension("overworld").getEntities(filter); - const filteredEntitiesLength = filteredEntities.length; - for (let i = 0; i < filteredEntitiesLength; i++) { - const entity = filteredEntities[i]; - // Get component of itemStack for dropped item - const itemContainer = entity.getComponent("item"); - const itemName = itemContainer?.itemStack; - // Check if object returns undefined and skip if it does - if (!itemName) { - continue; - } - if (entity.typeId === "minecraft:item") { - // If shulker boxes are not allowed in the server then we handle this here - if (antiShulkerBoolean && shulkerItems.includes(itemName.typeId)) { - entity.kill(); - } - else if (illegalitems.has(itemName.typeId)) { - // If it is an illegal item then remove it - entity.kill(); - } - else { - // If it is an illegal stack then remove it - const currentAmount = itemName.amount; - const maxAmount = itemName.maxAmount; - if (currentAmount < 0 || currentAmount > maxAmount) { - entity.kill(); - } - } - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function IllegalItemsC() { - const illegalItemsCId = system.runInterval(() => { - illegalitemsc(illegalItemsCId); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/invalidsprint/invalidsprint_a.js b/build/scripts/penrose/TickEvent/invalidsprint/invalidsprint_a.js deleted file mode 100644 index fb9b391..0000000 --- a/build/scripts/penrose/TickEvent/invalidsprint/invalidsprint_a.js +++ /dev/null @@ -1,129 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { MinecraftEffectTypes } from "../../../node_modules/@minecraft/vanilla-data/lib/index"; -import { flag, isTimerExpired } from "../../../util.js"; -import config from "../../../data/config.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -// Create a Map to store each player's last known position, timestamp, and highest speed -const playerData = new Map(); -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - const playerName = event.playerId; - playerData.delete(playerName); -} -function onPlayerSpawn(event) { - if (event.initialSpawn === true) { - return; - } - const playerName = event.player.id; - // Initialize player data when they spawn - playerData.set(playerName, { - lastPosition: [event.player.location.x, event.player.location.y, event.player.location.z], - lastTimestamp: Date.now(), - highestBps: 0, - lastHitTimestamp: 0, - }); -} -function onEntityHurt(event) { - if (!event.hurtEntity.isValid()) { - return; - } - const playerName = event.hurtEntity.id; - // Update the last hit timestamp for the player - if (playerData.has(playerName)) { - const playerInfo = playerData.get(playerName); - playerInfo.lastHitTimestamp = Date.now(); - } -} -function calculateMovementBPS(currentPosition, lastPosition, playerTimestamp, lastTimestamp) { - const timeElapsedInSeconds = (playerTimestamp - lastTimestamp) / 1000; - // Check for valid timeElapsedInSeconds - if (timeElapsedInSeconds <= 0 || !isFinite(timeElapsedInSeconds)) { - return 0; - } - const [dx, dy, dz] = [currentPosition[0] - lastPosition[0], currentPosition[1] - lastPosition[1], currentPosition[2] - lastPosition[2]]; - // Ignore purely vertical movement and downward vertical movement only - if (dy <= 0 && Math.abs(dx) < Math.abs(dy) && Math.abs(dz) < Math.abs(dy)) { - return 0; - } - // Calculate distance moved (ignoring vertical movement) - const distanceMoved = Math.sqrt(dx * dx + dz * dz); - // Calculate speed - const bps = distanceMoved / timeElapsedInSeconds; - return bps; -} -function invalidsprinta(id) { - // Get Dynamic Property - const invalidSprintABoolean = dynamicPropertyRegistry.get("invalidsprinta_b"); - // Unsubscribe if disabled in-game - if (invalidSprintABoolean === false) { - playerData.clear(); - world.afterEvents.playerSpawn.unsubscribe(onPlayerSpawn); - world.afterEvents.entityHurt.unsubscribe(onEntityHurt); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - system.clearRun(id); - return; - } - // run as each player - const players = world.getPlayers(); - for (const player of players) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - const glideCheck = player.isGliding; - if (glideCheck) { - continue; - } - const rideCheck = player.hasTag("riding"); - if (rideCheck) { - continue; - } - const playerName = player.id; - const playerPosition = [player.location.x, player.location.y, player.location.z]; - const playerTimestamp = Date.now(); - // If playerData Map doesn't have a key for the player's name, add it with initial values - if (!playerData.has(playerName)) { - playerData.set(playerName, { - lastPosition: playerPosition, - lastTimestamp: playerTimestamp, - highestBps: 0, - lastHitTimestamp: 0, - }); - } - const playerInfo = playerData.get(playerName); - const { lastPosition, lastTimestamp, highestBps, lastHitTimestamp } = playerInfo; - // Check if player was hit recently (within the last X milliseconds) - const timeSinceLastHit = Date.now() - lastHitTimestamp; - const recentlyHit = timeSinceLastHit <= 1000; // Adjust the time threshold as needed - // Skip processing for players who were recently hit - if (recentlyHit) { - continue; - } - const bps = calculateMovementBPS(playerPosition, lastPosition, playerTimestamp, lastTimestamp); - playerInfo.lastPosition = playerPosition; - playerInfo.lastTimestamp = playerTimestamp; - playerInfo.highestBps = Math.max(bps, highestBps); - const verifyTpGrace = isTimerExpired(player.id); - // We compare with a 20% buffer to minimize false flags - if (!isNaN(playerInfo.highestBps) && playerInfo.highestBps > config.modules.speedA.speed && player.getEffect(MinecraftEffectTypes.Blindness) && verifyTpGrace === true) { - flag(player, "InvalidSprint", "A", "Movement", null, null, "BlindSprint", playerInfo.highestBps.toFixed(2), true); - playerInfo.highestBps = 0; - } - } - return; -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function InvalidSprintA() { - world.afterEvents.playerSpawn.subscribe(onPlayerSpawn); - world.afterEvents.entityHurt.subscribe(onEntityHurt); - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - const invalidSprintAId = system.runInterval(() => { - invalidsprinta(invalidSprintAId); - }, 10); -} diff --git a/build/scripts/penrose/TickEvent/jesus/jesus_a.js b/build/scripts/penrose/TickEvent/jesus/jesus_a.js deleted file mode 100644 index e5de4f2..0000000 --- a/build/scripts/penrose/TickEvent/jesus/jesus_a.js +++ /dev/null @@ -1,74 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -let blockAtPlayer0; -let blockAtPlayer1; -const playerTags = ["vanish", "riding", "flying"]; -const playerCount = new Map(); -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - const playerName = event.playerId; - playerCount.delete(playerName); -} -function timer(player, dimension, x, y, z) { - player.teleport({ x: x, y: y - 2, z: z }, { dimension: dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - playerCount.set(player.id, 0); -} -function jesusa(id) { - // Get Dynamic Property - const jesusaBoolean = dynamicPropertyRegistry.get("jesusa_b"); - // Unsubscribe if disabled in-game - if (jesusaBoolean === false) { - playerCount.clear(); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - system.clearRun(id); - return; - } - // run as each player - const players = world.getPlayers(); - for (const player of players) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - const { x, y, z } = player.location; - const dimension = player.dimension; - try { - // Below Below player - blockAtPlayer0 = player?.dimension?.getBlock({ x: x, y: y - 1, z: z }) || undefined; - // Below player - blockAtPlayer1 = player?.dimension?.getBlock({ x: x, y: y, z: z }) || undefined; - } - catch (error) { } - const playerFeetY = Math.floor(y); // Round down to get the player's feet Y-coordinate - const swimming = player.isSwimming; - const inWater = player.isInWater; - if (!swimming && !inWater && blockAtPlayer0 && blockAtPlayer1) { - const isWaterOrLava = (blockAtPlayer1.typeId === "minecraft:water" && blockAtPlayer0.typeId === "minecraft:water") || (blockAtPlayer1.typeId === "minecraft:lava" && blockAtPlayer0.typeId === "minecraft:lava"); - if (isWaterOrLava && playerFeetY === blockAtPlayer1.y && playerTags.every((tag) => !player.hasTag(tag))) { - const count = (playerCount.get(player.id) || 0) + 1; - playerCount.set(player.id, count); - // Flag them after 2 seconds of activity - if (count === 1) { - timer(player, dimension, x, y, z); - } - } - } - // Reset count - if (player.isOnGround) { - playerCount.delete(player.id); - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function JesusA() { - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - const jesusAId = system.runInterval(() => { - jesusa(jesusAId); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/knockback/antikb_a.js b/build/scripts/penrose/TickEvent/knockback/antikb_a.js deleted file mode 100644 index 867bdd8..0000000 --- a/build/scripts/penrose/TickEvent/knockback/antikb_a.js +++ /dev/null @@ -1,51 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import config from "../../../data/config.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -async function antiknockbacka(id) { - const antikbBoolean = dynamicPropertyRegistry.get("antikb_b"); - if (antikbBoolean === false) { - system.clearRun(id); - return; - } - const players = world.getPlayers(); - for (const player of players) { - const uniqueId = dynamicPropertyRegistry.get(player?.id); - if (uniqueId === player.name) { - continue; - } - const hand = player.selectedSlot; - const invContainer = player.getComponent("inventory"); - const inventory = invContainer.container; - const equippedItem = inventory.getItem(hand); - let defineItem = ""; - if (equippedItem !== undefined) { - defineItem = equippedItem.typeId; - } - if (defineItem === "minecraft:trident") { - continue; - } - const velocity = player.getVelocity(); - const velocitySum = Math.abs(velocity.y) + Math.abs(velocity.x) + Math.abs(velocity.z); - if (velocitySum <= config.modules.antikbA.magnitude) { - const tags = player.getTags(); - if (tags.includes("attacked") && !tags.includes("dead") && !player.isGliding && !tags.includes("levitating") && !tags.includes("flying")) { - flag(player, "AntiKB", "A", "Movement", null, null, "Magnitude", velocitySum.toFixed(3), true); - } - } - } -} -export function AntiKnockbackA() { - const antiKnockbackAId = system.runInterval(() => { - antiknockbacka(antiKnockbackAId).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }, 40); -} diff --git a/build/scripts/penrose/TickEvent/namespoof/namespoof_a.js b/build/scripts/penrose/TickEvent/namespoof/namespoof_a.js deleted file mode 100644 index 67fe5c3..0000000 --- a/build/scripts/penrose/TickEvent/namespoof/namespoof_a.js +++ /dev/null @@ -1,41 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import config from "../../../data/config.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function namespoofa(id) { - // Get Dynamic Property - const nameSpoofBoolean = dynamicPropertyRegistry.get("namespoofa_b"); - // Unsubscribe if disabled in-game - if (nameSpoofBoolean === false) { - system.clearRun(id); - return; - } - // run as each player - const players = world.getPlayers(); - for (const player of players) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - // Namespoof/A = username length check. - try { - if (player.name.length < config.modules.namespoofA.minNameLength || player.name.length > config.modules.namespoofA.maxNameLength) { - flag(player, "Namespoof", "A", "Exploit", null, null, "nameLength", String(player.name.length), false); - } - } - catch (error) { } - } - return; -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function NamespoofA() { - const nameSpoofAId = system.runInterval(() => { - namespoofa(nameSpoofAId); - }, 40); -} diff --git a/build/scripts/penrose/TickEvent/namespoof/namespoof_b.js b/build/scripts/penrose/TickEvent/namespoof/namespoof_b.js deleted file mode 100644 index f3b2772..0000000 --- a/build/scripts/penrose/TickEvent/namespoof/namespoof_b.js +++ /dev/null @@ -1,57 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import config from "../../../data/config.js"; -import { kickablePlayers } from "../../../kickcheck.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function rip(player) { - // Tag with reason and by who - try { - player.addTag("Reason:Namespoof B (Disabler)"); - player.addTag("By:Paradox"); - player.addTag("isBanned"); - // Despawn if we cannot kick the player - } - catch (error) { - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - } -} -function namespoofb(id) { - // Get Dynamic Property - const nameSpoofBoolean = dynamicPropertyRegistry.get("namespoofb_b"); - // Unsubscribe if disabled in-game - if (nameSpoofBoolean === false) { - system.clearRun(id); - return; - } - // run as each player - const players = world.getPlayers(); - for (const player of players) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - // Namespoof/B = regex check - if (config.modules.namespoofB.banregex.test(player.name)) { - player.nameTag = player.name.replace(config.modules.namespoofB.banregex, ""); - rip(player); - } - else if (config.modules.namespoofB.kickregex.test(player.name)) { - player.nameTag = player.name.replace(config.modules.namespoofB.kickregex, ""); - flag(player, "Namespoof", "B", "Exploit", null, null, null, null, false); - } - } - return; -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function NamespoofB() { - const nameSpoofBId = system.runInterval(() => { - namespoofb(nameSpoofBId); - }, 40); -} diff --git a/build/scripts/penrose/TickEvent/noperms/nopermission.js b/build/scripts/penrose/TickEvent/noperms/nopermission.js deleted file mode 100644 index b1a3e98..0000000 --- a/build/scripts/penrose/TickEvent/noperms/nopermission.js +++ /dev/null @@ -1,48 +0,0 @@ -import { world, Player, system } from "@minecraft/server"; -import { crypto, sendMsg } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -import config from "../../../data/config.js"; -function noperms() { - const filter = { - tags: ["paradoxOpped"], - }; - // We need a list of players for checking behind a bug in Minecraft - const filteredPlayers = world.getPlayers(filter); - // Let's check the entities for illegal permissions - // Apparently all dimensions are checked even though we target overworld - const filteredEntities = world.getDimension("overworld").getEntities(filter); - for (const entity of filteredEntities) { - // If it's a player then ignore - if (entity instanceof Player) { - continue; - } - // This covers a bug that exists in Minecraft where for a brief tick the player will not return as a player entity - // This bug would essentially cause this script to remove permissions from staff unintentionally - if (filteredPlayers.includes(entity)) { - // Skip to the next entity since this is a bug in Minecraft - continue; - } - // Check for hash/salt and validate password - const hash = entity.getDynamicProperty("hash"); - const salt = entity.getDynamicProperty("salt"); - // Use either the operator's ID or the encryption password as the key - const key = config.encryption.password ? config.encryption.password : entity.id; - // Generate the hash - const encode = crypto?.(salt, key); - entity.removeTag("paradoxOpped"); - if (encode === hash) { - entity.removeDynamicProperty("hash"); - entity.removeDynamicProperty("salt"); - dynamicPropertyRegistry.delete(entity.id); - } - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f ${entity.nameTag} had unauthorized permissions. Permissions removed!`); - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export const NoPerms = system.runInterval(() => { - noperms(); -}, 20); diff --git a/build/scripts/penrose/TickEvent/noperms/verifypermission.js b/build/scripts/penrose/TickEvent/noperms/verifypermission.js deleted file mode 100644 index 17673b9..0000000 --- a/build/scripts/penrose/TickEvent/noperms/verifypermission.js +++ /dev/null @@ -1,53 +0,0 @@ -import { world, system } from "@minecraft/server"; -import config from "../../../data/config.js"; -import { crypto, sendMsg } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function verifypermission() { - const filter = { - tags: ["paradoxOpped"], - }; - const filteredPlayers = world.getPlayers(filter); - // Let's check the players for illegal permissions - for (const player of filteredPlayers) { - // Check for hash/salt and validate password - let hash, salt; - try { - hash = player.getDynamicProperty("hash"); - salt = player.getDynamicProperty("salt"); - } - catch (error) { - if (config.debug) { - console.error(`Error retrieving dynamic properties for player: ${player.name}`); - console.error(error); - console.log("Player:", player.name); - } - continue; // Skip to the next player - } - // Use either the operator's ID or the encryption password as the key - const key = config.encryption.password ? config.encryption.password : player.id; - // Generate the hash - const encode = crypto?.(salt, key); - if (encode === hash) { - // Make sure their unique ID exists in case of a reload - if (dynamicPropertyRegistry.has(player.id) === false) { - dynamicPropertyRegistry.set(player.id, player.name); - } - continue; - } - else { - player.removeDynamicProperty("hash"); - player.removeDynamicProperty("salt"); - dynamicPropertyRegistry.delete(player.id); - player.removeTag("paradoxOpped"); - } - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f ${player.name} had unauthorized permissions. Permissions removed!`); - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export const VerifyPermission = system.runInterval(() => { - verifypermission(); -}, 20); diff --git a/build/scripts/penrose/TickEvent/oneplayersleep/oneplayersleep.js b/build/scripts/penrose/TickEvent/oneplayersleep/oneplayersleep.js deleted file mode 100644 index 55803fc..0000000 --- a/build/scripts/penrose/TickEvent/oneplayersleep/oneplayersleep.js +++ /dev/null @@ -1,70 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -function setTimeoutAsync(delay) { - return new Promise((resolve) => system.runTimeout(resolve, delay)); -} -async function queueSleep(player) { - await Promise.all([player.runCommandAsync(`time set 126553000`), player.runCommandAsync(`weather clear`)]); - const hotbarBoolean = dynamicPropertyRegistry.get("hotbar_b"); - if (hotbarBoolean === undefined || hotbarBoolean === false) { - player.runCommand(`title @a[tag=!vanish] actionbar おはよ~!`); - } -} -async function ops(opsId) { - // Get Dynamic Property - const opsBoolean = dynamicPropertyRegistry.get("ops_b"); - // Unsubscribe if disabled in-game - if (opsBoolean === false) { - system.clearRun(opsId); - return; - } - const filter = { tags: ["sleeping"] }; - const filteredPlayers = world.getPlayers(filter); - for (const player of filteredPlayers) { - /** - * Check if player still has the "sleeping" tag - * - * This is necessary because the first player in the loop might have changed the time and weather, - * causing subsequent players to no longer be sleeping. By checking if the player still has the - * "sleeping" tag before calling the queueSleep function, we ensure that only players who are - * still considered to be sleeping have the time and weather changes applied to them. - */ - const stillSleeping = player.hasTag("sleeping"); - if (stillSleeping) { - // Wait for 2 seconds - await setTimeoutAsync(40); - // Call queueSleep after 2 seconds - await queueSleep(player).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function OPS() { - const opsId = system.runInterval(() => { - ops(opsId).catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); - }); -} diff --git a/build/scripts/penrose/TickEvent/phase/phase_a.js b/build/scripts/penrose/TickEvent/phase/phase_a.js deleted file mode 100644 index 34fa3c5..0000000 --- a/build/scripts/penrose/TickEvent/phase/phase_a.js +++ /dev/null @@ -1,83 +0,0 @@ -import { world, GameMode, system } from "@minecraft/server"; -import { flag } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -// Store last safe location -const lastSafeLocation = new Map(); -// Solids that are passable with conditions -const passableSolids = new Set(["sand", "gravel", "concrete_powder"]); -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - const playerName = event.playerId; - lastSafeLocation.delete(playerName); -} -function antiphasea(id) { - // Get Dynamic Property - const antiphaseABoolean = dynamicPropertyRegistry.get("antiphasea_b"); - // Unsubscribe if disabled in-game - if (!antiphaseABoolean) { - lastSafeLocation.clear(); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - system.clearRun(id); - return; - } - // Exclude players who are in spectator mode or vanished. - const gm = { - excludeGameModes: [GameMode.spectator], - excludeTags: ["vanish"], - }; - const filteredPlayers = world.getPlayers(gm); - for (const player of filteredPlayers) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - const { x, y, z } = player.location; - // Calculate block locations for head, waist, and feet - const upperBody = { x, y: y + 1, z }; - const lowerBody = { x, y, z }; - const blocksToCheck = [lowerBody, upperBody]; - const allSafe = blocksToCheck.every((block) => { - let blockType; - try { - blockType = player.dimension.getBlock(block); - } - catch { } - if (!blockType || player.hasTag("riding") || passableSolids.has(blockType.typeId.replace("minecraft:", ""))) { - return true; - } - return !blockType.isSolid(); - }); - if (allSafe) { - // Update last safe location - lastSafeLocation.set(player.id, player.location); - } - else { - // Flag player and teleport to last safe location if available - flag(player, "AntiPhase", "A", "Exploit", null, null, null, null, false); - const safeLocation = lastSafeLocation.get(player.id); - if (safeLocation) { - player.teleport(safeLocation, { - dimension: player.dimension, - rotation: { x: 0, y: 0 }, - facingLocation: { x: 0, y: 0, z: 0 }, - checkForBlocks: false, - keepVelocity: false, - }); - } - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function AntiPhaseA() { - // Catch players leaving to manage memory - world.afterEvents.playerLeave.subscribe(onPlayerLogout); - const antiPhaseAId = system.runInterval(() => { - antiphasea(antiPhaseAId); - }, 20); -} diff --git a/build/scripts/penrose/TickEvent/speed/speed_a.js b/build/scripts/penrose/TickEvent/speed/speed_a.js deleted file mode 100644 index de2d207..0000000 --- a/build/scripts/penrose/TickEvent/speed/speed_a.js +++ /dev/null @@ -1,131 +0,0 @@ -import { world, system, GameMode } from "@minecraft/server"; -import config from "../../../data/config.js"; -import { flag, isTimerExpired } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -// Create a Map to store each player's last known position, timestamp, and highest speed -const playerData = new Map(); -function onPlayerSpawn(event) { - if (event.initialSpawn === true) { - return; - } - const playerName = event.player.id; - // Initialize player data when they spawn - playerData.set(playerName, { - lastPosition: [event.player.location.x, event.player.location.y, event.player.location.z], - lastTimestamp: Date.now(), - highestBps: 0, - lastHitTimestamp: 0, - }); -} -function onEntityHurt(event) { - if (!event.hurtEntity.isValid()) { - return; - } - const playerName = event.hurtEntity.id; - // Update the last hit timestamp for the player - if (playerData.has(playerName)) { - const playerInfo = playerData.get(playerName); - playerInfo.lastHitTimestamp = Date.now(); - } -} -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - const playerName = event.playerId; - playerData.delete(playerName); -} -function calculateMovementBPS(currentPosition, lastPosition, playerTimestamp, lastTimestamp) { - const timeElapsedInSeconds = (playerTimestamp - lastTimestamp) / 1000; - // Check for valid timeElapsedInSeconds - if (timeElapsedInSeconds <= 0 || !isFinite(timeElapsedInSeconds)) { - return 0; - } - const [dx, dy, dz] = [currentPosition[0] - lastPosition[0], currentPosition[1] - lastPosition[1], currentPosition[2] - lastPosition[2]]; - // Ignore purely vertical movement and downward vertical movement only - if (dy <= 0 && Math.abs(dx) < Math.abs(dy) && Math.abs(dz) < Math.abs(dy)) { - return 0; - } - // Calculate distance moved (ignoring vertical movement) - const distanceMoved = Math.sqrt(dx * dx + dz * dz); - // Calculate speed - const bps = distanceMoved / timeElapsedInSeconds; - return bps; -} -function speeda(id) { - // Get Dynamic Property - const speedABoolean = dynamicPropertyRegistry.get("speeda_b"); - // Unsubscribe if disabled in-game - if (speedABoolean === false) { - playerData.clear(); - world.afterEvents.playerSpawn.unsubscribe(onPlayerSpawn); - world.afterEvents.entityHurt.unsubscribe(onEntityHurt); - world.afterEvents.playerLeave.unsubscribe(onPlayerLogout); - system.clearRun(id); - return; - } - const filter = { - excludeGameModes: [GameMode.creative, GameMode.spectator], - }; - // Exclude creative mode and spectator mode - const filteredPlayers = world.getPlayers(filter); - for (const player of filteredPlayers) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - const glideCheck = player.isGliding; - if (glideCheck) { - continue; - } - const rideCheck = player.hasTag("riding"); - if (rideCheck) { - continue; - } - const playerName = player.id; - const playerPosition = [player.location.x, player.location.y, player.location.z]; - const playerTimestamp = Date.now(); - // If playerData Map doesn't have a key for the player's name, add it with initial values - if (!playerData.has(playerName)) { - playerData.set(playerName, { - lastPosition: playerPosition, - lastTimestamp: playerTimestamp, - highestBps: 0, - lastHitTimestamp: 0, - }); - } - const playerInfo = playerData.get(playerName); - const { lastPosition, lastTimestamp, highestBps, lastHitTimestamp } = playerInfo; - // Check if player was hit recently (within the last X milliseconds) - const timeSinceLastHit = Date.now() - lastHitTimestamp; - const recentlyHit = timeSinceLastHit <= 1000; // Adjust the time threshold as needed - // Skip processing for players who were recently hit - if (recentlyHit) { - continue; - } - const bps = calculateMovementBPS(playerPosition, lastPosition, playerTimestamp, lastTimestamp); - playerInfo.lastPosition = playerPosition; - playerInfo.lastTimestamp = playerTimestamp; - playerInfo.highestBps = Math.max(bps, highestBps); - const verifyTpGrace = isTimerExpired(player.id); - // We compare with a 20% buffer to minimize false flags - if (!isNaN(playerInfo.highestBps) && playerInfo.highestBps > config.modules.speedA.speed && verifyTpGrace === true) { - flag(player, "Speed", "A", "Movement", null, null, "IllegalSpeed", playerInfo.highestBps.toFixed(2), true); - playerInfo.highestBps = 0; - } - } - return; -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function SpeedA() { - world.afterEvents.playerSpawn.subscribe(onPlayerSpawn); - world.afterEvents.entityHurt.subscribe(onEntityHurt); - world.afterEvents.playerLeave.subscribe(onPlayerLogout); // Subscribe to player logout events - const speedAId = system.runInterval(() => { - speeda(speedAId); - }, 10); -} diff --git a/build/scripts/penrose/TickEvent/vanish/vanish.js b/build/scripts/penrose/TickEvent/vanish/vanish.js deleted file mode 100644 index a42a0ba..0000000 --- a/build/scripts/penrose/TickEvent/vanish/vanish.js +++ /dev/null @@ -1,54 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { MinecraftEffectTypes } from "../../../node_modules/@minecraft/vanilla-data/lib/index"; -import { sendMsg } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -async function vanish() { - // Filter for only players who are vanished - const filter = { - tags: ["vanish"], - }; - const filteredPlayers = world.getPlayers(filter); - // Run as each player - for (const player of filteredPlayers) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Make sure they have permission - if (uniqueId === player.name) { - player.addEffect(MinecraftEffectTypes.Invisibility, 1728000, { amplifier: 255, showParticles: false }); - player.addEffect(MinecraftEffectTypes.NightVision, 1728000, { amplifier: 255, showParticles: false }); - player.onScreenDisplay.setActionBar("§6YOU ARE VANISHED!"); - } - // Make sure they have permission to use Vanish - if (uniqueId !== player.name) { - // They have been busted! - player.removeTag("vanish"); - if (player.getEffect(MinecraftEffectTypes.Invisibility) || player.getEffect(MinecraftEffectTypes.NightVision)) { - player.runCommandAsync(`effect @s clear`); - } - player.triggerEvent("unvanish"); - // Use try/catch in case nobody has tag 'notify' as this will report 'no target selector' - try { - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f ${player.name} had unauthorized permissions for Vanish. Permissions removed!`); - } - catch (error) { } - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export const Vanish = system.runInterval(() => { - vanish().catch((error) => { - console.error("Paradox Unhandled Rejection: ", error); - // Extract stack trace information - if (error instanceof Error) { - const stackLines = error.stack.split("\n"); - if (stackLines.length > 1) { - const sourceInfo = stackLines; - console.error("Error originated from:", sourceInfo[0]); - } - } - }); -}); diff --git a/build/scripts/penrose/TickEvent/worldborder/worldborder.js b/build/scripts/penrose/TickEvent/worldborder/worldborder.js deleted file mode 100644 index 9626ddf..0000000 --- a/build/scripts/penrose/TickEvent/worldborder/worldborder.js +++ /dev/null @@ -1,153 +0,0 @@ -import { world, system } from "@minecraft/server"; -import { MinecraftBlockTypes } from "../../../node_modules/@minecraft/vanilla-data/lib/index"; -import { sendMsgToPlayer, setTimer } from "../../../util.js"; -import { dynamicPropertyRegistry } from "../../WorldInitializeAfterEvent/registry.js"; -// Make sure they don't tp inside a solid block -function safetyProtocol(player, x, y, z) { - const testPositions = [ - { x: x, y: y + 1, z: z }, - { x: x, y: y, z: z }, - { x: x, y: y - 1, z: z }, // Feet position - ]; - let safe = null; - let consecutiveAir = 0; - for (const position of testPositions) { - const block = player.dimension.getBlock(position); - if (block?.isAir) { - consecutiveAir++; - } - else { - consecutiveAir = 0; - } - } - if (consecutiveAir === testPositions.length) { - safe = testPositions[0].y; - } - else { - safe = y; - } - return safe; -} -function worldborder(id) { - // Dynamic Properties for boolean - const worldBorderBoolean = dynamicPropertyRegistry.get("worldborder_b"); - // Dynamic Properties for number - const worldBorderOverworldNumber = dynamicPropertyRegistry.get("worldborder_n"); - const worldBorderNetherNumber = dynamicPropertyRegistry.get("worldborder_nether_n"); - const worldBorderEndNumber = dynamicPropertyRegistry.get("worldborder_end_n"); - // Unsubscribe if disabled in-game - if (worldBorderBoolean === false) { - system.clearRun(id); - return; - } - const players = world.getPlayers(); - for (const player of players) { - // Get unique ID - const uniqueId = dynamicPropertyRegistry.get(player?.id); - // Skip if they have permission - if (uniqueId === player.name) { - continue; - } - // What is it currently set to - let overworldSize = worldBorderOverworldNumber; - let netherSize = worldBorderNetherNumber; - let endSize = worldBorderEndNumber; - // Make sure it's not a negative - if (overworldSize < 0) { - overworldSize = Math.abs(overworldSize); - } - if (netherSize < 0) { - netherSize = Math.abs(netherSize); - } - if (endSize < 0) { - endSize = Math.abs(endSize); - } - // If overworld or nether is 0 then ignore - if ((overworldSize === 0 && player.dimension.id === "minecraft:overworld") || (netherSize === 0 && player.dimension.id === "minecraft:nether") || (endSize === 0 && player.dimension.id === "minecraft:the_end")) { - continue; - } - const { x, y, z } = player.location; - const blockCoords = [ - [x, y - 1, z], - [x, y - 1, z + 1], - [x, y - 1, z - 1], - [x + 1, y - 1, z], - [x - 1, y - 1, z], - [x, y, z], - [x, y, z + 1], - [x, y, z - 1], - [x + 1, y, z], - [x - 1, y, z], - ]; - const portalBlocks = {}; - for (const [x, y, z] of blockCoords) { - const block = player.dimension.getBlock({ x: x, y: y, z: z }); - portalBlocks[`${x},${y},${z}`] = block?.typeId ?? "minecraft:air"; - } - if (portalBlocks[MinecraftBlockTypes.Portal] || portalBlocks[`${x},${y - 1},${z}`] === MinecraftBlockTypes.Air) { - setTimer(player.id); - continue; - } - // Overworld - if (player.dimension.id === "minecraft:overworld") { - const border = overworldSize - 3; - const { x, y, z } = player.location; - // Make sure nobody climbs over the wall - if (x > overworldSize || x < -overworldSize || z > overworldSize || z < -overworldSize) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You have reached the world border.`); - const teleportToBorder = (x, z) => { - const safe = safetyProtocol(player, x, y, z); - setTimer(player.id); - player.teleport({ x: x, y: safe, z: z }, { dimension: player.dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - }; - const targetX = x < -overworldSize ? -border + 6 : x >= overworldSize ? border - 6 : x; - const targetZ = z < -overworldSize ? -border + 6 : z >= overworldSize ? border - 6 : z; - teleportToBorder(targetX, targetZ); - } - } - // Nether - if (player.dimension.id === "minecraft:nether") { - const border = netherSize - 3; - const { x, y, z } = player.location; - // Make sure nobody climbs over the wall - if (x > netherSize || x < -netherSize || z > netherSize || z < -netherSize) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You have reached the world border.`); - const teleportToBorder = (x, z) => { - const safe = safetyProtocol(player, x, y, z); - setTimer(player.id); - player.teleport({ x: x, y: safe, z: z }, { dimension: player.dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - }; - const targetX = x < -netherSize ? -border + 6 : x >= netherSize ? border - 6 : x; - const targetZ = z < -netherSize ? -border + 6 : z >= netherSize ? border - 6 : z; - teleportToBorder(targetX, targetZ); - } - } - // Nether - if (player.dimension.id === "minecraft:the_end") { - const border = endSize - 3; - const { x, y, z } = player.location; - // Make sure nobody climbs over the wall - if (x > endSize || x < -endSize || z > endSize || z < -endSize) { - sendMsgToPlayer(player, `§f§4[§6Paradox§4]§f You have reached the world border.`); - const teleportToBorder = (x, z) => { - const safe = safetyProtocol(player, x, y, z); - setTimer(player.id); - player.teleport({ x: x, y: safe, z: z }, { dimension: player.dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - }; - const targetX = x < -endSize ? -border + 6 : x >= endSize ? border - 6 : x; - const targetZ = z < -endSize ? -border + 6 : z >= endSize ? border - 6 : z; - teleportToBorder(targetX, targetZ); - } - } - } -} -/** - * We store the identifier in a variable - * to cancel the execution of this scheduled run - * if needed to do so. - */ -export function WorldBorder() { - const worldborderId = system.runInterval(() => { - worldborder(worldborderId); - }, 20); -} diff --git a/build/scripts/penrose/WorldInitializeAfterEvent/registry.js b/build/scripts/penrose/WorldInitializeAfterEvent/registry.js deleted file mode 100644 index 33e16a6..0000000 --- a/build/scripts/penrose/WorldInitializeAfterEvent/registry.js +++ /dev/null @@ -1,173 +0,0 @@ -import { world, DynamicPropertiesDefinition, MinecraftEntityTypes } from "@minecraft/server"; -import config from "../../data/config.js"; -import { UUID } from "../../util.js"; -export const dynamicPropertyRegistry = new Map(); -function registry(data) { - // World instance - const property = new DynamicPropertiesDefinition(); - // Entity instance - const personal = new DynamicPropertiesDefinition(); - /** - * Define property first - * Register property second - * Set property third - */ - // Boolean properties - const defineBooleanProperties = [ - "ops_b", - "flya_b", - "xraya_b", - "antikb_b", - "hotbar_b", - "jesusa_b", - "reacha_b", - "reachb_b", - "speeda_b", - "salvage_b", - "antispam_b", - "clearlag_b", - "crashera_b", - "lockdown_b", - "spammera_b", - "spammerb_b", - "spammerc_b", - "stackban_b", - "antifalla_b", - "chatranks_b", - "antinukera_b", - "creativegm_b", - "namespoofa_b", - "namespoofb_b", - "survivalgm_b", - "adventuregm_b", - "antishulker_b", - "badpackets1_b", - "badpackets2_b", - "worldborder_b", - "illegallores_b", - "antiscaffolda_b", - "illegalitemsa_b", - "illegalitemsb_b", - "illegalitemsc_b", - "invalidsprinta_b", - "bedrockvalidate_b", - "illegalenchantment_b", - "showrules_b", - "kickondecline_b", - "autoban_b", - "autoclicker_b", - "antikillaura_b", - "afk_b", - "antiphasea_b", - ]; - // String properties - const defineStringProperties = ["hash", "salt"]; - // Number properties - const defineNumberProperties = ["worldborder_n", "worldborder_nether_n", "worldborder_end_n"]; - // Define booleans (property) - const defineBooleanLength = defineBooleanProperties.length; - for (let b = 0; b < defineBooleanLength; b++) { - property.defineBoolean(defineBooleanProperties[b]); - } - // Define strings (personal) - const defineStringLength = defineStringProperties.length; - for (let s = 0; s < defineStringLength; s++) { - personal.defineString(defineStringProperties[s], 50); - } - // Define numbers (property) - const defineNumberLength = defineNumberProperties.length; - for (let n = 0; n < defineNumberLength; n++) { - property.defineNumber(defineNumberProperties[n]); - } - /** - * This is global security for strings where applicable - */ - property.defineString("crypt", 50); - // Register Defined properties in world globally - data.propertyRegistry.registerWorldDynamicProperties(property); - // Register Defined properties in entity globally - data.propertyRegistry.registerEntityTypeDynamicProperties(personal, MinecraftEntityTypes.player); - let flag = false; - // Loop through the identifiers in the array - defineBooleanProperties.forEach((booleanProp) => { - // Verify if identifier matches any module property in config - const objectEntriesModules = Object.entries(config.modules); - for (const [configProperty, configPropertyValue] of objectEntriesModules) { - if (booleanProp.replaceAll(/(_b)/g, "") === configProperty.toLowerCase()) { - // Loop through the settings of each property in module - const objectEntriesValues = Object.entries(configPropertyValue); - for (const [setting, settingValue] of objectEntriesValues) { - if (setting === "enabled") { - // We conditionally test if the dynamic property already exists - const test = world.getDynamicProperty(booleanProp); - if (test === undefined) { - // Dynamic property doesn't exist so we create it with the default settings in config - world.setDynamicProperty(booleanProp, settingValue); - // Set property with value as an element that we can use in other scripts - dynamicPropertyRegistry.set(booleanProp, settingValue); - } - else { - // Dynamic property exists so set property with value as an element that we can use in other scripts - dynamicPropertyRegistry.set(booleanProp, test); - } - } - // If a matching boolean property is found, set the flag and break out of the loop - flag = true; - break; - } - } - } - // If no matching boolean property was found, execute the else block - if (!flag) { - // We conditionally test if the dynamic property already exists - const test = world.getDynamicProperty(booleanProp); - if (test === undefined) { - // Dynamic property doesn't exist so we create it and disable it by default - world.setDynamicProperty(booleanProp, false); - // Set property with value as an element that we can use in other scripts - dynamicPropertyRegistry.set(booleanProp, false); - } - else { - // Dynamic property exists so set property with value as an element that we can use in other scripts - dynamicPropertyRegistry.set(booleanProp, test); - } - } - flag = false; // reset the flag for the next iteration - }); - // Set additional properties for world border - const worldborder_n = world.getDynamicProperty("worldborder_n"); - if (worldborder_n === undefined) { - world.setDynamicProperty("worldborder_n", config.modules.worldBorder.overworld); - dynamicPropertyRegistry.set("worldborder_n", config.modules.worldBorder.overworld); - } - else { - dynamicPropertyRegistry.set("worldborder_n", worldborder_n); - } - const worldborderNether_n = world.getDynamicProperty("worldborder_nether_n"); - if (worldborderNether_n === undefined) { - world.setDynamicProperty("worldborder_nether_n", config.modules.worldBorder.nether); - dynamicPropertyRegistry.set("worldborder_nether_n", config.modules.worldBorder.nether); - } - else { - dynamicPropertyRegistry.set("worldborder_nether_n", worldborderNether_n); - } - const worldborderEnd_n = world.getDynamicProperty("worldborder_end_n"); - if (worldborderEnd_n === undefined) { - world.setDynamicProperty("worldborder_end_n", config.modules.worldBorder.end); - dynamicPropertyRegistry.set("worldborder_end_n", config.modules.worldBorder.end); - } - else { - dynamicPropertyRegistry.set("worldborder_end_n", worldborderEnd_n); - } - /** - * This is global security for strings where applicable - */ - const salt = world.getDynamicProperty("crypt"); - if (salt === undefined) { - world.setDynamicProperty("crypt", UUID.generate()); - } -} -const Registry = () => { - world.afterEvents.worldInitialize.subscribe((data) => registry(data)); -}; -export { Registry }; diff --git a/build/scripts/util.js b/build/scripts/util.js deleted file mode 100644 index df161f1..0000000 --- a/build/scripts/util.js +++ /dev/null @@ -1,587 +0,0 @@ -import { GameMode, Vector, world } from "@minecraft/server"; -import config from "./data/config.js"; -import { kickablePlayers } from "./kickcheck.js"; -import CryptoJS from "./node_modules/crypto-es/lib/index.js"; -const overworld = world.getDimension("overworld"); -const timerMap = new Map(); -function onPlayerLogout(event) { - // Remove the player's data from the map when they log off - const playerName = event.playerId; - timerMap.delete(playerName); -} -world.afterEvents.playerLeave.subscribe(onPlayerLogout); -/** - * Flag players who trigger certain checks or sub-checks, with information about the type of hack, the item involved, and any debug information available. - * - * @name flag - * @param {Player} player - The player object - * @param {string} check - What check ran the function. - * @param {string} checkType - What sub-check ran the function (ex. a, b ,c). - * @param {string} hackType - What the hack is considered as (ex. movement, combat, exploit). - * @param {string} item - Item object. - * @param {number} stack - Item object stack. - * @param {string} debugName - Name for the debug value. - * @param {string} debug - Debug info. - * @param {boolean} shouldTP - Whever to tp the player to itself. - */ -export function flag(player, check, checkType, hackType, item, stack, debugName, debug, shouldTP) { - if (shouldTP && check !== "Crasher") { - player.teleport(new Vector(player.location.x, player.location.y, player.location.z), { dimension: player.dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - } - else if (shouldTP && check === "Crasher") { - player.teleport({ x: 30000000, y: 30000000, z: 30000000 }, { dimension: player.dimension, rotation: { x: 0, y: 0 }, facingLocation: { x: 0, y: 0, z: 0 }, checkForBlocks: false, keepVelocity: false }); - } - setScore(player, `${check.toLowerCase()}vl`, 1, true); - if (debug) { - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f ${player.name}§7§6(${hackType}) §4${check}/${checkType} §7(${debugName}=${debug})§4を検知しました!!§5 検知回数= ${getScore(check.toLowerCase() + "vl", player)}`); - } - else if (item && stack) { - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f ${player.name}§7§6(${hackType}) §4${check}/${checkType} §7(${item.replace("minecraft:", "")}=${stack})§4を検知しました!!§5 検知回数= ${getScore(check.toLowerCase() + "vl", player)}`); - } - else { - sendMsg("@a[tag=notify]", `§f§4[§6Paradox§4]§f ${player.name}§7§6(${hackType}) §4${check}/${checkType}を検知しました!!§5 検知回数= ${getScore(check.toLowerCase() + "vl", player)}`); - } - if (check === "Namespoof") { - player.runCommandAsync(`kick "${player.name}" §f\n\n§4[§6Paradox§4]§f あなたの名前には不正な文字が含まれています!`).catch(() => { - // If we can't kick them with /kick, then we instantly despawn them - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - }); - } -} -/** - * This function sends a kick message to a banned player, including the banning moderator and reason. If ban appeals are enabled, a Discord link will also be included in the message. If the player cannot be kicked, they will be despawned instantly. - * - * @name banMessage - * @param {Player} player - The player object - */ -export function banMessage(player) { - const tags = player.getTags(); - let reason; - let by; - for (const tag of tags) { - if (tag.startsWith("By:")) { - by = tag.slice(3); - } - else if (tag.startsWith("Reason:")) { - reason = tag.slice(7); - } - } - if (config.modules.banAppeal.enabled === true) { - player.runCommandAsync(`kick "${player.name}" §f\n§l§4サーバーから追放されました!!!§r\n§4[§6検知内容§4]§f: ${by || "§7N/A"}\n§4[§6BAN理由§4]§f: ${reason || "§7N/A"}\n§b${config.modules.banAppeal.discordLink}`).catch(() => { - // If we can't kick them with /kick, then we instantly despawn them - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - }); - } - else { - player.runCommandAsync(`kick "${player.name}" §f\n§l§4あなたはサーバーから追放されました\n§r\n§4[§6検知内容§4]§f: ${by || "§7N/A"}\n§4[§6BAN理由§4]§f: ${reason || "§7N/A"}`).catch(() => { - // If we can't kick them with /kick, then we instantly despawn them - kickablePlayers.add(player); - player.triggerEvent("paradox:kick"); - }); - } - // Notify staff that a player was banned - sendMsg("@a[tag=paradoxOpped]", [`§f§4[§6Paradox§4]§f ${player.name}はBANされました`, `§4[§6検知内容§4]§f: ${by || "§7N/A"}`, `§4[§6BAN理由§4]§f: ${reason || "§7N/A"}`]); -} -/** - * Returns the score of a player in the specified scoreboard objective. - * - * @name getScore - * @param {string} objective - Scoreboard objective - * @param {Player} player - The player object - */ -export function getScore(objective, player) { - try { - return world.scoreboard.getObjective(objective).getScore(player.scoreboardIdentity); - } - catch (error) { - return 0; - } -} -/** - * Sets a players score. - * - * @name setScore - * @param {Player} target The player object. - * @param {string} objective Scoreboard objective. - * @param {number} amount The number to set it to. - * @param {boolean} stack If true, it will be added instead of set. Default false. - * @returns {number} The score it was set to. - */ -export function setScore(target, objective, amount, stack = false) { - const scoreObj = world.scoreboard.getObjective(objective); - if (scoreObj) { - const isParticipant = !!scoreObj.getParticipants().some((participant) => participant.id === target.scoreboardIdentity.id); - if (!isParticipant) { - target.runCommand(`scoreboard players add @s ${objective} 0`); - } - const score = isParticipant ? scoreObj.getScore(target.scoreboardIdentity) : 0; - const result = stack ? score + amount : amount; - scoreObj.setScore(target.scoreboardIdentity, result); - return result; - } - else { - return 0; - } -} -/** - * Gets the prefix tag of a player, if it exists. - * - * @name getPrefix - * @param {Player} player - The player object - */ -export function getPrefix(player) { - const tags = player.getTags(); - let customprefix = null; - for (const tag of tags) { - if (tag.startsWith("Prefix:")) { - customprefix = tag.replace("Prefix:", ""); - break; - } - } - config.customcommands.prefix = customprefix || config.customcommands.prefix; - return config.customcommands.prefix; -} -/** - * Resets the rank tag of a player by removing any tags starting with "Rank:". - * - * @name resetTag - * @param {Player} member - The other player object - */ -export function resetTag(member) { - const sanitize = member.getTags(); - for (const tag of sanitize) { - if (tag.startsWith("Rank:")) { - member.removeTag(tag); - } - } - sendMsg("@a[tag=paradoxOpped]", `§f§4[§6Paradox§4]§f ${member.name} のランクをリセットしました`); -} -/** - * Fast UUID generator, RFC4122 version 4 compliant. - * - * @author Jeff Ward (jcward.com). - * @license MIT license - * @link http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 - **/ -export const UUID = (() => { - const lut = []; - for (let i = 0; i < 256; i++) { - lut[i] = (i < 16 ? "0" : "") + i.toString(16); - } - return { - generate: () => { - const d0 = (Math.random() * 0x100000000) >>> 0; - const d1 = (Math.random() * 0x100000000) >>> 0; - const d2 = (Math.random() * 0x100000000) >>> 0; - const d3 = (Math.random() * 0x100000000) >>> 0; - return (lut[d0 & 0xff] + - lut[(d0 >> 8) & 0xff] + - lut[(d0 >> 16) & 0xff] + - lut[(d0 >> 24) & 0xff] + - "-" + - lut[d1 & 0xff] + - lut[(d1 >> 8) & 0xff] + - "-" + - lut[((d1 >> 16) & 0x0f) | 0x40] + - lut[(d1 >> 24) & 0xff] + - "-" + - lut[(d2 & 0x3f) | 0x80] + - lut[(d2 >> 8) & 0xff] + - "-" + - lut[(d2 >> 16) & 0xff] + - lut[(d2 >> 24) & 0xff] + - lut[d3 & 0xff] + - lut[(d3 >> 8) & 0xff] + - lut[(d3 >> 16) & 0xff] + - lut[(d3 >> 24) & 0xff]); - }, - }; -})(); -/** - * Validates whether a given string is a valid UUID. - * - * @param {string} uuid - The string to validate as a UUID. - * @returns {boolean} - Returns true if the string is a valid UUID, false otherwise. - */ -export function isValidUUID(uuid) { - // Regular expression to match the UUID pattern - const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; - // Test if the UUID matches the pattern and return the result - return uuidRegex.test(uuid); -} -/** - * Takes a string and converts it to camelCase. - * - * @name toCamelCase - * @param {string} str - Takes strings and converts to camelCase - */ -export function toCamelCase(str) { - const regExp = /[^a-zA-Z0-9]+(.)/gi; - return str.replace(regExp, (match) => { - return match[1].toUpperCase(); - }); -} -/** - * Takes a string and converts it to PascalCase. - * - * @name toCamelCase - * @param {string} str - Takes strings and converts to PascalCase - */ -export function toPascalCase(str) { - const camelCase = toCamelCase(str); - return camelCase.charAt(0).toUpperCase() + camelCase.slice(1); -} -/** - * Converts a string in snake_case format to Title Case format. - * - * @name titleCase - * @param {*} s - Takes snakeCase and converts it to Title Case - * @returns - */ -export const titleCase = (s) => s.replace(/^[-_]*(.)/, (_, c) => c.toUpperCase()).replace(/[-_]+(.)/g, (_, c) => " " + c.toUpperCase()); -/** - * Hashes a given string with the specified salt value using SHA-3 (SHA3-256) encryption. - * - * @name crypto - * @param {string | number | boolean} salt - Hashes information - * @param {string} text - String to be hashed - */ -export const crypto = (salt, text) => { - // Convert the salt to a string representation - const saltString = String(salt); - // Combine salt and text - const combinedString = saltString + text; - // Hash the combined string using SHA-3 (SHA3-256) - const hash = CryptoJS.SHA3(combinedString, { outputLength: 256 }).toString(); - // Ensure it is no more than 50 characters as set for dynamic property strings - return hash.substring(0, 50); -}; -/** - * Encrypts a string using AES encryption with the specified salt as the key. - * - * @name encryptString - * @param {string} str - The string to encrypt - * @param {string} salt - The salt to use as the key for encryption - * @returns {string} The encrypted string - */ -export function encryptString(str, salt) { - const encrypted = CryptoJS.AES.encrypt(str, salt).toString(); - return "1337" + encrypted; -} -/** - * Decrypts a string using AES encryption with the specified salt as the key. - * - * @name decryptString - * @param {string} str - The string to decrypt - * @param {string} salt - The salt to use for decryption - * @returns {string} The decrypted string - */ -export function decryptString(str, salt) { - // Remove the prefix added in the encryptString function - str = str.slice(4); - // Decrypt using AES - const decryptedBytes = CryptoJS.AES.decrypt(str, salt); - // Convert the decrypted bytes to a UTF-8 string - const plaintext = decryptedBytes.toString(CryptoJS.enc.Utf8); - return plaintext; -} -/** - * Sets a timer for a given player. - * - * @param player - A string representing the player for whom the timer is being set. - * @param spawn - An optional boolean parameter with a default value of `false`. - * If `spawn` is set to `true`, the timer will be set for 10 seconds; - * otherwise, it will be set for 2 seconds. - */ -export function setTimer(player, spawn = false) { - let timer = 0; - if (spawn === true) { - // Set a timer for 10 seconds - timer = Date.now() + 10000; - } - else { - // Set a timer for 2 seconds - timer = Date.now() + 2000; - } - // Store the timer in the map - timerMap.set(player, timer); -} -/** - * Checks if the timer for the specified player has expired. - * - * @param player - A string representing the player whose timer will be checked. - * @returns A boolean value indicating whether the timer has expired (`true`) or not (`false`). - */ -export function isTimerExpired(player) { - // Get the timer for the player - const timer = timerMap.get(player); - // If the timer doesn't exist, assume it's expired - if (!timer) { - return true; - } - // Check if the timer has expired - if (Date.now() > timer) { - timerMap.delete(player); - return true; - } - return false; -} -/** - * Get the gamemode of a given player - * @param player - The player to get the gamemode of - * @returns The gamemode of the player as a string, or undefined if the player is not found - */ -export function getGamemode(player) { - // Loop through each gamemode in the GameMode enum - const gamemodeValues = Object.values(GameMode); - for (const gameMode of gamemodeValues) { - // Use world.getPlayers() to get an iterator of all players in the world with the same name and game mode as the given player - const gameModePlayer = world.getPlayers({ name: player.name, gameMode }); - // If a player is found with the given name and game mode, return the corresponding string representation of the gamemode - if (gameModePlayer.length > 0) { - switch (gameMode) { - case GameMode.creative: - return "creative"; - case GameMode.survival: - return "survival"; - case GameMode.adventure: - return "adventure"; - case GameMode.spectator: - return "spectator"; - } - } - } - // If no matching player is found, return undefined - return undefined; -} -/** - * Sends a message to one or multiple targets in Minecraft. - * - * @param targets The target or array of targets to send the messages to. - * @param message The message to send. This can be a string or an array of strings. - */ -export const sendMsg = async (targets, message) => { - const targetsArray = Array.isArray(targets) ? targets : [targets]; - const isArray = Array.isArray(message); - const modifiedMessage = isArray ? message.map((msg) => msg.replace(/§f/g, "§f§o")) : message.replace(/§f/g, "§f§o"); - // Loop through each target and send the message - for (const target of targetsArray) { - overworld.runCommandAsync(`tellraw ${/^ *@[spear]( *\[.*\] *)?$|^ *("[^"]+"|\S+) *$/.test(target) ? target : JSON.stringify(target)} {"rawtext":[{"text":${JSON.stringify(modifiedMessage)}}]}`); - } -}; -/** - * Sends a message to a player in Minecraft. - * - * @param target The player to send the message to. - * @param message The message to send. This can be a string or an array of strings. - */ -export const sendMsgToPlayer = async (target, message) => { - const isArray = Array.isArray(message); - let modifiedMessage; - if (isArray) { - modifiedMessage = message.map((msg) => msg.replace(/§f/g, "§f§o")).join("\n"); - } - else { - modifiedMessage = message.replace(/§f/g, "§f§o"); - } - target.runCommandAsync(`tellraw @s {"rawtext":[{"text":${JSON.stringify("\n" + modifiedMessage)}}]}`); -}; -export const chatChannels = {}; -export const playerChannelMap = {}; -/** - * Create a new chat channel. - * - * @param {string} channelName - Name of the chat channel to create. - * @param {string} [password] - Password for the chat channel (optional). - * @param {Player} owner - Player who owns the chat channel. - * @return {boolean} - Returns true if the chat channel was successfully created, false if it already exists. - */ -export function createChatChannel(channelName, password, owner) { - if (!chatChannels[channelName]) { - const newChannel = { - owner, - password, - members: new Set([owner]), - }; - chatChannels[channelName] = newChannel; - playerChannelMap[owner] = channelName; // Update player-to-channel mapping - return true; - } - return false; -} -/** - * Invite a player to join a chat channel. - * - * @param {string} playerName - Name of the player to invite. - * @param {string} channelName - Name of the chat channel to invite to. - * @return {boolean} - Returns true if the invitation was successful, false if the chat channel doesn't exist or the player is already a member. - */ -export function inviteToChatChannel(playerName, channelName) { - const chatChannel = chatChannels[channelName]; - const playerObject = getPlayerByName(playerName); - if (chatChannel && !chatChannel.members.has(playerObject.id)) { - chatChannel.members.add(playerObject.id); - playerChannelMap[playerObject.id] = channelName; - return true; - } - return false; -} -/** - * Switch the chat channel for a player. - * - * @param {Player} playerName - The player switching chat channel. - * @param {string} channelName - The name of the channel to switch to. - * @param {string} [password] - The password for the channel (optional). - * @return {string|boolean} - Returns the new chat channel name if successful, "already_in_channel" if the player is already in a channel, "wrong_password" if the password is incorrect, or false if not successful. - */ -export function switchChatChannel(playerName, channelName, password) { - const channel = chatChannels[channelName]; - if (channel) { - if (channel.password && password !== channel.password) { - return "wrong_password"; - } - if (channel.members.has(playerName)) { - return "already_in_channel"; - } - channel.members.add(playerName); - playerChannelMap[playerName] = channelName; // Update player-to-channel mapping - if (channel.owner === null) { - channel.owner = playerName; - } - return channelName; - } - return false; -} -/** - * Get the chat channel name associated with a player. - * - * @param {string} playerName - The name of the player. - * @returns {string|null} The name of the player's chat channel, or null if not found. - */ -export function getPlayerChannel(playerName) { - return playerChannelMap[playerName] || null; -} -/** - * Get a player by their name. - * - * @param {string} playerName - Name of the player to get. - * @return {Player|null} - The Player object if found, null if not found. - */ -export function getPlayerByName(playerName) { - const players = world.getPlayers(); - for (const player of players) { - if (player.name.toLowerCase().replace(/"|\\|@/g, "") === playerName.toLowerCase().replace(/"|\\|@/g, "")) { - return player; - } - } - return null; -} -/** - * Get a player by their unique identifier. - * - * @param {string} playerId - Unique identifier of the player to get. - * @return {Player|null} - The Player object if found, null if not found. - */ -export function getPlayerById(playerId) { - const players = world.getPlayers(); - for (const player of players) { - if (player.id === playerId) { - return player; - } - } - return null; -} -/** - * Transfer ownership of a chat channel to another player. - * - * @param {string} channelName - The name of the channel to transfer ownership of. - * @param {Player} currentOwner - The current owner of the channel. - * @param {string} newOwnerName - The name of the new owner. - * @returns {boolean|string} - Returns true if ownership is successfully transferred, "not_owner" if the current player is not the owner, or "target_not_found" if the new owner is not found. - */ -export function handOverChannelOwnership(channelName, currentOwner, newOwnerName) { - const channel = chatChannels[channelName]; - if (channel) { - if (channel.owner !== currentOwner.id) { - return "not_owner"; - } - const newOwner = getPlayerByName(newOwnerName); - if (!newOwner) { - return "target_not_found"; - } - channel.owner = newOwner.id; - // Update playerChannelMap to reflect the new owner - playerChannelMap[currentOwner.id] = null; - playerChannelMap[newOwner.id] = channelName; - return true; - } - return false; -} -/** - * Delete an existing chat channel. - * - * @param {string} channelName - Name of the chat channel to delete. - * @param {string} [password] - Password for the chat channel (optional, required if channel has a password). - * @return {boolean | "wrong_password"} - Returns true if the chat channel was successfully deleted, false if it doesn't exist, or "wrong_password" if the provided password is incorrect. - */ -export function deleteChatChannel(channelName, password) { - const channel = chatChannels[channelName]; - if (channel) { - if (channel.password) { - // Check if the provided password matches the channel's password - if (password !== channel.password) { - return "wrong_password"; // Return "wrong_password" if the password is incorrect - } - } - // Convert the Set to an array and clear the channel efficiently - const membersArray = Array.from(channel.members); - membersArray.forEach((thisMember) => { - const thisPlayer = getPlayerById(thisMember); - // Let members know that this channel no longer exists - sendMsgToPlayer(thisPlayer, `§f§4[§6Paradox§4]§f '${channelName}' は解散した.`); - playerChannelMap[thisMember] = null; - }); - if (playerChannelMap[channel.owner] === channelName) { - playerChannelMap[channel.owner] = null; - } - delete chatChannels[channelName]; - return true; - } - return false; -} -//returns channel list along with if a password is required. -export function listChatChannels() { - const channelList = []; - for (const channelName in chatChannels) { - const channel = chatChannels[channelName]; - const hasPassword = channel.password ? "Yes" : "No"; - channelList.push({ - channelName, - hasPassword, - }); - } - return channelList; -} -export const allscores = [ - "autoclickervl", - "badpacketsvl", - "killauravl", - "flyvl", - "illegalitemsvl", - "cbevl", - "gamemodevl", - "spammervl", - "namespoofvl", - "speedvl", - "crashervl", - "reachvl", - "invalidsprintvl", - "armorvl", - "antikbvl", - "antifallvl", - "nukervl", - "scaffoldvl", - "antiphasevl", -]; diff --git a/build/scripts/version.js b/build/scripts/version.js deleted file mode 100644 index c147a6b..0000000 --- a/build/scripts/version.js +++ /dev/null @@ -1,3 +0,0 @@ -export default { - version: "3.3.4", -}; diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..9239561 --- /dev/null +++ b/manifest.json @@ -0,0 +1,41 @@ +{ + "format_version": 2, + "header": { + "name": "Paradox日本語版!!", + "description": "Paradoxv3.3.4.1 Beta 日本語版です!!編集者:こう君", + "uuid": "0b9c3761-e4ba-402d-ae00-fec098ef18ba", + "version": [3, 3, 3], + "min_engine_version": [1, 20, 10] + }, + "metadata": { + "authors": ["MrDiamond64, Visual1mpact, Koukunn_"], + "license": "GPLv3", + "url": "https://github.com/Visual1mpact/Paradox_AntiCheat" + }, + "modules": [ + { + "type": "data", + "uuid": "8637e7b7-340f-40ba-816f-dd87ff44b97e", + "version": [1, 0, 0] + }, + { + "description": "Paradox AntiCheat Gametest Features", + "language": "javascript", + "type": "script", + "uuid": "8abbc147-2d85-4748-bad5-a3f58cfe9ea0", + "version": [0, 0, 1], + "entry": "scripts/paradox.js" + } + ], + "dependencies": [ + { + "module_name": "@minecraft/server", + "version": "1.4.0-beta" + }, + { + "module_name": "@minecraft/server-ui", + "version": "1.2.0-beta" + } + ], + "capabilities": ["script_eval"] +} diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 5072c3d..014e0f6 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -6,28 +6,32 @@ "packages": { "node_modules/@minecraft/server": { "version": "1.4.0-beta.1.20.10-stable", - "resolved": "https://registry.npmjs.org/@minecraft/server/-/server-1.4.0-beta.1.20.10-stable.tgz", - "integrity": "sha512-GFxR3rc83fLG4G1QV51D6a7V1EylomZrUMO1oUNINhkMpNBe2ACA9CBpLpkixxg0Y3aDpUnTkuhjQpoMnekPSA==" + "license": "MIT" }, "node_modules/@minecraft/server-ui": { "version": "1.2.0-beta.1.20.10-stable", - "resolved": "https://registry.npmjs.org/@minecraft/server-ui/-/server-ui-1.2.0-beta.1.20.10-stable.tgz", - "integrity": "sha512-ciStJuaHMxQhddJzZPiaJJBi6LjVEugr5LoamUaQhdd2qfgILAz/k3Nfwsx7YYDSTrg6jmMrAj4+Na5IJ7VITw==", + "license": "MIT", "dependencies": { "@minecraft/server": "^1.4.0-beta.1.20.10-stable" } }, "node_modules/7zip-bin": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "engines": { + "node": ">=0.4" + } }, "node_modules/prettier": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -40,8 +44,7 @@ }, "node_modules/typescript": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6641b96 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,72 @@ +{ + "name": "paradox-anticheat", + "version": "3.3.4", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "paradox-anticheat", + "version": "3.3.4", + "hasInstallScript": true, + "dependencies": { + "@minecraft/server": "1.4.0-beta.1.20.10-stable", + "@minecraft/server-ui": "1.2.0-beta.1.20.10-stable", + "i": "^0.3.7", + "typescript": "5.1.6" + }, + "devDependencies": { + "7zip-bin": "5.2.0", + "prettier": "3.0.0" + } + }, + "node_modules/@minecraft/server": { + "version": "1.4.0-beta.1.20.10-stable", + "license": "MIT" + }, + "node_modules/@minecraft/server-ui": { + "version": "1.2.0-beta.1.20.10-stable", + "license": "MIT", + "dependencies": { + "@minecraft/server": "^1.4.0-beta.1.20.10-stable" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/prettier": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + } + } +} diff --git a/package.json b/package.json index f196031..9596bac 100644 --- a/package.json +++ b/package.json @@ -5,14 +5,14 @@ "description": "A utility to fight against malicious hackers on Bedrock Edition", "private": true, "devDependencies": { - "prettier": "3.0.0", - "7zip-bin": "5.2.0" + "7zip-bin": "5.2.0", + "prettier": "3.0.0" }, "dependencies": { - "@minecraft/server-ui": "1.2.0-beta.1.20.10-stable", "@minecraft/server": "1.4.0-beta.1.20.10-stable", + "@minecraft/server-ui": "1.2.0-beta.1.20.10-stable", + "i": "^0.3.7", "typescript": "5.1.6" - }, "prettier": { "trailingComma": "es5",