From 0489f09464f99387cbbba84ba19754b390dae785 Mon Sep 17 00:00:00 2001 From: Illyrius Date: Mon, 17 Nov 2025 16:30:08 +0100 Subject: [PATCH 1/3] init Signed-off-by: Illyrius --- ..._paper_paper_api_1_21_10_R0_1_SNAPSHOT.xml | 1 - .../vanillaplus/VanillaPlusBootstrap.kt | 11 ++++++ .../vanillaplus/hooks/NyctophobiaHook.kt | 34 +++++++++++++++++++ .../vanillaplus/modules/PlayerModule.kt | 3 ++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/org/xodium/vanillaplus/hooks/NyctophobiaHook.kt diff --git a/.idea/libraries/Gradle__io_papermc_paper_paper_api_1_21_10_R0_1_SNAPSHOT.xml b/.idea/libraries/Gradle__io_papermc_paper_paper_api_1_21_10_R0_1_SNAPSHOT.xml index 603dada4b..e421723b2 100644 --- a/.idea/libraries/Gradle__io_papermc_paper_paper_api_1_21_10_R0_1_SNAPSHOT.xml +++ b/.idea/libraries/Gradle__io_papermc_paper_paper_api_1_21_10_R0_1_SNAPSHOT.xml @@ -7,7 +7,6 @@ - \ No newline at end of file diff --git a/src/main/kotlin/org/xodium/vanillaplus/VanillaPlusBootstrap.kt b/src/main/kotlin/org/xodium/vanillaplus/VanillaPlusBootstrap.kt index fa704d08d..fba4a70f1 100644 --- a/src/main/kotlin/org/xodium/vanillaplus/VanillaPlusBootstrap.kt +++ b/src/main/kotlin/org/xodium/vanillaplus/VanillaPlusBootstrap.kt @@ -17,6 +17,7 @@ import org.xodium.vanillaplus.enchantments.NightVisionEnchantment import org.xodium.vanillaplus.enchantments.NimbusEnchantment import org.xodium.vanillaplus.enchantments.PickupEnchantment import org.xodium.vanillaplus.enchantments.ReplantEnchantment +import java.util.* /** Main bootstrap class of the plugin. */ @Suppress("UnstableApiUsage", "Unused") @@ -104,6 +105,16 @@ internal class VanillaPlusBootstrap : PluginBootstrap { addToTag(EnchantmentTagKeys.IN_ENCHANTING_TABLE, enchants) } } + registerEventHandler( + LifecycleEvents.DATAPACK_DISCOVERY.newHandler { event -> + try { + val uri = Objects.requireNonNull(this.javaClass.getResource("/nyctophobia")).toURI() + event.registrar().discoverPack(uri, "provided") + } catch (e: Exception) { + e.printStackTrace() + } + }, + ) } } } diff --git a/src/main/kotlin/org/xodium/vanillaplus/hooks/NyctophobiaHook.kt b/src/main/kotlin/org/xodium/vanillaplus/hooks/NyctophobiaHook.kt new file mode 100644 index 000000000..6dc1fb651 --- /dev/null +++ b/src/main/kotlin/org/xodium/vanillaplus/hooks/NyctophobiaHook.kt @@ -0,0 +1,34 @@ +package org.xodium.vanillaplus.hooks + +import net.kyori.adventure.audience.Audience +import net.kyori.adventure.resource.ResourcePackInfo +import net.kyori.adventure.resource.ResourcePackRequest +import org.xodium.vanillaplus.utils.ExtUtils.mm +import java.net.URI + +/** A utility object for checking datapack availability and handling related dependencies. */ +object NyctophobiaHook { + val PACK_INFO = + ResourcePackInfo + .resourcePackInfo() + .uri( + URI.create( + "https://cdn.modrinth.com/data/Q2HFmuJV/versions/xe548JsZ/Nyctophobia%20Resourcepack%20V1.5%20%5BOPTIFINE%5D.zip", + ), + ).build() + + /** + * Sends the Nyctophobia resource pack to the specified audience. + * @param target The audience to send the resource pack to. + */ + fun sendResourcePack(target: Audience) { + target.sendResourcePacks( + ResourcePackRequest + .resourcePackRequest() + .packs(PACK_INFO) + .prompt("This Resource Pack is required to play on this server.".mm()) + .required(true) + .build(), + ) + } +} diff --git a/src/main/kotlin/org/xodium/vanillaplus/modules/PlayerModule.kt b/src/main/kotlin/org/xodium/vanillaplus/modules/PlayerModule.kt index 070fc8647..a24bac17d 100644 --- a/src/main/kotlin/org/xodium/vanillaplus/modules/PlayerModule.kt +++ b/src/main/kotlin/org/xodium/vanillaplus/modules/PlayerModule.kt @@ -29,6 +29,7 @@ import org.xodium.vanillaplus.data.CommandData import org.xodium.vanillaplus.enchantments.NightVisionEnchantment import org.xodium.vanillaplus.enchantments.PickupEnchantment import org.xodium.vanillaplus.enchantments.ReplantEnchantment +import org.xodium.vanillaplus.hooks.NyctophobiaHook import org.xodium.vanillaplus.interfaces.ModuleInterface import org.xodium.vanillaplus.pdcs.PlayerPDC.nickname import org.xodium.vanillaplus.utils.ExtUtils.mm @@ -85,6 +86,8 @@ internal class PlayerModule( val player = event.player + NyctophobiaHook.sendResourcePack(player) + player.displayName(player.nickname?.mm()) if (config.i18n.playerJoinMsg.isEmpty()) return From c014fd09b6144e4167231818798330f4b4557434 Mon Sep 17 00:00:00 2001 From: Illyrius Date: Mon, 17 Nov 2025 16:42:53 +0100 Subject: [PATCH 2/3] refactor: simplify null checks by using requireNonNull for resource retrieval Signed-off-by: Illyrius --- .../kotlin/org/xodium/vanillaplus/VanillaPlusBootstrap.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/org/xodium/vanillaplus/VanillaPlusBootstrap.kt b/src/main/kotlin/org/xodium/vanillaplus/VanillaPlusBootstrap.kt index fba4a70f1..e880b8a55 100644 --- a/src/main/kotlin/org/xodium/vanillaplus/VanillaPlusBootstrap.kt +++ b/src/main/kotlin/org/xodium/vanillaplus/VanillaPlusBootstrap.kt @@ -17,7 +17,7 @@ import org.xodium.vanillaplus.enchantments.NightVisionEnchantment import org.xodium.vanillaplus.enchantments.NimbusEnchantment import org.xodium.vanillaplus.enchantments.PickupEnchantment import org.xodium.vanillaplus.enchantments.ReplantEnchantment -import java.util.* +import java.util.Objects.requireNonNull /** Main bootstrap class of the plugin. */ @Suppress("UnstableApiUsage", "Unused") @@ -108,7 +108,7 @@ internal class VanillaPlusBootstrap : PluginBootstrap { registerEventHandler( LifecycleEvents.DATAPACK_DISCOVERY.newHandler { event -> try { - val uri = Objects.requireNonNull(this.javaClass.getResource("/nyctophobia")).toURI() + val uri = requireNonNull(javaClass.getResource("/nyctophobia")).toURI() event.registrar().discoverPack(uri, "provided") } catch (e: Exception) { e.printStackTrace() From 9dba3c0acac7eca7d792ae3bc273b744e47326a7 Mon Sep 17 00:00:00 2001 From: Illyrius Date: Mon, 17 Nov 2025 16:44:48 +0100 Subject: [PATCH 3/3] feat: add initial implementation of Nyctophobia datapack with grue mechanics and darkness effects Signed-off-by: Illyrius --- .../data/minecraft/tags/function/load.json | 5 ++ .../data/minecraft/tags/function/tick.json | 5 ++ .../nycto/function/difficulty/easy.mcfunction | 1 + .../nycto/function/difficulty/hard.mcfunction | 1 + .../function/difficulty/normal.mcfunction | 1 + .../nycto/function/grue/despawn.mcfunction | 7 +++ .../data/nycto/function/grue/give.mcfunction | 1 + .../data/nycto/function/grue/hurt.mcfunction | 4 ++ .../data/nycto/function/grue/main.mcfunction | 7 +++ .../data/nycto/function/grue/sound.mcfunction | 4 ++ .../data/nycto/function/grue/spawn.mcfunction | 4 ++ .../data/nycto/function/load.mcfunction | 18 +++++++ .../player/darkness/inside.mcfunction | 16 ++++++ .../player/darkness/outside.mcfunction | 13 +++++ .../nycto/function/player/register.mcfunction | 3 ++ .../nycto/function/player/warn.mcfunction | 7 +++ .../data/nycto/function/tick.mcfunction | 20 +++++++ .../data/nycto/function/tick_20t.mcfunction | 8 +++ .../data/nycto/loot_table/rng/1-2.json | 23 ++++++++ .../data/nycto/loot_table/rng/1-3.json | 23 ++++++++ .../data/nycto/loot_table/rng/1-6.json | 23 ++++++++ .../data/nycto/predicate/in_darkness.json | 11 ++++ .../data/nycto/predicate/soundchance.json | 4 ++ .../data/nycto/tags/block/nonsolid.json | 49 ++++++++++++++++++ src/main/resources/nyctophobia/pack.mcmeta | 6 +++ src/main/resources/nyctophobia/pack.png | Bin 0 -> 45056 bytes 26 files changed, 264 insertions(+) create mode 100644 src/main/resources/nyctophobia/data/minecraft/tags/function/load.json create mode 100644 src/main/resources/nyctophobia/data/minecraft/tags/function/tick.json create mode 100644 src/main/resources/nyctophobia/data/nycto/function/difficulty/easy.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/difficulty/hard.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/difficulty/normal.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/grue/despawn.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/grue/give.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/grue/hurt.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/grue/main.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/grue/sound.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/grue/spawn.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/load.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/player/darkness/inside.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/player/darkness/outside.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/player/register.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/player/warn.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/tick.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/function/tick_20t.mcfunction create mode 100644 src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-2.json create mode 100644 src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-3.json create mode 100644 src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-6.json create mode 100644 src/main/resources/nyctophobia/data/nycto/predicate/in_darkness.json create mode 100644 src/main/resources/nyctophobia/data/nycto/predicate/soundchance.json create mode 100644 src/main/resources/nyctophobia/data/nycto/tags/block/nonsolid.json create mode 100644 src/main/resources/nyctophobia/pack.mcmeta create mode 100644 src/main/resources/nyctophobia/pack.png diff --git a/src/main/resources/nyctophobia/data/minecraft/tags/function/load.json b/src/main/resources/nyctophobia/data/minecraft/tags/function/load.json new file mode 100644 index 000000000..1b15e9006 --- /dev/null +++ b/src/main/resources/nyctophobia/data/minecraft/tags/function/load.json @@ -0,0 +1,5 @@ +{ + "values": [ + "nycto:load" + ] +} \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/minecraft/tags/function/tick.json b/src/main/resources/nyctophobia/data/minecraft/tags/function/tick.json new file mode 100644 index 000000000..f379be8b9 --- /dev/null +++ b/src/main/resources/nyctophobia/data/minecraft/tags/function/tick.json @@ -0,0 +1,5 @@ +{ + "values": [ + "nycto:tick" + ] +} \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/difficulty/easy.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/difficulty/easy.mcfunction new file mode 100644 index 000000000..8689550fb --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/difficulty/easy.mcfunction @@ -0,0 +1 @@ +scoreboard players set .diff grue.diff 1 \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/difficulty/hard.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/difficulty/hard.mcfunction new file mode 100644 index 000000000..30a7bbf83 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/difficulty/hard.mcfunction @@ -0,0 +1 @@ +scoreboard players set .diff grue.diff 3 \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/difficulty/normal.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/difficulty/normal.mcfunction new file mode 100644 index 000000000..73ea2d3b0 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/difficulty/normal.mcfunction @@ -0,0 +1 @@ +scoreboard players set .diff grue.diff 2 \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/grue/despawn.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/grue/despawn.mcfunction new file mode 100644 index 000000000..20001b858 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/grue/despawn.mcfunction @@ -0,0 +1,7 @@ +particle smoke ~ ~ ~ 0.5 0.5 0.5 0 600 normal +execute store result score @s grue.rng run loot spawn ~ ~ ~ loot nycto:rng/1-3 +execute if score @s grue.rng matches 1 run playsound minecraft:grue.snarl1 hostile @a ~ ~ ~ 1 +execute if score @s grue.rng matches 2 run playsound minecraft:grue.snarl2 hostile @a ~ ~ ~ 1 +execute if score @s grue.rng matches 3 run playsound minecraft:grue.snarl3 hostile @a ~ ~ ~ 1 +tp @s ~ ~-256 ~ +kill @s \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/grue/give.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/grue/give.mcfunction new file mode 100644 index 000000000..b22bb98d3 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/grue/give.mcfunction @@ -0,0 +1 @@ +give @p husk_spawn_egg{EntityTag:{CanBreakDoors:1,DeathLootTable:"minecraft:entities/allay",CustomName:'[{"text":"Unknown"}]',Health:800,Silent:1b,Tags:["grue.gruemob"],active_effects:[{id:"minecraft:invisibility",duration:1000000,amplifier:1,show_particles:0b}],ArmorItems:[{},{},{},{id:"string",tag:{CustomModelData:557001},Count:1}],ArmorDropChances:[0f,0f,0f,0.00f],Attributes:[{Name:"generic.movement_speed",Base:0.5d},{Name:"generic.attack_damage",Base:500d},{Name:"generic.max_health",Base:800d}]},display:{Name:'[{"text":"Grue Spawn Egg","italic":false}]'}} 1 \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/grue/hurt.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/grue/hurt.mcfunction new file mode 100644 index 000000000..7c7142c2a --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/grue/hurt.mcfunction @@ -0,0 +1,4 @@ +execute store result score @s grue.rng run loot spawn ~ ~ ~ loot nycto:rng/1-2 + +execute if score @s grue.rng matches 1 run playsound minecraft:grue.hurt1 hostile @a ~ ~ ~ 1 +execute if score @s grue.rng matches 2 run playsound minecraft:grue.hurt2 hostile @a ~ ~ ~ 1 \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/grue/main.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/grue/main.mcfunction new file mode 100644 index 000000000..431f88697 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/grue/main.mcfunction @@ -0,0 +1,7 @@ +execute unless predicate nycto:in_darkness run function nycto:grue/despawn + +execute unless entity @a[distance=..30] run function nycto:grue/despawn +execute if entity @a[distance=..30,gamemode=!creative,gamemode=!spectator,nbt={active_effects:[{id:"minecraft:night_vision"}]}] run function nycto:grue/despawn + +execute as @s[nbt={HurtTime:10s}] at @s run function nycto:grue/hurt + diff --git a/src/main/resources/nyctophobia/data/nycto/function/grue/sound.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/grue/sound.mcfunction new file mode 100644 index 000000000..7d0392eef --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/grue/sound.mcfunction @@ -0,0 +1,4 @@ +execute store result score @s grue.rng run loot spawn ~ ~ ~ loot nycto:rng/1-3 +execute if score @s grue.rng matches 1 run playsound minecraft:grue.growl1 hostile @a ~ ~ ~ 1 +execute if score @s grue.rng matches 2 run playsound minecraft:grue.growl2 hostile @a ~ ~ ~ 1 +execute if score @s grue.rng matches 3 run playsound minecraft:grue.growl3 hostile @a ~ ~ ~ 1 \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/grue/spawn.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/grue/spawn.mcfunction new file mode 100644 index 000000000..71d27f608 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/grue/spawn.mcfunction @@ -0,0 +1,4 @@ +summon husk ~ ~ ~ {Silent:1b,Health:800f,CanBreakDoors:1b,Tags:["grue.gruemob"],CustomName:'{"text":"Unknown"}',ArmorItems:[{},{},{},{id:"string",components:{custom_model_data:557001},count:1}],ArmorDropChances:[0.000F,0.000F,0.000F,0.000F],active_effects:[{id:"minecraft:invisibility",amplifier:1,duration:1000000,show_particles:0b}],attributes:[{id:"minecraft:generic.attack_damage",base:500},{id:"minecraft:generic.max_health",base:800},{id:"minecraft:generic.movement_speed",base:0.5}]} +playsound minecraft:grue.growl1 hostile @a ~ ~ ~ 1 +execute as @a[distance=..8] at @s run playsound minecraft:grue.spawn hostile @s ~ ~ ~ 0.8 +execute as @a[distance=9..30] at @s run playsound minecraft:grue.mistake hostile @s ~ ~ ~ 0.8 \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/load.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/load.mcfunction new file mode 100644 index 000000000..18c66d833 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/load.mcfunction @@ -0,0 +1,18 @@ +# - Schedules + +schedule clear nycto:tick_20t +schedule function nycto:tick_20t 20t + +function nycto:difficulty/normal + +# - Scoreboards + +scoreboard objectives add grue.darknesstimer dummy +scoreboard objectives add grue.rng dummy +scoreboard objectives add grue.diff dummy + +# - Settings + + + +# - General \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/player/darkness/inside.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/player/darkness/inside.mcfunction new file mode 100644 index 000000000..8ebddeff1 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/player/darkness/inside.mcfunction @@ -0,0 +1,16 @@ +# Runs every tick the player is in light level 0 as the player inside + +execute if score @s grue.darknesstimer matches 1.. run scoreboard players remove @s grue.darknesstimer 1 + +execute if score @s grue.darknesstimer matches 375 run playsound minecraft:grue.warning hostile @s ~ ~ ~ 0.8 + +execute if score @s grue.darknesstimer matches 238 run function nycto:player/warn + +execute if score @s grue.darknesstimer matches 238 run effect give @s darkness 2 4 true +execute if score @s grue.darknesstimer matches 100 run effect give @s darkness 2 8 true +execute if score @s grue.darknesstimer matches 1 run effect give @s darkness 8 15 true +execute if score @s grue.darknesstimer matches 1 run effect give @s blindness 8 1 true +execute if score .diff grue.diff matches 3 if score @s grue.darknesstimer matches 1 run effect give @s slowness 8 2 true + +execute if score @s grue.darknesstimer matches 1 run function nycto:grue/spawn +tag @s[tag=!nycto.indarkness] add nycto.indarkness \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/player/darkness/outside.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/player/darkness/outside.mcfunction new file mode 100644 index 000000000..0c9c15559 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/player/darkness/outside.mcfunction @@ -0,0 +1,13 @@ +playsound minecraft:grue.escape hostile @s[tag=nycto.indarkness,scores={grue.darknesstimer=1..330}] + +title @s[tag=nycto.indarkness,scores={grue.darknesstimer=1..150}] actionbar [{"text": "You escaped... This time","color": "dark_red"}] + + +execute if score .diff grue.diff matches 1 run scoreboard players set @s grue.darknesstimer 580 +execute if score .diff grue.diff matches 2 run scoreboard players set @s grue.darknesstimer 455 +execute if score .diff grue.diff matches 3 run scoreboard players set @s grue.darknesstimer 378 + + +stopsound @s hostile minecraft:grue.warning + +tag @s[tag=nycto.indarkness] remove nycto.indarkness \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/player/register.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/player/register.mcfunction new file mode 100644 index 000000000..3a237521b --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/player/register.mcfunction @@ -0,0 +1,3 @@ +scoreboard players set @s grue.darknesstimer 455 + +tag @s add nycto.registered \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/player/warn.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/player/warn.mcfunction new file mode 100644 index 000000000..d31661822 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/player/warn.mcfunction @@ -0,0 +1,7 @@ +execute store result score @s grue.rng run loot spawn ~ ~ ~ loot nycto:rng/1-6 +execute if score @s grue.rng matches 1 run title @s actionbar [{"text": "Breathing is heard in the darkness","color": "dark_gray"}] +execute if score @s grue.rng matches 2 run title @s actionbar [{"text": "You feel as though you are being watched","color": "dark_gray"}] +execute if score @s grue.rng matches 3 run title @s actionbar [{"text": "A horrible chill creeps down your spine","color": "dark_gray"}] +execute if score @s grue.rng matches 4 run title @s actionbar [{"text": "You feel an unshakable sense of unease","color": "dark_gray"}] +execute if score @s grue.rng matches 5 run title @s actionbar [{"text": "You sense danger in the cloak of darkness","color": "dark_gray"}] +execute if score @s grue.rng matches 6 run title @s actionbar [{"text": "Heavy breathing approaches slowly","color": "dark_gray"}] \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/tick.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/tick.mcfunction new file mode 100644 index 000000000..4fba8ea3f --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/tick.mcfunction @@ -0,0 +1,20 @@ +## --------------------------- +## +## Nyctophobia - Tick Function +## Do not redistribute without permission +## +## --------------------------- + +# - New Player + +execute as @a[tag=!nycto.registered] at @s run function nycto:player/register + +# - Darkness - # + +execute as @a[predicate=nycto:in_darkness,gamemode=!spectator,gamemode=!creative,nbt=!{active_effects:[{id:"minecraft:night_vision"}]}] at @s if block ~ ~ ~ #nycto:nonsolid run function nycto:player/darkness/inside +execute as @a[predicate=!nycto:in_darkness] at @s run function nycto:player/darkness/outside +execute as @a[nbt={active_effects:[{id:"minecraft:night_vision"}]}] at @s run function nycto:player/darkness/outside + +# - Grue + +execute as @e[type=husk,tag=grue.gruemob] at @s run function nycto:grue/main \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/function/tick_20t.mcfunction b/src/main/resources/nyctophobia/data/nycto/function/tick_20t.mcfunction new file mode 100644 index 000000000..3158d7a7f --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/function/tick_20t.mcfunction @@ -0,0 +1,8 @@ +# - Grue + +execute as @e[type=husk,tag=grue.gruemob] at @s if predicate nycto:soundchance run function nycto:grue/sound + + +# Rerun + +schedule function nycto:tick_20t 20t \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-2.json b/src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-2.json new file mode 100644 index 000000000..1c5478d38 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-2.json @@ -0,0 +1,23 @@ +{ + "pools": [ + { + "rolls": { + "min": 1, + "max": 2 + }, + "entries": [ + { + "type": "item", + "weight": 1, + "name": "minecraft:stone_button", + "functions": [ + { + "function": "set_count", + "count": 0 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-3.json b/src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-3.json new file mode 100644 index 000000000..778395296 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-3.json @@ -0,0 +1,23 @@ +{ + "pools": [ + { + "rolls": { + "min": 1, + "max": 3 + }, + "entries": [ + { + "type": "item", + "weight": 1, + "name": "minecraft:stone_button", + "functions": [ + { + "function": "set_count", + "count": 0 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-6.json b/src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-6.json new file mode 100644 index 000000000..5d6a5300a --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/loot_table/rng/1-6.json @@ -0,0 +1,23 @@ +{ + "pools": [ + { + "rolls": { + "min": 1, + "max": 6 + }, + "entries": [ + { + "type": "item", + "weight": 1, + "name": "minecraft:stone_button", + "functions": [ + { + "function": "set_count", + "count": 0 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/predicate/in_darkness.json b/src/main/resources/nyctophobia/data/nycto/predicate/in_darkness.json new file mode 100644 index 000000000..1a68c29be --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/predicate/in_darkness.json @@ -0,0 +1,11 @@ +{ + "condition": "minecraft:location_check", + "predicate": { + "light": { + "light": { + "min": 0, + "max": 1 + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/predicate/soundchance.json b/src/main/resources/nyctophobia/data/nycto/predicate/soundchance.json new file mode 100644 index 000000000..eea971be5 --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/predicate/soundchance.json @@ -0,0 +1,4 @@ +{ + "condition": "minecraft:random_chance", + "chance": 0.35 +} \ No newline at end of file diff --git a/src/main/resources/nyctophobia/data/nycto/tags/block/nonsolid.json b/src/main/resources/nyctophobia/data/nycto/tags/block/nonsolid.json new file mode 100644 index 000000000..f6f381b8d --- /dev/null +++ b/src/main/resources/nyctophobia/data/nycto/tags/block/nonsolid.json @@ -0,0 +1,49 @@ +{ + "values": [ + "air", + "cave_air", + "void_air", + "water", + "lava", + "#wool_carpets", + "#banners", + "#buttons", + "#candles", + "#cave_vines", + "#climbable", + "#signs", + "#fire", + "#crops", + "#pressure_plates", + "#saplings", + "#minecraft:small_flowers", + "#minecraft:tall_flowers", + "#rails", + "sculk_vein", + "snow", + "short_grass", + "tall_grass", + "kelp", + "bubble_column", + "torch", + "wall_torch", + "soul_torch", + "soul_wall_torch", + "redstone_wire", + "redstone_torch", + "redstone_wall_torch", + "dead_bush", + "red_mushroom", + "brown_mushroom", + "warped_fungus", + "crimson_fungus", + "sugar_cane", + "lever", + "fern", + "large_fern", + "warped_roots", + "crimson_roots", + "hanging_roots", + "nether_sprouts" + ] +} \ No newline at end of file diff --git a/src/main/resources/nyctophobia/pack.mcmeta b/src/main/resources/nyctophobia/pack.mcmeta new file mode 100644 index 000000000..92374d9c0 --- /dev/null +++ b/src/main/resources/nyctophobia/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 48, + "description": "Nyctophobia Datapack" + } +} \ No newline at end of file diff --git a/src/main/resources/nyctophobia/pack.png b/src/main/resources/nyctophobia/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1aa92b042f043fb9ee396b2416c61fe9fd3e61 GIT binary patch literal 45056 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