diff --git a/src/main/java/fr/openmc/api/datapacks/OMCDatapack.java b/src/main/java/fr/openmc/api/datapacks/OMCDatapack.java index 2352a1b9b..f81f8a335 100644 --- a/src/main/java/fr/openmc/api/datapacks/OMCDatapack.java +++ b/src/main/java/fr/openmc/api/datapacks/OMCDatapack.java @@ -1,9 +1,12 @@ package fr.openmc.api.datapacks; import fr.openmc.api.datapacks.injectors.PackMetadataInjector; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.utils.FilesUtils; import io.papermc.paper.plugin.bootstrap.BootstrapContext; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import lombok.Getter; +import org.bukkit.Bukkit; import java.io.IOException; import java.net.URI; @@ -19,26 +22,38 @@ public class OMCDatapack { private final String namespace; private final Set injectors = new HashSet<>(); + public final String ID_DATAPACK_INJECTED = "openmc-injected"; + private final String ID_TEMP_DATAPACK_FOLDER = "datapacks-openmc"; + public OMCDatapack(String packName, String namespace) { this.packName = packName; this.namespace = namespace; } - public void build(BootstrapContext context) throws IOException { - Path tempDir = Files.createTempDirectory("datapacks-openmc"); + public void buildBootstrap(BootstrapContext context, boolean generateFiles) throws IOException { + Path dir; + + if (generateFiles) { + dir = context.getDataDirectory().resolve(ID_TEMP_DATAPACK_FOLDER); + + FilesUtils.deleteDirectory(dir.toFile()); + Files.createDirectories(dir); + } else { + dir = Files.createTempDirectory(ID_TEMP_DATAPACK_FOLDER); + } - runInjector(tempDir, new PackMetadataInjector()); + runInjector(dir, new PackMetadataInjector()); for (DatapackInjector injector : injectors) { - runInjector(tempDir, injector); + runInjector(dir, injector); } context.getLifecycleManager().registerEventHandler(LifecycleEvents.DATAPACK_DISCOVERY.newHandler( event -> { try { - URI uri = tempDir.toUri(); + URI uri = dir.toUri(); - event.registrar().discoverPack(uri, "openmc-injected"); + event.registrar().discoverPack(uri, ID_DATAPACK_INJECTED); } catch (IOException e) { throw new RuntimeException(e); } @@ -46,10 +61,63 @@ public void build(BootstrapContext context) throws IOException { )); } + /** + * Dangeureux à utiliser, veillez bien que serveur restart apres, car les registres nms de minecraft + * (pas reloadable, ex worldgen/biome et worldgen/..) ne peuvent pas etre reload. et donc vous pourrez pas acceder à vos valeures + * @param onBuilded execute une action lorsque le datapack est build (par ex redemarrer le serveur si y'a des registres pas reloadable affecté) + * @throws IOException + */ + public void buildRuntime(Runnable onBuilded) throws IOException { + Path dir = OMCPlugin.getInstance().getServer() + .getLevelDirectory() + .resolve("datapacks") + .resolve(ID_TEMP_DATAPACK_FOLDER); + + cleanupRumtime(); + Files.createDirectories(dir); + + runInjector(dir, new PackMetadataInjector()); + + for (DatapackInjector injector : injectors) { + runInjector(dir, injector); + } + + Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), onBuilded, 20L); + } + + public void cleanupBootstrap(BootstrapContext context) throws IOException { + Path dataDir = context.getDataDirectory().toFile() + .toPath() + .toAbsolutePath() + .normalize(); // * ex /home/container/plugins/OpenMC + + Path serverRoot = dataDir.getParent() // * plugins/ + .getParent(); // * /container + + Path dir = serverRoot + .resolve("world") // * /container/world + .resolve("datapacks") // * /container/datapacks + .resolve(ID_TEMP_DATAPACK_FOLDER); + FilesUtils.deleteDirectory(dir.toFile()); + } + + public void cleanupRumtime() throws IOException { + Path dir = OMCPlugin.getInstance().getServer().getLevelDirectory() + .resolve("datapacks") + .resolve(ID_TEMP_DATAPACK_FOLDER); + FilesUtils.deleteDirectory(dir.toFile()); + } + public void addInjector(DatapackInjector injector) { injectors.add(injector); } + public void addInjector(Iterable injectors) { + for (DatapackInjector injector : injectors) { + addInjector(injector); + } + } + private static void runInjector(Path datapackRoot, DatapackInjector injector) { injector.inject(datapackRoot.toFile()); } diff --git a/src/main/java/fr/openmc/api/datapacks/builders/BiomeBuilder.java b/src/main/java/fr/openmc/api/datapacks/builders/BiomeBuilder.java new file mode 100644 index 000000000..fa577c49f --- /dev/null +++ b/src/main/java/fr/openmc/api/datapacks/builders/BiomeBuilder.java @@ -0,0 +1,183 @@ +package fr.openmc.api.datapacks.builders; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import lombok.Getter; + +import java.util.function.Consumer; + +/** + * Exemple simple d'un biome: + * { + * "attributes": {}, + * "carvers": [], + * "creature_spawn_probability": 0.03, + * "downfall": 0, + * "effects": { + * "foliage_color": "#9e814d", + * "grass_color": "#90814d", + * "water_color": "#3f76e4", + * "dry_foliage_color": "", + * "grass_color_modifier": "none" + * }, + * "features": [], + * "has_precipitation": false, + * "spawn_costs": {}, + * "spawners": {}, + * "temperature": 2 + * } + */ +public final class BiomeBuilder { + private JsonObject attributes = new JsonObject(); + private final JsonArray carvers = new JsonArray(); + @Getter + private final JsonObject effects = new JsonObject(); + private final JsonArray features = new JsonArray(); + private final JsonObject spawnCosts = new JsonObject(); + private final JsonObject spawners = new JsonObject(); + private String temperatureModifier = "none"; + private Double creatureSpawnProbability = 0.03; + private Float downfall = 0.5f; + private Float temperatures = 0.5f; + private Boolean hasPrecipitation = true; + + public BiomeBuilder attributes(EnvironnementAttributeBuilder builder) { + this.attributes = builder.getOutputData(); + return this; + } + + public BiomeBuilder carver(String id) { + this.carvers.add(id); + return this; + } + + public BiomeBuilder features(JsonElement id) { + this.features.add(id); + return this; + } + + public BiomeBuilder temperatureModifier(String id) { + this.temperatureModifier =id; + return this; + } + + public BiomeBuilder creatureSpawnProbability(Double value) { + this.creatureSpawnProbability=value; + return this; + } + + public BiomeBuilder downfall(Float value) { + this.downfall=value; + return this; + } + + public BiomeBuilder effects(Consumer builder) { + JsonObject obj = new JsonObject(); + builder.accept(obj); + for (var entry : obj.entrySet()) { + this.effects.add(entry.getKey(), entry.getValue()); + } + return this; + } + + public BiomeBuilder waterColor(String color) { + this.effects.addProperty("water_color", color); + return this; + } + + public BiomeBuilder grassColor(String color) { + this.effects.addProperty("grass_color", color); + return this; + } + + public BiomeBuilder foliageColor(String color) { + this.effects.addProperty("foliage_color", color); + return this; + } + + public BiomeBuilder dryFoliageColor(String color) { + this.effects.addProperty("dry_foliage_color", color); + return this; + } + + public BiomeBuilder waterColor(Integer color) { + this.effects.addProperty("water_color", color); + return this; + } + + public BiomeBuilder grassColor(Integer color) { + this.effects.addProperty("grass_color", color); + return this; + } + + public BiomeBuilder foliageColor(Integer color) { + this.effects.addProperty("foliage_color", color); + return this; + } + + public BiomeBuilder dryFoliageColor(Integer color) { + this.effects.addProperty("dry_foliage_color", color); + return this; + } + + /** + * Set la grass color modifier + * @param id none, dark_forest, swamp + * @return le builder + */ + public BiomeBuilder grassColorModifier(String id) { + this.effects.addProperty("grass_color_modifier", id); + return this; + } + + public BiomeBuilder spawnCosts(Consumer builder) { + JsonObject obj = new JsonObject(); + builder.accept(obj); + for (var entry : obj.entrySet()) { + this.spawnCosts.add(entry.getKey(), entry.getValue()); + } + return this; + } + + public BiomeBuilder spawnCosts(JsonObject spawnCosts) { + for (var entry : spawnCosts.entrySet()) { + this.spawnCosts.add(entry.getKey(), entry.getValue()); + } + return this; + } + + public BiomeBuilder spawners(JsonObject spawners) { + for (var entry : spawners.entrySet()) { + this.spawners.add(entry.getKey(), entry.getValue()); + } + return this; + } + + public BiomeBuilder temperatures(Float value) { + this.temperatures=value; + return this; + } + + public BiomeBuilder hasPrecipitation(Boolean bool) { + this.hasPrecipitation=bool; + return this; + } + + public JsonObject toJson() { + JsonObject json = new JsonObject(); + if (attributes != null) json.add("attributes", attributes); + if (temperatureModifier != null) json.addProperty("temperature_modifier", temperatureModifier); + if (creatureSpawnProbability != null) json.addProperty("creature_spawn_probability", creatureSpawnProbability); + if (carvers != null) json.add("carvers", carvers); + if (downfall != null) json.addProperty("downfall", downfall); + if (effects != null) json.add("effects", effects); + if (features != null) json.add("features", features); + if (hasPrecipitation != null) json.addProperty("has_precipitation", hasPrecipitation); + if (spawnCosts != null) json.add("spawn_costs", spawnCosts); + if (spawners != null) json.add("spawners", spawners); + if (temperatures != null) json.addProperty("temperature", temperatures); + + return json; + } +} diff --git a/src/main/java/fr/openmc/api/datapacks/builders/DimensionTypeBuilder.java b/src/main/java/fr/openmc/api/datapacks/builders/DimensionTypeBuilder.java new file mode 100644 index 000000000..d09c5b354 --- /dev/null +++ b/src/main/java/fr/openmc/api/datapacks/builders/DimensionTypeBuilder.java @@ -0,0 +1,190 @@ +package fr.openmc.api.datapacks.builders; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import fr.openmc.api.datapacks.injectors.TimelinesInjector; +import net.minecraft.world.level.dimension.DimensionType; + +/** + * Exemple simple d'un dimension type : + * { + * "attributes": {}, + * "ambient_light": 0, + * "coordinate_scale": 1, + * "default_clock": "minecraft:overworld", + * "has_ceiling": false, + * "has_ender_dragon_fight": false, + * "has_skylight": true, + * "has_fixed_time": true, + * "skybox": "overworld", + * "cardinal_light": "default", + * "height": 384, + * "infiniburn": "#minecraft:infiniburn_overworld", + * "logical_height": 384, + * "min_y": -64, + * "monster_spawn_block_light_limit": 0, + * "monster_spawn_light_level": { + * "type": "minecraft:uniform", + * "max_inclusive": 7, + * "min_inclusive": 0 + * }, + * "timelines": "#minecraft:in_overworld" + * } + */ +public final class DimensionTypeBuilder { + private JsonObject attributes; + private Double ambientLight = 0.0; + private Double coordinateScale = 1.0; + private String defaultClock = "overworld"; + private Boolean hasCeiling = false; + private Boolean hasEnderDragonFlight = false; + private Boolean hasSkylight = true; + private Boolean hasFixedTime = false; + private String skybox = "overworld"; + private String cardinalLight = "default"; + private Integer height = 384; + private String infiniburn = "#infiniburn_overworld"; + private Integer logicalHeight = 384; + private Integer minY = -64; + private Integer monsterSpawnBlockLightLimit = 0; + private JsonElement monsterSpawnLightLevel = new JsonPrimitive(0); + private String timelines = "#minecraft:in_overworld"; + + public DimensionTypeBuilder attributesBuilder(EnvironnementAttributeBuilder builder) { + this.attributes = builder.getOutputData(); + return this; + } + + public DimensionTypeBuilder ambientLight(double ambientLight) { + this.ambientLight = ambientLight; + return this; + } + + public DimensionTypeBuilder coordinateScale(double coordinateScale) { + this.coordinateScale = coordinateScale; + return this; + } + + public DimensionTypeBuilder defaultClock(String keyOfClock) { + this.defaultClock = keyOfClock; + return this; + } + + public DimensionTypeBuilder hasCeiling(boolean hasCeiling) { + this.hasCeiling = hasCeiling; + return this; + } + + public DimensionTypeBuilder hasEnderDragonFlight(boolean hasEnderDragonFlight) { + this.hasEnderDragonFlight = hasEnderDragonFlight; + return this; + } + + public DimensionTypeBuilder hasSkylight(boolean hasSkylight) { + this.hasSkylight = hasSkylight; + return this; + } + + public DimensionTypeBuilder hasFixedTime(boolean hasFixedTime) { + this.hasFixedTime = hasFixedTime; + return this; + } + + public DimensionTypeBuilder skybox(String skybox) { + this.skybox = skybox; + return this; + } + + public DimensionTypeBuilder skybox(DimensionType.Skybox skybox) { + return skybox(skybox.getSerializedName()); + } + + public DimensionTypeBuilder cardinalLight(String cardinalLight) { + this.cardinalLight = cardinalLight; + return this; + } + + public DimensionTypeBuilder height(int height) { + this.height = height; + return this; + } + + public DimensionTypeBuilder infiniburn(String infiniburn) { + this.infiniburn = infiniburn; + return this; + } + + public DimensionTypeBuilder logicalHeight(int logicalHeight) { + this.logicalHeight = logicalHeight; + return this; + } + + public DimensionTypeBuilder minY(int minY) { + this.minY = minY; + return this; + } + + public DimensionTypeBuilder monsterSpawnBlockLightLimit(int limit) { + this.monsterSpawnBlockLightLimit = limit; + return this; + } + + public DimensionTypeBuilder monsterSpawnLightLevelUniform(int minInclusive, int maxInclusive) { + JsonObject uniform = new JsonObject(); + uniform.addProperty("type", "minecraft:uniform"); + uniform.addProperty("min_inclusive", minInclusive); + uniform.addProperty("max_inclusive", maxInclusive); + this.monsterSpawnLightLevel = uniform; + return this; + } + + public DimensionTypeBuilder monsterSpawnLightLevel(int level) { + this.monsterSpawnLightLevel = new JsonPrimitive(level); + return this; + } + + public DimensionTypeBuilder monsterSpawnLightLevel(JsonElement monsterSpawnLightLevel) { + this.monsterSpawnLightLevel = monsterSpawnLightLevel; + return this; + } + + public DimensionTypeBuilder timelines(String timelines) { + this.timelines = timelines; + return this; + } + + public DimensionTypeBuilder timelines(TimelinesInjector injector) { + this.timelines = injector.getNamespace() + ":" + injector.getId(); + return this; + } + + public JsonObject toJson() { + JsonObject json = new JsonObject(); + if (attributes != null) json.add("attributes", attributes); + if (ambientLight != null) json.addProperty("ambient_light", ambientLight); + if (coordinateScale != null) json.addProperty("coordinate_scale", coordinateScale); + if (defaultClock != null) json.addProperty("default_clock", defaultClock); + if (hasCeiling != null) json.addProperty("has_ceiling", hasCeiling); + if (hasEnderDragonFlight != null) json.addProperty("has_ender_dragon_fight", hasEnderDragonFlight); + if (hasSkylight != null) json.addProperty("has_skylight", hasSkylight); + if (hasFixedTime != null) json.addProperty("has_fixed_time", hasFixedTime); + if (skybox != null) json.addProperty("skybox", skybox); + if (cardinalLight != null) json.addProperty("cardinal_light", cardinalLight); + if (height != null) json.addProperty("height", height); + if (infiniburn != null) json.addProperty("infiniburn", infiniburn); + if (logicalHeight != null) json.addProperty("logical_height", logicalHeight); + if (minY != null) json.addProperty("min_y", minY); + if (monsterSpawnBlockLightLimit != null) json.addProperty("monster_spawn_block_light_limit", monsterSpawnBlockLightLimit); + if (monsterSpawnLightLevel != null) json.add("monster_spawn_light_level", monsterSpawnLightLevel); + if (timelines != null) json.addProperty("timelines", timelines); + return json; + } + + private JsonObject toOverridenEnvironnementAttribute(JsonElement value) { + JsonObject obj = new JsonObject(); + obj.addProperty("modifier", "override"); + obj.add("argument", value); + return obj; + } +} diff --git a/src/main/java/fr/openmc/api/datapacks/builders/EnvironnementAttributeBuilder.java b/src/main/java/fr/openmc/api/datapacks/builders/EnvironnementAttributeBuilder.java new file mode 100644 index 000000000..e32588f98 --- /dev/null +++ b/src/main/java/fr/openmc/api/datapacks/builders/EnvironnementAttributeBuilder.java @@ -0,0 +1,101 @@ +package fr.openmc.api.datapacks.builders; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import fr.openmc.api.datapacks.builders.sounds.AmbientSoundBuilder; +import org.bukkit.Particle; + +import java.util.function.Consumer; + +public class EnvironnementAttributeBuilder { + private final JsonObject attributes = new JsonObject(); + + public JsonObject getOutputData() { + return attributes; + } + + public EnvironnementAttributeBuilder attributes(Consumer builder) { + JsonObject obj = new JsonObject(); + builder.accept(obj); + for (var entry : obj.entrySet()) { + this.attributes.add(entry.getKey(), entry.getValue()); + } + return this; + } + + public EnvironnementAttributeBuilder attributes(JsonObject attributes) { + for (var entry : attributes.entrySet()) { + this.attributes.add(entry.getKey(), entry.getValue()); + } + return this; + } + + /** + * Ajoute un attribut "minecraft:visual/ambient_particles" simple. + * Exemple : + * "minecraft:visual/ambient_particles": [ { "particle": { "type": "minecraft:crimson_spore" }, "probability": 0.025 } ] + */ + public EnvironnementAttributeBuilder ambientParticles(String particleType, double probability) { + JsonObject entry = new JsonObject(); + JsonObject particle = new JsonObject(); + particle.addProperty("type", particleType); + entry.add("particle", particle); + entry.addProperty("probability", probability); + + String key = "minecraft:visual/ambient_particles"; + if (this.attributes.has(key)) { + this.attributes.getAsJsonArray(key).add(entry); + } else { + JsonArray arr = new JsonArray(); + arr.add(entry); + this.attributes.add(key, arr); + } + return this; + } + + /** + * { + * "particle": { + * "type": "minecraft:dust_color_transition", + * "from_color": 16776172, + * "to_color": 16766720, + * "scale": 1 + * }, + * "probability": 0.1 + * } + */ + public EnvironnementAttributeBuilder particleDustColorTransition(int fromColor, int toColor, float scale, double probability) { + JsonObject entry = new JsonObject(); + JsonObject particle = new JsonObject(); + particle.addProperty("type", "minecraft:dust_color_transition"); + particle.addProperty("from_color", fromColor); + particle.addProperty("to_color", toColor); + particle.addProperty("scale", scale); + entry.add("particle", particle); + entry.addProperty("probability", probability); + + String key = "minecraft:visual/ambient_particles"; + if (this.attributes.has(key)) { + this.attributes.getAsJsonArray(key).add(entry); + } else { + JsonArray arr = new JsonArray(); + arr.add(entry); + this.attributes.add(key, arr); + } + return this; + } + + /** + * Ajoute un attribut "minecraft:visual/ambient_particles" simple. + * Exemple : + * "minecraft:visual/ambient_particles": [ { "particle": { "type": "minecraft:crimson_spore" }, "probability": 0.025 } ] + */ + public EnvironnementAttributeBuilder ambientParticles(Particle particle, double probability) { + return ambientParticles(particle.getKey().toString(), probability); + } + + public EnvironnementAttributeBuilder ambientSounds(AmbientSoundBuilder ambientBuilder) { + this.attributes.add("audio/ambient_sounds", ambientBuilder.toJson()); + return this; + } +} diff --git a/src/main/java/fr/openmc/api/datapacks/builders/TimelineBuilder.java b/src/main/java/fr/openmc/api/datapacks/builders/TimelineBuilder.java new file mode 100644 index 000000000..bef824a5b --- /dev/null +++ b/src/main/java/fr/openmc/api/datapacks/builders/TimelineBuilder.java @@ -0,0 +1,200 @@ +package fr.openmc.api.datapacks.builders; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + * { + * "clock": "minecraft:overworld", + * "period_ticks": 24000, + * "time_markers": { + * "minecraft:day": { + * "show_in_commands": true, + * "ticks": 1000 + * }, + * "minecraft:midnight": { + * "show_in_commands": true, + * "ticks": 18000 + * }, + * "minecraft:night": { + * "show_in_commands": true, + * "ticks": 13000 + * }, + * "minecraft:noon": { + * "show_in_commands": true, + * "ticks": 6000 + * }, + * "minecraft:roll_village_siege": 18000, + * "minecraft:wake_up_from_sleep": 0 + * }, + * "tracks": { + * "minecraft:visual/sky_color": { + * "keyframes": [ + * { + * "ticks": 133, + * "value": "#ffffff" + * }, + * { + * "ticks": 11867, + * "value": "#ffffff" + * }, + * { + * "ticks": 13670, + * "value": "#000000" + * }, + * { + * "ticks": 22330, + * "value": "#000000" + * } + * ], + * "modifier": "multiply" + * } + * } + * } + */ +public final class TimelineBuilder { + private String clock = "minecraft:overworld"; + private Integer periodTicks = null; + private final Map tracks = new LinkedHashMap<>(); + private final Map timeMarkers = new LinkedHashMap<>(); + + public TimelineBuilder clock(String clock) { + this.clock = clock; + return this; + } + + public TimelineBuilder periodTicks(int periodTicks) { + this.periodTicks = periodTicks; + return this; + } + + public TimelineBuilder track(String attributeId, Consumer builder) { + TrackBuilder track = new TrackBuilder(); + builder.accept(track); + tracks.put(attributeId, track); + return this; + } + + public TimelineBuilder timeMarker(String id, int ticks) { + timeMarkers.put(id, ticks); + return this; + } + + public TimelineBuilder timeMarker(String id, int ticks, boolean showInCommands) { + JsonObject marker = new JsonObject(); + marker.addProperty("ticks", ticks); + marker.addProperty("show_in_commands", showInCommands); + timeMarkers.put(id, marker); + return this; + } + + public JsonObject toJson() { + JsonObject json = new JsonObject(); + json.addProperty("clock", clock); + if (periodTicks != null) json.addProperty("period_ticks", periodTicks); + + if (!tracks.isEmpty()) { + JsonObject tracksJson = new JsonObject(); + for (var entry : tracks.entrySet()) { + tracksJson.add(entry.getKey(), entry.getValue().toJson()); + } + json.add("tracks", tracksJson); + } + + if (!timeMarkers.isEmpty()) { + JsonObject markersJson = new JsonObject(); + for (var entry : timeMarkers.entrySet()) { + if (entry.getValue() instanceof Integer i) { + markersJson.addProperty(entry.getKey(), i); + } else if (entry.getValue() instanceof JsonObject obj) { + markersJson.add(entry.getKey(), obj); + } + } + json.add("time_markers", markersJson); + } + + return json; + } + + public final class TrackBuilder { + private String ease = null; + private JsonElement easeObject = null; + private String modifier = null; + private final List keyframes = new ArrayList<>(); + + public TrackBuilder ease(String ease) { + this.ease = ease; + return this; + } + + public TrackBuilder easeCubicBezier(double x1, double y1, double x2, double y2) { + JsonObject obj = new JsonObject(); + JsonArray bezier = new JsonArray(); + bezier.add(x1); bezier.add(y1); bezier.add(x2); bezier.add(y2); + obj.add("cubic_bezier", bezier); + this.easeObject = obj; + return this; + } + + public TrackBuilder modifier(String modifier) { + this.modifier = modifier; + return this; + } + + public TrackBuilder keyframe(int ticks, String value) { + keyframes.add(new KeyframeBuilder(ticks, new JsonPrimitive(value))); + return this; + } + + public TrackBuilder keyframe(int ticks, double value) { + keyframes.add(new KeyframeBuilder(ticks, new JsonPrimitive(value))); + return this; + } + + public TrackBuilder keyframe(int ticks, boolean value) { + keyframes.add(new KeyframeBuilder(ticks, new JsonPrimitive(value))); + return this; + } + + public TrackBuilder keyframe(int ticks, JsonElement value) { + keyframes.add(new KeyframeBuilder(ticks, value)); + return this; + } + + private JsonObject toJson() { + JsonObject json = new JsonObject(); + if (easeObject != null) { + json.add("ease", easeObject); + } else if (ease != null) { + json.addProperty("ease", ease); + } + if (modifier != null) json.addProperty("modifier", modifier); + + JsonArray kfArray = new JsonArray(); + for (KeyframeBuilder kf : keyframes) { + kfArray.add(kf.toJson()); + } + json.add("keyframes", kfArray); + return json; + } + + + + private record KeyframeBuilder(int ticks, JsonElement value) { + private JsonObject toJson() { + JsonObject json = new JsonObject(); + json.addProperty("ticks", ticks); + json.add("value", value); + return json; + } + } + } +} diff --git a/src/main/java/fr/openmc/api/datapacks/builders/sounds/AmbientSoundBuilder.java b/src/main/java/fr/openmc/api/datapacks/builders/sounds/AmbientSoundBuilder.java new file mode 100644 index 000000000..7ded7a833 --- /dev/null +++ b/src/main/java/fr/openmc/api/datapacks/builders/sounds/AmbientSoundBuilder.java @@ -0,0 +1,124 @@ +package fr.openmc.api.datapacks.builders.sounds; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; + +/** Environnement Attribute de son + * "minecraft:audio/ambient_sounds": { + * "loop": "minecraft:ambient.crimson_forest.loop", + * "mood": { + * "sound": "minecraft:ambient.basalt_deltas.additions", + * "tick_delay": 0, + * "block_search_extent": 0, + * "offset": 0 + * }, + * "additions": [ + * { + * "sound": "minecraft:ambient.basalt_deltas.loop", + * "tick_chance": 0 + * } + * ] + * } + */ +public class AmbientSoundBuilder { + private JsonElement loop; + private JsonObject mood; + private JsonObject additions; + + public AmbientSoundBuilder mood(MoodBuilder moodBuilder) { + this.mood = moodBuilder.toJson(); + return this; + } + + public AmbientSoundBuilder additions(AdditionsBuilder additionsBuilder) { + this.additions = additionsBuilder.toJson(); + return this; + } + + public AmbientSoundBuilder loop(String soundId) { + this.loop = new JsonPrimitive(soundId); + return this; + } + + public AmbientSoundBuilder loop(SoundEventBuilder soundEventBuilder) { + this.loop = soundEventBuilder.toJson(); + return this; + } + + public JsonObject toJson() { + JsonObject json = new JsonObject(); + if (mood != null) json.add("mood", mood); + if (additions != null) json.add("additions", additions); + if (loop != null) json.add("loop", loop); + return json; + } + + public static class MoodBuilder { + private Integer blockSearchExtent; + private Integer offset; + private JsonElement sound; + private Integer tickDelay; + + public MoodBuilder blockSearchExtent(int value) { + this.blockSearchExtent = value; + return this; + } + + public MoodBuilder offset(int value) { + this.offset = value; + return this; + } + + public MoodBuilder tickDelay(int value) { + this.tickDelay = value; + return this; + } + + public MoodBuilder sound(String soundId) { + this.sound = new JsonPrimitive(soundId); + return this; + } + + public MoodBuilder sound(SoundEventBuilder soundEventBuilder) { + this.sound = soundEventBuilder.toJson(); + return this; + } + + public JsonObject toJson() { + JsonObject json = new JsonObject(); + if (blockSearchExtent != null) json.addProperty("block_search_extent", blockSearchExtent); + if (offset != null) json.addProperty("offset", offset); + if (sound != null) json.add("sound", sound); + if (tickDelay != null) json.addProperty("tick_delay", tickDelay); + return json; + } + } + + public static class AdditionsBuilder { + private JsonElement sound; + private Double tickChance; + + public AdditionsBuilder sound(String soundId) { + this.sound = new JsonPrimitive(soundId); + return this; + } + + public AdditionsBuilder sound(SoundEventBuilder soundEventBuilder) { + this.sound = soundEventBuilder.toJson(); + return this; + } + + public AdditionsBuilder tickChance(double value) { + this.tickChance = value; + return this; + } + + public JsonObject toJson() { + JsonObject json = new JsonObject(); + if (sound != null) json.add("sound", sound); + if (tickChance != null) json.addProperty("tick_chance", tickChance); + return json; + } + } +} diff --git a/src/main/java/fr/openmc/api/datapacks/builders/sounds/SoundEventBuilder.java b/src/main/java/fr/openmc/api/datapacks/builders/sounds/SoundEventBuilder.java new file mode 100644 index 000000000..bba0a6667 --- /dev/null +++ b/src/main/java/fr/openmc/api/datapacks/builders/sounds/SoundEventBuilder.java @@ -0,0 +1,31 @@ +package fr.openmc.api.datapacks.builders.sounds; + +import com.google.gson.JsonObject; + +/** + * { + * "sound_id": "minecraft:music.game", + * "range": 1 + * } + */ +public class SoundEventBuilder { + private String soundId; + private Integer range; + + public SoundEventBuilder soundId(String id) { + this.soundId = id; + return this; + } + + public SoundEventBuilder range(int range) { + this.range = range; + return this; + } + + public JsonObject toJson() { + JsonObject json = new JsonObject(); + if (soundId != null) json.addProperty("sound_id", soundId); + if (range != null) json.addProperty("range", range); + return json; + } +} diff --git a/src/main/java/fr/openmc/api/datapacks/injectors/BiomesInjector.java b/src/main/java/fr/openmc/api/datapacks/injectors/BiomesInjector.java new file mode 100644 index 000000000..c263c41d1 --- /dev/null +++ b/src/main/java/fr/openmc/api/datapacks/injectors/BiomesInjector.java @@ -0,0 +1,56 @@ +package fr.openmc.api.datapacks.injectors; + +import fr.openmc.api.datapacks.DatapackInjector; +import fr.openmc.api.datapacks.builders.BiomeBuilder; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Consumer; + +/** + * Classe qui représente les données trouvable dans un biome + * Qui injecte directement cela sous forme .json dans le datapack + * ... + */ +public class BiomesInjector implements DatapackInjector { + + private final String namespace; + private final Map entries = new LinkedHashMap<>(); + + public BiomesInjector(String namespace) { + this.namespace = namespace; + } + + public BiomesInjector add(String id, Consumer builder) { + BiomeBuilder instance = new BiomeBuilder(); + builder.accept(instance); + entries.put(id, instance); + return this; + } + + public BiomesInjector add(String id, BiomeBuilder builder) { + entries.put(id, builder); + return this; + } + + @Override + public void inject(File rootFile) { + if (entries.isEmpty()) return; + + Path root = rootFile.toPath().resolve("data").resolve(namespace) + .resolve("worldgen").resolve("biome"); + try { + Files.createDirectories(root); + for (var entry : entries.entrySet()) { + Path biomeFile = root.resolve(entry.getKey() + ".json"); + Files.writeString(biomeFile, GSON.toJson(entry.getValue().toJson())); + } + } catch (IOException e) { + throw new IllegalStateException("Cannot write biome files", e); + } + } +} diff --git a/src/main/java/fr/openmc/api/datapacks/injectors/DimensionTypesInjector.java b/src/main/java/fr/openmc/api/datapacks/injectors/DimensionTypesInjector.java index 39a768ae5..c60792d8d 100644 --- a/src/main/java/fr/openmc/api/datapacks/injectors/DimensionTypesInjector.java +++ b/src/main/java/fr/openmc/api/datapacks/injectors/DimensionTypesInjector.java @@ -1,12 +1,7 @@ package fr.openmc.api.datapacks.injectors; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; import fr.openmc.api.datapacks.DatapackInjector; -import net.minecraft.world.level.dimension.DimensionType; -import org.bukkit.Particle; +import fr.openmc.api.datapacks.builders.DimensionTypeBuilder; import java.io.File; import java.io.IOException; @@ -56,214 +51,4 @@ public void inject(File rootFile) { throw new IllegalStateException("Cannot write dimension_type files", e); } } - - /** - * Exemple simple d'un dimension type : - * { - * "attributes": {}, - * "ambient_light": 0, - * "coordinate_scale": 1, - * "default_clock": "minecraft:overworld", - * "has_ceiling": false, - * "has_ender_dragon_fight": false, - * "has_skylight": true, - * "has_fixed_time": true, - * "skybox": "overworld", - * "cardinal_light": "default", - * "height": 384, - * "infiniburn": "#minecraft:infiniburn_overworld", - * "logical_height": 384, - * "min_y": -64, - * "monster_spawn_block_light_limit": 0, - * "monster_spawn_light_level": { - * "type": "minecraft:uniform", - * "max_inclusive": 7, - * "min_inclusive": 0 - * }, - * "timelines": "#minecraft:in_overworld" - * } - */ - public static final class DimensionTypeBuilder { - private JsonObject attributes; - private Double ambientLight = 0.0; - private Double coordinateScale = 1.0; - private String defaultClock = "overworld"; - private Boolean hasCeiling = false; - private Boolean hasEnderDragonFlight = false; - private Boolean hasSkylight = true; - private Boolean hasFixedTime = false; - private String skybox = "overworld"; - private String cardinalLight = "default"; - private Integer height = 384; - private String infiniburn = "#infiniburn_overworld"; - private Integer logicalHeight = 384; - private Integer minY = -64; - private Integer monsterSpawnBlockLightLimit = 0; - private JsonElement monsterSpawnLightLevel = new JsonPrimitive(0); - private String timelines = "#minecraft:in_overworld"; - - public DimensionTypeBuilder attributes(Consumer builder) { - JsonObject obj = new JsonObject(); - builder.accept(obj); - this.attributes = obj; - return this; - } - - public DimensionTypeBuilder attributes(JsonObject attributes) { - this.attributes = attributes; - return this; - } - - /** - * Ajoute un attribut "minecraft:visual/ambient_particles" simple. - * Exemple : - * "minecraft:visual/ambient_particles": [ { "particle": { "type": "minecraft:crimson_spore" }, "probability": 0.025 } ] - */ - public DimensionTypeBuilder ambientParticles(String particleType, double probability) { - if (this.attributes == null) this.attributes = new JsonObject(); - JsonObject entry = new JsonObject(); - JsonObject particle = new JsonObject(); - particle.addProperty("type", particleType); - entry.add("particle", particle); - entry.addProperty("probability", probability); - - if (this.attributes.has("minecraft:visual/ambient_particles") && this.attributes.get("minecraft:visual/ambient_particles").isJsonArray()) { - this.attributes.getAsJsonArray("minecraft:visual/ambient_particles").add(entry); - } else { - JsonArray arr = new JsonArray(); - arr.add(entry); - this.attributes.add("minecraft:visual/ambient_particles", arr); - } - return this; - } - - /** - * Ajoute un attribut "minecraft:visual/ambient_particles" simple. - * Exemple : - * "minecraft:visual/ambient_particles": [ { "particle": { "type": "minecraft:crimson_spore" }, "probability": 0.025 } ] - */ - public DimensionTypeBuilder ambientParticles(Particle particle, double probability) { - return ambientParticles(particle.getKey().toString(), probability); - } - - public DimensionTypeBuilder ambientLight(double ambientLight) { - this.ambientLight = ambientLight; - return this; - } - - public DimensionTypeBuilder coordinateScale(double coordinateScale) { - this.coordinateScale = coordinateScale; - return this; - } - - public DimensionTypeBuilder defaultClock(String keyOfClock) { - this.defaultClock = keyOfClock; - return this; - } - - public DimensionTypeBuilder hasCeiling(boolean hasCeiling) { - this.hasCeiling = hasCeiling; - return this; - } - - public DimensionTypeBuilder hasEnderDragonFlight(boolean hasEnderDragonFlight) { - this.hasEnderDragonFlight = hasEnderDragonFlight; - return this; - } - - public DimensionTypeBuilder hasSkylight(boolean hasSkylight) { - this.hasSkylight = hasSkylight; - return this; - } - - public DimensionTypeBuilder hasFixedTime(boolean hasFixedTime) { - this.hasFixedTime = hasFixedTime; - return this; - } - - public DimensionTypeBuilder skybox(String skybox) { - this.skybox = skybox; - return this; - } - - public DimensionTypeBuilder skybox(DimensionType.Skybox skybox) { - return skybox(skybox.getSerializedName()); - } - - public DimensionTypeBuilder cardinalLight(String cardinalLight) { - this.cardinalLight = cardinalLight; - return this; - } - - public DimensionTypeBuilder height(int height) { - this.height = height; - return this; - } - - public DimensionTypeBuilder infiniburn(String infiniburn) { - this.infiniburn = infiniburn; - return this; - } - - public DimensionTypeBuilder logicalHeight(int logicalHeight) { - this.logicalHeight = logicalHeight; - return this; - } - - public DimensionTypeBuilder minY(int minY) { - this.minY = minY; - return this; - } - - public DimensionTypeBuilder monsterSpawnBlockLightLimit(int limit) { - this.monsterSpawnBlockLightLimit = limit; - return this; - } - - public DimensionTypeBuilder monsterSpawnLightLevelUniform(int minInclusive, int maxInclusive) { - JsonObject uniform = new JsonObject(); - uniform.addProperty("type", "minecraft:uniform"); - uniform.addProperty("min_inclusive", minInclusive); - uniform.addProperty("max_inclusive", maxInclusive); - this.monsterSpawnLightLevel = uniform; - return this; - } - - public DimensionTypeBuilder monsterSpawnLightLevel(int level) { - this.monsterSpawnLightLevel = new JsonPrimitive(level); - return this; - } - - public DimensionTypeBuilder monsterSpawnLightLevel(JsonElement monsterSpawnLightLevel) { - this.monsterSpawnLightLevel = monsterSpawnLightLevel; - return this; - } - - public DimensionTypeBuilder timelines(String timelines) { - this.timelines = timelines; - return this; - } - - private JsonObject toJson() { - JsonObject json = new JsonObject(); - if (attributes != null) json.add("attributes", attributes); - if (ambientLight != null) json.addProperty("ambient_light", ambientLight); - if (coordinateScale != null) json.addProperty("coordinate_scale", coordinateScale); - if (defaultClock != null) json.addProperty("default_clock", defaultClock); - if (hasCeiling != null) json.addProperty("has_ceiling", hasCeiling); - if (hasEnderDragonFlight != null) json.addProperty("has_ender_dragon_fight", hasEnderDragonFlight); - if (hasSkylight != null) json.addProperty("has_skylight", hasSkylight); - if (hasFixedTime != null) json.addProperty("has_fixed_time", hasFixedTime); - if (skybox != null) json.addProperty("skybox", skybox); - if (cardinalLight != null) json.addProperty("cardinal_light", cardinalLight); - if (height != null) json.addProperty("height", height); - if (infiniburn != null) json.addProperty("infiniburn", infiniburn); - if (logicalHeight != null) json.addProperty("logical_height", logicalHeight); - if (minY != null) json.addProperty("min_y", minY); - if (monsterSpawnBlockLightLimit != null) json.addProperty("monster_spawn_block_light_limit", monsterSpawnBlockLightLimit); - if (monsterSpawnLightLevel != null) json.add("monster_spawn_light_level", monsterSpawnLightLevel); - if (timelines != null) json.addProperty("timelines", timelines); - return json; - } - } } diff --git a/src/main/java/fr/openmc/api/datapacks/injectors/TimelinesInjector.java b/src/main/java/fr/openmc/api/datapacks/injectors/TimelinesInjector.java new file mode 100644 index 000000000..c3b67943f --- /dev/null +++ b/src/main/java/fr/openmc/api/datapacks/injectors/TimelinesInjector.java @@ -0,0 +1,60 @@ +package fr.openmc.api.datapacks.injectors; + +import fr.openmc.api.datapacks.DatapackInjector; +import fr.openmc.api.datapacks.builders.TimelineBuilder; +import lombok.Getter; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Consumer; + +@Getter +/** + * Classe qui représente les données trouvable dans une timeline + * Qui injecte directement cela sous forme .json dans le datapack + * https://minecraft.wiki/w/Timeline + */ +public class TimelinesInjector implements DatapackInjector { + + private final String namespace; + private String id; + private final Map entries = new LinkedHashMap<>(); + + public TimelinesInjector(String namespace) { + this.namespace = namespace; + } + + public TimelinesInjector add(String id, Consumer builder) { + TimelineBuilder instance = new TimelineBuilder(); + builder.accept(instance); + entries.put(id, instance); + this.id = id; + return this; + } + + public TimelinesInjector add(String id, TimelineBuilder builder) { + entries.put(id, builder); + this.id = id; + return this; + } + + @Override + public void inject(File rootFile) { + if (entries.isEmpty()) return; + + Path root = rootFile.toPath().resolve("data").resolve(namespace).resolve("timeline"); + try { + Files.createDirectories(root); + for (var entry : entries.entrySet()) { + Path file = root.resolve(entry.getKey() + ".json"); + Files.writeString(file, GSON.toJson(entry.getValue().toJson())); + } + } catch (IOException e) { + throw new IllegalStateException("Cannot write timeline files", e); + } + } +} diff --git a/src/main/java/fr/openmc/api/menulib/Menu.java b/src/main/java/fr/openmc/api/menulib/Menu.java index e3953ddd9..ffb758184 100644 --- a/src/main/java/fr/openmc/api/menulib/Menu.java +++ b/src/main/java/fr/openmc/api/menulib/Menu.java @@ -18,8 +18,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; @@ -152,7 +154,10 @@ public final void open() { Bukkit.getServer().getPluginManager().callEvent(new OpenMenuEvent(owner, this)); - owner.openInventory(inventory); + InventoryView openedMenu = owner.openInventory(inventory); + + if (this instanceof OpenMenu om) + om.onOpen(new InventoryOpenEvent(openedMenu)); } catch (Exception e) { MessagesManager.sendMessage(owner, TranslationManager.translation("api.menulib.an_error_occurred"), Prefix.OPENMC, MessageType.ERROR, false); owner.closeInventory(); diff --git a/src/main/java/fr/openmc/api/menulib/OpenMenu.java b/src/main/java/fr/openmc/api/menulib/OpenMenu.java new file mode 100644 index 000000000..097ec9dd1 --- /dev/null +++ b/src/main/java/fr/openmc/api/menulib/OpenMenu.java @@ -0,0 +1,16 @@ +package fr.openmc.api.menulib; + +import org.bukkit.event.inventory.InventoryOpenEvent; + +public interface OpenMenu { + /** + * Handles the event that occurs when a player open the menu's inventory. + * This method is called whenever an {@link InventoryOpenEvent} is triggered for a menu + * controlled by this class. Subclasses + * should implement the logic to respond to the inventory being opened, + * such as saving data or cleaning up resources. + * + * @param event The {@link InventoryOpenEvent} containing details about the open action, + */ + void onOpen(InventoryOpenEvent event); +} diff --git a/src/main/java/fr/openmc/core/ListenersManager.java b/src/main/java/fr/openmc/core/ListenersManager.java index 5f71dc22c..2705944c2 100644 --- a/src/main/java/fr/openmc/core/ListenersManager.java +++ b/src/main/java/fr/openmc/core/ListenersManager.java @@ -5,6 +5,8 @@ import fr.openmc.core.features.itemsadder.SpawnerExtractorListener; import fr.openmc.core.hooks.itemsadder.ItemsAdderHook; import fr.openmc.core.listeners.*; +import fr.openmc.core.registry.ambient.listeners.AmbientWeatherListener; +import fr.openmc.core.registry.ambient.listeners.BiomesOnChunkLoad; import fr.openmc.core.registry.ambient.listeners.CustomAmbientListener; import org.bukkit.Bukkit; import org.bukkit.Server; @@ -31,11 +33,14 @@ public static void init() { new PlayerDeathListener(), new AsyncChatListener(OMCPlugin.getInstance()), new InteractListener(), + new BlockPlaceListener(), new EquipableItemListener(), new NoMoreRabbit(), new ArmorListener(), new BlockBreakListener(), - new CustomAmbientListener() + new CustomAmbientListener(), + new BiomesOnChunkLoad(), + new AmbientWeatherListener() ); if (!OMCPlugin.isUnitTestVersion()) { diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 45e2b3020..63eb92cbf 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -29,6 +29,7 @@ import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.economy.TransactionsManager; import fr.openmc.core.features.events.commands.calendar.CalendarManager; +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; import fr.openmc.core.features.events.contents.halloween.managers.HalloweenManager; import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; @@ -109,6 +110,7 @@ public class OMCPlugin extends JavaPlugin { DynamicCooldownManager::new, ContestManager::new, WeeklyEventsManager::new, + DailyEventsManager::new, CalendarManager::new, DreamManager::new, MultiBlockManager::new, @@ -231,6 +233,9 @@ public void onDisable() { feature.startSave(); } + /* REGISTRIES */ + OMCRegistry.stopAll(); + // - Close all inventories for (Player player : Bukkit.getOnlinePlayers()) { player.closeInventory(); diff --git a/src/main/java/fr/openmc/core/OMCRegistry.java b/src/main/java/fr/openmc/core/OMCRegistry.java index c019a67d4..7ea353762 100644 --- a/src/main/java/fr/openmc/core/OMCRegistry.java +++ b/src/main/java/fr/openmc/core/OMCRegistry.java @@ -41,7 +41,7 @@ public final class OMCRegistry { RegistryLoadingType.AFTER_IA), new RegistryContext( () -> CUSTOM_AMBIENTS = new CustomAmbientRegistry(), - RegistryLoadingType.BOOTSTRAP), + RegistryLoadingType.BOOTSTRAP, RegistryLoadingType.RUNTIME), new RegistryContext( () -> CUSTOM_LOOTBOXES = new CustomLootboxRegistry(), RegistryLoadingType.AFTER_IA) @@ -86,4 +86,12 @@ public static void postInitAll() { OMCLogger.successFormatted("Registre {} chargé après ItemsAdder", r.getClass().getSimpleName()); } } + + public static void stopAll() { + for (RegistryContext ctx : OMCRegistry.ALL) { + LifecycleRegistry r = ctx.registry().get(); + r.stop(); + OMCLogger.successFormatted("Registre {} stoppé", r.getClass().getSimpleName()); + } + } } \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/bootstrap/registries/LifecycleRegistry.java b/src/main/java/fr/openmc/core/bootstrap/registries/LifecycleRegistry.java index 541e7a503..506ca7f96 100644 --- a/src/main/java/fr/openmc/core/bootstrap/registries/LifecycleRegistry.java +++ b/src/main/java/fr/openmc/core/bootstrap/registries/LifecycleRegistry.java @@ -7,8 +7,8 @@ @SuppressWarnings("UnstableApiUsage") public interface LifecycleRegistry { default void bootstrap(BootstrapContext context) throws IOException {} - default void init() {} - default void postInit() {} + + default void stop() {} } diff --git a/src/main/java/fr/openmc/core/commands/debug/ToastCommand.java b/src/main/java/fr/openmc/core/commands/debug/ToastCommand.java index d841aa915..dec46e90a 100644 --- a/src/main/java/fr/openmc/core/commands/debug/ToastCommand.java +++ b/src/main/java/fr/openmc/core/commands/debug/ToastCommand.java @@ -1,6 +1,7 @@ package fr.openmc.core.commands.debug; -import fr.openmc.core.utils.nms.ToastUtils; +import fr.openmc.core.utils.nms.toast.ToastUtils; +import net.kyori.adventure.text.Component; import net.minecraft.advancements.AdvancementType; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -14,6 +15,6 @@ public class ToastCommand { @Subcommand("test") @CommandPermission("omc.admins.commands.toast.test") public void test(Player player) { - ToastUtils.sendCustomToast(player, Material.TEST_INSTANCE_BLOCK, "translation.key.fuck", AdvancementType.CHALLENGE); + ToastUtils.sendCustomToast(player, Material.TEST_INSTANCE_BLOCK, Component.text("test debile"), AdvancementType.CHALLENGE); } } diff --git a/src/main/java/fr/openmc/core/events/LootboxRewardEvent.java b/src/main/java/fr/openmc/core/events/LootboxRewardEvent.java index 8b46ef73d..4bac1ea6d 100644 --- a/src/main/java/fr/openmc/core/events/LootboxRewardEvent.java +++ b/src/main/java/fr/openmc/core/events/LootboxRewardEvent.java @@ -1,7 +1,7 @@ package fr.openmc.core.events; import fr.openmc.core.registry.lootboxes.CustomLootbox; -import fr.openmc.core.registry.loottable.CustomLoot; +import fr.openmc.core.registry.loottable.loots.CustomLoot; import lombok.Getter; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; diff --git a/src/main/java/fr/openmc/core/features/dream/events/MetalDetectorLootEvent.java b/src/main/java/fr/openmc/core/features/dream/events/MetalDetectorLootEvent.java index 6ca9b70c2..2cde281ac 100644 --- a/src/main/java/fr/openmc/core/features/dream/events/MetalDetectorLootEvent.java +++ b/src/main/java/fr/openmc/core/features/dream/events/MetalDetectorLootEvent.java @@ -1,10 +1,10 @@ package fr.openmc.core.features.dream.events; +import fr.openmc.core.registry.loottable.loots.CustomLoot; import lombok.Getter; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; -import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -12,13 +12,13 @@ @Getter public class MetalDetectorLootEvent extends PlayerEvent { private static final HandlerList HANDLERS = new HandlerList(); - private final List loot; + private final List loot; /** * @param player The player who found the loot. - * @param loot The list of ItemStack representing the loot found. + * @param loot The list of CustomLoot representing the loot found. */ - public MetalDetectorLootEvent(Player player, List loot) { + public MetalDetectorLootEvent(Player player, List loot) { super(player); this.loot = loot; } diff --git a/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerObtainOrb.java b/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerObtainOrb.java index e87f980b0..a920a9765 100644 --- a/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerObtainOrb.java +++ b/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerObtainOrb.java @@ -11,6 +11,8 @@ import fr.openmc.core.features.dream.models.registry.items.DreamItem; import fr.openmc.core.features.dream.registries.DreamBiome; import fr.openmc.core.features.dream.registries.DreamItemRegistry; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.utils.bukkit.ParticleUtils; import fr.openmc.core.utils.text.messages.MessageType; import fr.openmc.core.utils.text.messages.MessagesManager; @@ -86,18 +88,22 @@ public void onCloudOrbDispense(EntityPickupItemEvent event) { public void onMetalDetectorLoot(MetalDetectorLootEvent event) { Player player = event.getPlayer(); - for (ItemStack item : event.getLoot()) { - DreamItem dreamItem = DreamItemRegistry.getByItemStack(item); + for (CustomLoot loot : event.getLoot()) { + if (!(loot instanceof ItemLoot itemLoot)) continue; - if (dreamItem == null) continue; - if (!dreamItem.getId().equals(DreamItemRegistry.MUD_ORB.getId())) continue; + for (ItemStack item : itemLoot.getItems()) { + DreamItem dreamItem = DreamItemRegistry.getByItemStack(item); - setProgressionOrb(player, MUD_BEACH_ORB, DreamBiome.GLACITE_GROTTO); + if (dreamItem == null) continue; + if (!dreamItem.getId().equals(DreamItemRegistry.MUD_ORB.getId())) continue; - // * SFX - player.getWorld().playSound(player.getLocation(), "minecraft:entity.wither.spawn", 1f, 2f); - ParticleUtils.spawnDispersingParticles(player.getLocation(), Particle.ASH, 15, 15, 0.5, null); - break; + setProgressionOrb(player, MUD_BEACH_ORB, DreamBiome.GLACITE_GROTTO); + + // * SFX + player.getWorld().playSound(player.getLocation(), "minecraft:entity.wither.spawn", 1f, 2f); + ParticleUtils.spawnDispersingParticles(player.getLocation(), Particle.ASH, 15, 15, 0.5, null); + break; + } } } diff --git a/src/main/java/fr/openmc/core/features/dream/mecanism/cloudcastle/CloudVault.java b/src/main/java/fr/openmc/core/features/dream/mecanism/cloudcastle/CloudVault.java index 20799e897..24e7ce35a 100644 --- a/src/main/java/fr/openmc/core/features/dream/mecanism/cloudcastle/CloudVault.java +++ b/src/main/java/fr/openmc/core/features/dream/mecanism/cloudcastle/CloudVault.java @@ -6,6 +6,7 @@ import fr.openmc.core.features.dream.registries.DreamItemRegistry; import fr.openmc.core.features.dream.registries.DreamLootTableRegistry; import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; @@ -17,6 +18,7 @@ import org.bukkit.inventory.ItemStack; import java.util.List; +import java.util.Set; public class CloudVault implements Listener { private final CustomLootTable CLOUD_VAULT_LOOT_TABLE = DreamLootTableRegistry.CLOUD_VAULT; @@ -43,10 +45,19 @@ public void onLootGenerate(BlockDispenseLootEvent event) { if (CLOUD_VAULT_LOOT_TABLE == null) return; - List loot = CLOUD_VAULT_LOOT_TABLE.rollLootsWithAmount(3); - event.setDispensedLoot(loot); + List itemLoots = CLOUD_VAULT_LOOT_TABLE.rollLootsWithAmount(player, 3) + .stream() + .filter(loot -> loot instanceof ItemLoot) + .map(item -> (ItemLoot) item).toList(); - for (ItemStack item : loot) { + List itemStacks = itemLoots.stream() + .map(ItemLoot::getItems) + .flatMap(Set::stream) + .toList(); + + event.setDispensedLoot(itemStacks); + + for (ItemStack item : itemStacks) { Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> Bukkit.getServer().getPluginManager().callEvent(new DreamRngLootEvent(player, item, item.getAmount(), CLOUD_VAULT_LOOT_TABLE.getChanceOf(item))) ); diff --git a/src/main/java/fr/openmc/core/features/dream/mecanism/cloudfishing/PlayerFishListener.java b/src/main/java/fr/openmc/core/features/dream/mecanism/cloudfishing/PlayerFishListener.java index 5a5eb958d..6b9d32da6 100644 --- a/src/main/java/fr/openmc/core/features/dream/mecanism/cloudfishing/PlayerFishListener.java +++ b/src/main/java/fr/openmc/core/features/dream/mecanism/cloudfishing/PlayerFishListener.java @@ -4,6 +4,7 @@ import fr.openmc.core.features.dream.DreamUtils; import fr.openmc.core.features.dream.mecanism.rng.DreamRngLootEvent; import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; import fr.openmc.core.utils.bukkit.ItemUtils; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -65,10 +66,10 @@ public void run() { CustomLootTable lootTable = CloudFishingManager.FISHING_LOOT_TABLE; if (lootTable == null) return; - List rewards = lootTable.rollLoots(); + List rewards = lootTable.rollLoots(player); - for (ItemStack item : rewards) { - player.getInventory().addItem(item); + for (CustomLoot loot : rewards) { + if (!(loot instanceof ItemStack item)) continue; Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> Bukkit.getServer().getPluginManager().callEvent(new DreamRngLootEvent(player, item, item.getAmount(), lootTable.getChanceOf(item))) diff --git a/src/main/java/fr/openmc/core/features/dream/mecanism/rng/DreamRngLootManager.java b/src/main/java/fr/openmc/core/features/dream/mecanism/rng/DreamRngLootManager.java index 290ebfc69..c22b56784 100644 --- a/src/main/java/fr/openmc/core/features/dream/mecanism/rng/DreamRngLootManager.java +++ b/src/main/java/fr/openmc/core/features/dream/mecanism/rng/DreamRngLootManager.java @@ -1,16 +1,12 @@ package fr.openmc.core.features.dream.mecanism.rng; +import fr.openmc.core.utils.RngUtils; import fr.openmc.core.utils.text.messages.MessageType; import fr.openmc.core.utils.text.messages.MessagesManager; import fr.openmc.core.utils.text.messages.Prefix; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.List; - public class DreamRngLootManager { public static void sendMessageLoot(DreamRngLootEvent event) { double chance = event.getChance() != null ? event.getChance() : 0.0; @@ -38,22 +34,6 @@ private static void sendSoundLoot(DreamRngLootEvent event) { double chance = event.getChance() != null ? event.getChance() : 0.0; Player player = event.getPlayer(); - List sounds = new ArrayList<>(); - if (chance <= 0.001) { // 0.1% - sounds.add(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 0.1f)); - player.getWorld().playSound(player.getLocation(), "minecraft:entity.ender_dragon.death", 1f, 0.1f); - } else if (chance <= 0.05) { // 5% - sounds.add(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 0.5f)); - } else if (chance <= 0.1) { // 10% - sounds.add(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 1.0f)); - } else if (chance <= 0.25) { // 25% - sounds.add(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 1.3f)); - } else { - sounds.add(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 2f)); - } - - for (Sound sound : sounds) { - player.playSound(sound); - } + RngUtils.sendSoundRng(player, chance); } } diff --git a/src/main/java/fr/openmc/core/features/dream/milestone/quests/CrystallizedPickaxeQuest.java b/src/main/java/fr/openmc/core/features/dream/milestone/quests/CrystallizedPickaxeQuest.java index a8e37e7fd..9e9c6eb78 100644 --- a/src/main/java/fr/openmc/core/features/dream/milestone/quests/CrystallizedPickaxeQuest.java +++ b/src/main/java/fr/openmc/core/features/dream/milestone/quests/CrystallizedPickaxeQuest.java @@ -13,12 +13,15 @@ import fr.openmc.core.features.milestones.models.MilestoneType; import fr.openmc.core.features.milestones.quests.MilestoneQuest; import fr.openmc.core.features.quests.objects.QuestTier; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.utils.text.DirectionUtils; import net.kyori.adventure.text.Component; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import java.util.List; @@ -71,12 +74,18 @@ public void run() { public void onPickUp(MetalDetectorLootEvent e) { Player player = e.getPlayer(); if (!DreamUtils.isInDreamWorld(player)) return; - - DreamItem item = DreamItemRegistry.getByItemStack(e.getLoot().getFirst()); - if (item == null) return; - if (item instanceof CrystalizedPickaxe) { - if (MilestonesManager.getPlayerStep(getType(), player) != getStep().ordinal()) return; - this.incrementProgressInDream(player.getUniqueId()); + + for (CustomLoot loot : e.getLoot()) { + if (!(loot instanceof ItemLoot itemLoot)) continue; + + for (ItemStack item : itemLoot.getItems()) { + DreamItem dreamItem = DreamItemRegistry.getByItemStack(item); + if (dreamItem == null) return; + if (dreamItem instanceof CrystalizedPickaxe) { + if (MilestonesManager.getPlayerStep(getType(), player) != getStep().ordinal()) continue; + this.incrementProgressInDream(player.getUniqueId()); + } + } } } diff --git a/src/main/java/fr/openmc/core/features/dream/milestone/quests/MudOrbQuest.java b/src/main/java/fr/openmc/core/features/dream/milestone/quests/MudOrbQuest.java index 8d1114154..b23b59c06 100644 --- a/src/main/java/fr/openmc/core/features/dream/milestone/quests/MudOrbQuest.java +++ b/src/main/java/fr/openmc/core/features/dream/milestone/quests/MudOrbQuest.java @@ -10,9 +10,12 @@ import fr.openmc.core.features.milestones.models.MilestoneType; import fr.openmc.core.features.milestones.quests.MilestoneQuest; import fr.openmc.core.features.quests.objects.QuestTier; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; import java.util.List; @@ -50,12 +53,18 @@ public MudOrbQuest() { public void onGetOrb(MetalDetectorLootEvent e) { Player player = e.getPlayer(); if (!DreamUtils.isInDreamWorld(player)) return; - - DreamItem item = DreamItemRegistry.getByItemStack(e.getLoot().getFirst()); - if (item == null) return; - if (item instanceof MudOrb) { - if (MilestonesManager.getPlayerStep(getType(), player) != getStep().ordinal()) return; - this.incrementProgressInDream(player.getUniqueId()); + + for (CustomLoot loot : e.getLoot()) { + if (!(loot instanceof ItemLoot itemLoot)) continue; + + for (ItemStack item : itemLoot.getItems()) { + DreamItem dreamItem = DreamItemRegistry.getByItemStack(item); + if (dreamItem == null) return; + if (dreamItem instanceof MudOrb) { + if (MilestonesManager.getPlayerStep(getType(), player) != getStep().ordinal()) return; + this.incrementProgressInDream(player.getUniqueId()); + } + } } } } diff --git a/src/main/java/fr/openmc/core/features/dream/models/registry/DreamMob.java b/src/main/java/fr/openmc/core/features/dream/models/registry/DreamMob.java index cf3df6b4e..265e9bd7f 100644 --- a/src/main/java/fr/openmc/core/features/dream/models/registry/DreamMob.java +++ b/src/main/java/fr/openmc/core/features/dream/models/registry/DreamMob.java @@ -1,6 +1,6 @@ package fr.openmc.core.features.dream.models.registry; -import fr.openmc.core.registry.loottable.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.registry.mobs.CustomMob; import fr.openmc.core.registry.mobs.CustomMobAttribute; import lombok.Getter; @@ -19,7 +19,7 @@ public DreamMob(String id, String name, Class entityClass, double health, Lon this.damageTime = damageTime; } - public DreamMob(String id, String name, Class entityClass, double health, Long damageTime, double speed, double scale, List loots) { + public DreamMob(String id, String name, Class entityClass, double health, Long damageTime, double speed, double scale, List loots) { super(id, name, entityClass, health, 0f, speed, loots, new CustomMobAttribute(Attribute.SCALE, scale)); this.damageTime = damageTime; diff --git a/src/main/java/fr/openmc/core/features/dream/registries/DreamItemRegistry.java b/src/main/java/fr/openmc/core/features/dream/registries/DreamItemRegistry.java index 57c1ac892..72aa61381 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/DreamItemRegistry.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/DreamItemRegistry.java @@ -64,6 +64,7 @@ public class DreamItemRegistry { public static final DreamItem CRAFTING_TABLE = create(new CraftingTable()); public static final DreamItem ETERNAL_CAMPFIRE = create(new EternalCampFire()); public static final DreamItem EWENITE = create(new Ewenite()); + public static final DreamItem EWENITE_BLOCK = create(new EweniteBlock()); public static final DreamItem SOMNIFERE = create(new Somnifere()); public static final DreamItem CHIPS_AYWEN = create(new ChipsAywen()); diff --git a/src/main/java/fr/openmc/core/features/dream/registries/items/blocks/EweniteBlock.java b/src/main/java/fr/openmc/core/features/dream/registries/items/blocks/EweniteBlock.java new file mode 100644 index 000000000..6043cff17 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/dream/registries/items/blocks/EweniteBlock.java @@ -0,0 +1,24 @@ +package fr.openmc.core.features.dream.registries.items.blocks; + +import fr.openmc.core.features.dream.models.registry.items.DreamItem; +import fr.openmc.core.features.dream.models.registry.items.DreamItemMeta; +import fr.openmc.core.features.dream.models.registry.items.DreamRarity; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public class EweniteBlock extends DreamItem { + public EweniteBlock() { + super(new DreamItemMeta( + "omc_dream:ewenite_block", + "Bloc d'ewenite", + DreamRarity.ONIRISIME, + Material.NETHERITE_BLOCK, + false + )); + } + + @Override + public ItemStack getTransferableItem() { + return new ItemStack(Material.SCULK); + } +} diff --git a/src/main/java/fr/openmc/core/features/dream/registries/items/tools/MetalDetector.java b/src/main/java/fr/openmc/core/features/dream/registries/items/tools/MetalDetector.java index b4ca0c918..dc325024b 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/items/tools/MetalDetector.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/items/tools/MetalDetector.java @@ -11,6 +11,7 @@ import fr.openmc.core.features.dream.models.registry.items.DreamRarity; import fr.openmc.core.registry.items.options.UsableItem; import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; import fr.openmc.core.utils.text.messages.MessageType; import fr.openmc.core.utils.text.messages.MessagesManager; import fr.openmc.core.utils.text.messages.Prefix; @@ -68,10 +69,10 @@ public void onRightClick(Player player, PlayerInteractEvent event) { CustomLootTable lootTable = MetalDetectorManager.METAL_DETECTOR_LOOT_TABLE; if (lootTable == null) return; - List rewards = lootTable.rollLoots(); + List rewards = lootTable.rollLoots(player); - for (ItemStack item : rewards) { - player.getInventory().addItem(item); + for (CustomLoot loot : rewards) { + if (!(loot instanceof ItemStack item)) continue; Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> Bukkit.getServer().getPluginManager().callEvent(new DreamRngLootEvent(player, item, item.getAmount(), lootTable.getChanceOf(item))) diff --git a/src/main/java/fr/openmc/core/features/dream/registries/loottable/CloudFishingLootTable.java b/src/main/java/fr/openmc/core/features/dream/registries/loottable/CloudFishingLootTable.java index dab19af94..020875aec 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/loottable/CloudFishingLootTable.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/loottable/CloudFishingLootTable.java @@ -1,8 +1,9 @@ package fr.openmc.core.features.dream.registries.loottable; import fr.openmc.core.features.dream.registries.DreamItemRegistry; -import fr.openmc.core.registry.loottable.CustomLoot; import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import java.util.Set; @@ -13,37 +14,37 @@ public class CloudFishingLootTable extends CustomLootTable { @Override public Set getLoots() { return Set.of( - new CustomLoot( + new ItemLoot( DreamItemRegistry.METEO_WAND, 0.05, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.POISSONION, 0.5, 1, 2 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.MOON_FISH, 0.5, 1, 2 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.SUN_FISH, 0.5, 1, 2 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.DOCKER_FISH, 0.1, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.SOMNIFERE, 0.4, 1, diff --git a/src/main/java/fr/openmc/core/features/dream/registries/loottable/CloudVaultLootTable.java b/src/main/java/fr/openmc/core/features/dream/registries/loottable/CloudVaultLootTable.java index 8467d7eb8..d5019748e 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/loottable/CloudVaultLootTable.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/loottable/CloudVaultLootTable.java @@ -2,8 +2,9 @@ import fr.openmc.core.OMCRegistry; import fr.openmc.core.features.dream.registries.DreamItemRegistry; -import fr.openmc.core.registry.loottable.CustomLoot; import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import java.util.Set; @@ -14,43 +15,43 @@ public class CloudVaultLootTable extends CustomLootTable { @Override public Set getLoots() { return Set.of( - new CustomLoot( + new ItemLoot( DreamItemRegistry.CLOUD_HELMET, 0.125, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CLOUD_CHESTPLATE, 0.125, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CLOUD_LEGGINGS, 0.125, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CLOUD_BOOTS, 0.125, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.SOMNIFERE, 0.45, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CLOUD_FISHING_ROD, 0.08, 1, 1 ), - new CustomLoot( + new ItemLoot( OMCRegistry.CUSTOM_ENCHANTS.DREAM_SLEEPER.getEnchantedBookItem(2).getBest(), 0.10, 1, diff --git a/src/main/java/fr/openmc/core/features/dream/registries/loottable/MetalDetectorLootTable.java b/src/main/java/fr/openmc/core/features/dream/registries/loottable/MetalDetectorLootTable.java index c2f5f26b4..cb1140b11 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/loottable/MetalDetectorLootTable.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/loottable/MetalDetectorLootTable.java @@ -2,8 +2,9 @@ import fr.openmc.core.OMCRegistry; import fr.openmc.core.features.dream.registries.DreamItemRegistry; -import fr.openmc.core.registry.loottable.CustomLoot; import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import java.util.Set; @@ -14,67 +15,67 @@ public class MetalDetectorLootTable extends CustomLootTable { @Override public Set getLoots() { return Set.of( - new CustomLoot( + new ItemLoot( DreamItemRegistry.CHIPS_DIHYDROGENE, 0.4, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CHIPS_JIMMY, 0.2, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CHIPS_TERRE, 0.4, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CHIPS_SANS_PLOMB, 0.4, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CHIPS_NATURE, 0.4, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CHIPS_AYWEN, 0.1, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CHIPS_LAIT_2_MARGOUTA, 0.005, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.SOMNIFERE, 0.4, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.MUD_ORB, 0.05, 1, 1 ), - new CustomLoot( + new ItemLoot( OMCRegistry.CUSTOM_ENCHANTS.EXPERIENTASTIC.getEnchantedBookItem(1), 0.03, 1, 1 ), - new CustomLoot( + new ItemLoot( DreamItemRegistry.CRYSTALIZED_PICKAXE, 0.1, 1, diff --git a/src/main/java/fr/openmc/core/features/dream/registries/mobs/CrazyFrog.java b/src/main/java/fr/openmc/core/features/dream/registries/mobs/CrazyFrog.java index a142e5f9a..6e00de037 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/mobs/CrazyFrog.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/mobs/CrazyFrog.java @@ -4,7 +4,7 @@ import fr.openmc.core.OMCRegistry; import fr.openmc.core.features.dream.models.registry.DreamMob; import fr.openmc.core.features.dream.registries.DreamItemRegistry; -import fr.openmc.core.registry.loottable.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.utils.RandomUtils; import fr.openmc.core.utils.world.LocationUtils; import org.bukkit.Bukkit; @@ -41,7 +41,7 @@ public CrazyFrog(String id) { 0L, RandomUtils.randomBetween(0.2, 0.4), RandomUtils.randomBetween(3, 2.3), - List.of(new CustomLoot( + List.of(new ItemLoot( DreamItemRegistry.METAL_DETECTOR, 0.5, 1, diff --git a/src/main/java/fr/openmc/core/features/dream/registries/mobs/DreamSpider.java b/src/main/java/fr/openmc/core/features/dream/registries/mobs/DreamSpider.java index dd8e8387c..439fd9153 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/mobs/DreamSpider.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/mobs/DreamSpider.java @@ -2,7 +2,7 @@ import fr.openmc.core.features.dream.models.registry.DreamMob; import fr.openmc.core.features.dream.registries.DreamItemRegistry; -import fr.openmc.core.registry.loottable.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.utils.RandomUtils; import org.bukkit.Location; import org.bukkit.entity.Spider; @@ -19,7 +19,7 @@ public DreamSpider(String id) { 1L, RandomUtils.randomBetween(0.2, 0.3), RandomUtils.randomBetween(1.5, 2.0), - List.of(new CustomLoot( + List.of(new ItemLoot( DreamItemRegistry.CORRUPTED_STRING, 0.80, 1, diff --git a/src/main/java/fr/openmc/core/features/dream/registries/mobs/Soul.java b/src/main/java/fr/openmc/core/features/dream/registries/mobs/Soul.java index 5c6ddb389..444450981 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/mobs/Soul.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/mobs/Soul.java @@ -3,7 +3,7 @@ import fr.openmc.core.OMCPlugin; import fr.openmc.core.features.dream.models.registry.DreamMob; import fr.openmc.core.features.dream.registries.DreamItemRegistry; -import fr.openmc.core.registry.loottable.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.registry.mobs.CustomMobRegistry; import fr.openmc.core.utils.RandomUtils; import fr.openmc.core.utils.bukkit.EntityUtils; @@ -92,7 +92,7 @@ public Vex spawn(Location location) { return vex; } - private final List loots = List.of(new CustomLoot( + private final List loots = List.of(new ItemLoot( DreamItemRegistry.SOUL, 0.70, 1, @@ -121,19 +121,19 @@ private void registerSoulLink(Vex vex, ArmorStand stand) { Entity dead = e.getEntity(); if (dead.equals(vex) && stand.isValid()) { stand.remove(); - for (CustomLoot loot : loots) { - if (Math.random() >= loot.chance()) return; + for (ItemLoot loot : loots) { + if (Math.random() >= loot.getChance()) return; - int amount = loot.minAmount() + (int) (Math.random() * (loot.maxAmount() - loot.minAmount() + 1)); + int amount = loot.getMinAmount() + (int) (Math.random() * (loot.getMaxAmount() - loot.getMinAmount() + 1)); ItemStack drop = loot.getFirstLoot().asQuantity(amount); dead.getWorld().dropItemNaturally(dead.getLocation(), drop); } } else if (dead.equals(stand) && vex.isValid()) { vex.remove(); - for (CustomLoot loot : loots) { - if (Math.random() >= loot.chance()) return; + for (ItemLoot loot : loots) { + if (Math.random() >= loot.getChance()) return; - int amount = loot.minAmount() + (int) (Math.random() * (loot.maxAmount() - loot.minAmount() + 1)); + int amount = loot.getMinAmount() + (int) (Math.random() * (loot.getMaxAmount() - loot.getMinAmount() + 1)); ItemStack drop = loot.getFirstLoot().asQuantity(amount); dead.getWorld().dropItemNaturally(dead.getLocation(), drop); } diff --git a/src/main/java/fr/openmc/core/features/economy/BankManager.java b/src/main/java/fr/openmc/core/features/economy/BankManager.java index 4369d06d7..25392fd2c 100644 --- a/src/main/java/fr/openmc/core/features/economy/BankManager.java +++ b/src/main/java/fr/openmc/core/features/economy/BankManager.java @@ -20,6 +20,7 @@ import fr.openmc.core.features.economy.events.BankDepositEvent; import fr.openmc.core.features.economy.models.Bank; import fr.openmc.core.utils.cache.CacheOfflinePlayer; +import fr.openmc.core.utils.text.DateUtils; import fr.openmc.core.utils.text.InputUtils; import fr.openmc.core.utils.text.messages.MessageType; import fr.openmc.core.utils.text.messages.MessagesManager; @@ -283,7 +284,7 @@ public static void updateInterestTimer() { } public static long getSecondsUntilInterest() { - LocalDateTime now = LocalDateTime.now(); + LocalDateTime now = DateUtils.getLocalDateTime(); LocalDateTime nextMonday = now.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY)).withHour(2).withMinute(0) .withSecond(0); // if it is after 2 AM, get the monday after diff --git a/src/main/java/fr/openmc/core/features/events/commands/calendar/CalendarManager.java b/src/main/java/fr/openmc/core/features/events/commands/calendar/CalendarManager.java index 21ad7b216..bdc69b674 100644 --- a/src/main/java/fr/openmc/core/features/events/commands/calendar/CalendarManager.java +++ b/src/main/java/fr/openmc/core/features/events/commands/calendar/CalendarManager.java @@ -3,16 +3,21 @@ import fr.openmc.core.bootstrap.features.Feature; import fr.openmc.core.bootstrap.features.types.HasCommands; import fr.openmc.core.bootstrap.features.types.LoadAfterItemsAdder; +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import fr.openmc.core.features.events.contents.dailyevents.models.ScheduleDailyEvent; import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEvent; import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventPhase; import fr.openmc.core.features.events.models.Event; +import fr.openmc.core.utils.text.DateUtils; import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import java.time.DayOfWeek; +import java.time.LocalDateTime; +import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -26,11 +31,19 @@ public Set getCommands() { } public static List getUpcomingEvents(int slots) { - List events = new ArrayList<>(List.of( - WeeklyEventsManager.getCurrentEvent() - )); + List events = new ArrayList<>(); - //todo: implement DailyEvent in upcoming events + events.addAll(DailyEventsManager.incomingEvents); + events.add(WeeklyEventsManager.getCurrentEvent()); + + events.sort((e1, e2) -> { + LocalDateTime d1 = getEventStartDate(e1); + LocalDateTime d2 = getEventStartDate(e2); + if (d1 == null && d2 == null) return 0; + if (d1 == null) return 1; + if (d2 == null) return -1; + return d1.compareTo(d2); + }); if (events.getLast() instanceof WeeklyEvent we) { for (int i = events.size(); i <= slots; i++) { @@ -98,4 +111,18 @@ public ItemStack getIcon() { return events; } + + private static LocalDateTime getEventStartDate(Event event) { + if (event instanceof ScheduleDailyEvent sde) { + return sde.getScheduledStartDate(); + } else if (event instanceof WeeklyEvent we) { + WeeklyEventPhase firstPhase = we.getPhases().getFirst(); + LocalDateTime now = DateUtils.getLocalDateTime(); + return now.toLocalDate() + .with(TemporalAdjusters.nextOrSame(firstPhase.getStartDay())) + .plusWeeks(we.getWeekOffset()) + .atTime(firstPhase.getStartHour(), firstPhase.getStartMinutes()); + } + return null; + } } diff --git a/src/main/java/fr/openmc/core/features/events/commands/calendar/CalendarMenu.java b/src/main/java/fr/openmc/core/features/events/commands/calendar/CalendarMenu.java index 92d34abdc..320149522 100644 --- a/src/main/java/fr/openmc/core/features/events/commands/calendar/CalendarMenu.java +++ b/src/main/java/fr/openmc/core/features/events/commands/calendar/CalendarMenu.java @@ -1,14 +1,22 @@ package fr.openmc.core.features.events.commands.calendar; +import fr.openmc.api.menulib.MenuLib; +import fr.openmc.api.menulib.OpenMenu; import fr.openmc.api.menulib.PaginatedMenu; import fr.openmc.api.menulib.template.ItemMenuTemplate; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemMenuBuilder; +import fr.openmc.api.menulib.utils.MenuUtils; import fr.openmc.api.menulib.utils.StaticSlots; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.features.events.contents.dailyevents.models.ScheduleDailyEvent; import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEvent; import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventPhase; import fr.openmc.core.features.events.models.Event; +import fr.openmc.core.utils.text.DateUtils; import fr.openmc.core.utils.text.messages.TranslationManager; +import io.papermc.paper.persistence.PersistentDataContainerView; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -16,17 +24,24 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.format.TextStyle; +import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CalendarMenu extends PaginatedMenu implements OpenMenu { + private static final HashMap scheduledEventById = new HashMap<>(); -public class CalendarMenu extends PaginatedMenu { public CalendarMenu(Player owner) { super(owner); } @@ -45,14 +60,52 @@ public CalendarMenu(Player owner) { public List getItems() { List items = new ArrayList<>(); for (Event event : CalendarManager.getUpcomingEvents(14)) { - items.add(new ItemMenuBuilder(this, event.getIcon(), meta -> { + ItemMenuBuilder itemBuilder = new ItemMenuBuilder(this, event.getIcon(), meta -> { meta.customName(event.getName().decoration(TextDecoration.ITALIC, false)); meta.lore(getEventLore(event)); - })); + }); + + if (event instanceof ScheduleDailyEvent de) { + String itemId = "scheduled_" + de.getScheduledStartDate().toString().toLowerCase(); // .toLowerCase car mc enelve les maj sur les pdc + scheduledEventById.put(itemId, de); + items.add(itemBuilder.setItemId(itemId)); + } else if (event instanceof WeeklyEvent) { + items.add(itemBuilder); + } } return items; } + @Override + public void onOpen(InventoryOpenEvent event) { + int i = 0; + for (ItemStack itemStack : event.getInventory().getContents()) { + if (itemStack == null) { + i++; + continue; + } + + PersistentDataContainerView pdc = itemStack.getPersistentDataContainer(); + if (!pdc.has(MenuLib.getItemIdKey())) { + i++; + continue; + } + + String itemId = pdc.get(MenuLib.getItemIdKey(), PersistentDataType.STRING); + ScheduleDailyEvent scheduleEvent = scheduledEventById.get(itemId); + + if (scheduleEvent != null) { + MenuUtils.runDynamicItem(getOwner(), this, i, () -> + new ItemMenuBuilder(this, scheduleEvent.getIcon(), meta -> { + meta.customName(scheduleEvent.getName().decoration(TextDecoration.ITALIC, false)); + meta.lore(getEventLore(scheduleEvent)); + }) + ).runTaskTimer(OMCPlugin.getInstance(), 0L, 20L); + } + i++; + } + } + @Override public List getTakableSlot() { return List.of(); @@ -65,7 +118,7 @@ public List getTakableSlot() { @Override public int getSizeOfItems() { - return getItems().size(); + return CalendarManager.getUpcomingEvents(14).size(); } @Override @@ -78,11 +131,30 @@ public Map getButtons() { private List getEventLore(Event event) { List eventLore = new ArrayList<>(event.getDescription()); - if (event instanceof WeeklyEvent we) { + if (event instanceof ScheduleDailyEvent de) { + LocalDateTime now = DateUtils.getLocalDateTime(); + LocalDateTime startDate = de.getScheduledStartDate(); + LocalDateTime endDate = de.getScheduledStartDate(); + + eventLore.add(Component.empty()); + eventLore.add(TranslationManager.translation("feature.events.calendar.start_in", + Component.text(DateUtils.convertSecondToTime(ChronoUnit.SECONDS.between(now, startDate)), NamedTextColor.YELLOW) + )); + eventLore.add(Component.empty()); + eventLore.add(TranslationManager.translation("feature.events.calendar.start_date", + Component.text(DateUtils.formatDate(startDate), NamedTextColor.AQUA), + Component.text(DateUtils.formatHourMinute(endDate.getHour(), endDate.getMinute()), NamedTextColor.AQUA) + )); + eventLore.add(TranslationManager.translation("feature.events.calendar.end_date", + Component.text(DateUtils.formatDate(endDate), NamedTextColor.AQUA), + Component.text(DateUtils.formatHourMinute(endDate.getHour(), endDate.getMinute()), NamedTextColor.AQUA) + )); + + } else if (event instanceof WeeklyEvent we) { eventLore.add(Component.empty()); eventLore.add(TranslationManager.translation("feature.events.calendar.phases")); for (WeeklyEventPhase phase : we.getPhases()) { - LocalDateTime now = LocalDateTime.now(); + LocalDateTime now = DateUtils.getLocalDateTime(); LocalDate nextDate = now.toLocalDate() .with(TemporalAdjusters.nextOrSame(phase.getStartDay())) @@ -93,10 +165,8 @@ private List getEventLore(Event event) { phase.getStartMinutes() ); - String formattedDate = dateEvent.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.FRANCE) - + " " + dateEvent.getDayOfMonth() + " " - + dateEvent.getMonth().getDisplayName(TextStyle.FULL, Locale.FRANCE); - String formattedTime = phase.getStartHour() + "h" + String.format("%02d", phase.getStartMinutes()); + String formattedDate = DateUtils.formatDate(dateEvent); + String formattedTime = DateUtils.formatHourMinute(phase.getStartHour(), phase.getStartMinutes()); eventLore.add(TranslationManager.translation( "feature.events.calendar.phase.line", diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/DailyEventsManager.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/DailyEventsManager.java new file mode 100644 index 000000000..922a54220 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/DailyEventsManager.java @@ -0,0 +1,226 @@ +package fr.openmc.core.features.events.contents.dailyevents; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.table.TableUtils; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.bootstrap.features.Feature; +import fr.openmc.core.bootstrap.features.annotations.Credit; +import fr.openmc.core.bootstrap.features.types.DatabaseFeature; +import fr.openmc.core.bootstrap.features.types.HasCommands; +import fr.openmc.core.bootstrap.features.types.HasListeners; +import fr.openmc.core.bootstrap.features.types.LoadAfterItemsAdder; +import fr.openmc.core.bootstrap.integration.OMCLogger; +import fr.openmc.core.features.events.contents.dailyevents.commands.DailyEventCommand; +import fr.openmc.core.features.events.contents.dailyevents.contents.bloodynight.BloodyNightEvent; +import fr.openmc.core.features.events.contents.dailyevents.contents.goldenharvest.GoldenHarvestEvent; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.MiraculousFishingEvent; +import fr.openmc.core.features.events.contents.dailyevents.listeners.DailyEventAmbientListeners; +import fr.openmc.core.features.events.contents.dailyevents.models.IncomingEventsDB; +import fr.openmc.core.features.events.contents.dailyevents.models.ScheduleDailyEvent; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.DailyEvent; +import fr.openmc.core.features.events.contents.dailyevents.tasks.NextEventTask; +import fr.openmc.core.features.events.contents.dailyevents.tasks.ShowBeginningEventTask; +import fr.openmc.core.utils.RandomUtils; +import fr.openmc.core.utils.text.DateUtils; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitTask; + +import java.sql.SQLException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + + +//todo: tester les toasts lorsqu'ils refonctionneront (before, start, end) +@Credit(developers = {"iambibi_"}) +public class DailyEventsManager extends Feature implements LoadAfterItemsAdder, DatabaseFeature, HasListeners, HasCommands { + // * Constantes + public static final List EVENTS = List.of( + new MiraculousFishingEvent(), + new GoldenHarvestEvent(), + new BloodyNightEvent() + ); + + private static final List SLOT_HOURS_EVENTS = new ArrayList<>(List.of( + 9, 13, 16, 19, 21 + )); + + public static final int SHOW_BEGINNING_DELAY = 60; // en secondes + + // * Données à propos de la gestion des daily event + public static ScheduleDailyEvent outgoingEvent = null; + public static BukkitTask endEventTask = null; + public static BukkitTask nextEventTask; + public static List incomingEvents = new ArrayList<>(); + + private static Dao dao; + + @Override + public void init() { + incomingEvents = loadIncomingEvents(); + nextEventTask = scheduleNextEventTask(); + } + + @Override + public void save() { + saveIncomingEventsDB(new IncomingEventsDB(incomingEvents)); + } + + @Override + public void initDB(ConnectionSource connectionSource) throws SQLException { + dao = DaoManager.createDao(connectionSource, IncomingEventsDB.class); + TableUtils.createTableIfNotExists(connectionSource, IncomingEventsDB.class); + } + + @Override + public Set getListeners() { + Set listeners = new HashSet<>(Set.of( + new DailyEventAmbientListeners() + )); + + for (DailyEvent event : EVENTS) { + if (!(event instanceof HasListeners hasListeners)) continue; + listeners.addAll(hasListeners.getListeners()); + } + + return listeners; + } + + @Override + public Set getCommands() { + return Set.of( + new DailyEventCommand() + ); + } + + /** + * Charge les données de la DB, généralement pdt le démarrage + * + * @return les données des daily event (ordre actuel) + */ + public static IncomingEventsDB loadIncomingEventsDB() { + try { + IncomingEventsDB data = dao.queryForId(1); + if (data == null) { + data = new IncomingEventsDB(List.of()); + dao.create(data); + } + return data; + } catch (SQLException e) { + throw new RuntimeException("Erreur lors du chargement de IncomingEventsDB", e); + } + } + + /** + * Sauvegarde les données des Daily Event dans la DB, généralement pdt l'arrêt du serveur + * + * @param data les données des daily events + */ + public static void saveIncomingEventsDB(IncomingEventsDB data) { + try { + dao.createOrUpdate(data); + } catch (SQLException e) { + throw new RuntimeException("Erreur lors de la sauvegarde de IncomingEventsDB", e); + } + } + + /** + * On charge les evenements à venir + * Lors du premier chargement, on remplit directement notre liste de taille identique à nos slots horaires. + * + * @return la liste prévue des x prochains évenements + */ + public static List loadIncomingEvents() { + List scheduledEvents = new ArrayList<>(); + LocalDateTime now = DateUtils.getLocalDateTime(); + IncomingEventsDB data = loadIncomingEventsDB(); + List incomingEvent = data.getDailyEventsIncomings(); + + // * Si la liste est vide, soit c'est la premiere fois qu'on lance le plugin, soit que tout les events sont fini + List copyEvents = new ArrayList<>(incomingEvent); + for (int hourSlot : SLOT_HOURS_EVENTS) { + if (copyEvents.isEmpty()) { + copyEvents = RandomUtils.generateRandomOrder(EVENTS); + } + + LocalDateTime scheduledDailyEvent; + if (hourSlot > now.getHour()) { + scheduledDailyEvent = now.withHour(hourSlot).withMinute(0).withSecond(0).withNano(0); + } else { + scheduledDailyEvent = now.plusDays(1) + .withHour(hourSlot).withMinute(0).withSecond(0).withNano(0); + } + scheduledEvents.add(new ScheduleDailyEvent(copyEvents.removeFirst(), scheduledDailyEvent)); + } + + return scheduledEvents; + } + + /** + * On schedule le prochain événement à venir. + * - On cherche la prochaine heure, en faisant gaffe si l'heure est passée, dans ce cas on schedule pour demain + * - Apres la prochaine heure on lance les taches associés à l'événement (tache pour avant le commencement, + * et pour le lancement de l'événement et la planification du prochain + * + * @return la tache de lancement de l'événement, qui sera executé à l'heure exacte du début de l'événement + */ + public static BukkitTask scheduleNextEventTask() { + LocalDateTime now = DateUtils.getLocalDateTime(); + // * On cherche la prochaine heure + Integer nextHour = SLOT_HOURS_EVENTS.stream() + .filter(hour -> hour > now.getHour()) + .findFirst() + .orElse(null); + + // si c'est null, alors on rempli la file et on schedule pour le premier horaire + LocalDateTime scheduleTime; + if (nextHour == null) { + incomingEvents = loadIncomingEvents(); + scheduleTime = now.toLocalDate().plusDays(1).atTime(SLOT_HOURS_EVENTS.getFirst(), 0); + } else { + scheduleTime = now.toLocalDate().atTime(nextHour, 0); + } + + long delayTicks = DateUtils.getDelayBetweenNow(scheduleTime) * 20; + + OMCLogger.infoFormatted("Les prochains evenement : " + incomingEvents.stream() + .map(s -> s.getDailyEvent().getClass().getSimpleName()).toList()); + OMCLogger.infoFormatted("Prochain Evenement journalier : " + scheduleTime + "s (dans " + DateUtils.convertSecondToTime(DateUtils.getDelayBetweenNow(scheduleTime)) + ")"); + + // * Programation de la tâche qui s'executera peu avant le commencement + new ShowBeginningEventTask() + .runTaskLater(OMCPlugin.getInstance(), delayTicks - SHOW_BEGINNING_DELAY * 20L); + + // * Renvoie la tache qui executera le début de l'evenement + return new NextEventTask().runTaskLater(OMCPlugin.getInstance(), delayTicks); + } + + /** + * Méthode plus claire afin de dire s'il y a un evenement journalier actif ou non + * + * @return un boolean + */ + public static boolean isActiveDailyEvent() { + return outgoingEvent != null; + } + + /** + * Méthode plus claire afin de dire renvoyer l'evenement journalier actif + * + * @return un daily event + */ + public static DailyEvent getActiveDailyEvent() { + return outgoingEvent.getDailyEvent(); + } + + public static DailyEvent getDailyEvent(String id) { + return EVENTS.stream() + .filter(event -> event.getEventId().equals(id)) + .findFirst() + .orElse(null); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/commands/DailyEventCommand.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/commands/DailyEventCommand.java new file mode 100644 index 000000000..655fa44b3 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/commands/DailyEventCommand.java @@ -0,0 +1,33 @@ +package fr.openmc.core.features.events.contents.dailyevents.commands; + +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import fr.openmc.core.features.events.contents.dailyevents.commands.autocomplete.DailyEventAutoComplete; +import fr.openmc.core.features.events.contents.dailyevents.models.ScheduleDailyEvent; +import fr.openmc.core.utils.text.DateUtils; +import org.bukkit.entity.Player; +import revxrsal.commands.annotation.Command; +import revxrsal.commands.annotation.Description; +import revxrsal.commands.annotation.Subcommand; +import revxrsal.commands.annotation.SuggestWith; +import revxrsal.commands.bukkit.annotation.CommandPermission; + +@Command({"events", "dailyevents"}) +@Description("Ouvre l'interface des événements") +public class DailyEventCommand { + @Subcommand("forceStart") + @CommandPermission("omc.admins.commands.dailyevent.forcestart") + public static void forceStartCommand(Player player, + @SuggestWith(DailyEventAutoComplete.class) String dailyEvent) { + if (DailyEventsManager.outgoingEvent != null) { + // * On arrete l'evenement en cours + DailyEventsManager.endEventTask.cancel(); + DailyEventsManager.endEventTask = null; + DailyEventsManager.outgoingEvent.getDailyEvent().end(); + } + + // * on lance le evenement rentré en param + DailyEventsManager.outgoingEvent = new ScheduleDailyEvent( + DailyEventsManager.getDailyEvent(dailyEvent), DateUtils.getLocalDateTime()); + DailyEventsManager.outgoingEvent.getDailyEvent().start(); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/commands/autocomplete/DailyEventAutoComplete.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/commands/autocomplete/DailyEventAutoComplete.java new file mode 100644 index 000000000..ce9776b55 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/commands/autocomplete/DailyEventAutoComplete.java @@ -0,0 +1,20 @@ +package fr.openmc.core.features.events.contents.dailyevents.commands.autocomplete; + +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.DailyEvent; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; + +import java.util.List; + +public class DailyEventAutoComplete implements SuggestionProvider { + + @Override + public @NotNull List getSuggestions(@NotNull ExecutionContext context) { + return DailyEventsManager.EVENTS.stream() + .map(DailyEvent::getEventId) + .toList(); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/bloodynight/BloodyNightEvent.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/bloodynight/BloodyNightEvent.java new file mode 100644 index 000000000..c246af449 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/bloodynight/BloodyNightEvent.java @@ -0,0 +1,95 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.bloodynight; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.DailyEvent; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasAmbient; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasBroadcast; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasToast; +import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.utils.nms.toast.CustomToastData; +import fr.openmc.core.utils.text.messages.TranslationManager; +import net.kyori.adventure.text.Component; +import net.minecraft.advancements.AdvancementType; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class BloodyNightEvent extends DailyEvent implements HasToast, HasAmbient, HasBroadcast { + @Override + public String getEventId() { + return "bloody_night"; + } + + @Override + public String getWorldEvent() { + return "world"; + } + + @Override + public int getDuration() { + return 20; + } + + @Override + public Runnable onStart() { + return () -> { + System.out.println("BLOODY NIGHT START"); + }; + } + + @Override + public Runnable onEnd() { + return () -> { + System.out.println("BLOODY NIGHT END"); + }; + } + + @Override + public Component getName() { + return TranslationManager.translation("feature.dailyevents.bloodynight.name"); + } + + @Override + public List getDescription() { + return TranslationManager.translationLore("feature.dailyevents.bloodynight.lore"); + } + + @Override + public ItemStack getIcon() { + return new ItemStack(Material.REDSTONE); + } + + @Override + public CustomToastData getStartToastData() { + return new CustomToastData( + this.getIcon(), + TranslationManager.translation("feature.dailyevents.bloodynight.toast.start"), + AdvancementType.CHALLENGE + ); + } + + @Override + public CustomToastData getEndToastData() { + return new CustomToastData( + this.getIcon(), + TranslationManager.translation("feature.dailyevents.bloodynight.toast.end"), + AdvancementType.GOAL + ); + } + + @Override + public CustomAmbient getAmbient() { + return OMCRegistry.CUSTOM_AMBIENTS.BLOODY; + } + + @Override + public Component getStartBroadcast() { + return TranslationManager.translation("feature.dailyevents.bloodynight.broadcast.start"); + } + + @Override + public Component getEndBroadcast() { + return TranslationManager.translation("feature.dailyevents.bloodynight.broadcast.end"); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/goldenharvest/GoldenHarvestEvent.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/goldenharvest/GoldenHarvestEvent.java new file mode 100644 index 000000000..b03553c91 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/goldenharvest/GoldenHarvestEvent.java @@ -0,0 +1,95 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.goldenharvest; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.DailyEvent; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasAmbient; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasBroadcast; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasToast; +import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.utils.nms.toast.CustomToastData; +import fr.openmc.core.utils.text.messages.TranslationManager; +import net.kyori.adventure.text.Component; +import net.minecraft.advancements.AdvancementType; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class GoldenHarvestEvent extends DailyEvent implements HasToast, HasAmbient, HasBroadcast { + @Override + public String getEventId() { + return "golden_harvest"; + } + + @Override + public String getWorldEvent() { + return "world"; + } + + @Override + public int getDuration() { + return 40; + } + + @Override + public Runnable onStart() { + return () -> { + System.out.println("GOLDEN HARVEST START"); + }; + } + + @Override + public Runnable onEnd() { + return () -> { + System.out.println("GOLDEN HARVEST END"); + }; + } + + @Override + public Component getName() { + return TranslationManager.translation("feature.dailyevents.goldenharvest.name"); + } + + @Override + public List getDescription() { + return TranslationManager.translationLore("feature.dailyevents.goldenharvest.lore"); + } + + @Override + public ItemStack getIcon() { + return new ItemStack(Material.GOLDEN_HOE); + } + + @Override + public CustomToastData getStartToastData() { + return new CustomToastData( + this.getIcon(), + TranslationManager.translation("feature.dailyevents.goldenharvest.toast.start"), + AdvancementType.CHALLENGE + ); + } + + @Override + public CustomToastData getEndToastData() { + return new CustomToastData( + this.getIcon(), + TranslationManager.translation("feature.dailyevents.goldenharvest.toast.end"), + AdvancementType.GOAL + ); + } + + @Override + public CustomAmbient getAmbient() { + return OMCRegistry.CUSTOM_AMBIENTS.GOLDEN; + } + + @Override + public Component getStartBroadcast() { + return TranslationManager.translation("feature.dailyevents.goldenharvest.broadcast.start"); + } + + @Override + public Component getEndBroadcast() { + return TranslationManager.translation("feature.dailyevents.goldenharvest.broadcast.end"); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/MiraculousFishingEvent.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/MiraculousFishingEvent.java new file mode 100644 index 000000000..16eabe5eb --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/MiraculousFishingEvent.java @@ -0,0 +1,111 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.bootstrap.features.types.HasListeners; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.listeners.EatKebabFermentedListener; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.listeners.PlayerFishListener; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.listeners.PlayerNotPickUpListener; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.DailyEvent; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasAmbient; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasBroadcast; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasToast; +import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.utils.nms.toast.CustomToastData; +import fr.openmc.core.utils.text.messages.TranslationManager; +import net.kyori.adventure.text.Component; +import net.minecraft.advancements.AdvancementType; +import org.bukkit.Material; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; + +import java.util.List; +import java.util.Set; + +public class MiraculousFishingEvent extends DailyEvent implements HasToast, HasAmbient, HasBroadcast, HasListeners { + @Override + public String getEventId() { + return "miraculous_fishing"; + } + + @Override + public String getWorldEvent() { + return "world"; + } + + @Override + public int getDuration() { + return 30; + } + + @Override + public Runnable onStart() { + return () -> { + System.out.println("MIRACULOUS FISHING START"); + }; + } + + @Override + public Runnable onEnd() { + return () -> { + System.out.println("MIRACULOUS FISHING END"); + }; + } + + @Override + public Component getName() { + return TranslationManager.translation("feature.dailyevents.miraculousfishing.name"); + } + + @Override + public List getDescription() { + return TranslationManager.translationLore("feature.dailyevents.miraculousfishing.lore"); + } + + @Override + public ItemStack getIcon() { + return new ItemStack(Material.FISHING_ROD); + } + + @Override + public CustomToastData getStartToastData() { + return new CustomToastData( + this.getIcon(), + TranslationManager.translation("feature.dailyevents.miraculousfishing.toast.start"), + AdvancementType.CHALLENGE + ); + } + + @Override + public CustomToastData getEndToastData() { + return new CustomToastData( + this.getIcon(), + TranslationManager.translation("feature.dailyevents.miraculousfishing.toast.end"), + AdvancementType.GOAL + ); + } + + @Override + public CustomAmbient getAmbient() { + return OMCRegistry.CUSTOM_AMBIENTS.BLESSED; + } + + //todo marquer effets de la peche miraculeuse ds broadcast + @Override + public Component getStartBroadcast() { + return TranslationManager.translation("feature.dailyevents.miraculousfishing.broadcast.start"); + } + + @Override + public Component getEndBroadcast() { + return TranslationManager.translation("feature.dailyevents.miraculousfishing.broadcast.end"); + } + + @Override + public Set getListeners() { + return Set.of( + new PlayerFishListener(), + new PlayerNotPickUpListener(), + new EatKebabFermentedListener() + ); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/MiraculousFishingManager.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/MiraculousFishingManager.java new file mode 100644 index 000000000..e3c3df405 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/MiraculousFishingManager.java @@ -0,0 +1,73 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing; + +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.MoneyLoot; +import fr.openmc.core.registry.loottable.loots.RepresentedItem; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.FishHook; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.util.Vector; + +public class MiraculousFishingManager { + + public static final NamespacedKey NOT_PICKUP_KEY = new NamespacedKey(OMCPlugin.getInstance(), "not_pickup"); + public static final double FISHING_SPEED_MODIFIER = 0.4; + + /** + * Applique un modificateur de vitesse de pêche à un FishHook. + * @param hook le hook qui aura son temps réduit + */ + public static void applyFishingSpeedModifier(FishHook hook) { + hook.setWaitTime((int) (hook.getMinWaitTime() * FISHING_SPEED_MODIFIER), + (int) (hook.getMaxWaitTime() * FISHING_SPEED_MODIFIER)); + } + + /** + * Simule un item qui est lancé du bouchon de pêche jusqu'au joueur, via un CustomLoot. + * @param player le joueur visé + * @param hookLocation la position du bouchon, position de spawn de l'item + * @param loot le CustomLoot qui sera utilisé pour déterminer l'item à lancer + */ + public static void simulateLaunchLoot(Player player, Location hookLocation, CustomLoot loot) { + ItemStack displayItem = getLaunchedItem(loot); + + if (displayItem == null) return; + + // * Spawn de l'entité Item + Item itemEntity = hookLocation.getWorld().dropItem(hookLocation, displayItem); + itemEntity.setCanPlayerPickup(true); + itemEntity.setCanMobPickup(true); + itemEntity.setGlowing(true); + + // * Revient à faire le vecteur vitesse entre 2 vecteur (xp - xh, yp - yh, zp - zh) + Vector velocity = player.getEyeLocation().toVector().subtract(hookLocation.toVector()); + velocity.multiply(0.1); + velocity.setY(velocity.getY() + Math.sqrt(Math.sqrt( + velocity.getX()*2 + velocity.getY()*2 + velocity.getZ()*2)) * 0.08); + itemEntity.setVelocity(velocity); + } + + /** + * L'item décidé en fonction du CustomLoot + * @param loot le custom loot + * @return un item stack en fonction du loot + */ + private static ItemStack getLaunchedItem(CustomLoot loot) { + // * Si c'est une loot qui peut être représenter par un item + if (loot instanceof RepresentedItem itemDisplayed) { + ItemStack item = itemDisplayed.getRepresentativeItem(); + // * et que si c'est une item, qui ne doit pas etre donné (ex Money) + if (loot instanceof MoneyLoot) + item.editPersistentDataContainer(c -> + c.set(NOT_PICKUP_KEY, PersistentDataType.BOOLEAN, true)); + return item; + } + + return null; + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/EpicFishingTreasureLootbox.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/EpicFishingTreasureLootbox.java new file mode 100644 index 000000000..456c3a6d1 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/EpicFishingTreasureLootbox.java @@ -0,0 +1,28 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.items; + +import dev.lone.itemsadder.api.Events.FurniturePrePlaceEvent; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.items.CustomItem; +import fr.openmc.core.registry.items.options.UsableBlock; +import fr.openmc.core.utils.bukkit.ItemUtils; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class EpicFishingTreasureLootbox extends CustomItem implements UsableBlock { + public EpicFishingTreasureLootbox(String id) { + super(id); + } + + @Override + public ItemStack getVanilla() { + return new ItemStack(Material.GLASS); + } + + @Override + public void onFurniturePlace(Player player, FurniturePrePlaceEvent event) { + event.setCancelled(true); + ItemUtils.removeItemsFromInventory(player, this.getBest(), 1); + OMCRegistry.CUSTOM_LOOTBOXES.EPIC_FISHING_TREASURE.open(player); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/FishingFurnitureLootbox.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/FishingFurnitureLootbox.java new file mode 100644 index 000000000..173bb3c60 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/FishingFurnitureLootbox.java @@ -0,0 +1,28 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.items; + +import dev.lone.itemsadder.api.Events.FurniturePrePlaceEvent; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.items.CustomItem; +import fr.openmc.core.registry.items.options.UsableBlock; +import fr.openmc.core.utils.bukkit.ItemUtils; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class FishingFurnitureLootbox extends CustomItem implements UsableBlock { + public FishingFurnitureLootbox(String id) { + super(id); + } + + @Override + public ItemStack getVanilla() { + return new ItemStack(Material.GLASS); + } + + @Override + public void onFurniturePlace(Player player, FurniturePrePlaceEvent event) { + event.setCancelled(true); + ItemUtils.removeItemsFromInventory(player, this.getBest(), 1); + OMCRegistry.CUSTOM_LOOTBOXES.FISHING_FURNITURE.open(player); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/LegendaryFishingTreasureLootbox.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/LegendaryFishingTreasureLootbox.java new file mode 100644 index 000000000..aa3678878 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/LegendaryFishingTreasureLootbox.java @@ -0,0 +1,28 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.items; + +import dev.lone.itemsadder.api.Events.FurniturePrePlaceEvent; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.items.CustomItem; +import fr.openmc.core.registry.items.options.UsableBlock; +import fr.openmc.core.utils.bukkit.ItemUtils; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class LegendaryFishingTreasureLootbox extends CustomItem implements UsableBlock { + public LegendaryFishingTreasureLootbox(String id) { + super(id); + } + + @Override + public ItemStack getVanilla() { + return new ItemStack(Material.GLASS); + } + + @Override + public void onFurniturePlace(Player player, FurniturePrePlaceEvent event) { + event.setCancelled(true); + ItemUtils.removeItemsFromInventory(player, this.getBest(), 1); + OMCRegistry.CUSTOM_LOOTBOXES.LEGENDARY_FISHING_TREASURE.open(player); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/RareFishingTreasureLootbox.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/RareFishingTreasureLootbox.java new file mode 100644 index 000000000..f95e58f71 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/items/RareFishingTreasureLootbox.java @@ -0,0 +1,28 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.items; + +import dev.lone.itemsadder.api.Events.FurniturePrePlaceEvent; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.items.CustomItem; +import fr.openmc.core.registry.items.options.UsableBlock; +import fr.openmc.core.utils.bukkit.ItemUtils; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class RareFishingTreasureLootbox extends CustomItem implements UsableBlock { + public RareFishingTreasureLootbox(String id) { + super(id); + } + + @Override + public ItemStack getVanilla() { + return new ItemStack(Material.GLASS); + } + + @Override + public void onFurniturePlace(Player player, FurniturePrePlaceEvent event) { + event.setCancelled(true); + ItemUtils.removeItemsFromInventory(player, this.getBest(), 1); + OMCRegistry.CUSTOM_LOOTBOXES.RARE_FISHING_TREASURE.open(player); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/EpicFishingTreasureLootbox.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/EpicFishingTreasureLootbox.java new file mode 100644 index 000000000..32ff97f43 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/EpicFishingTreasureLootbox.java @@ -0,0 +1,27 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.lootboxes; + +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.lootboxes.CustomLootbox; +import fr.openmc.core.registry.lootboxes.LootboxOptions; +import fr.openmc.core.utils.text.messages.TranslationManager; + +import java.util.stream.IntStream; + +public class EpicFishingTreasureLootbox extends CustomLootbox { + public EpicFishingTreasureLootbox() { + super( + OMCRegistry.CUSTOM_ITEMS.EPIC_FISHING_TREASURE, + "omc_daily_events:epic_fishing_treasure", + TranslationManager.translation("feature.dailyevents.miraculousfishing.lootbox.epic_fishing_treasure.name"), + OMCRegistry.CUSTOM_LOOT_TABLES.EPIC_FISHING_TREASURE, + new LootboxOptions( + InventorySize.NORMAL, + 60, + IntStream.range(10, 17).boxed().toList(), + 13 + ) + ); + } +} + diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/FishingFurnitureLootbox.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/FishingFurnitureLootbox.java new file mode 100644 index 000000000..2f5e24228 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/FishingFurnitureLootbox.java @@ -0,0 +1,27 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.lootboxes; + +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.lootboxes.CustomLootbox; +import fr.openmc.core.registry.lootboxes.LootboxOptions; +import fr.openmc.core.utils.text.messages.TranslationManager; + +import java.util.stream.IntStream; + +public class FishingFurnitureLootbox extends CustomLootbox { + public FishingFurnitureLootbox() { + super( + OMCRegistry.CUSTOM_ITEMS.FISHING_FURNITURE_BOX, + "omc_daily_events:fishing_furniture", + TranslationManager.translation("feature.dailyevents.miraculousfishing.lootbox.fishing_furniture.name"), + OMCRegistry.CUSTOM_LOOT_TABLES.FISHING_FURNITURE, + new LootboxOptions( + InventorySize.NORMAL, + 60, + IntStream.range(10, 17).boxed().toList(), + 13 + ) + ); + } +} + diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/LegendaryFishingTreasureLootbox.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/LegendaryFishingTreasureLootbox.java new file mode 100644 index 000000000..494d54489 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/LegendaryFishingTreasureLootbox.java @@ -0,0 +1,27 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.lootboxes; + +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.lootboxes.CustomLootbox; +import fr.openmc.core.registry.lootboxes.LootboxOptions; +import fr.openmc.core.utils.text.messages.TranslationManager; + +import java.util.stream.IntStream; + +public class LegendaryFishingTreasureLootbox extends CustomLootbox { + public LegendaryFishingTreasureLootbox() { + super( + OMCRegistry.CUSTOM_ITEMS.LEGENDARY_FISHING_TREASURE, + "omc_daily_events:legendary_fishing_treasure", + TranslationManager.translation("feature.dailyevents.miraculousfishing.lootbox.legendary_fishing_treasure.name"), + OMCRegistry.CUSTOM_LOOT_TABLES.LEGENDARY_FISHING_TREASURE, + new LootboxOptions( + InventorySize.NORMAL, + 60, + IntStream.range(10, 17).boxed().toList(), + 13 + ) + ); + } +} + diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/RareFishingTreasureLootbox.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/RareFishingTreasureLootbox.java new file mode 100644 index 000000000..5c4e573ab --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/lootboxes/RareFishingTreasureLootbox.java @@ -0,0 +1,27 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.lootboxes; + +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.lootboxes.CustomLootbox; +import fr.openmc.core.registry.lootboxes.LootboxOptions; +import fr.openmc.core.utils.text.messages.TranslationManager; + +import java.util.stream.IntStream; + +public class RareFishingTreasureLootbox extends CustomLootbox { + public RareFishingTreasureLootbox() { + super( + OMCRegistry.CUSTOM_ITEMS.RARE_FISHING_TREASURE, + "omc_daily_events:rare_fishing_treasure", + TranslationManager.translation("feature.dailyevents.miraculousfishing.lootbox.rare_fishing_treasure.name"), + OMCRegistry.CUSTOM_LOOT_TABLES.RARE_FISHING_TREASURE, + new LootboxOptions( + InventorySize.NORMAL, + 60, + IntStream.range(10, 17).boxed().toList(), + 13 + ) + ); + } +} + diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/fishing/BasicFishLootTable.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/fishing/BasicFishLootTable.java new file mode 100644 index 000000000..ee6b9f33c --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/fishing/BasicFishLootTable.java @@ -0,0 +1,25 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.fishing; + +import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; +import org.bukkit.Material; + +import java.util.Set; + +public class BasicFishLootTable extends CustomLootTable { + @Override + public String getNamespace() { + return "omc_daily_events:basic_fishing"; + } + + @Override + public Set getLoots() { + return Set.of( + new ItemLoot(Material.COD, Material.COD, 0.6, 2, 4), + new ItemLoot(Material.SALMON, Material.SALMON, 0.25, 2, 4), + new ItemLoot(Material.TROPICAL_FISH, Material.TROPICAL_FISH, 0.02, 2, 4), + new ItemLoot(Material.PUFFERFISH, Material.PUFFERFISH, 0.13, 2, 4) + ); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/fishing/MiraculousFishLootTable.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/fishing/MiraculousFishLootTable.java new file mode 100644 index 000000000..9a418fe34 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/fishing/MiraculousFishLootTable.java @@ -0,0 +1,26 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.fishing; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.*; + +import java.util.Set; + +public class MiraculousFishLootTable extends CustomLootTable { + @Override + public String getNamespace() { + return "omc_daily_events:miraculous_fishing"; + } + + @Override + public Set getLoots() { + return Set.of( + new TableLoot(OMCRegistry.CUSTOM_LOOT_TABLES.BASIC_FISHING, 0.4), + new MoneyLoot(50, 250, 0.3), + new ItemLoot(OMCRegistry.CUSTOM_ITEMS.SPONGE_BOB, 0.1, 1, 1), + new LootboxLoot(OMCRegistry.CUSTOM_LOOTBOXES.FISHING_FURNITURE, 0.08), + new LootboxLoot(OMCRegistry.CUSTOM_LOOTBOXES.RARE_FISHING_TREASURE, 0.1) + // new TableLoot(OMCRegistry.CUSTOM_LOOT_TABLES.SEA_CREATURE, 0.2) + ); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/EpicFishingTreasureLootTable.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/EpicFishingTreasureLootTable.java new file mode 100644 index 000000000..57d4c3470 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/EpicFishingTreasureLootTable.java @@ -0,0 +1,72 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.lootbox; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; +import fr.openmc.core.utils.RandomUtils; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; + +import java.util.List; +import java.util.Set; + +public class EpicFishingTreasureLootTable extends CustomLootTable { + @Override + public String getNamespace() { + return "omc_daily_events:epic_fishing_treasure"; + } + + @Override + public Set getLoots() { + return Set.of( + new ItemLoot(this::generateEnchantedBook, Material.ENCHANTED_BOOK, 0.2, 1, 2), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.KEBAB_FERMENTED, + OMCRegistry.CUSTOM_ITEMS.KEBAB_FERMENTED, + 0.1, + 1, + 3 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.AYWENITE_BLOCK, + OMCRegistry.CUSTOM_ITEMS.AYWENITE_BLOCK, + 0.07, + 2, + 6 + ), + new ItemLoot(OMCRegistry.CUSTOM_ITEMS.LEGENDARY_FISHING_TREASURE, 0.1, 1, 1) + ); + } + + private final List ENCHANTMENT_AVAILABLE = List.of( + Enchantment.DEPTH_STRIDER, + Enchantment.LURE, + Enchantment.MENDING, + Enchantment.LOOTING, + Enchantment.UNBREAKING, + Enchantment.LUCK_OF_THE_SEA + ); + + private ItemStack generateEnchantedBook() { + ItemStack enchantedBook = new ItemStack(Material.ENCHANTED_BOOK); + EnchantmentStorageMeta meta = (EnchantmentStorageMeta) enchantedBook.getItemMeta(); + if (meta != null) { + for (Enchantment enchantment : selectEnchantment(RandomUtils.randomBetween(2, 5))) { + int level = RandomUtils.randomBetween(enchantment.getStartLevel(), enchantment.getMaxLevel()); + meta.addStoredEnchant(enchantment, level, true); + } + + enchantedBook.setItemMeta(meta); + } + return enchantedBook; + } + + private List selectEnchantment(int number) { + List randomOrder = RandomUtils.generateRandomOrder(ENCHANTMENT_AVAILABLE); + + return randomOrder.subList(0, Math.min(number, randomOrder.size())); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/FishingFurnitureLootTable.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/FishingFurnitureLootTable.java new file mode 100644 index 000000000..6454f907e --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/FishingFurnitureLootTable.java @@ -0,0 +1,140 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.lootbox; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; + +import java.util.Set; + +public class FishingFurnitureLootTable extends CustomLootTable { + @Override + public String getNamespace() { + return "omc_daily_events:fishing_furniture"; + } + + @Override + public Set getLoots() { + return Set.of( + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_BLUE_FISH, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_BLUE_FISH, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_CYAN_FISH, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_CYAN_FISH, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_ORANGE_FISH, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_ORANGE_FISH, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_RED_FISH, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_RED_FISH, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_BOAT, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_BOAT, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_CHAIR, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_CHAIR, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FISH_BOX, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FISH_BOX, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FISH_RACK, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FISH_RACK, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FISHING_POLE, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FISHING_POLE, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FISHINGPOLE_RACK, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FISHINGPOLE_RACK, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FLOATIE, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_FLOATIE, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_HANGING_FISH, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_HANGING_FISH, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_LANDING_NET, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_LANDING_NET, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_LARGE_FISHNET, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_LARGE_FISHNET, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_LOBSTER_TRAP, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_LOBSTER_TRAP, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_STAND, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_STAND, + 0.2, + 1, + 1 + ), + new ItemLoot( + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_TABLE, + OMCRegistry.CUSTOM_ITEMS.FISHERMAN_TABLE, + 0.2, + 1, + 1 + ) + ); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/LegendaryFishingTreasureLootTable.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/LegendaryFishingTreasureLootTable.java new file mode 100644 index 000000000..db4686f21 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/LegendaryFishingTreasureLootTable.java @@ -0,0 +1,25 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.lootbox; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.features.dream.registries.DreamItemRegistry; +import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; + +import java.util.Set; + +public class LegendaryFishingTreasureLootTable extends CustomLootTable { + @Override + public String getNamespace() { + return "omc_daily_events:legendary_fishing_treasure"; + } + + @Override + public Set getLoots() { + return Set.of( + new ItemLoot(OMCRegistry.CUSTOM_ITEMS.ANCIENT_FISHER_HELMET, OMCRegistry.CUSTOM_ITEMS.ANCIENT_FISHER_HELMET, 0.10, 1, 1), + new ItemLoot(OMCRegistry.CUSTOM_ITEMS.ANCIENT_FISHER_BOOTS, OMCRegistry.CUSTOM_ITEMS.ANCIENT_FISHER_BOOTS, 0.10, 1, 1), + new ItemLoot(DreamItemRegistry.EWENITE_BLOCK, DreamItemRegistry.EWENITE_BLOCK, 0.006, 1, 1) + ); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/RareFishingTreasureLootTable.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/RareFishingTreasureLootTable.java new file mode 100644 index 000000000..abc5194fe --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/contents/loottable/lootbox/RareFishingTreasureLootTable.java @@ -0,0 +1,29 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.lootbox; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; +import org.bukkit.Material; + +import java.util.Set; + +public class RareFishingTreasureLootTable extends CustomLootTable { + @Override + public String getNamespace() { + return "omc_daily_events:rare_fishing_treasure"; + } + + @Override + public Set getLoots() { + return Set.of( + new ItemLoot(Material.COD, Material.COD, 0.3, 32, 64), + new ItemLoot(Material.SALMON, Material.SALMON, 0.3, 32, 64), + new ItemLoot(Material.TROPICAL_FISH, Material.TROPICAL_FISH, 0.3, 32, 64), + new ItemLoot(Material.PUFFERFISH, Material.PUFFERFISH, 0.3, 15, 32), + new ItemLoot(Material.NAUTILUS_SHELL, Material.NAUTILUS_SHELL, 0.15, 2, 4), + new ItemLoot(OMCRegistry.CUSTOM_ITEMS.EPIC_FISHING_TREASURE, 0.1, 1, 1) + + ); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/listeners/EatKebabFermentedListener.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/listeners/EatKebabFermentedListener.java new file mode 100644 index 000000000..69e115de6 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/listeners/EatKebabFermentedListener.java @@ -0,0 +1,68 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.listeners; + +import edu.umd.cs.findbugs.annotations.Nullable; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.items.CustomItem; +import fr.openmc.core.utils.text.messages.TranslationManager; +import net.kyori.adventure.text.Component; +import org.bukkit.*; +import org.bukkit.entity.Boat; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import java.util.Optional; + +public class EatKebabFermentedListener implements Listener { + + @EventHandler + public void onFoodEated(PlayerItemConsumeEvent event) { + Optional customItem = OMCRegistry.CUSTOM_ITEMS.get(event.getItem()); + + if (customItem.isEmpty() || !customItem.get().getId().equals(OMCRegistry.CUSTOM_ITEMS.KEBAB_FERMENTED.getId())) return; + + proutAction(event.getPlayer()); + } + + /** + * l'original, l'unique, le vrai + */ + private void proutAction(Player player) { + player.sendMessage(TranslationManager.translation("feature.dailyevents.miraculousfishing.eat_kebab_fermented.smelt")); + + if(player.isInsideVehicle()){ + if(player.getVehicle() instanceof Boat boat){ + ItemStack itemBoat = ItemStack.of(boat.getBoatMaterial()); + player.getVehicle().remove(); + player.getWorld().dropItemNaturally(boat.getLocation(), itemBoat); + + player.sendMessage(TranslationManager.translation("feature.dailyevents.miraculousfishing.eat_kebab_fermented.boat")); + } + } + + // Make the player jump + final Vector currentVelocity = player.getVelocity(); + currentVelocity.setY(0.55d); + + player.setVelocity(currentVelocity); + + // Spawn some cloud particles + final Location location = player.getLocation(); + final @Nullable World world = location.getWorld(); + + if (world != null) { + world.spawnParticle(Particle.CLOUD, location, 3, 0.02d, -0.04d, 0.02d, 0.09d); + + // Funny sound! + world.playSound(location, Sound.ENTITY_VILLAGER_NO, SoundCategory.PLAYERS, 0.8f, 2.3f); + world.playSound(location, Sound.ENTITY_GOAT_EAT, SoundCategory.PLAYERS,0.7f, 0.2f); + } + + // Broadcast the message + Bukkit.broadcast(TranslationManager.translation("feature.dailyevents.miraculousfishing.eat_kebab_fermented.broadcast", + Component.text(player.getName()))); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/listeners/PlayerFishListener.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/listeners/PlayerFishListener.java new file mode 100644 index 000000000..052d1fb05 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/listeners/PlayerFishListener.java @@ -0,0 +1,94 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.listeners; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.MiraculousFishingEvent; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.MiraculousFishingManager; +import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.MethodLoot; +import fr.openmc.core.registry.loottable.loots.MoneyLoot; +import fr.openmc.core.registry.loottable.loots.TableLoot; +import fr.openmc.core.utils.RngUtils; +import fr.openmc.core.utils.text.messages.MessageType; +import fr.openmc.core.utils.text.messages.MessagesManager; +import fr.openmc.core.utils.text.messages.Prefix; +import fr.openmc.core.utils.text.messages.TranslationManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Sound; +import org.bukkit.entity.Entity; +import org.bukkit.entity.FishHook; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerFishEvent; + +import java.util.Collection; +import java.util.List; + +public class PlayerFishListener implements Listener { + + @EventHandler + public void onStartFishing(PlayerFishEvent event) { + if (!DailyEventsManager.isActiveDailyEvent() + || !(DailyEventsManager.getActiveDailyEvent() instanceof MiraculousFishingEvent)) return; + + Player player = event.getPlayer(); + FishHook hook = event.getHook(); + + MiraculousFishingManager.applyFishingSpeedModifier(hook); + + switch (event.getState()) { + case FISHING -> { + // * SFX + // todo sfx + player.playSound(player.getLocation(), Sound.ENTITY_FISHING_BOBBER_SPLASH, 1f, 0.7f); + } + + case CAUGHT_FISH -> { + Entity caughtEntity = event.getCaught(); + if (caughtEntity instanceof Item caughtItem) { + caughtItem.remove(); + } + + CustomLootTable fishingLootTable = OMCRegistry.CUSTOM_LOOT_TABLES.MIRACULOUS_FISHING; + + List loots = fishingLootTable.rollLoots(player, false); + + // * SFX + // todo: sfx particle + MessagesManager.sendMessage(player, TranslationManager.translation( + "feature.dailyevents.miraculousfishing.loottable.get", + Component.text(loots.size()).color(NamedTextColor.YELLOW) + ), Prefix.MIRACULOUS_FISHING, MessageType.INFO, false); + + sendLoot(player, hook, loots); + } + } + } + + private void sendLoot(Player player, FishHook hook, Collection loots) { + for (CustomLoot loot : loots) { + if (loot.getDisplayText() != null) + player.sendMessage(Component.text(" - ", NamedTextColor.GRAY) + .append(Component.text(loot.getRepresentativeItem().getAmount() + "x ")) + .append(loot.getDisplayText()) + .append(Component.text(" ("+ Math.round(loot.getChance() * 100.0) +"% ★)", NamedTextColor.AQUA)) + ); + + RngUtils.sendSoundRng(player, loot.getChance()); + + MiraculousFishingManager.simulateLaunchLoot(player, hook.getLocation(), loot); + + // * Si y'a des sous loots, alors on affiche les sous loots obtenu + if (loot instanceof TableLoot) + sendLoot(player, hook, loot.run(player)); + // * Si c'est un loot de type MoneyLoot ou MethodLoot, + // on exécute le loot, car on ne le donne va via un item + else if (loot instanceof MoneyLoot || loot instanceof MethodLoot) + loot.run(player); + } + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/listeners/PlayerNotPickUpListener.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/listeners/PlayerNotPickUpListener.java new file mode 100644 index 000000000..347202455 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/contents/miraculousfishing/listeners/PlayerNotPickUpListener.java @@ -0,0 +1,18 @@ +package fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.listeners; + +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.MiraculousFishingManager; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; + +public class PlayerNotPickUpListener implements Listener { + @EventHandler + public void onPickUp(EntityPickupItemEvent event) { + if (!(event.getEntity() instanceof Player)) return; + if (!event.getItem().getItemStack().getPersistentDataContainer().has(MiraculousFishingManager.NOT_PICKUP_KEY)) return; + + event.getItem().remove(); + event.setCancelled(true); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/listeners/DailyEventAmbientListeners.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/listeners/DailyEventAmbientListeners.java new file mode 100644 index 000000000..8fc3af2cf --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/listeners/DailyEventAmbientListeners.java @@ -0,0 +1,37 @@ +package fr.openmc.core.features.events.contents.dailyevents.listeners; + +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.DailyEvent; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.HasAmbient; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerTeleportEvent; + +public class DailyEventAmbientListeners implements Listener { + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + if (!DailyEventsManager.isActiveDailyEvent()) return; + + DailyEvent dailyEvent = DailyEventsManager.outgoingEvent.getDailyEvent(); + + if (!(dailyEvent instanceof HasAmbient hasAmbient)) return; + + hasAmbient.apply(event.getPlayer()); + } + + @EventHandler + public void onChangeWorld(PlayerTeleportEvent event) { + if (!DailyEventsManager.isActiveDailyEvent()) return; + + DailyEvent dailyEvent = DailyEventsManager.outgoingEvent.getDailyEvent(); + + if (!(dailyEvent instanceof HasAmbient hasAmbient)) return; + + if (dailyEvent.getWorldEvent().equals(event.getFrom().getWorld().getName())) return; + if (!dailyEvent.getWorldEvent().equals(event.getTo().getWorld().getName())) return; + + hasAmbient.apply(event.getPlayer()); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/IncomingEventsDB.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/IncomingEventsDB.java new file mode 100644 index 000000000..5126b1df1 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/IncomingEventsDB.java @@ -0,0 +1,42 @@ +package fr.openmc.core.features.events.contents.dailyevents.models; + +import com.j256.ormlite.field.DataType; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.DailyEvent; +import lombok.Getter; +import lombok.Setter; + +import java.util.Arrays; +import java.util.List; + +import static java.util.stream.Collectors.toList; + +@Getter +@DatabaseTable(tableName = "daily_event_incoming") +public class IncomingEventsDB { + @DatabaseField(id = true, columnName = "id") + private int id = 1; + + @Setter + @DatabaseField(columnName = "incomings", dataType = DataType.SERIALIZABLE) + private String[] dailyEventsIdIncomings; + + public IncomingEventsDB() {} + + public IncomingEventsDB(List incomingEventsList) { + this.dailyEventsIdIncomings = incomingEventsList.stream() + .map(d->d.getDailyEvent().getEventId()) + .toArray(String[]::new); + } + + public List getDailyEventsIncomings() { + return Arrays.stream(dailyEventsIdIncomings) + .map(id -> DailyEventsManager.EVENTS.stream() + .filter(event -> event.getEventId().equals(id)) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Aucun daily event trouvé pour l'id : " + id))) + .collect(toList()); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/ScheduleDailyEvent.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/ScheduleDailyEvent.java new file mode 100644 index 000000000..3ddc1434e --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/ScheduleDailyEvent.java @@ -0,0 +1,42 @@ +package fr.openmc.core.features.events.contents.dailyevents.models; + + +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.DailyEvent; +import fr.openmc.core.features.events.models.Event; +import lombok.Getter; +import net.kyori.adventure.text.Component; +import org.bukkit.inventory.ItemStack; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * Wrapper qui combine le DailyEvent et sa date d'execution + */ +@Getter +public class ScheduleDailyEvent extends Event { + private final DailyEvent dailyEvent; + private final LocalDateTime scheduledStartDate; + private final LocalDateTime scheduledEndDate; + + public ScheduleDailyEvent(DailyEvent dailyEvent, LocalDateTime scheduledDate) { + this.dailyEvent = dailyEvent; + this.scheduledStartDate = scheduledDate; + this.scheduledEndDate = scheduledDate.plusMinutes(dailyEvent.getDuration()); + } + + @Override + public Component getName() { + return dailyEvent.getName(); + } + + @Override + public List getDescription() { + return dailyEvent.getDescription(); + } + + @Override + public ItemStack getIcon() { + return dailyEvent.getIcon(); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/DailyEvent.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/DailyEvent.java new file mode 100644 index 000000000..791be57b3 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/DailyEvent.java @@ -0,0 +1,95 @@ +package fr.openmc.core.features.events.contents.dailyevents.models.dailyevent; + +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import fr.openmc.core.features.events.contents.dailyevents.tasks.EndEventTask; +import fr.openmc.core.features.events.models.Event; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.Collection; +import java.util.stream.Collectors; + +public abstract class DailyEvent extends Event { + /** + * L'identifiant de l'evenement afin de le serialize dans la db + * @return un string + */ + public abstract String getEventId(); + + /** + * Le monde où l'evenement est actif + * @return un monde (minecraft:the_nether, minecraft:world, omc_dream:dream, ...) + */ + public abstract String getWorldEvent(); + + /** + * Le temps de durée de l'évenement + * @return un entier représentant les minutes + */ + public abstract int getDuration(); + + /** + * Les procédures à lancer au début de l'évenement + * @return une méthode + */ + public abstract Runnable onStart(); + + /** + * Les procédures à lancer à la fin de l'évenement + * @return une méthode + */ + public abstract Runnable onEnd(); + + public void start() { + Collection receivers = Bukkit.getOnlinePlayers() + .stream() + .filter(p -> p.getWorld().getName().equals(this.getWorldEvent())) + .collect(Collectors.toSet()); + + // * Application de l'ambience + if (this instanceof HasAmbient ambient) { + ambient.apply(receivers); + } + + // * Message de début + if (this instanceof HasBroadcast broadcast) { + broadcast.sendStartBroadcast(receivers); + } + + // * Toast de début + if (this instanceof HasToast toast) { + toast.getStartToastData().send(receivers); + } + + // * Programmation de la fin de l'evenement + DailyEventsManager.endEventTask = new EndEventTask() + .runTaskLater(OMCPlugin.getInstance(), + DailyEventsManager.outgoingEvent.getDailyEvent().getDuration() * 60L * 20L); + } + + public void end() { + Collection receivers = Bukkit.getOnlinePlayers() + .stream() + .filter(p -> p.getWorld().getName().equals(this.getWorldEvent())) + .collect(Collectors.toSet()); + + DailyEventsManager.outgoingEvent = null; + DailyEventsManager.endEventTask = null; + + // * Suppression de la l'ambience + if (this instanceof HasAmbient ambient) { + ambient.reset(receivers); + } + + // * Message de fin + if (this instanceof HasBroadcast broadcast) { + broadcast.sendEndBroadcast(receivers); + } + + // * Toast de fin + if (this instanceof HasToast toast) { + toast.getEndToastData().send(receivers); + } + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/HasAmbient.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/HasAmbient.java new file mode 100644 index 000000000..17548ba30 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/HasAmbient.java @@ -0,0 +1,26 @@ +package fr.openmc.core.features.events.contents.dailyevents.models.dailyevent; + +import fr.openmc.core.registry.ambient.CustomAmbient; +import org.bukkit.entity.Player; + +import java.util.Collection; + +public interface HasAmbient { + CustomAmbient getAmbient(); + + default void apply(Player player) { + this.getAmbient().apply(player); + } + + default void apply(Collection receivers) { + this.getAmbient().apply(receivers); + } + + default void reset(Player player) { + this.getAmbient().reset(player); + } + + default void reset(Collection receivers) { + this.getAmbient().reset(receivers); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/HasBroadcast.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/HasBroadcast.java new file mode 100644 index 000000000..5d00eae6f --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/HasBroadcast.java @@ -0,0 +1,23 @@ +package fr.openmc.core.features.events.contents.dailyevents.models.dailyevent; + +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; + +import java.util.Collection; + +public interface HasBroadcast { + Component getStartBroadcast(); + Component getEndBroadcast(); + + default void sendStartBroadcast(Collection receivers) { + for (Player receiver : receivers) { + receiver.sendMessage(getStartBroadcast()); + } + } + + default void sendEndBroadcast(Collection receivers) { + for (Player receiver : receivers) { + receiver.sendMessage(getEndBroadcast()); + } + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/HasToast.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/HasToast.java new file mode 100644 index 000000000..961cf4aab --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/models/dailyevent/HasToast.java @@ -0,0 +1,8 @@ +package fr.openmc.core.features.events.contents.dailyevents.models.dailyevent; + +import fr.openmc.core.utils.nms.toast.CustomToastData; + +public interface HasToast { + CustomToastData getStartToastData(); + CustomToastData getEndToastData(); +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/tasks/EndEventTask.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/tasks/EndEventTask.java new file mode 100644 index 000000000..6e63cb654 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/tasks/EndEventTask.java @@ -0,0 +1,11 @@ +package fr.openmc.core.features.events.contents.dailyevents.tasks; + +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import org.bukkit.scheduler.BukkitRunnable; + +public class EndEventTask extends BukkitRunnable { + @Override + public void run() { + DailyEventsManager.outgoingEvent.getDailyEvent().end(); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/tasks/NextEventTask.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/tasks/NextEventTask.java new file mode 100644 index 000000000..d4bd3f396 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/tasks/NextEventTask.java @@ -0,0 +1,24 @@ +package fr.openmc.core.features.events.contents.dailyevents.tasks; + +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import org.bukkit.Bukkit; +import org.bukkit.scheduler.BukkitRunnable; + +public class NextEventTask extends BukkitRunnable { + @Override + public void run() { + // * Choix de l'evenement à lancer + if (DailyEventsManager.incomingEvents.isEmpty()) { + DailyEventsManager.incomingEvents = DailyEventsManager.loadIncomingEvents(); + } + DailyEventsManager.outgoingEvent = DailyEventsManager.incomingEvents.removeFirst(); + + // * Lancement de l'evenement + DailyEventsManager.outgoingEvent.getDailyEvent().start(); + + // * 10 secondes d'attente avant de schedule un autre event (evite que plusieurs events se lancent en meme temps) + Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> + DailyEventsManager.nextEventTask = DailyEventsManager.scheduleNextEventTask(), 20L * 10); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/contents/dailyevents/tasks/ShowBeginningEventTask.java b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/tasks/ShowBeginningEventTask.java new file mode 100644 index 000000000..ec4600367 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/contents/dailyevents/tasks/ShowBeginningEventTask.java @@ -0,0 +1,50 @@ +package fr.openmc.core.features.events.contents.dailyevents.tasks; + +import fr.openmc.core.features.events.contents.dailyevents.DailyEventsManager; +import fr.openmc.core.features.events.contents.dailyevents.models.ScheduleDailyEvent; +import fr.openmc.core.features.events.contents.dailyevents.models.dailyevent.DailyEvent; +import fr.openmc.core.utils.nms.toast.ToastUtils; +import fr.openmc.core.utils.text.messages.TranslationManager; +import fr.openmc.core.utils.world.WorldUtils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minecraft.advancements.AdvancementType; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +public class ShowBeginningEventTask extends BukkitRunnable { + @Override + public void run() { + ScheduleDailyEvent nextEvent = DailyEventsManager.incomingEvents.getFirst(); + DailyEvent dailyEvent = nextEvent.getDailyEvent(); + + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + Component name; + + // ** Affichage d'un message dans le chat + if (dailyEvent.getWorldEvent().contains(onlinePlayer.getWorld().getName())) { + onlinePlayer.sendMessage( + TranslationManager.translation("feature.dailyevents.broadcast.soon")); + } + + // ** Affichage du Toast + if (dailyEvent.getWorldEvent().contains(onlinePlayer.getWorld().getName())) { + name = TranslationManager.translation("feature.dailyevents.toast.beginning_event_in_world", + Component.text(DailyEventsManager.SHOW_BEGINNING_DELAY, NamedTextColor.YELLOW)); + } else { + name = TranslationManager.translation("feature.dailyevents.toast.beginning_event_out_world", + TranslationManager.translation(WorldUtils.getDisplayedWorldName(dailyEvent.getWorldEvent())), + Component.text(DailyEventsManager.SHOW_BEGINNING_DELAY, NamedTextColor.YELLOW)); + } + + ToastUtils.sendCustomToast( + onlinePlayer, + Material.NOTE_BLOCK, + name, + AdvancementType.TASK + ); + } + } +} diff --git a/src/main/java/fr/openmc/core/features/friend/FriendSQLManager.java b/src/main/java/fr/openmc/core/features/friend/FriendSQLManager.java index 3176170b7..1abb25afe 100644 --- a/src/main/java/fr/openmc/core/features/friend/FriendSQLManager.java +++ b/src/main/java/fr/openmc/core/features/friend/FriendSQLManager.java @@ -7,10 +7,10 @@ import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; import fr.openmc.core.bootstrap.integration.OMCLogger; +import fr.openmc.core.utils.text.DateUtils; import java.sql.SQLException; import java.sql.Timestamp; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -50,7 +50,7 @@ private static Friend getFriendObject(UUID first, UUID second) { public static boolean addInDatabase(UUID first, UUID second) { try { - return friendsDao.create(new Friend(first, second, Timestamp.valueOf(LocalDateTime.now()))) != 0; + return friendsDao.create(new Friend(first, second, Timestamp.valueOf(DateUtils.getLocalDateTime()))) != 0; } catch (SQLException e) { OMCLogger.error("Failed to add Friends in database", e); return false; diff --git a/src/main/java/fr/openmc/core/features/mailboxes/MailboxManager.java b/src/main/java/fr/openmc/core/features/mailboxes/MailboxManager.java index 76b0a1c21..e98a1909b 100644 --- a/src/main/java/fr/openmc/core/features/mailboxes/MailboxManager.java +++ b/src/main/java/fr/openmc/core/features/mailboxes/MailboxManager.java @@ -16,6 +16,7 @@ import fr.openmc.core.features.settings.PlayerSettingsManager; import fr.openmc.core.features.settings.SettingType; import fr.openmc.core.utils.bukkit.serializer.BukkitSerializer; +import fr.openmc.core.utils.text.DateUtils; import fr.openmc.core.utils.text.messages.MessageType; import fr.openmc.core.utils.text.messages.MessagesManager; import fr.openmc.core.utils.text.messages.Prefix; @@ -81,7 +82,7 @@ public static boolean sendItems(Player sender, OfflinePlayer receiver, ItemStack private static boolean sendLetter(Player sender, OfflinePlayer receiver, ItemStack[] items) { String receiverName = receiver.getName(); int numItems = Arrays.stream(items).mapToInt(ItemStack::getAmount).sum(); - LocalDateTime sent = LocalDateTime.now(); + LocalDateTime sent = DateUtils.getLocalDateTime(); try { byte[] itemsBytes = BukkitSerializer.serializeItemStacks(items); @@ -125,7 +126,7 @@ public static void sendItemsToAOfflinePlayerBatch(Map OMCRegistry.CUSTOM_ITEMS.get(loot).isPresent()) .anyMatch(loot -> OMCRegistry.CUSTOM_ITEMS.getOrThrow(loot).getId().equals(pelushKey)); diff --git a/src/main/java/fr/openmc/core/hooks/itemsadder/ItemsAdderHook.java b/src/main/java/fr/openmc/core/hooks/itemsadder/ItemsAdderHook.java index 1a154772b..eae3531a4 100644 --- a/src/main/java/fr/openmc/core/hooks/itemsadder/ItemsAdderHook.java +++ b/src/main/java/fr/openmc/core/hooks/itemsadder/ItemsAdderHook.java @@ -87,9 +87,9 @@ public static void loadContents() { */ public static void copyContentsToItemsAdder(BootstrapContext context, String contentsName) { try { - File pluginsDir = context.getDataDirectory().toFile().getParentFile(); // * root/pluigns - File itemsAdderDir = new File(pluginsDir, "ItemsAdder"); // * root/pluigns/ItemsAdder - File contentDir = new File(itemsAdderDir, CONTENTS_FOLDER_NAME); // * root/pluigns/ItemsAdder/contents + File pluginsDir = context.getDataDirectory().toFile().getParentFile(); // * root/plugins + File itemsAdderDir = new File(pluginsDir, "ItemsAdder"); // * root/plugins/ItemsAdder + File contentDir = new File(itemsAdderDir, CONTENTS_FOLDER_NAME); // * root/plugins/ItemsAdder/contents FilesUtils.deleteDirectory(contentDir); diff --git a/src/main/java/fr/openmc/core/listeners/BlockPlaceListener.java b/src/main/java/fr/openmc/core/listeners/BlockPlaceListener.java new file mode 100644 index 000000000..1bf9760b2 --- /dev/null +++ b/src/main/java/fr/openmc/core/listeners/BlockPlaceListener.java @@ -0,0 +1,52 @@ +package fr.openmc.core.listeners; + +import dev.lone.itemsadder.api.Events.CustomBlockPlaceEvent; +import dev.lone.itemsadder.api.Events.FurniturePrePlaceEvent; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.items.CustomItem; +import fr.openmc.core.registry.items.options.UsableBlock; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; + +import java.util.Optional; + +public class BlockPlaceListener implements Listener { + @EventHandler(priority = EventPriority.LOWEST) + void onFurniturePlace(FurniturePrePlaceEvent event) { + Player player = event.getPlayer(); + + Optional item = OMCRegistry.CUSTOM_ITEMS.get(event.getNamespacedID()); + if (item.isEmpty()) return; + + if (item.get() instanceof UsableBlock usable) { + usable.onFurniturePlace(player, event); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + void onCustomBlockPlace(CustomBlockPlaceEvent event) { + Player player = event.getPlayer(); + + Optional item = OMCRegistry.CUSTOM_ITEMS.get(event.getNamespacedID()); + if (item.isEmpty()) return; + if (item.get() instanceof UsableBlock usable) { + usable.onCustomBlockPlace(player, event); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + void onBlockPlace(BlockPlaceEvent event) { + Player player = event.getPlayer(); + + Optional item = OMCRegistry.CUSTOM_ITEMS.get(event.getItemInHand()); + if (item.isEmpty()) return; + + if (item.get() instanceof UsableBlock usable) { + usable.onBlockPlace(player, event); + } + } + +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/registry/ambient/CustomAmbient.java b/src/main/java/fr/openmc/core/registry/ambient/CustomAmbient.java index 19e475510..2b54f46ce 100644 --- a/src/main/java/fr/openmc/core/registry/ambient/CustomAmbient.java +++ b/src/main/java/fr/openmc/core/registry/ambient/CustomAmbient.java @@ -1,8 +1,14 @@ package fr.openmc.core.registry.ambient; -import fr.openmc.api.datapacks.DatapackInjector; -import fr.openmc.api.datapacks.injectors.DimensionTypesInjector; +import com.google.gson.JsonObject; +import fr.openmc.api.datapacks.builders.BiomeBuilder; +import fr.openmc.api.datapacks.injectors.BiomesInjector; +import fr.openmc.core.registry.ambient.builder.AmbientBuilder; +import fr.openmc.core.utils.MathUtils; +import fr.openmc.core.utils.nms.PlayerBiomeNMS; import fr.openmc.core.utils.nms.PlayerRespawnNMS; +import fr.openmc.core.utils.nms.PlayerSetTimeNMS; +import fr.openmc.core.utils.nms.PlayerWeatherNMS; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; @@ -12,21 +18,22 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSpecialEffects; import net.minecraft.world.level.dimension.DimensionType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; public abstract class CustomAmbient { // ** UUID playerUUID -> String idAmbient public static final Map ACTIVE_AMBIENTS = new HashMap<>(); - private Holder CACHED_DIMENSION_TYPE = null; + + public Holder CACHED_DIMENSION_TYPE = null; public abstract String getId(); - public abstract DimensionTypesInjector.DimensionTypeBuilder getDimensionTypeBuilder(); + public abstract AmbientBuilder getAmbientBuilder(); /** * Choix de la transition de dimension lorsque le joueur change d'ambience @@ -34,15 +41,6 @@ public abstract class CustomAmbient { */ public abstract ResourceKey getTransitionDimension(); - /** - * Converti notre DimensionTypeBuild en un injecteur de datapack - * et qui mettera les dimension_type sous le namepsace omc_ambient - * @return Un datapack injector - */ - public DatapackInjector toDimensionTypeInjector() { - return new DimensionTypesInjector("omc_ambient").add(getId(), getDimensionTypeBuilder()); - } - /** * Applique l'ambience sur un Joueur * @param player Le joueur concerné @@ -57,9 +55,31 @@ public void apply(Player player) { getTransitionDimensionForPlayer(nmsPlayer) ); + if (this.getAmbientBuilder().utilizeBiome()) { + PlayerBiomeNMS.replaceBiomes(nmsPlayer, this.getId(), this::toBiomeVariantKey); + } + + if (this.getAmbientBuilder().getTimeFixed() != null) { + PlayerSetTimeNMS.sendPacketSetTime(player, this.getAmbientBuilder().getTimeFixed()); + } + + if (this.getAmbientBuilder().getWeatherFixed() != null) { + PlayerWeatherNMS.setWeather(player, this.getAmbientBuilder().getWeatherFixed()); + } + ACTIVE_AMBIENTS.put(player.getUniqueId(), this.getId()); } + /** + * Applique l'ambience sur des joueurs + * @param receivers Les joueurs concernés + */ + public void apply(Collection receivers) { + for (Player receiver : receivers) { + apply(receiver); + } + } + /** * Retire l'ambience du Joueur * @param player le joueur ciblé @@ -77,6 +97,75 @@ public void reset(Player player) { ACTIVE_AMBIENTS.remove(player.getUniqueId()); } + /** + * Retire l'ambience des joueurs + * @param receivers le joueur ciblé74 + */ + public void reset(Collection receivers) { + for (Player receiver : receivers) { + reset(receiver); + } + } + + /** + * Genere la clé de la variente du biome + * @param initialBiomeKey clé du biome initial a changer + * @return identifiant de la variante du biome (namespace:initialBiomePath_ambientId) + */ + public Identifier toBiomeVariantKey(Identifier initialBiomeKey) { + return Identifier.fromNamespaceAndPath(CustomAmbientRegistry.NAMESPACE, initialBiomeKey.getPath() + "_" + this.getId()); + } + + /** + * Genere une variante d'un biome en fonction d'une ambience (namespace:id) + * Retourne un injecteur de biome qui prendra une variante de celui ci + * (couleur de l'herbe initial si pas override par l'ambience, idem pour les autres) + * @param initialBiome le biome initial à cloner + * @param ambientId l'id de l'ambience + * @return l'injecteur du fichier json + */ + public BiomesInjector toBiomeVariant(Biome initialBiome, Identifier ambientId) { + BiomeSpecialEffects initialEffects = initialBiome.getSpecialEffects(); + Biome.ClimateSettings climate = initialBiome.climateSettings; + + if (!this.getAmbientBuilder().utilizeBiome()) return null; + + JsonObject effects = this.getAmbientBuilder().getBiomeBuilder().getEffects(); + Optional grassColor = hasEffects(effects, "grass_color") ? + Optional.of(MathUtils.hexToInt(effects.get("grass_color").getAsString())) : + initialEffects.grassColorOverride(); + Optional foliageColor = hasEffects(effects, "foliage_color") ? + Optional.of(MathUtils.hexToInt(effects.get("foliage_color").getAsString())) : + initialEffects.foliageColorOverride(); + Integer waterColor = hasEffects(effects, "water_color") ? + MathUtils.hexToInt(effects.get("water_color").getAsString()) : + initialEffects.waterColor(); + Optional dryFoliageColor = hasEffects(effects, "dry_foliage_color") ? + Optional.of(MathUtils.hexToInt(effects.get("dry_foliage_color").getAsString())) : + initialEffects.foliageColorOverride(); + String grassColorModifier = hasEffects(effects, "grass_color_modifier") ? + effects.get("grass_color_modifier").getAsString() : + initialEffects.grassColorModifier().getName(); + + BiomeBuilder builder = new BiomeBuilder() + .waterColor(waterColor) + .grassColorModifier(grassColorModifier) + .hasPrecipitation(climate.hasPrecipitation()) + .downfall(climate.downfall()) + .temperatures(climate.temperature()) + .temperatureModifier(climate.temperatureModifier().getName()); + + grassColor.ifPresent(builder::grassColor); + foliageColor.ifPresent(builder::foliageColor); + dryFoliageColor.ifPresent(builder::dryFoliageColor); + + return new BiomesInjector(ambientId.getNamespace()).add(ambientId.getPath(), builder); + } + + private boolean hasEffects(JsonObject effects, String envKey) { + return effects.get(envKey) != null; + } + /** * Calcule la dimension de transition appropriée pour le joueur * Si le joueur est en OVERWORLD, on transitionne vers l'ambience @@ -119,15 +208,15 @@ private Holder getDimensionType() { ResourceKey key = ResourceKey.create( Registries.DIMENSION_TYPE, - Identifier.fromNamespaceAndPath("omc_ambient", this.getId()) + Identifier.fromNamespaceAndPath(CustomAmbientRegistry.NAMESPACE, this.getId()) ); Registry dimRegistry = MinecraftServer.getServer().registryAccess().lookupOrThrow(Registries.DIMENSION_TYPE); CACHED_DIMENSION_TYPE = dimRegistry.get(key).orElseThrow(() -> - new IllegalStateException("DimensionType omc_ambient:"+ this.getId() +" introuvable") + new IllegalStateException("DimensionType " + CustomAmbientRegistry.NAMESPACE + ":"+ this.getId() +" introuvable") ); return CACHED_DIMENSION_TYPE; } -} +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/registry/ambient/CustomAmbientRegistry.java b/src/main/java/fr/openmc/core/registry/ambient/CustomAmbientRegistry.java index bdf5dfafc..01243c4fa 100644 --- a/src/main/java/fr/openmc/core/registry/ambient/CustomAmbientRegistry.java +++ b/src/main/java/fr/openmc/core/registry/ambient/CustomAmbientRegistry.java @@ -1,21 +1,30 @@ package fr.openmc.core.registry.ambient; import fr.openmc.api.datapacks.OMCDatapack; +import fr.openmc.api.datapacks.injectors.BiomesInjector; +import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.core.bootstrap.registries.KeyedRegistry; import fr.openmc.core.bootstrap.registries.Registry; -import fr.openmc.core.registry.ambient.contents.DarkAmbient; -import fr.openmc.core.registry.ambient.contents.HellAmbient; +import fr.openmc.core.registry.ambient.contents.*; import io.papermc.paper.plugin.bootstrap.BootstrapContext; +import net.minecraft.core.registries.Registries; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.biome.Biome; +import org.bukkit.Bukkit; import java.io.IOException; @SuppressWarnings("UnstableApiUsage") public class CustomAmbientRegistry extends Registry implements KeyedRegistry { - private final OMCDatapack ambientDatapack = new OMCDatapack("openmc", "omc_ambient"); + public static final String NAMESPACE = "omc_ambient"; + private final OMCDatapack ambientDatapack = new OMCDatapack("openmc", NAMESPACE); // ** REGISTER AMBIENT ** public final CustomAmbient DARK = register(new DarkAmbient()); public final CustomAmbient HELL = register(new HellAmbient()); + public final CustomAmbient GOLDEN = register(new GoldenAmbient()); + public final CustomAmbient BLOODY = register(new BloodyAmbient()); + public final CustomAmbient BLESSED = register(new BlessedAmbient()); @Override public String key(CustomAmbient registryObject) { @@ -24,10 +33,53 @@ public String key(CustomAmbient registryObject) { @Override public void bootstrap(BootstrapContext context) throws IOException { + // * On check si la config à été enlevé, + // on l'eneleve avant le démarrage des datapacks (utile si y'a une erreur avec celui ci) + RegistriesLoadConfig.init(context.getDataDirectory().toFile()); + + if (RegistriesLoadConfig.isMustRestart()) { + OMCLogger.infoFormatted("Suppression du datapack/" + ambientDatapack.ID_DATAPACK_INJECTED); + ambientDatapack.cleanupBootstrap(context); + } + } + + @Override + public void init() { for (CustomAmbient ambient : values()) { - ambientDatapack.addInjector(ambient.toDimensionTypeInjector()); + ambient.getAmbientBuilder().runInjectors(ambient, ambientDatapack); } - ambientDatapack.build(context); + if (RegistriesLoadConfig.isMustRestart() || checkIfAmbientChange()) { + try { + ambientDatapack.buildRuntime(() -> { + OMCLogger.warnFormatted("ATTENTION! Restart du serveur afin d'appliquer les changements dans les registres"); + Bukkit.restart(); + }); + } catch (IOException e) { + OMCLogger.error("Erreur survenue durant le build du datapack lors du runtime {}", e.getMessage()); + } + } else { + OMCLogger.infoFormatted("Aucun ambient rajouté, innutile de redémarrer le serveur"); + } + } + + private boolean checkIfAmbientChange() { + net.minecraft.core.Registry biomeRegistry = + MinecraftServer.getServer().registryAccess().lookupOrThrow(Registries.BIOME); + + int numberOfAmbient = values().stream() + .filter(ambient -> ambient.getAmbientBuilder().utilizeBiome()) + .toList().size(); + int numberOfVanillaBiome = biomeRegistry.keySet().stream() + .filter(key -> !key.getNamespace().equals(NAMESPACE)) + .toList().size(); + + int numberOfBiomeVariant = numberOfAmbient * numberOfVanillaBiome; + int numberOfBiomeVarientInDatapack = ambientDatapack.getInjectors().stream() + .filter(injector -> injector instanceof BiomesInjector).toList().size(); + + // * On regarde si notre nombre de variante de biome, est pas égale aux nombres de variente de biome dans le datapack + // si ça a changé ça veut dire qu'il y a des nouveaux biomes ou des nouvelles ambiences + return numberOfBiomeVariant != numberOfBiomeVarientInDatapack; } } diff --git a/src/main/java/fr/openmc/core/registry/ambient/RegistriesLoadConfig.java b/src/main/java/fr/openmc/core/registry/ambient/RegistriesLoadConfig.java new file mode 100644 index 000000000..ace14e441 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/ambient/RegistriesLoadConfig.java @@ -0,0 +1,45 @@ +package fr.openmc.core.registry.ambient; + +import fr.openmc.core.bootstrap.integration.OMCLogger; +import lombok.Getter; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; + +/** + * Cette configuration gère le restart de serveur apres la génération du datapack dans le runtime + *

+ * Explication : + * - Lorsqu'on génère un datapack dans le runtime, les changements ne sont pas appliqués dans les registry de minecraft + * - C'est pourquoi il faut redem le serveur afin que le datapack puisse bien entrer dans le registre. + * - Donc cela nécessite 2 lancements pour faire tourner une premiere fois le plugin. + */ +public class RegistriesLoadConfig { + private static File registriesConfigFile; + private static FileConfiguration registriesConfig; + @Getter + private static boolean mustRestart; + + public static void init(File dataFolder) { + registriesConfigFile = new File(dataFolder + "/data/registry", "load.yml"); + registriesConfig = YamlConfiguration.loadConfiguration(registriesConfigFile); + + // * Premier lancement du plugin où suppression du fichier par une classe externe (ex CustomAmbientRegistry) + if (!registriesConfigFile.exists()) { + mustRestart = true; + saveConfig(); + } else { + mustRestart = false; + } + } + + private static void saveConfig() { + try { + registriesConfig.save(registriesConfigFile); + } catch (IOException e) { + OMCLogger.error("Cannot save registriesConfigFile", e); + } + } +} diff --git a/src/main/java/fr/openmc/core/registry/ambient/builder/AmbientBuilder.java b/src/main/java/fr/openmc/core/registry/ambient/builder/AmbientBuilder.java new file mode 100644 index 000000000..470f067b9 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/ambient/builder/AmbientBuilder.java @@ -0,0 +1,241 @@ +package fr.openmc.core.registry.ambient.builder; + +import com.google.gson.JsonObject; +import fr.openmc.api.datapacks.OMCDatapack; +import fr.openmc.api.datapacks.builders.BiomeBuilder; +import fr.openmc.api.datapacks.builders.DimensionTypeBuilder; +import fr.openmc.api.datapacks.builders.EnvironnementAttributeBuilder; +import fr.openmc.api.datapacks.builders.TimelineBuilder; +import fr.openmc.api.datapacks.injectors.DimensionTypesInjector; +import fr.openmc.api.datapacks.injectors.TimelinesInjector; +import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.registry.ambient.CustomAmbientRegistry; +import fr.openmc.core.utils.nms.WeatherType; +import lombok.Getter; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.dimension.DimensionType; + +import java.util.function.Consumer; + +public class AmbientBuilder { + private final String namespace; + private final String id; + + @Getter + private final DimensionTypeBuilder dimTypeBuilder = new DimensionTypeBuilder(); + @Getter + private TimelineBuilder timelineBuilder = null; + @Getter + private BiomeBuilder biomeBuilder = null; + @Getter + private Integer timeFixed = null; + + @Getter + private WeatherType weatherFixed = null; + + public AmbientBuilder(String namepace, String id) { + this.namespace = namepace; + this.id = id; + } + + public boolean utilizeBiome() { + return biomeBuilder != null; + } + + + public AmbientBuilder ambientLight(double ambientLight) { + this.dimTypeBuilder.ambientLight(ambientLight); + return this; + } + + public AmbientBuilder attributesBuilder(EnvironnementAttributeBuilder builder) { + this.dimTypeBuilder.attributesBuilder(builder); + return this; + } + + public AmbientBuilder defaultClock(String keyOfClock) { + this.dimTypeBuilder.defaultClock(keyOfClock); + return this; + } + + public AmbientBuilder hasCeiling(boolean hasCeiling) { + this.dimTypeBuilder.hasCeiling(hasCeiling); + return this; + } + + public AmbientBuilder hasSkylight(boolean hasSkylight) { + this.dimTypeBuilder.hasSkylight(hasSkylight); + return this; + } + + public AmbientBuilder hasFixedTime(boolean hasFixedTime, int timeSet) { + this.dimTypeBuilder.hasFixedTime(hasFixedTime); + this.timeFixed = timeSet; + return this; + } + + public AmbientBuilder hasFixedTime(boolean hasFixedTime) { + this.dimTypeBuilder.hasFixedTime(hasFixedTime); + return this; + } + public AmbientBuilder skybox(String skybox) { + this.dimTypeBuilder.skybox(skybox); + return this; + } + + public AmbientBuilder skybox(DimensionType.Skybox skybox) { + return skybox(skybox.getSerializedName()); + } + + public AmbientBuilder cardinalLight(String cardinalLight) { + this.dimTypeBuilder.cardinalLight(cardinalLight); + return this; + } + + public AmbientBuilder timelines(String timelines) { + this.dimTypeBuilder.timelines(timelines); + return this; + } + + public AmbientBuilder timelines(TimelineBuilder builder) { + this.dimTypeBuilder.timelines(new TimelinesInjector(namespace).add(id, builder)); + this.timelineBuilder = builder; + return this; + } + + public AmbientBuilder biomes(BiomeBuilder builder) { + this.biomeBuilder = builder; + return this; + } + + public AmbientBuilder downfall(Float value) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.downfall(value); + return this; + } + + public AmbientBuilder temperatures(Float value) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.temperatures(value); + return this; + } + + public AmbientBuilder temperatureModifier(String id) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.temperatureModifier(id); + return this; + } + + public AmbientBuilder hasPrecipitation(Boolean bool) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.hasPrecipitation(bool); + return this; + } + + public AmbientBuilder hasPrecipitation(Boolean bool, WeatherType type) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.hasPrecipitation(bool); + this.weatherFixed = type; + return this; + } + + public AmbientBuilder effects(Consumer builder) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.effects(builder); + return this; + } + + public AmbientBuilder waterColor(String color) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.waterColor(color); + return this; + } + + public AmbientBuilder grassColor(String color) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.grassColor(color); + return this; + } + + public AmbientBuilder foliageColor(String color) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.foliageColor(color); + return this; + } + + public AmbientBuilder dryFoliageColor(String color) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.dryFoliageColor(color); + return this; + } + + public AmbientBuilder waterColor(Integer color) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.waterColor(color); + return this; + } + + public AmbientBuilder grassColor(Integer color) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.grassColor(color); + return this; + } + + public AmbientBuilder foliageColor(Integer color) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.foliageColor(color); + return this; + } + + public AmbientBuilder dryFoliageColor(Integer color) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.dryFoliageColor(color); + return this; + } + + /** + * Set la grass color modifier + * @param id none, dark_forest, swamp + * @return le builder + */ + public AmbientBuilder grassColorModifier(String id) { + if (biomeBuilder == null) biomeBuilder = new BiomeBuilder(); + this.biomeBuilder.grassColorModifier(id); + return this; + } + + public void runInjectors(CustomAmbient ambient, OMCDatapack datapack) { + // ** DimensionType Injector + DimensionTypesInjector dimensionTypesInjector = new DimensionTypesInjector(namespace).add(id, dimTypeBuilder); + datapack.addInjector(dimensionTypesInjector); + + // ** Timeline Injector + if (timelineBuilder != null) { + TimelinesInjector timelinesInjector = new TimelinesInjector(namespace).add(id, timelineBuilder); + datapack.addInjector(timelinesInjector); + } + + // ** Biome Injector + if (this.utilizeBiome()) { + net.minecraft.core.Registry biomeRegistry = + MinecraftServer.getServer().registryAccess().lookupOrThrow(Registries.BIOME); + + // ** Création de chaque variante des biomes existants. + // * Renvoie simplement un biome ayant les effects (grassColor, waterColor, ...) lié au biome original + // * si ça pas été override par le biome mis par le CustomAmbient + for (var biomeEntry : biomeRegistry.entrySet()) { + ResourceKey key = biomeEntry.getKey(); + if (key.identifier().getNamespace().equals(CustomAmbientRegistry.NAMESPACE)) continue; // * On skip les biomes de notre datapack + + Biome biome = biomeEntry.getValue(); + + datapack.addInjector(ambient.toBiomeVariant( + biome, ambient.toBiomeVariantKey(key.identifier()))); + } + } + } + +} diff --git a/src/main/java/fr/openmc/core/registry/ambient/contents/BlessedAmbient.java b/src/main/java/fr/openmc/core/registry/ambient/contents/BlessedAmbient.java new file mode 100644 index 000000000..017d0899a --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/ambient/contents/BlessedAmbient.java @@ -0,0 +1,61 @@ +package fr.openmc.core.registry.ambient.contents; + +import fr.openmc.api.datapacks.builders.EnvironnementAttributeBuilder; +import fr.openmc.api.datapacks.builders.sounds.AmbientSoundBuilder; +import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.registry.ambient.CustomAmbientRegistry; +import fr.openmc.core.registry.ambient.builder.AmbientBuilder; +import fr.openmc.core.utils.nms.WeatherType; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.dimension.DimensionType; +import org.bukkit.Particle; + +public class BlessedAmbient extends CustomAmbient { + @Override + public String getId() { + return "blessed_ambient"; + } + + @Override + public AmbientBuilder getAmbientBuilder() { + return new AmbientBuilder(CustomAmbientRegistry.NAMESPACE, this.getId()) + .attributesBuilder(new EnvironnementAttributeBuilder() + .attributes(obj -> { + obj.addProperty("visual/sky_light_color", "#FAED5C"); + obj.addProperty("visual/ambient_light_color", "#001A19"); + + obj.addProperty("visual/sunrise_sunset_color", "#e540e58b"); + obj.addProperty("visual/sky_color", "#92E6FC"); + + obj.addProperty("visual/fog_start_distance", 0); + obj.addProperty("visual/fog_end_distance", 512); + obj.addProperty("visual/fog_color", "#5CFFD3"); + obj.addProperty("visual/water_fog_color", "#75FFD1"); + + obj.addProperty("visual/cloud_height", 240); + }) + .ambientParticles(Particle.OMINOUS_SPAWNING, 0.01) + .ambientParticles(Particle.FISHING, 0.004) + .ambientSounds(new AmbientSoundBuilder() + .additions(new AmbientSoundBuilder.AdditionsBuilder() + .sound("minecraft:ambient.underwater.loop.additions.rare") + .tickChance(0.001) + ) + ) + ) + .ambientLight(0.2f) + .skybox(DimensionType.Skybox.OVERWORLD) + .hasSkylight(true) + .waterColor("#43d5ee") + .defaultClock("overworld") + .timelines("#minecraft:in_overworld") + .hasFixedTime(true, 200) + .hasPrecipitation(true, WeatherType.RAIN); + } + + @Override + public ResourceKey getTransitionDimension() { + return Level.END; + } +} diff --git a/src/main/java/fr/openmc/core/registry/ambient/contents/BloodyAmbient.java b/src/main/java/fr/openmc/core/registry/ambient/contents/BloodyAmbient.java new file mode 100644 index 000000000..dde6dc0e4 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/ambient/contents/BloodyAmbient.java @@ -0,0 +1,78 @@ +package fr.openmc.core.registry.ambient.contents; + +import fr.openmc.api.datapacks.builders.BiomeBuilder; +import fr.openmc.api.datapacks.builders.EnvironnementAttributeBuilder; +import fr.openmc.api.datapacks.builders.sounds.AmbientSoundBuilder; +import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.registry.ambient.CustomAmbientRegistry; +import fr.openmc.core.registry.ambient.builder.AmbientBuilder; +import fr.openmc.core.utils.nms.WeatherType; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.dimension.DimensionType; +import org.bukkit.Particle; + +public class BloodyAmbient extends CustomAmbient { + @Override + public String getId() { + return "bloody_ambient"; + } + + @Override + public AmbientBuilder getAmbientBuilder() { + return new AmbientBuilder(CustomAmbientRegistry.NAMESPACE, this.getId()) + .attributesBuilder(new EnvironnementAttributeBuilder() + .attributes(obj -> { + obj.addProperty("visual/block_light_tint", "#F53200"); + obj.addProperty("visual/ambient_light_color", "#FF5C57"); + obj.addProperty("minecraft:visual/sky_light_factor", 0.7); + + obj.addProperty("visual/fog_start_distance", 40); + obj.addProperty("visual/fog_end_distance", 70); + obj.addProperty("visual/fog_color","#800000"); + + obj.addProperty("visual/moon_phase", "full_moon"); + obj.addProperty("visual/moon_angle", 67); + obj.addProperty("visual/star_brightness", 0.7); + + obj.addProperty("visual/cloud_height", 65); + obj.addProperty("visual/cloud_color", "#7e8c2b2b"); + + obj.addProperty("visual/water_fog_color", "#330505"); + }) + .ambientParticles(Particle.CRIMSON_SPORE, 0.01f) + .ambientParticles(Particle.RAID_OMEN, 0.001f) + .ambientSounds(new AmbientSoundBuilder() + .loop("minecraft:ambient.soul_sand_valley.loop") + .mood(new AmbientSoundBuilder.MoodBuilder() + .sound("minecraft:ambient.soul_sand_valley.mood") + .tickDelay(2000) + .offset(2) + .blockSearchExtent(8) + ) + .additions(new AmbientSoundBuilder.AdditionsBuilder() + .sound("minecraft:ambient.cave") + .tickChance(0.001) + ) + ) + ) + .ambientLight(0f) + .cardinalLight("nether") + .skybox(DimensionType.Skybox.OVERWORLD) + .hasSkylight(false) + .hasCeiling(true) + .biomes(new BiomeBuilder() + .hasPrecipitation(false) + .waterColor("#700000")) + + .defaultClock("overworld") + .timelines("#minecraft:in_overworld") + .hasFixedTime(true, 21000) + .hasPrecipitation(false, WeatherType.NONE); + } + + @Override + public ResourceKey getTransitionDimension() { + return Level.NETHER; + } +} diff --git a/src/main/java/fr/openmc/core/registry/ambient/contents/DarkAmbient.java b/src/main/java/fr/openmc/core/registry/ambient/contents/DarkAmbient.java index 4e84828fe..1a4c9ac5a 100644 --- a/src/main/java/fr/openmc/core/registry/ambient/contents/DarkAmbient.java +++ b/src/main/java/fr/openmc/core/registry/ambient/contents/DarkAmbient.java @@ -1,7 +1,9 @@ package fr.openmc.core.registry.ambient.contents; -import fr.openmc.api.datapacks.injectors.DimensionTypesInjector; +import fr.openmc.api.datapacks.builders.EnvironnementAttributeBuilder; import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.registry.ambient.CustomAmbientRegistry; +import fr.openmc.core.registry.ambient.builder.AmbientBuilder; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; @@ -13,18 +15,20 @@ public String getId() { } @Override - public DimensionTypesInjector.DimensionTypeBuilder getDimensionTypeBuilder() { - return new DimensionTypesInjector.DimensionTypeBuilder() - .attributes(obj -> { - obj.addProperty("visual/ambient_light_color", "#DD37E6"); - obj.addProperty("visual/sky_color", "#DD37E6"); - obj.addProperty("visual/sky_light_color", "#3B205E"); - obj.addProperty("visual/fog_start_distance", 40); - obj.addProperty("visual/fog_end_distance", 70); - obj.addProperty("visual/sunrise_sunset_color", "#FFBB00FA"); - }) + public AmbientBuilder getAmbientBuilder() { + return new AmbientBuilder(CustomAmbientRegistry.NAMESPACE, this.getId()) + .attributesBuilder(new EnvironnementAttributeBuilder() + .attributes(obj -> { + obj.addProperty("visual/ambient_light_color", "#DD37E6"); + obj.addProperty("visual/sky_color", "#DD37E6"); + obj.addProperty("visual/sky_light_color", "#3B205E"); + obj.addProperty("visual/fog_start_distance", 40); + obj.addProperty("visual/fog_end_distance", 70); + obj.addProperty("visual/sunrise_sunset_color", "#FFBB00FA"); + }) + ) .defaultClock(null) - .timelines(null) + .timelines((String) null) .skybox(DimensionType.Skybox.END) .hasSkylight(true); } diff --git a/src/main/java/fr/openmc/core/registry/ambient/contents/GoldenAmbient.java b/src/main/java/fr/openmc/core/registry/ambient/contents/GoldenAmbient.java new file mode 100644 index 000000000..72173ff22 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/ambient/contents/GoldenAmbient.java @@ -0,0 +1,58 @@ +package fr.openmc.core.registry.ambient.contents; + +import fr.openmc.api.datapacks.builders.EnvironnementAttributeBuilder; +import fr.openmc.api.datapacks.builders.sounds.AmbientSoundBuilder; +import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.registry.ambient.CustomAmbientRegistry; +import fr.openmc.core.registry.ambient.builder.AmbientBuilder; +import fr.openmc.core.utils.nms.WeatherType; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.dimension.DimensionType; + +public class GoldenAmbient extends CustomAmbient { + @Override + public String getId() { + return "golden_ambient"; + } + + @Override + public AmbientBuilder getAmbientBuilder() { + return new AmbientBuilder(CustomAmbientRegistry.NAMESPACE, this.getId()) + .attributesBuilder(new EnvironnementAttributeBuilder() + .attributes(obj -> { + obj.addProperty("visual/block_light_tint", "#FFE02E"); + obj.addProperty("visual/ambient_light_color", "#211D07"); + obj.addProperty("visual/sky_light_color", "#FFDE17"); + + obj.addProperty("visual/sky_color", "#E3AA00"); + obj.addProperty("visual/sunrise_sunset_color", "#ccfa6f25"); + + obj.addProperty("visual/fog_color", "#AA9B27"); + obj.addProperty("visual/fog_start_distance", 70); + obj.addProperty("visual/fog_end_distance", 80); + + obj.addProperty("visual/cloud_height", 100); + obj.addProperty("visual/cloud_color", "#4cffde50"); + }) + .particleDustColorTransition(16776172, 16766720, 2, 0.01) + .ambientSounds(new AmbientSoundBuilder() + .additions(new AmbientSoundBuilder.AdditionsBuilder() + .sound("minecraft:block.amethyst_block.step") + .tickChance(0.1) + ) + ) + ) + .skybox(DimensionType.Skybox.OVERWORLD) + .hasSkylight(true) + .defaultClock("overworld") + .timelines("#minecraft:in_overworld") + .hasFixedTime(true, 6000) + .hasPrecipitation(false, WeatherType.NONE); + } + + @Override + public ResourceKey getTransitionDimension() { + return Level.END; + } +} diff --git a/src/main/java/fr/openmc/core/registry/ambient/contents/HellAmbient.java b/src/main/java/fr/openmc/core/registry/ambient/contents/HellAmbient.java index 98aba1cf3..786bb65fb 100644 --- a/src/main/java/fr/openmc/core/registry/ambient/contents/HellAmbient.java +++ b/src/main/java/fr/openmc/core/registry/ambient/contents/HellAmbient.java @@ -1,7 +1,9 @@ package fr.openmc.core.registry.ambient.contents; -import fr.openmc.api.datapacks.injectors.DimensionTypesInjector; +import fr.openmc.api.datapacks.builders.EnvironnementAttributeBuilder; import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.registry.ambient.CustomAmbientRegistry; +import fr.openmc.core.registry.ambient.builder.AmbientBuilder; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; @@ -14,24 +16,24 @@ public String getId() { } @Override - public DimensionTypesInjector.DimensionTypeBuilder getDimensionTypeBuilder() { - return new DimensionTypesInjector.DimensionTypeBuilder() - .attributes(obj -> { - obj.addProperty("visual/ambient_light_color", "#A3170B"); - obj.addProperty("visual/block_light_tint", "#F53200"); - obj.addProperty("visual/fog_start_distance", 10); - obj.addProperty("visual/fog_end_distance", 96); - obj.addProperty("minecraft:visual/sky_light_color", "#7a7aff"); - obj.addProperty("minecraft:visual/sky_light_factor", 0); - obj.addProperty("visual/fog_color","#5E1414"); - }) - .ambientParticles(Particle.CRIMSON_SPORE, 0.25f) + public AmbientBuilder getAmbientBuilder() { + return new AmbientBuilder(CustomAmbientRegistry.NAMESPACE, this.getId()) + .attributesBuilder(new EnvironnementAttributeBuilder() + .attributes(obj -> { + obj.addProperty("visual/ambient_light_color", "#A3170B"); + obj.addProperty("visual/block_light_tint", "#F53200"); + obj.addProperty("visual/fog_start_distance", 10); + obj.addProperty("visual/fog_end_distance", 96); + obj.addProperty("minecraft:visual/sky_light_color", "#7a7aff"); + obj.addProperty("minecraft:visual/sky_light_factor", 0); + obj.addProperty("visual/fog_color","#5E1414"); + }) + .ambientParticles(Particle.CRIMSON_SPORE, 0.25f)) .defaultClock(null) .ambientLight(0.1f) .cardinalLight("nether") .timelines("#minecraft:in_nether") .skybox(DimensionType.Skybox.NONE) - .infiniburn("#minecraft:infiniburn_nether") .hasSkylight(false) .hasCeiling(true) .hasFixedTime(true); diff --git a/src/main/java/fr/openmc/core/registry/ambient/listeners/AmbientWeatherListener.java b/src/main/java/fr/openmc/core/registry/ambient/listeners/AmbientWeatherListener.java new file mode 100644 index 000000000..d79e483e7 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/ambient/listeners/AmbientWeatherListener.java @@ -0,0 +1,27 @@ +package fr.openmc.core.registry.ambient.listeners; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.utils.nms.PlayerWeatherNMS; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.weather.WeatherChangeEvent; + +public class AmbientWeatherListener implements Listener { + + @EventHandler + public void onWeatherChange(WeatherChangeEvent event) { + for (Player player : event.getWorld().getPlayers()) { + if (!CustomAmbient.ACTIVE_AMBIENTS.containsKey(player.getUniqueId())) continue; + + CustomAmbient ambientApplied = OMCRegistry.CUSTOM_AMBIENTS.getOrThrow( + CustomAmbient.ACTIVE_AMBIENTS.get(player.getUniqueId()) + ); + + if (ambientApplied.getAmbientBuilder().getWeatherFixed() == null) continue; + + PlayerWeatherNMS.setWeather(player, ambientApplied.getAmbientBuilder().getWeatherFixed()); + } + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/registry/ambient/listeners/BiomesOnChunkLoad.java b/src/main/java/fr/openmc/core/registry/ambient/listeners/BiomesOnChunkLoad.java new file mode 100644 index 000000000..da5876232 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/ambient/listeners/BiomesOnChunkLoad.java @@ -0,0 +1,42 @@ +package fr.openmc.core.registry.ambient.listeners; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.registry.ambient.CustomAmbient; +import fr.openmc.core.utils.nms.PlayerBiomeNMS; +import io.papermc.paper.event.packet.PlayerChunkLoadEvent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.status.ChunkStatus; +import org.bukkit.craftbukkit.CraftChunk; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +/** + * Listener qui va appliquer le biome de l'ambience d'un joueur si : + * - le joueur a une ambience + * - et que l'ambience utilise un biome ou non + */ +public class BiomesOnChunkLoad implements Listener { + + @EventHandler + public void onChunkLoad(PlayerChunkLoadEvent event) { + Player player = event.getPlayer(); + + if (!CustomAmbient.ACTIVE_AMBIENTS.containsKey(player.getUniqueId())) return; + + CustomAmbient ambientApplied = OMCRegistry.CUSTOM_AMBIENTS.getOrThrow( + CustomAmbient.ACTIVE_AMBIENTS.get(player.getUniqueId()) + ); + + if (!ambientApplied.getAmbientBuilder().utilizeBiome()) return; + + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + ChunkAccess chunkAccess = ((CraftChunk) event.getChunk()).getHandle(ChunkStatus.FULL); + if (!(chunkAccess instanceof LevelChunk nmsChunk)) return; + + PlayerBiomeNMS.remplaceBiome(nmsPlayer, nmsChunk, ambientApplied.getId(), ambientApplied::toBiomeVariantKey); + } +} diff --git a/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java b/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java index 84dd8d737..f96d58213 100644 --- a/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java +++ b/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java @@ -4,6 +4,10 @@ import fr.openmc.core.CommandsManager; import fr.openmc.core.bootstrap.registries.KeyedRegistry; import fr.openmc.core.bootstrap.registries.Registry; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.items.EpicFishingTreasureLootbox; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.items.FishingFurnitureLootbox; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.items.LegendaryFishingTreasureLootbox; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.items.RareFishingTreasureLootbox; import fr.openmc.core.hooks.itemsadder.ItemsAdderHook; import fr.openmc.core.registry.items.contents.AywenCap; import fr.openmc.core.registry.items.contents.Hammer; @@ -86,6 +90,45 @@ public class CustomItemRegistry extends Registry implements public final CustomItem DIAMOND_HAMMER = register(new Hammer("omc_items:diamond_hammer", Material.DIAMOND_PICKAXE, 1, 1)); public final CustomItem NETHERITE_HAMMER = register(new Hammer("omc_items:netherite_hammer", Material.NETHERITE_PICKAXE, 1, 2)); + /* Daily Event */ + public final CustomItem TENDERS = register("omc_daily_events:tenders", Material.COOKED_CHICKEN); + public final CustomItem SPONGE_BOB = register("omc_daily_events:bob_sponge", Material.SPONGE); + public final CustomItem KEBAB_FERMENTED = register("omc_daily_events:kebab_fermented", Material.COOKED_BEEF); + + public final CustomItem ANCIENT_FISHER_HELMET = register("omc_daily_events:ancient_fishing_helmet", Material.IRON_HELMET); + public final CustomItem ANCIENT_FISHER_CHESTPLATE = register("omc_daily_events:ancient_fishing_chestplate", Material.IRON_CHESTPLATE); + public final CustomItem ANCIENT_FISHER_LEGGINGS = register("omc_daily_events:ancient_fishing_leggings", Material.IRON_LEGGINGS); + public final CustomItem ANCIENT_FISHER_BOOTS = register("omc_daily_events:ancient_fishing_boots", Material.IRON_BOOTS); + + public final CustomItem FISHERMAN_BLUE_FISH = register("omc_daily_events:fisherman_blue_fish", Material.PAPER); + public final CustomItem FISHERMAN_CYAN_FISH = register("omc_daily_events:fisherman_cyan_fish", Material.PAPER); + public final CustomItem FISHERMAN_ORANGE_FISH = register("omc_daily_events:fisherman_orange_fish", Material.PAPER); + public final CustomItem FISHERMAN_RED_FISH = register("omc_daily_events:fisherman_red_fish", Material.PAPER); + public final CustomItem FISHERMAN_BOAT = register("omc_daily_events:fisherman_boat", Material.PAPER); + public final CustomItem FISHERMAN_CHAIR = register("omc_daily_events:fisherman_chair", Material.PAPER); + public final CustomItem FISHERMAN_FISH_BOX = register("omc_daily_events:fisherman_fish_box", Material.PAPER); + public final CustomItem FISHERMAN_FISH_RACK = register("omc_daily_events:fisherman_fish_rack", Material.PAPER); + public final CustomItem FISHERMAN_FISHING_POLE = register("omc_daily_events:fisherman_fishing_pole", Material.PAPER); + public final CustomItem FISHERMAN_FISHINGPOLE_RACK = register("omc_daily_events:fisherman_fishingpole_rack", Material.PAPER); + public final CustomItem FISHERMAN_FLOATIE = register("omc_daily_events:fisherman_floatie", Material.PAPER); + public final CustomItem FISHERMAN_HANGING_FISH = register("omc_daily_events:fisherman_hanging_fish", Material.PAPER); + public final CustomItem FISHERMAN_LANDING_NET = register("omc_daily_events:fisherman_landing_net", Material.PAPER); + public final CustomItem FISHERMAN_LARGE_FISHNET = register("omc_daily_events:fisherman_large_fishnet", Material.PAPER); + public final CustomItem FISHERMAN_LOBSTER_TRAP = register("omc_daily_events:fisherman_lobster_trap", Material.PAPER); + public final CustomItem FISHERMAN_STAND = register("omc_daily_events:fisherman_stand", Material.PAPER); + public final CustomItem FISHERMAN_TABLE = register("omc_daily_events:fisherman_table", Material.PAPER); + + public final CustomItem RARE_FISHING_TREASURE = register(new RareFishingTreasureLootbox("omc_daily_events:rare_fishing_treasure_lootbox")); + public final CustomItem EPIC_FISHING_TREASURE = register(new EpicFishingTreasureLootbox("omc_daily_events:epic_fishing_treasure_lootbox")); + public final CustomItem LEGENDARY_FISHING_TREASURE = register(new LegendaryFishingTreasureLootbox("omc_daily_events:legendary_fishing_treasure_lootbox")); + public final CustomItem FISHING_FURNITURE_BOX = register(new FishingFurnitureLootbox("omc_daily_events:fishing_furniture_lootbox")); + + public final CustomItem COIN = register("omc_daily_events:coin", Material.GOLD_INGOT); + public final CustomItem POISSON_STEVE_HEAD = register("omc_daily_events:poisson_steve_head", Material.PLAYER_HEAD); + public final CustomItem KRAKEN_HEAD = register("omc_daily_events:kraken_head", Material.PLAYER_HEAD); + public final CustomItem LEVIATHAN_HEAD = register("omc_daily_events:leviathan_head", Material.PLAYER_HEAD); + + @Override public void postInit() { CommandsManager.getHandler().register(new CustomItemsDebugCommand()); diff --git a/src/main/java/fr/openmc/core/registry/items/options/UsableBlock.java b/src/main/java/fr/openmc/core/registry/items/options/UsableBlock.java new file mode 100644 index 000000000..9663c2cf9 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/items/options/UsableBlock.java @@ -0,0 +1,12 @@ +package fr.openmc.core.registry.items.options; + +import dev.lone.itemsadder.api.Events.CustomBlockPlaceEvent; +import dev.lone.itemsadder.api.Events.FurniturePrePlaceEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockPlaceEvent; + +public interface UsableBlock { + default void onFurniturePlace(Player player, FurniturePrePlaceEvent event) {} + default void onCustomBlockPlace(Player player, CustomBlockPlaceEvent event) {} + default void onBlockPlace(Player player, BlockPlaceEvent event) {} +} diff --git a/src/main/java/fr/openmc/core/registry/lootboxes/CustomLootbox.java b/src/main/java/fr/openmc/core/registry/lootboxes/CustomLootbox.java index 8e5cd420c..87c069825 100644 --- a/src/main/java/fr/openmc/core/registry/lootboxes/CustomLootbox.java +++ b/src/main/java/fr/openmc/core/registry/lootboxes/CustomLootbox.java @@ -1,15 +1,18 @@ package fr.openmc.core.registry.lootboxes; import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.core.registry.items.CustomItem; import fr.openmc.core.registry.loottable.CustomLootTable; import lombok.Getter; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import java.util.stream.IntStream; @Getter public abstract class CustomLootbox { + private final ItemStack itemDisplayed; private final String namespace; private final Component name; private final CustomLootTable lootTable; @@ -20,13 +23,38 @@ public abstract class CustomLootbox { 22 ); + public CustomLootbox(ItemStack itemDisplayed, String namespace, Component name, CustomLootTable lootTable) { + this.itemDisplayed = itemDisplayed; + this.namespace = namespace; + this.name = name; + this.lootTable = lootTable; + } + public CustomLootbox(String namespace, Component name, CustomLootTable lootTable) { + this.itemDisplayed = null; this.namespace = namespace; this.name = name; this.lootTable = lootTable; } + public CustomLootbox(CustomItem itemDisplayed, String namespace, Component name, CustomLootTable lootTable, LootboxOptions options) { + this.itemDisplayed = itemDisplayed.getBest(); + this.namespace = namespace; + this.name = name; + this.lootTable = lootTable; + this.options = options; + } + + public CustomLootbox(ItemStack itemDisplayed, String namespace, Component name, CustomLootTable lootTable, LootboxOptions options) { + this.itemDisplayed = itemDisplayed; + this.namespace = namespace; + this.name = name; + this.lootTable = lootTable; + this.options = options; + } + public CustomLootbox(String namespace, Component name, CustomLootTable lootTable, LootboxOptions options) { + this.itemDisplayed = null; this.namespace = namespace; this.name = name; this.lootTable = lootTable; diff --git a/src/main/java/fr/openmc/core/registry/lootboxes/CustomLootboxRegistry.java b/src/main/java/fr/openmc/core/registry/lootboxes/CustomLootboxRegistry.java index 9004cbdab..cb0efc260 100644 --- a/src/main/java/fr/openmc/core/registry/lootboxes/CustomLootboxRegistry.java +++ b/src/main/java/fr/openmc/core/registry/lootboxes/CustomLootboxRegistry.java @@ -2,6 +2,10 @@ import fr.openmc.core.bootstrap.registries.KeyedRegistry; import fr.openmc.core.bootstrap.registries.Registry; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.lootboxes.EpicFishingTreasureLootbox; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.lootboxes.FishingFurnitureLootbox; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.lootboxes.LegendaryFishingTreasureLootbox; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.lootboxes.RareFishingTreasureLootbox; import fr.openmc.core.registry.lootboxes.contents.MachineBallLootbox; public class CustomLootboxRegistry extends Registry implements KeyedRegistry { @@ -9,6 +13,11 @@ public class CustomLootboxRegistry extends Registry imple // ** REGISTER LOOTBOX ** public final CustomLootbox MACHINE_BALL = register(new MachineBallLootbox()); + public final CustomLootbox FISHING_FURNITURE = register(new FishingFurnitureLootbox()); + public final CustomLootbox RARE_FISHING_TREASURE = register(new RareFishingTreasureLootbox()); + public final CustomLootbox EPIC_FISHING_TREASURE = register(new EpicFishingTreasureLootbox()); + public final CustomLootbox LEGENDARY_FISHING_TREASURE = register(new LegendaryFishingTreasureLootbox()); + @Override public String key(CustomLootbox registryObject) { return registryObject.getNamespace(); diff --git a/src/main/java/fr/openmc/core/registry/lootboxes/LootboxOpenMenu.java b/src/main/java/fr/openmc/core/registry/lootboxes/LootboxOpenMenu.java index c6063823b..e39130125 100644 --- a/src/main/java/fr/openmc/core/registry/lootboxes/LootboxOpenMenu.java +++ b/src/main/java/fr/openmc/core/registry/lootboxes/LootboxOpenMenu.java @@ -5,13 +5,15 @@ import fr.openmc.api.menulib.utils.ItemMenuBuilder; import fr.openmc.core.OMCPlugin; import fr.openmc.core.events.LootboxRewardEvent; -import fr.openmc.core.registry.loottable.CustomLoot; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.utils.text.messages.MessageType; import fr.openmc.core.utils.text.messages.MessagesManager; import fr.openmc.core.utils.text.messages.Prefix; import net.kyori.adventure.key.Key; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.FireworkEffect; @@ -45,7 +47,7 @@ public class LootboxOpenMenu extends Menu { private final CustomLootbox box; private int itemOffset = 0; - private CustomLoot winningItem = null; + private CustomLoot winningLoot = null; private boolean finished = false; public LootboxOpenMenu(@NotNull Player owner, CustomLootbox box) { @@ -78,33 +80,61 @@ public String getTexture() { public @NotNull Map getContent() { Map items = fill(Material.GRAY_STAINED_GLASS_PANE); - if (!isAnimating && !finished) startAnimation(); - if (finished && winningItem != null) { - items.put(22, new ItemMenuBuilder(this, winningItem.displayedItem().getType(), meta -> { + if (finished && winningLoot != null && winningLoot.getRepresentativeItem() != null) { + ItemStack displayedItem = winningLoot.getRepresentativeItem(); + + items.put(box.getOptions().rewardSlot(), new ItemMenuBuilder(this, displayedItem, meta -> { meta.displayName(Component.text("§6§l✦ ") - .append(winningItem.displayedItem().effectiveName()) + .append(displayedItem.effectiveName().decoration(TextDecoration.ITALIC, false)) .append(Component.text(" §6§l✦"))); List lore = new ArrayList<>(); lore.add(Component.text("§e§lFÉLICITATIONS !")); lore.add(Component.text(" ")); - lore.addAll(winningItem.displayedItem().lore()); + if (displayedItem.lore() != null) + lore.addAll(displayedItem.lore()); meta.lore(lore); })); + return items; } List weightedPool = box.getLootTable().generateWeightedPool(); for (int i = 0; i < displaySlots.size(); i++) { int lootIndex = (itemOffset + i) % weightedPool.size(); - CustomLoot lootItem = weightedPool.get(lootIndex); + CustomLoot loot = weightedPool.get(lootIndex); - items.put(displaySlots.get(i), new ItemMenuBuilder(this, lootItem.displayedItem().getType(), meta -> { - meta.displayName(winningItem.displayedItem().effectiveName()); - meta.lore(lootItem.displayedItem().lore()); - })); + ItemStack itemDisplay = loot.getRepresentativeItem(); + + if (loot instanceof ItemLoot itemLoot && itemLoot.getDisplayedItem() != null) { + itemDisplay = itemLoot.getDisplayedItem(); + } + + if (itemDisplay == null) continue; + + ItemStack finalItemDisplay = itemDisplay; + + ItemMenuBuilder itemMenuBuilder = new ItemMenuBuilder(this, finalItemDisplay, meta -> { + Component name = finalItemDisplay.effectiveName().decoration(TextDecoration.ITALIC, false); + + if (loot instanceof ItemLoot itemLoot + && itemLoot.getMinAmount() != itemLoot.getMaxAmount()) { + name = Component.text("§7" + itemLoot.getMinAmount() + "-" + itemLoot.getMaxAmount() + " ") + .append(name); + } + + meta.displayName(name); + meta.lore(finalItemDisplay.lore()); + }); + + if (loot instanceof ItemLoot itemLoot + && itemLoot.getMinAmount() == itemLoot.getMaxAmount()) { + itemMenuBuilder.setAmount(itemLoot.getMinAmount()); + } + + items.put(displaySlots.get(i), itemMenuBuilder); } return items; @@ -141,7 +171,8 @@ public void startAnimation() { getOwner().playSound(Sound.sound(Key.key("minecraft", "block.note_block.pling"), Sound.Source.BLOCK, 1f, 1f)); - winningItem = box.getLootTable().selectRandomLoot(); + winningLoot = box.getLootTable().selectRandomLoot(); + List weightedPool = box.getLootTable().generateWeightedPool(); animationTask = new BukkitRunnable() { @@ -167,7 +198,8 @@ public void run() { } private void finishAnimation(boolean withLatency) { - winningItem = box.getLootTable().selectRandomLoot(); + winningLoot = box.getLootTable().selectRandomLoot(); + finished = true; getOwner().playSound(Sound.sound(Key.key("minecraft", "entity.player.levelup"), @@ -178,14 +210,13 @@ private void finishAnimation(boolean withLatency) { new BukkitRunnable() { @Override public void run() { - boolean cancelled = giveReward(winningItem); - System.out.println(cancelled); + boolean cancelled = giveReward(winningLoot); if (cancelled) { cancel(); return; } getOwner().closeInventory(); - if (winningItem.chance() <= 10.0) { + if (winningLoot.getChance() <= 0.1) { getOwner().playSound(Sound.sound(Key.key("minecraft", "entity.firework_rocket.launch"), Sound.Source.BLOCK, 1f, 1f)); @@ -200,11 +231,12 @@ public void run() { firework.setFireworkMeta(meta); firework.detonate(); }); + MessagesManager.broadcastMessage( Component.text("§6§l✦ §e§lFÉLICITATIONS §r§eà ") .append(Component.text(getOwner().getName())) .append(Component.text(" §equi vient de gagner ")) - .append(winningItem.displayedItem().effectiveName()) + .append(winningLoot.getRepresentativeItem().effectiveName().decoration(TextDecoration.ITALIC, false)) .append(Component.text(" §eà ")) .append(box.getName()) .append(Component.text(" §e! §6§l✦")), @@ -219,17 +251,11 @@ private boolean giveReward(CustomLoot wonItem) { Bukkit.getPluginManager().callEvent(rewardEvent); if (rewardEvent.isCancelled()) return true; - for (ItemStack reward : wonItem.items()) { - if (getOwner().getInventory().firstEmpty() != -1) { - getOwner().getInventory().addItem(reward); - } else { - getOwner().getWorld().dropItemNaturally(getOwner().getLocation(), reward); - } - } + wonItem.run(getOwner()); MessagesManager.sendMessage(getOwner(), Component.text("§aVous avez gagné : ") - .append(wonItem.displayedItem().displayName()) + .append(wonItem.getRepresentativeItem().displayName()) .append(Component.text(" §a!")), Prefix.OPENMC, MessageType.SUCCESS, true); return false; @@ -241,19 +267,41 @@ private void refreshAnimated(List pool) { for (int i = 0; i < displaySlots.size(); i++) { int index; - CustomLoot itemToShow; + ItemStack itemToShow; + CustomLoot currentLoot; if (animationTick > maxAnimationTicks - 10 && i == displaySlots.indexOf(box.getOptions().rewardSlot())) { - itemToShow = winningItem; + itemToShow = winningLoot.getRepresentativeItem(); + currentLoot = winningLoot; } else { index = (itemOffset + i) % pool.size(); - itemToShow = pool.get(index); + currentLoot = pool.get(index); + itemToShow = currentLoot.getRepresentativeItem(); } - inv.setItem(displaySlots.get(i), new ItemMenuBuilder(this, itemToShow.displayedItem().getType(), meta -> { - meta.displayName(itemToShow.displayedItem().effectiveName()); - meta.lore(itemToShow.displayedItem().lore()); - })); + if (itemToShow == null) continue; + + ItemStack finalItemToShow = itemToShow; + CustomLoot finalCurrentLoot = currentLoot; + ItemMenuBuilder itemMenuBuilder = new ItemMenuBuilder(this, itemToShow, meta -> { + Component name = finalItemToShow.effectiveName().decoration(TextDecoration.ITALIC, false); + + if (finalCurrentLoot instanceof ItemLoot itemLoot + && itemLoot.getMinAmount() != itemLoot.getMaxAmount()) { + name = Component.text("§7" + itemLoot.getMinAmount() + "-" + itemLoot.getMaxAmount() + " ") + .append(name); + } + + meta.displayName(name); + meta.lore(finalItemToShow.lore()); + }); + + if (finalCurrentLoot instanceof ItemLoot itemLoot + && itemLoot.getMinAmount() == itemLoot.getMaxAmount()) { + itemMenuBuilder.setAmount(itemLoot.getMinAmount()); + } + + inv.setItem(displaySlots.get(i), itemMenuBuilder); } if (animationTick >= maxAnimationTicks) { diff --git a/src/main/java/fr/openmc/core/registry/loottable/CustomLoot.java b/src/main/java/fr/openmc/core/registry/loottable/CustomLoot.java deleted file mode 100644 index b2edc7cb3..000000000 --- a/src/main/java/fr/openmc/core/registry/loottable/CustomLoot.java +++ /dev/null @@ -1,59 +0,0 @@ -package fr.openmc.core.registry.loottable; - -import fr.openmc.core.registry.items.CustomItem; -import org.bukkit.inventory.ItemStack; - -import java.util.Collections; -import java.util.Set; - -public record CustomLoot(Set items, ItemStack displayedItem, double chance, int minAmount, int maxAmount) { - - public CustomLoot(ItemStack item, double chance, int minAmount, int maxAmount) { - this(Collections.singleton(item), - null, - chance, - minAmount, - maxAmount); - } - - public CustomLoot(CustomItem item, double chance, int minAmount, int maxAmount) { - if (item == null) { - throw new IllegalArgumentException("CustomItem cannot be null"); - } - this(Collections.singleton(item.getBest()), - null, - chance, - minAmount, - maxAmount); - } - - public CustomLoot(ItemStack item, ItemStack displayedItem, double chance, int minAmount, int maxAmount) { - this(Collections.singleton(item), - displayedItem, - chance, - minAmount, - maxAmount); - } - - public CustomLoot(CustomItem item, ItemStack displayedItem, double chance, int minAmount, int maxAmount) { - if (item == null) { - throw new IllegalArgumentException("CustomItem cannot be null"); - } - this(Collections.singleton(item.getBest()), - displayedItem, - chance, - minAmount, - maxAmount); - } - - public ItemStack getFirstLoot() { - if (items.size() == 1) { - return items.iterator().next(); - } - return items.stream().findFirst().orElse(null); - } - - public int getRandomAmount() { - return minAmount + (int) (Math.random() * (maxAmount - minAmount + 1)); - } -} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/registry/loottable/CustomLootTable.java b/src/main/java/fr/openmc/core/registry/loottable/CustomLootTable.java index 6f182870b..7af559cbd 100644 --- a/src/main/java/fr/openmc/core/registry/loottable/CustomLootTable.java +++ b/src/main/java/fr/openmc/core/registry/loottable/CustomLootTable.java @@ -1,6 +1,9 @@ package fr.openmc.core.registry.loottable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.utils.bukkit.ItemUtils; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -15,62 +18,53 @@ public abstract class CustomLootTable { public double getChanceOf(ItemStack item) { return this.getLoots().stream() - .filter(loot -> loot.items().stream() + .filter(loot -> loot instanceof ItemLoot) + .map(loot -> (ItemLoot) loot) + .filter(loot -> loot.getItems().stream() .anyMatch(lootItem -> ItemUtils.isSimilar(lootItem, item))) - .mapToDouble(CustomLoot::chance) + .mapToDouble(CustomLoot::getChance) .sum(); } - /** - * Rolls the loot table and returns a list of ItemStacks based on the defined chances. - * The method calculates the total chance of all loots, generates a random number, - * and iterates through the loots to determine which one(s) to drop based on their chances. - * @return A list of ItemStacks representing the rolled loot. - */ - public List rollLoots() { - List result = new ArrayList<>(); + public List rollLoots(Player receiver, boolean giveLoots) { + List result = new ArrayList<>(); double totalChance = this.getLoots().stream() - .mapToDouble(CustomLoot::chance) + .mapToDouble(CustomLoot::getChance) .sum(); double roll = Math.random() * totalChance; double sumChance = 0.0; for (CustomLoot loot : this.getLoots()) { - sumChance += loot.chance(); + sumChance += loot.getChance(); if (roll <= sumChance) { - for (ItemStack lootItem : loot.items()) { - ItemStack item = lootItem.clone(); - item.setAmount(loot.getRandomAmount()); - result.add(item); - } + if (giveLoots) + loot.run(receiver); + result.add(loot); break; } } if (result.isEmpty()) { CustomLoot next = this.getLoots().iterator().next(); - for (ItemStack lootItem : next.items()) { - ItemStack item = lootItem.clone(); - item.setAmount(next.getRandomAmount()); - result.add(item); - } + if (giveLoots) + next.run(receiver); + result.add(next); } return result; } - /** - * Rolls the loot table and returns a list of ItemStacks based on the defined chances, but with a specified amount for each loot. - * @param amountRoll The amount to set for each rolled loot. This will override the random amount defined in the CustomLoot. - * @return A list of ItemStacks representing the rolled loot with the specified amount. - */ - public List rollLootsWithAmount(int amountRoll) { - List loot = new ArrayList<>(); + public List rollLoots(Player receiver) { + return rollLoots(receiver, true); + } + + public List rollLootsWithAmount(Player receiver, int amountRoll) { + List loot = new ArrayList<>(); for (int i = 0; i < amountRoll; i++) { - loot.addAll(rollLoots()); + loot.addAll(rollLoots(receiver)); } return loot; @@ -78,17 +72,17 @@ public List rollLootsWithAmount(int amountRoll) { public CustomLoot selectRandomLoot() { double totalChance = this.getLoots().stream() - .mapToDouble(CustomLoot::chance) + .mapToDouble(CustomLoot::getChance) .sum(); double random = ThreadLocalRandom.current().nextDouble(totalChance); double cumulative = 0; - for (CustomLoot item : this.getLoots()) { - cumulative += item.chance(); + for (CustomLoot loot : this.getLoots()) { + cumulative += loot.getChance(); if (random <= cumulative) { - return item; + return loot; } } @@ -97,10 +91,10 @@ public CustomLoot selectRandomLoot() { public List generateWeightedPool() { List pool = new ArrayList<>(); - for (CustomLoot item : this.getLoots()) { - int count = Math.max(1, (int) (item.chance() * 2)); + for (CustomLoot loot : this.getLoots()) { + int count = Math.max(1, (int) (loot.getChance() * 2)); for (int i = 0; i < count; i++) { - pool.add(item); + pool.add(loot); } } Collections.shuffle(pool); diff --git a/src/main/java/fr/openmc/core/registry/loottable/CustomLootTableRegistry.java b/src/main/java/fr/openmc/core/registry/loottable/CustomLootTableRegistry.java index ef052ec63..9928a0557 100644 --- a/src/main/java/fr/openmc/core/registry/loottable/CustomLootTableRegistry.java +++ b/src/main/java/fr/openmc/core/registry/loottable/CustomLootTableRegistry.java @@ -2,6 +2,12 @@ import fr.openmc.core.bootstrap.registries.KeyedRegistry; import fr.openmc.core.bootstrap.registries.Registry; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.fishing.BasicFishLootTable; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.fishing.MiraculousFishLootTable; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.lootbox.EpicFishingTreasureLootTable; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.lootbox.FishingFurnitureLootTable; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.lootbox.LegendaryFishingTreasureLootTable; +import fr.openmc.core.features.events.contents.dailyevents.contents.miraculousfishing.contents.loottable.lootbox.RareFishingTreasureLootTable; import fr.openmc.core.registry.loottable.contents.MachineBallLootTable; public class CustomLootTableRegistry extends Registry implements KeyedRegistry { @@ -9,6 +15,14 @@ public class CustomLootTableRegistry extends Registry i // ** REGISTER LOOT TABLE ** public final CustomLootTable MACHINE_BALL = register(new MachineBallLootTable()); + public final CustomLootTable MIRACULOUS_FISHING = register(new MiraculousFishLootTable()); + public final CustomLootTable BASIC_FISHING = register(new BasicFishLootTable()); + + public final CustomLootTable FISHING_FURNITURE = register(new FishingFurnitureLootTable()); + public final CustomLootTable RARE_FISHING_TREASURE = register(new RareFishingTreasureLootTable()); + public final CustomLootTable EPIC_FISHING_TREASURE = register(new EpicFishingTreasureLootTable()); + public final CustomLootTable LEGENDARY_FISHING_TREASURE = register(new LegendaryFishingTreasureLootTable()); + @Override public String key(CustomLootTable registryObject) { return registryObject.getNamespace(); diff --git a/src/main/java/fr/openmc/core/registry/loottable/contents/MachineBallLootTable.java b/src/main/java/fr/openmc/core/registry/loottable/contents/MachineBallLootTable.java index e28396608..bafadd3aa 100644 --- a/src/main/java/fr/openmc/core/registry/loottable/contents/MachineBallLootTable.java +++ b/src/main/java/fr/openmc/core/registry/loottable/contents/MachineBallLootTable.java @@ -1,8 +1,9 @@ package fr.openmc.core.registry.loottable.contents; import fr.openmc.core.OMCRegistry; -import fr.openmc.core.registry.loottable.CustomLoot; import fr.openmc.core.registry.loottable.CustomLootTable; +import fr.openmc.core.registry.loottable.loots.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.utils.bukkit.ItemBuilder; import net.kyori.adventure.text.Component; import org.bukkit.Material; @@ -20,7 +21,7 @@ public String getNamespace() { @Override public Set getLoots() { return Set.of( - new CustomLoot( + new ItemLoot( Set.of(OMCRegistry.CUSTOM_ITEMS.PELUCHE_SEINYY.getBest()), new ItemBuilder( OMCRegistry.CUSTOM_ITEMS.PELUCHE_SEINYY, @@ -29,12 +30,12 @@ public Set getLoots() { meta.lore(List.of(Component.text("§7Une petite peluche comme Seinyy !"))); } ), - 10.0, + 0.1, 1, 1 ), - new CustomLoot( - Set.of(new ItemStack(Material.DIAMOND, 3)), + new ItemLoot( + Set.of(ItemStack.of(Material.DIAMOND)), new ItemBuilder( Material.DIAMOND, meta -> { @@ -42,12 +43,12 @@ public Set getLoots() { meta.lore(List.of(Component.text("§7Ohhhh mais qu'est ce que c'est précieux ce truc !?"))); } ), - 15.0, - 1, - 1 + 0.15, + 3, + 3 ), - new CustomLoot( - Set.of(new ItemStack(Material.IRON_INGOT, 10)), + new ItemLoot( + Set.of(ItemStack.of(Material.IRON_INGOT)), new ItemBuilder( Material.IRON_INGOT, meta -> { @@ -55,12 +56,12 @@ public Set getLoots() { meta.lore(List.of(Component.text("§7Simplement du fer, rien de fou quoi..."))); } ), - 20.0, - 1, - 1 + 0.2, + 10, + 10 ), - new CustomLoot( - Set.of(new ItemStack(Material.NETHERITE_INGOT)), + new ItemLoot( + Set.of(ItemStack.of(Material.NETHERITE_INGOT)), new ItemBuilder( Material.NETHERITE_INGOT, meta -> { @@ -68,12 +69,12 @@ public Set getLoots() { meta.lore(List.of(Component.text("§7Le truc le plus rare du jeu !"))); } ), - 0.5, + 0.05, 1, 1 ), - new CustomLoot( - Set.of(new ItemStack(Material.OAK_LOG, 32)), + new ItemLoot( + Set.of(ItemStack.of(Material.OAK_LOG)), new ItemBuilder( Material.OAK_LOG, meta -> { @@ -81,12 +82,12 @@ public Set getLoots() { meta.lore(List.of(Component.text("§7De quoi te faire une petite maison hihi"))); } ), - 25, - 1, - 1 + 0.25, + 32, + 32 ), - new CustomLoot( - Set.of(new ItemStack(Material.COOKED_BEEF, 16)), + new ItemLoot( + Set.of(ItemStack.of(Material.COOKED_BEEF)), new ItemBuilder( Material.COOKED_BEEF, meta -> { @@ -94,12 +95,12 @@ public Set getLoots() { meta.lore(List.of(Component.text("§7Miam miam, de la bonne viande !"))); } ), - 15, - 1, - 1 + 0.15, + 16, + 16 ), - new CustomLoot( - Set.of(new ItemStack(Material.COAL, 16)), + new ItemLoot( + Set.of(ItemStack.of(Material.COAL)), new ItemBuilder( Material.COAL, meta -> { @@ -107,9 +108,9 @@ public Set getLoots() { meta.lore(List.of(Component.text("§7De quoi faire du feu"))); } ), - 14.5, - 1, - 1 + 0.145, + 16, + 16 ) ); } diff --git a/src/main/java/fr/openmc/core/registry/loottable/loots/CustomLoot.java b/src/main/java/fr/openmc/core/registry/loottable/loots/CustomLoot.java new file mode 100644 index 000000000..55e23669c --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/loottable/loots/CustomLoot.java @@ -0,0 +1,20 @@ +package fr.openmc.core.registry.loottable.loots; + +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.Set; + +public interface CustomLoot { + Component getDisplayText(); + double getChance(); + Set run(Player receiver); + + default ItemStack getRepresentativeItem() { + if (this instanceof RepresentedItem representedItem) { + return representedItem.getRepresentativeItem(); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/registry/loottable/loots/ItemLoot.java b/src/main/java/fr/openmc/core/registry/loottable/loots/ItemLoot.java new file mode 100644 index 000000000..6397cdea3 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/loottable/loots/ItemLoot.java @@ -0,0 +1,158 @@ +package fr.openmc.core.registry.loottable.loots; + +import fr.openmc.core.registry.items.CustomItem; +import lombok.Getter; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.Collections; +import java.util.Set; +import java.util.function.Supplier; + +@Getter +public class ItemLoot implements CustomLoot, RepresentedItem { + private final double chance; + private final Set items; + private Supplier itemSupplier = null; + private final ItemStack displayedItem; + private final int minAmount; + private final int maxAmount; + + public ItemLoot(Set items, ItemStack displayedItem, double chance, int minAmount, int maxAmount) { + this.chance = chance; + this.items = items; + this.displayedItem = displayedItem; + this.minAmount = minAmount; + this.maxAmount = maxAmount; + } + + public ItemLoot(Supplier itemSupplier, ItemStack displayedItem, double chance, int minAmount, int maxAmount) { + this.chance = chance; + this.items = Collections.emptySet(); + this.itemSupplier = itemSupplier; + this.displayedItem = displayedItem; + this.minAmount = minAmount; + this.maxAmount = maxAmount; + } + + public ItemLoot(Supplier itemSupplier, Material displayedItem, double chance, int minAmount, int maxAmount) { + this(itemSupplier, ItemStack.of(displayedItem), chance, minAmount, maxAmount); + } + + public ItemLoot(ItemStack item, double chance, int minAmount, int maxAmount) { + this(Collections.singleton(item), + null, + chance, + minAmount, + maxAmount); + } + + public ItemLoot(CustomItem item, double chance, int minAmount, int maxAmount) { + if (item == null) { + throw new IllegalArgumentException("CustomItem cannot be null"); + } + this(Collections.singleton(item.getBest()), + null, + chance, + minAmount, + maxAmount); + } + + public ItemLoot(Material item, Material displayedItem, double chance, int minAmount, int maxAmount) { + this(ItemStack.of(item), + ItemStack.of(displayedItem), + chance, + minAmount, + maxAmount); + } + + public ItemLoot(ItemStack item, Material displayedItem, double chance, int minAmount, int maxAmount) { + this(item, + ItemStack.of(displayedItem), + chance, + minAmount, + maxAmount); + } + + public ItemLoot(ItemStack item, ItemStack displayedItem, double chance, int minAmount, int maxAmount) { + this(Collections.singleton(item), + displayedItem, + chance, + minAmount, + maxAmount); + } + + public ItemLoot(CustomItem item, ItemStack displayedItem, double chance, int minAmount, int maxAmount) { + if (item == null) { + throw new IllegalArgumentException("CustomItem cannot be null"); + } + this(Collections.singleton(item.getBest()), + displayedItem, + chance, + minAmount, + maxAmount); + } + + public ItemLoot(CustomItem item, CustomItem displayedItem, double chance, int minAmount, int maxAmount) { + if (item == null) throw new IllegalArgumentException("CustomItem cannot be null"); + if (displayedItem == null) throw new IllegalArgumentException("CustomItem cannot be null"); + + this(Collections.singleton(item.getBest()), + displayedItem.getBest(), + chance, + minAmount, + maxAmount); + } + + public ItemStack getFirstLoot() { + if (items.size() == 1) { + return items.iterator().next(); + } + + ItemStack item = items.stream().findFirst().orElse(null); + + if (item != null) { + item.setAmount(this.getRandomAmount()); + return item; + } + + return null; + } + + public int getRandomAmount() { + return minAmount + (int) (Math.random() * (maxAmount - minAmount + 1)); + } + + @Override + public Component getDisplayText() { + return getFirstLoot().displayName(); + } + + @Override + public Set run(Player receiver) { + if (itemSupplier != null) { + ItemStack item = itemSupplier.get(); + item.setAmount(this.getRandomAmount()); + receiver.getInventory().addItem(item); + return Collections.singleton(this); + } + + for (ItemStack lootItem : this.getItems()) { + ItemStack item = lootItem.clone(); + item.setAmount(this.getRandomAmount()); + receiver.getInventory().addItem(item); + } + + return Collections.singleton(this); + } + + @Override + public ItemStack getRepresentativeItem() { + if (this.displayedItem != null) + return this.getDisplayedItem(); + else + return getFirstLoot(); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/registry/loottable/loots/LootboxLoot.java b/src/main/java/fr/openmc/core/registry/loottable/loots/LootboxLoot.java new file mode 100644 index 000000000..c0fcb7969 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/loottable/loots/LootboxLoot.java @@ -0,0 +1,37 @@ +package fr.openmc.core.registry.loottable.loots; + +import fr.openmc.core.registry.lootboxes.CustomLootbox; +import lombok.Getter; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.Collections; +import java.util.Set; + +@Getter +public class LootboxLoot implements CustomLoot, RepresentedItem { + private final double chance; + private final CustomLootbox lootbox; + + public LootboxLoot(CustomLootbox lootbox, double chance) { + this.chance = chance; + this.lootbox = lootbox; + } + + @Override + public Component getDisplayText() { + return lootbox.getName(); + } + + @Override + public Set run(Player receiver) { + lootbox.open(receiver); + return Collections.singleton(this); + } + + @Override + public ItemStack getRepresentativeItem() { + return lootbox.getItemDisplayed(); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/registry/loottable/loots/MethodLoot.java b/src/main/java/fr/openmc/core/registry/loottable/loots/MethodLoot.java new file mode 100644 index 000000000..b81cb12b1 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/loottable/loots/MethodLoot.java @@ -0,0 +1,36 @@ +package fr.openmc.core.registry.loottable.loots; + +import lombok.Getter; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.Collections; +import java.util.Set; +import java.util.function.Consumer; + +@Getter +public class MethodLoot implements CustomLoot, RepresentedItem { + private final ItemStack representativeItem; + private final Component text; + private final double chance; + private final Consumer receiverAction; + + public MethodLoot(ItemStack representativeItem, Component text, Consumer receiverAction, double chance) { + this.representativeItem = representativeItem; + this.text = text; + this.chance = chance; + this.receiverAction = receiverAction; + } + + @Override + public Component getDisplayText() { + return text; + } + + @Override + public Set run(Player receiver) { + receiverAction.accept(receiver); + return Collections.singleton(this); + } +} diff --git a/src/main/java/fr/openmc/core/registry/loottable/loots/MoneyLoot.java b/src/main/java/fr/openmc/core/registry/loottable/loots/MoneyLoot.java new file mode 100644 index 000000000..198c6d4cf --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/loottable/loots/MoneyLoot.java @@ -0,0 +1,37 @@ +package fr.openmc.core.registry.loottable.loots; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.utils.RandomUtils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.Collections; +import java.util.Set; + + +public record MoneyLoot(int money, double getChance) implements CustomLoot, RepresentedItem { + public MoneyLoot(int minMoney, int maxMoney, double chance) { + this(RandomUtils.randomBetween(minMoney, maxMoney), chance); + } + + @Override + public Component getDisplayText() { + return Component.text(money, NamedTextColor.GOLD) + .appendSpace() + .append(Component.text(EconomyManager.getEconomyIcon())); + } + + @Override + public Set run(Player receiver) { + EconomyManager.addBalance(receiver.getUniqueId(), money); + return Collections.singleton(this); + } + + @Override + public ItemStack getRepresentativeItem() { + return OMCRegistry.CUSTOM_ITEMS.COIN.getBest(); + } +} diff --git a/src/main/java/fr/openmc/core/registry/loottable/loots/RepresentedItem.java b/src/main/java/fr/openmc/core/registry/loottable/loots/RepresentedItem.java new file mode 100644 index 000000000..25afaec98 --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/loottable/loots/RepresentedItem.java @@ -0,0 +1,7 @@ +package fr.openmc.core.registry.loottable.loots; + +import org.bukkit.inventory.ItemStack; + +public interface RepresentedItem { + ItemStack getRepresentativeItem(); +} diff --git a/src/main/java/fr/openmc/core/registry/loottable/loots/TableLoot.java b/src/main/java/fr/openmc/core/registry/loottable/loots/TableLoot.java new file mode 100644 index 000000000..19a67d40e --- /dev/null +++ b/src/main/java/fr/openmc/core/registry/loottable/loots/TableLoot.java @@ -0,0 +1,29 @@ +package fr.openmc.core.registry.loottable.loots; + +import fr.openmc.core.registry.loottable.CustomLootTable; +import lombok.Getter; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; + +import java.util.Set; + +@Getter +public class TableLoot implements CustomLoot { + private final double chance; + private final CustomLootTable lootTable; + + public TableLoot(CustomLootTable lootTable, double chance) { + this.chance = chance; + this.lootTable = lootTable; + } + + @Override + public Component getDisplayText() { + return null; + } + + @Override + public Set run(Player receiver) { + return Set.copyOf(lootTable.rollLoots(receiver)); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/registry/mobs/CustomMob.java b/src/main/java/fr/openmc/core/registry/mobs/CustomMob.java index a2e162ca1..9cb1b4a8b 100644 --- a/src/main/java/fr/openmc/core/registry/mobs/CustomMob.java +++ b/src/main/java/fr/openmc/core/registry/mobs/CustomMob.java @@ -1,6 +1,6 @@ package fr.openmc.core.registry.mobs; -import fr.openmc.core.registry.loottable.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import lombok.Getter; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; @@ -21,7 +21,7 @@ public abstract class CustomMob { private final String name; private final Class entityClass; private final Set baseAttributes = new HashSet<>(); - private final List loots = new ArrayList<>(); + private final List loots = new ArrayList<>(); public CustomMob(String id, String name, Class entityClass, double health, double damage, CustomMobAttribute... baseAttributes) { this.id = id; @@ -42,7 +42,7 @@ public CustomMob(String id, String name, Class entityClass, double health, do this.baseAttributes.addAll(Arrays.stream(baseAttributes).toList()); } - public CustomMob(String id, String name, Class entityClass, double health, double damage, double speed, List loots, CustomMobAttribute... baseAttributes) { + public CustomMob(String id, String name, Class entityClass, double health, double damage, double speed, List loots, CustomMobAttribute... baseAttributes) { this.id = id; this.name = name; this.entityClass = entityClass; @@ -53,7 +53,7 @@ public CustomMob(String id, String name, Class entityClass, double health, do this.loots.addAll(loots); } - public CustomMob(String id, String name, Class entityClass, double health, double damage, List loots, CustomMobAttribute... baseAttributes) { + public CustomMob(String id, String name, Class entityClass, double health, double damage, List loots, CustomMobAttribute... baseAttributes) { this.id = id; this.name = name; this.entityClass = entityClass; diff --git a/src/main/java/fr/openmc/core/registry/mobs/listeners/CustomMobDeathListener.java b/src/main/java/fr/openmc/core/registry/mobs/listeners/CustomMobDeathListener.java index 6172d7b85..2d885a342 100644 --- a/src/main/java/fr/openmc/core/registry/mobs/listeners/CustomMobDeathListener.java +++ b/src/main/java/fr/openmc/core/registry/mobs/listeners/CustomMobDeathListener.java @@ -1,7 +1,7 @@ package fr.openmc.core.registry.mobs.listeners; import fr.openmc.core.OMCRegistry; -import fr.openmc.core.registry.loottable.CustomLoot; +import fr.openmc.core.registry.loottable.loots.ItemLoot; import fr.openmc.core.registry.mobs.CustomMob; import fr.openmc.core.registry.mobs.CustomMobRegistry; import org.bukkit.damage.DamageSource; @@ -33,10 +33,10 @@ public void onEntityDeath(EntityDeathEvent event) { customMob.onDeath(customMob, event); if (customMob.getLoots() == null) return; - for (CustomLoot loot : customMob.getLoots()) { - if (Math.random() >= loot.chance()) return; + for (ItemLoot loot : customMob.getLoots()) { + if (Math.random() >= loot.getChance()) return; - int amount = loot.minAmount() + (int) (Math.random() * (loot.maxAmount() - loot.minAmount() + 1)); + int amount = loot.getMinAmount() + (int) (Math.random() * (loot.getMaxAmount() - loot.getMinAmount() + 1)); ItemStack drop = loot.getFirstLoot().asQuantity(amount); entity.getWorld().dropItemNaturally(entity.getLocation(), drop); } diff --git a/src/main/java/fr/openmc/core/utils/FilesUtils.java b/src/main/java/fr/openmc/core/utils/FilesUtils.java index eb0852a92..91196c17a 100644 --- a/src/main/java/fr/openmc/core/utils/FilesUtils.java +++ b/src/main/java/fr/openmc/core/utils/FilesUtils.java @@ -17,6 +17,7 @@ import java.util.function.Function; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.stream.Stream; /** * Utilitaires pour la gestion des fichiers et dossiers @@ -39,19 +40,23 @@ public class FilesUtils { * @throws IOException Si une erreur survient lors de la suppression */ public static void deleteDirectory(File dir) throws IOException { - if (!dir.exists()) return; + if (!dir.exists()) { + OMCLogger.warn("Dossier introuvable : " + dir.getAbsolutePath()); + return; + } - Files.walk(Paths.get(dir.getAbsolutePath())) - .sorted(Comparator.reverseOrder()) - .forEach(path -> { - try { - Files.delete(path); - } catch (NoSuchFileException e) { - OMCLogger.warn("Impossible de supprimer (fichier manquant): {}", path, e.getMessage()); - } catch (IOException e) { - OMCLogger.warn("Impossible de supprimer: {}", path, e); - } - }); + try (Stream stream = Files.walk(dir.toPath())) { + stream.sorted(Comparator.reverseOrder()) + .forEach(path -> { + try { + Files.delete(path); + } catch (NoSuchFileException e) { + OMCLogger.warn("Impossible de supprimer (fichier manquant): {}", path, e.getMessage()); + } catch (IOException e) { + OMCLogger.warn("Impossible de supprimer: {}", path, e); + } + }); + } } /** diff --git a/src/main/java/fr/openmc/core/utils/MathUtils.java b/src/main/java/fr/openmc/core/utils/MathUtils.java index be7462627..89bd43279 100644 --- a/src/main/java/fr/openmc/core/utils/MathUtils.java +++ b/src/main/java/fr/openmc/core/utils/MathUtils.java @@ -26,4 +26,13 @@ public static int lerpColor(int startColor, int endColor, double t) { return (r << 16) | (g << 8) | b; } + /** + * Convertit une hexa en entier, utilise la méthode de Integer + * @param hexa un héxadécimal (ex #000000) + * @return un entier representant l'hexa décimal + */ + public static int hexToInt(String hexa) { + return Integer.parseInt(hexa.replace("#", ""), 16); + } + } diff --git a/src/main/java/fr/openmc/core/utils/RandomUtils.java b/src/main/java/fr/openmc/core/utils/RandomUtils.java index 81c533abc..c35f583ac 100644 --- a/src/main/java/fr/openmc/core/utils/RandomUtils.java +++ b/src/main/java/fr/openmc/core/utils/RandomUtils.java @@ -1,5 +1,8 @@ package fr.openmc.core.utils; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Random; public class RandomUtils { @@ -25,4 +28,15 @@ public static float randomBetween(float min, float max) { public static int randomBetween(int min, int max) { return min + random.nextInt((max - min) + 1); } + + /** + * Prends une liste initial et mélange la liste en en retournant une nouvelle liste. + * @param inital la liste initial + * @return la liste mélangé + */ + public static List generateRandomOrder(List inital) { + List shuffle = new ArrayList<>(inital); + Collections.shuffle(shuffle); + return shuffle; + } } \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/utils/RngUtils.java b/src/main/java/fr/openmc/core/utils/RngUtils.java new file mode 100644 index 000000000..7e29d3c2c --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/RngUtils.java @@ -0,0 +1,27 @@ +package fr.openmc.core.utils; + +import net.kyori.adventure.key.Key; +import net.kyori.adventure.sound.Sound; +import org.bukkit.entity.Player; + +public class RngUtils { + /** + * Renvoie un son aléatoire en fonction de la chance donnée. + * @param player le joueur ciblé (et le monde ciblé si il y a une basse probabilité + * @param chance la chance eu + */ + public static void sendSoundRng(Player player, double chance) { + if (chance <= 0.001) { // 0.1% + player.playSound(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 0.1f)); + player.getWorld().playSound(player.getLocation(), "minecraft:entity.ender_dragon.death", 1f, 0.1f); + } else if (chance <= 0.05) { // 5% + player.playSound(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 0.5f)); + } else if (chance <= 0.1) { // 10% + player.playSound(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 1.0f)); + } else if (chance <= 0.25) { // 25% + player.playSound(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 1.3f)); + } else { + player.playSound(Sound.sound(Key.key("minecraft:entity.player.levelup"), Sound.Source.MASTER, 2f, 2f)); + } + } +} diff --git a/src/main/java/fr/openmc/core/utils/nms/PlayerBiomeNMS.java b/src/main/java/fr/openmc/core/utils/nms/PlayerBiomeNMS.java new file mode 100644 index 000000000..9407bd618 --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/nms/PlayerBiomeNMS.java @@ -0,0 +1,249 @@ +package fr.openmc.core.utils.nms; + +import fr.openmc.core.bootstrap.integration.OMCLogger; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.protocol.game.ClientboundChunksBiomesPacket; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.PalettedContainer; +import net.minecraft.world.level.chunk.Strategy; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +public class PlayerBiomeNMS { + private static Field SECTION_BIOMES; + static { + try { + SECTION_BIOMES = LevelChunkSection.class.getDeclaredField("biomes"); + SECTION_BIOMES.setAccessible(true); + } catch (Exception e) { + OMCLogger.error(e.getMessage()); + } + } + + /** + * Envoie un simple biome sur un chunk + * @param nmsPlayer Le joueur à envoyer les changements + * @param biome le biome a envoyer + * @param initialChunk le chunk a remplacer le biome + */ + public static void sendBiome(ServerPlayer nmsPlayer, Holder biome, LevelChunk initialChunk) { + List biomeDataList = new ArrayList<>(); + LevelChunk fakeChunk = PlayerBiomeNMS.getFakeChunk( + initialChunk, + nmsPlayer.level(), + biome + ); + ClientboundChunksBiomesPacket.ChunkBiomeData data = new ClientboundChunksBiomesPacket.ChunkBiomeData(fakeChunk); + biomeDataList.add(data); + ClientboundChunksBiomesPacket packet = new ClientboundChunksBiomesPacket(biomeDataList); + nmsPlayer.connection.send(packet); + } + + /** + * Actualise tout les biomes au alentour (dans la view distance du joueur) + * @param player le joueur a envoyer le changement de biome + * @param biome le biome a afficher + */ + public static void sendBiomes(Player player, Holder biome) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + ServerLevel nmsWorld = nmsPlayer.level(); + + int viewDistance = nmsWorld.getServer().getPlayerList().getViewDistance(); + ChunkPos center = nmsPlayer.chunkPosition(); + List biomeDataList = new ArrayList<>(); + for (int cx = center.x() - viewDistance; cx <= center.x() + viewDistance; cx++) { + for (int cz = center.z() - viewDistance; cz <= center.z() + viewDistance; cz++) { + LevelChunk chunk = nmsWorld.getChunkIfLoaded(cx, cz); + if (chunk == null) continue; + + LevelChunk fakeChunk = PlayerBiomeNMS.getFakeChunk(chunk, nmsWorld, biome); + + ClientboundChunksBiomesPacket.ChunkBiomeData data = new ClientboundChunksBiomesPacket.ChunkBiomeData(fakeChunk); + biomeDataList.add(data); + } + } + + ClientboundChunksBiomesPacket packet = new ClientboundChunksBiomesPacket(biomeDataList); + nmsPlayer.connection.send(packet); + } + + /** + * Remplace un simple biome par un id de biome transformé par identifierModifier + * @param nmsPlayer Le joueur à envoyer les changements + * @param identifierModifier la clé du biome a modifier + * @param initialChunk le chunk a remplacer le biome + */ + public static void remplaceBiome( + ServerPlayer nmsPlayer, + LevelChunk initialChunk, + String keyMappedBiome, + Function identifierModifier) { + List biomeDataList = new ArrayList<>(); + LevelChunk fakeChunk = PlayerBiomeNMS.getFakeChunkWithMapping( + initialChunk, + keyMappedBiome, + identifierModifier + ); + ClientboundChunksBiomesPacket.ChunkBiomeData data = new ClientboundChunksBiomesPacket.ChunkBiomeData(fakeChunk); + biomeDataList.add(data); + ClientboundChunksBiomesPacket packet = new ClientboundChunksBiomesPacket(biomeDataList); + nmsPlayer.connection.send(packet); + } + + public static void replaceBiomes( + ServerPlayer nmsPlayer, + String keyMappedBiome, + Function identifierModifier) { + ServerLevel nmsWorld = nmsPlayer.level(); + + int viewDistance = nmsWorld.getServer().getPlayerList().getViewDistance(); + ChunkPos center = nmsPlayer.chunkPosition(); + List biomeDataList = new ArrayList<>(); + + for (int cx = center.x() - viewDistance; cx <= center.x() + viewDistance; cx++) { + for (int cz = center.z() - viewDistance; cz <= center.z() + viewDistance; cz++) { + LevelChunk chunk = nmsWorld.getChunkIfLoaded(cx, cz); + if (chunk == null) continue; + + LevelChunk fakeChunk = getFakeChunkWithMapping(chunk, keyMappedBiome, identifierModifier); + biomeDataList.add(new ClientboundChunksBiomesPacket.ChunkBiomeData(fakeChunk)); + } + } + + nmsPlayer.connection.send(new ClientboundChunksBiomesPacket(biomeDataList)); + } + + /** + * Crée un faux chunk en se basant sur l'originel et en changeant juste le biome du chunk + * @param original le chunk original + * @param level le monde ou y'a le chunk + * @param biome le biome a injecter dans le faux chunk + * @return le faux chunk avec le biome + */ + public static LevelChunk getFakeChunk(LevelChunk original, ServerLevel level, Holder biome) { + LevelChunk fakeChunk = new LevelChunk(level, original.getPos()); + + Strategy> idMap = Strategy.createForBiomes(original.level.registryAccess().lookupOrThrow(Registries.BIOME).asHolderIdMap()); + + LevelChunkSection[] originalSections = original.getSections(); + LevelChunkSection[] fakeSections = fakeChunk.getSections(); + + for (int i = 0; i < originalSections.length; i++) { + PalettedContainer> container = new PalettedContainer<>( + biome, + idMap, + null + ); + + try { + SECTION_BIOMES.set(fakeSections[i], container); + } catch (IllegalAccessException e) { + OMCLogger.error("Erreur d'acces à l'attribut biomes d'un levelChunkSetcion"); + } + } + + return fakeChunk; + } + + private static final Map> BIOME_CACHE = new HashMap<>(); + /** + * Crée un faux chunk en se basant sur l'originel et en changeant juste le biome du chunk en fonction + * d'un identifierModifier + * @param original le chunk original + * @param identifierModifier le modifier d'identifiant + * @return le faux chunk avec biomes modifiés + */ + private static LevelChunk getFakeChunkWithMapping( + LevelChunk original, + String keyMappedBiome, + Function identifierModifier) { + LevelChunk fake = new LevelChunk(original.level, original.getPos()); + + Registry registry = original.level.registryAccess().lookupOrThrow(Registries.BIOME); + Strategy> idMap = Strategy.createForBiomes(original.level.registryAccess().lookupOrThrow(Registries.BIOME).asHolderIdMap()); + LevelChunkSection[] originalSections = original.getSections(); + LevelChunkSection[] fakeSections = fake.getSections(); + + for (int i = 0; i < originalSections.length; i++) { + LevelChunkSection originalSection = originalSections[i]; + PalettedContainer> originalBiomes = null; + + try { + originalBiomes = + (PalettedContainer>) SECTION_BIOMES.get(originalSection); + } catch (IllegalAccessException e) { + OMCLogger.error("Erreur d'acces à l'attribut biomes d'un levelChunkSetcion"); + } + + if (originalBiomes == null) continue; + + // ** Si le chunk contient qu'un biome + if (originalBiomes.data.palette().getSize() == 1) { + Holder single = originalBiomes.data.palette().valueFor(0); + Holder mapped = getMapped(single, registry, keyMappedBiome, identifierModifier); + + PalettedContainer> fakeBiomes1 = new PalettedContainer<>(mapped, idMap, null); + try { + SECTION_BIOMES.set(fakeSections[i], fakeBiomes1); + } catch (IllegalAccessException e) { + OMCLogger.error("Erreur d'acces à l'attribut biomes d'un levelChunkSetcion"); + } + continue; + } + + PalettedContainer> fakeBiomes = new PalettedContainer<>( + originalSection.getNoiseBiome(0,0,0), + idMap, + null + ); + + for (int x = 0; x < 4; x++) { + for (int y = 0; y < 4; y++) { + for (int z = 0; z < 4; z++) { + Holder originalBiome = originalSection.getNoiseBiome(x, y, z); + Holder mapped = getMapped(originalBiome, registry, keyMappedBiome, identifierModifier); + + fakeBiomes.set(x, y, z, mapped); + } + } + } + + try { + SECTION_BIOMES.set(fakeSections[i], fakeBiomes); + } catch (IllegalAccessException e) { + OMCLogger.error("Erreur d'acces à l'attribut biomes d'un levelChunkSetcion"); + } + } + + return fake; + } + + private static Holder getMapped( + Holder original, + Registry registry, + String keyMappedBiome, + Function identifierModifier) { + Identifier originalId = original.unwrapKey().orElseThrow().identifier(); + String cacheKey = keyMappedBiome + "/" + originalId; + + return BIOME_CACHE.computeIfAbsent(cacheKey, k -> { + Identifier mappedId = identifierModifier.apply(originalId); + return registry.get(mappedId).orElseThrow(); + }); + } +} diff --git a/src/main/java/fr/openmc/core/utils/nms/PlayerSetTimeNMS.java b/src/main/java/fr/openmc/core/utils/nms/PlayerSetTimeNMS.java new file mode 100644 index 000000000..660a58a20 --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/nms/PlayerSetTimeNMS.java @@ -0,0 +1,43 @@ +package fr.openmc.core.utils.nms; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.protocol.game.ClientboundSetTimePacket; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.clock.ClockNetworkState; +import net.minecraft.world.clock.WorldClock; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; + +public class PlayerSetTimeNMS { + + /** + * Envoie un packet au joueur pour définir l'heure du monde + * @param player le joueur a qui envoyé le packet + * @param time le temps envoyé + */ + public static void sendPacketSetTime(Player player, int time) { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + + Registry clockRegistry = MinecraftServer.getServer() + .registryAccess() + .lookupOrThrow(Registries.WORLD_CLOCK); + + Map, ClockNetworkState> clockUpdates = new HashMap<>(); + + clockRegistry.listElements().forEach(clockHolder -> { + ClockNetworkState state = new ClockNetworkState(time, 0.0F, 0.0F); + clockUpdates.put(clockHolder, state); + }); + + long gameTime = serverPlayer.level().getGameTime(); + ClientboundSetTimePacket packet = new ClientboundSetTimePacket(gameTime, clockUpdates); + + serverPlayer.connection.send(packet); + } +} diff --git a/src/main/java/fr/openmc/core/utils/nms/PlayerWeatherNMS.java b/src/main/java/fr/openmc/core/utils/nms/PlayerWeatherNMS.java new file mode 100644 index 000000000..89720ba6d --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/nms/PlayerWeatherNMS.java @@ -0,0 +1,34 @@ +package fr.openmc.core.utils.nms; + +import net.minecraft.network.protocol.game.ClientboundGameEventPacket; +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class PlayerWeatherNMS { + public static void setWeather(Player player, WeatherType type) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + + switch (type) { + case NONE -> { + send(nmsPlayer, ClientboundGameEventPacket.STOP_RAINING, 0.0f); + send(nmsPlayer, ClientboundGameEventPacket.RAIN_LEVEL_CHANGE, 0.0f); + send(nmsPlayer, ClientboundGameEventPacket.THUNDER_LEVEL_CHANGE, 0.0f); + } + case RAIN -> { + send(nmsPlayer, ClientboundGameEventPacket.START_RAINING, 0.0f); + send(nmsPlayer, ClientboundGameEventPacket.RAIN_LEVEL_CHANGE, 1.0f); + send(nmsPlayer, ClientboundGameEventPacket.THUNDER_LEVEL_CHANGE, 0.0f); + } + case STORM -> { + send(nmsPlayer, ClientboundGameEventPacket.START_RAINING, 0.0f); + send(nmsPlayer, ClientboundGameEventPacket.RAIN_LEVEL_CHANGE, 1.0f); + send(nmsPlayer, ClientboundGameEventPacket.THUNDER_LEVEL_CHANGE, 1.0f); + } + } + } + + private static void send(ServerPlayer nmsPlayer, ClientboundGameEventPacket.Type event, float value) { + nmsPlayer.connection.send(new ClientboundGameEventPacket(event, value)); + } +} diff --git a/src/main/java/fr/openmc/core/utils/nms/WeatherType.java b/src/main/java/fr/openmc/core/utils/nms/WeatherType.java new file mode 100644 index 000000000..5aaa2c92f --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/nms/WeatherType.java @@ -0,0 +1,7 @@ +package fr.openmc.core.utils.nms; + +public enum WeatherType { + NONE, + RAIN, + STORM +} diff --git a/src/main/java/fr/openmc/core/utils/nms/toast/CustomToastData.java b/src/main/java/fr/openmc/core/utils/nms/toast/CustomToastData.java new file mode 100644 index 000000000..3ce50d88f --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/nms/toast/CustomToastData.java @@ -0,0 +1,24 @@ +package fr.openmc.core.utils.nms.toast; + +import net.kyori.adventure.text.Component; +import net.minecraft.advancements.AdvancementType; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.Collection; + +public record CustomToastData(ItemStack icon, Component name, Component description, AdvancementType type) { + public CustomToastData(ItemStack icon, Component name, AdvancementType type) { + this(icon, name, Component.empty(), type); + } + + public void send(Player player) { + ToastUtils.sendCustomToast(player, this); + } + + public void send(Collection receivers) { + for (Player receiver : receivers) { + send(receiver); + } + } +} diff --git a/src/main/java/fr/openmc/core/utils/nms/ToastUtils.java b/src/main/java/fr/openmc/core/utils/nms/toast/ToastUtils.java similarity index 64% rename from src/main/java/fr/openmc/core/utils/nms/ToastUtils.java rename to src/main/java/fr/openmc/core/utils/nms/toast/ToastUtils.java index 8b5723f4a..25e7f211b 100644 --- a/src/main/java/fr/openmc/core/utils/nms/ToastUtils.java +++ b/src/main/java/fr/openmc/core/utils/nms/toast/ToastUtils.java @@ -1,7 +1,8 @@ -package fr.openmc.core.utils.nms; +package fr.openmc.core.utils.nms.toast; +import io.papermc.paper.adventure.PaperAdventure; +import net.kyori.adventure.text.Component; import net.minecraft.advancements.*; -import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundUpdateAdvancementsPacket; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; @@ -16,23 +17,44 @@ import java.util.Set; public class ToastUtils { - private static final Identifier TOAST_IDENTIFIER = Identifier.parse("omc:custom_toast"); + private static final Identifier TOAST_IDENTIFIER = Identifier.fromNamespaceAndPath("omc", "custom_toast"); private static final AdvancementRequirements ADV_REQUIREMENTS = AdvancementRequirements.allOf(Set.of("c")); + /** + * Affiche un Toast (= pop up lorsqu'on obtient un succes) Customisable + * @param player Le joueur ciblé + * @param material le material utilisé + * @param name le component du nom + * @param type le type du succes + */ + public static void sendCustomToast( + Player player, + Material material, + Component name, + AdvancementType type) { + sendCustomToast(player, new org.bukkit.inventory.ItemStack(material), name, Component.empty(), type); + } + /** * Affiche un Toast (= pop up lorsqu'on obtient un succes) Customisable * @param player Le joueur ciblé * @param item l'item utilisé - * @param translationKey la clé de translation du texte + * @param name le Component du nom + * @param description le Component de la description * @param type le type du succes */ - public static void sendCustomToast(Player player, org.bukkit.inventory.ItemStack item, String translationKey, AdvancementType type) { + public static void sendCustomToast( + Player player, + org.bukkit.inventory.ItemStack item, + Component name, + Component description, + AdvancementType type) { Advancement adv = new Advancement( Optional.empty(), Optional.of(new DisplayInfo( ItemStackTemplate.fromNonEmptyStack(ItemStack.fromBukkitCopy(item)), - Component.translatable(translationKey), - Component.empty(), + PaperAdventure.asVanilla(name), + PaperAdventure.asVanilla(description), Optional.empty(), type, true, @@ -72,11 +94,16 @@ public static void sendCustomToast(Player player, org.bukkit.inventory.ItemStack /** * Affiche un Toast (= pop up lorsqu'on obtient un succes) Customisable * @param player Le joueur ciblé - * @param material le material utilisé - * @param translationKey la clé de translation du texte - * @param type le type du succes + * @param toastData wrapper qui contient les données du taost */ - public static void sendCustomToast(Player player, Material material, String translationKey, AdvancementType type) { - sendCustomToast(player, new org.bukkit.inventory.ItemStack(material), translationKey, type); + public static void sendCustomToast( + Player player, + CustomToastData toastData) { + sendCustomToast(player, + toastData.icon(), + toastData.name(), + toastData.description(), + toastData.type() + ); } } diff --git a/src/main/java/fr/openmc/core/utils/text/DateUtils.java b/src/main/java/fr/openmc/core/utils/text/DateUtils.java index 0086dcff8..4fe73dea2 100644 --- a/src/main/java/fr/openmc/core/utils/text/DateUtils.java +++ b/src/main/java/fr/openmc/core/utils/text/DateUtils.java @@ -1,17 +1,19 @@ package fr.openmc.core.utils.text; -import java.time.DayOfWeek; -import java.time.Duration; -import java.time.LocalDate; -import java.time.LocalDateTime; +import java.time.*; import java.time.format.DateTimeFormatter; +import java.time.format.TextStyle; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.Locale; public class DateUtils { + private final static DateTimeFormatter foratterWeekFormat = DateTimeFormatter.ofPattern("u-w", Locale.FRENCH); + public static LocalDateTime getLocalDateTime() { + return LocalDateTime.now(ZoneId.of("Europe/Paris")); + } /** * Get "Previous Week Format" * -> 2025-34 - 1 YY-w @@ -133,7 +135,7 @@ private static String formatTime(long millis) { * Renvoie une chaine de caractère en fonction du temps passé */ public static String formatRelativeDate(LocalDateTime dateTime) { - LocalDateTime now = LocalDateTime.now(); + LocalDateTime now = DateUtils.getLocalDateTime(); Duration duration = Duration.between(dateTime, now); long minutes = duration.toMinutes(); @@ -154,13 +156,29 @@ public static String formatRelativeDate(LocalDateTime dateTime) { } } + /** + * Renvoie une chaine de caractère (ex dimanche 7 juin) + */ + public static String formatDate(LocalDateTime dateTime) { + return dateTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.FRANCE) + + " " + dateTime.getDayOfMonth() + " " + + dateTime.getMonth().getDisplayName(TextStyle.FULL, Locale.FRANCE); + } + + /** + * Renvoie une chaine de caractère (ex 0h12) + */ + public static String formatHourMinute(int hours, int minutes) { + return hours + "h" + String.format("%02d", minutes); + } + /** * Calcule le temps entre maintenant et lundi par exemple * @param day DayOfWeek * @return format 4h 2m 38s */ public static String getTimeUntilNextDay(DayOfWeek day) { - LocalDateTime now = LocalDateTime.now(); + LocalDateTime now = DateUtils.getLocalDateTime(); LocalDateTime nextDay = now.with(TemporalAdjusters.next(day)).toLocalDate().atStartOfDay(); @@ -174,7 +192,7 @@ public static String getTimeUntilNextDay(DayOfWeek day) { } public static long getSecondsUntilDayOfWeekTime(DayOfWeek dayOfWeek, int hour, int minute, int second) { - LocalDateTime now = LocalDateTime.now(); + LocalDateTime now = DateUtils.getLocalDateTime(); LocalDateTime nextDayOfWeekMidnight = now.with(TemporalAdjusters.nextOrSame(dayOfWeek)) .withHour(hour).withMinute(minute).withSecond(second).withNano(0); @@ -184,4 +202,10 @@ public static long getSecondsUntilDayOfWeekTime(DayOfWeek dayOfWeek, int hour, i return ChronoUnit.SECONDS.between(now, nextDayOfWeekMidnight); } + + public static long getDelayBetweenNow(LocalDateTime time) { + LocalDateTime now = getLocalDateTime(); + + return ChronoUnit.SECONDS.between(now, time); + } } diff --git a/src/main/java/fr/openmc/core/utils/text/messages/Prefix.java b/src/main/java/fr/openmc/core/utils/text/messages/Prefix.java index 9e2e50c2c..e60be5e98 100644 --- a/src/main/java/fr/openmc/core/utils/text/messages/Prefix.java +++ b/src/main/java/fr/openmc/core/utils/text/messages/Prefix.java @@ -31,7 +31,8 @@ public enum Prefix { MILLESTONE("ᴍɪʟʟᴇѕᴛᴏɴᴇ"), DREAM("ᴅʀᴇᴀᴍ"), MAILBOX("ᴍᴀɪʟʙᴏx"), - HALLOWEEN("ʜᴀʟʟᴏᴡᴇᴇɴ") + HALLOWEEN("ʜᴀʟʟᴏᴡᴇᴇɴ"), + MIRACULOUS_FISHING("ᴘᴇᴄʜᴇ ᴍɪʀᴀᴄᴜʟᴇᴜѕᴇ") ; @Getter diff --git a/src/main/java/fr/openmc/core/utils/text/messages/TranslationManager.java b/src/main/java/fr/openmc/core/utils/text/messages/TranslationManager.java index 4465a54ff..4c92818ab 100644 --- a/src/main/java/fr/openmc/core/utils/text/messages/TranslationManager.java +++ b/src/main/java/fr/openmc/core/utils/text/messages/TranslationManager.java @@ -25,7 +25,6 @@ */ @SuppressWarnings("UnstableApiUsage") public class TranslationManager { - /** Traductions de fallback (langue par défaut du serveur - Français) */ public static Map fallbackTranslations = new HashMap<>(); private static final Gson GSON = new GsonBuilder() @@ -46,7 +45,7 @@ public static void init(BootstrapContext context, Locale defaultLang, Locale... // * Generate resource pack Path resourcePackFolder; try { - resourcePackFolder=ResourcePacksGenerator.generateBase(context, "generated-rp-langs"); + resourcePackFolder = ResourcePacksGenerator.generateBase(context, "generated-rp-langs"); Files.createDirectories(resourcePackFolder.resolve("assets/minecraft/lang")); OMCLogger.successFormatted("Génération du resource pack de langues !"); } catch (Exception e) { diff --git a/src/main/java/fr/openmc/core/utils/world/WorldUtils.java b/src/main/java/fr/openmc/core/utils/world/WorldUtils.java index 75a92097e..f7ea7729d 100644 --- a/src/main/java/fr/openmc/core/utils/world/WorldUtils.java +++ b/src/main/java/fr/openmc/core/utils/world/WorldUtils.java @@ -1,11 +1,37 @@ package fr.openmc.core.utils.world; +import fr.openmc.core.features.dream.DreamDimensionManager; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.entity.Player; public class WorldUtils { + /** + * Renvoie la translation key de l'affichage du nom d'un monde + * @param worldId l'id du monde + * @return la translation key lié au nom de la dimension + */ + public static String getDisplayedWorldName(String worldId) { + switch (worldId) { + case "world" -> { + return "utils.world.overworld"; + } + case "world_nether" -> { + return "utils.world.nether"; + } + case "world_the_end" -> { + return "utils.world.end"; + } + case DreamDimensionManager.DIMENSION_NAME -> { + return "utils.world.dream"; + } + default -> { + return worldId; + } + } + } + public static Yaw getYaw(Player p) { float yaw = p.getLocation().getYaw(); yaw = (yaw % 360 + 360) % 360; // true modulo, as javas modulo is unique for negative values diff --git a/src/main/resources/contents/omc_daily_events/armor.yml b/src/main/resources/contents/omc_daily_events/armor.yml new file mode 100644 index 000000000..c8dfa6db4 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/armor.yml @@ -0,0 +1,71 @@ +info: + namespace: omc_daily_events +equipments: + ancient_fishing: + type: armor + layer_1: armor/ancient_fishing/ancient_armor_layer_1 + layer_2: armor/ancient_fishing/ancient_armor_layer_2 + +items: + ancient_fishing_helmet: + display_name: "Casque du pêcheur antique" + resource: + generate: true + textures: + - armor/ancient_fishing/ancient_helmet + material: LEATHER_HELMET + lore: + - "§7§oUn casque trouvé dans les abysses des mers" + durability: + unbreakable: true + equipment: + id: omc_daily_events:ancient_fishing + slot_attribute_modifiers: + armor: 3 + + ancient_fishing_chestplate: + display_name: "Plastron du pêcheur antique" + resource: + generate: true + textures: + - armor/ancient_fishing/ancient_chestplate + material: LEATHER_CHESTPLATE + lore: + - "§7§oUn plastron trouvé dans les abysses des mers" + durability: + unbreakable: true + equipment: + id: omc_daily_events:ancient_fishing + slot_attribute_modifiers: + armor: 5 + ancient_fishing_leggings: + display_name: "Jambière du pêcheur antique" + resource: + generate: true + textures: + - armor/ancient_fishing/ancient_leggings + material: LEATHER_LEGGINGS + lore: + - "§7§oUne jambière trouvé dans les abysses des mers" + durability: + unbreakable: true + equipment: + id: omc_daily_events:ancient_fishing + slot_attribute_modifiers: + armor: 5 + + ancient_fishing_boots: + display_name: "Bottes du pêcheur antique" + resource: + generate: true + textures: + - armor/ancient_fishing/ancient_boots + material: LEATHER_BOOTS + lore: + - "§7§oDes bottes trouvées dans les abysses des mers" + durability: + unbreakable: true + equipment: + id: omc_daily_events:ancient_fishing + slot_attribute_modifiers: + armor: 3 \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/blocks.yml b/src/main/resources/contents/omc_daily_events/blocks.yml deleted file mode 100644 index 7ef63999e..000000000 --- a/src/main/resources/contents/omc_daily_events/blocks.yml +++ /dev/null @@ -1,31 +0,0 @@ -info: - namespace: omc_daily_events -items: - obese_potato: - display_name: Patate obèse - graphics: - textures: - north: obese_crops/potato/obese_potato_side - south: obese_crops/potato/obese_potato_side - east: obese_crops/potato/obese_potato_side - west: obese_crops/potato/obese_potato_side - up: obese_crops/potato/obese_potato_top - down: obese_crops/potato/obese_potato_bottom - behaviours: - block: - placed_model: - type: REAL_NOTE - break_particles: ITEM - up_block: omc_daily_events:obese_potato_stem - - obese_potato_stem: - display_name: Tige de patate obèse - graphics: - icon: obese_crops/potato/obese_potato_stem - parent: block/cross - textures: - cross: obese_crops/potato/obese_potato_stem - behaviours: - block: - placed_model: - type: REAL_WIRE \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/category.yml b/src/main/resources/contents/omc_daily_events/category.yml index a3b4e3055..b7b4f48fd 100644 --- a/src/main/resources/contents/omc_daily_events/category.yml +++ b/src/main/resources/contents/omc_daily_events/category.yml @@ -4,7 +4,7 @@ categories: omc_daily_events: enabled: true skip_if_already: false - icon: omc_daily_events:aywenite_block + icon: omc_daily_events:obese_golden_apple name: "OpenMC Daily Events" items: - omc_daily_events:* \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/fishing_furniture.yml b/src/main/resources/contents/omc_daily_events/fishing_furniture.yml new file mode 100644 index 000000000..51bf24c71 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/fishing_furniture.yml @@ -0,0 +1,520 @@ +info: + namespace: omc_daily_events + +items: + fisherman_blue_fish: + enabled: true + permission: "" + display_name: "Blue fish" + behaviours: + furniture: + entity: item_frame + small: false + solid: false + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_blue_fish + model_id: 2510051 + fisherman_cyan_fish: + enabled: true + permission: "" + display_name: "Cyan fish" + behaviours: + furniture: + entity: item_frame + small: false + solid: false + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_cyan_fish + model_id: 2510052 + fisherman_orange_fish: + enabled: true + permission: "" + display_name: "Orange fish" + behaviours: + furniture: + entity: item_frame + small: false + solid: false + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_orange_fish + model_id: 2510053 + fisherman_red_fish: + enabled: true + permission: "" + display_name: "Red fish" + behaviours: + furniture: + entity: item_frame + small: false + solid: false + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_red_fish + model_id: 2510054 + fisherman_boat: + enabled: true + permission: "" + display_name: "Boat" + behaviours: + furniture: + entity: item_display + small: false + solid: true + fixed_rotation: true + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + hitbox: + height: 1 + width: 3 + sound: + place: + name: block.wood.place + break: + name: block.wood.break + display_transformation: + transform: FIXED + translation: + x: 0 + y: -0.5 + z: 0 + scale: + x: 1 + y: 1 + z: 1 + right_rotation: + axis_angle: + angle: -90 + axis: + x: 1 + y: 0 + z: 0 + furniture_sit: + sit_height: 0.7 + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_boat + model_id: 2510055 + fisherman_chair: + enabled: true + permission: "" + display_name: "Fisherman stool" + behaviours: + furniture: + entity: item_frame + small: false + solid: true + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + furniture_sit: + sit_height: 1 + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_chair + model_id: 2510056 + fisherman_fish_box: + enabled: true + permission: "" + display_name: "Fish box" + behaviours: + furniture: + entity: item_frame + small: false + solid: true + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_fish_box + model_id: 2510057 + fisherman_fish_rack: + enabled: true + permission: "" + display_name: "Fish rack" + behaviours: + furniture: + entity: item_frame + small: false + solid: true + fixed_rotation: true + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + hitbox: + height: 1 + width: 2 + width_offset: -0.5 + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_fish_rack + model_id: 2510058 + fisherman_fishing_pole: + enabled: true + permission: "" + display_name: "Fishing pole" + behaviours: + furniture: + entity: item_frame + small: false + solid: false + fixed_rotation: true + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_fishing_pole + model_id: 2510059 + fisherman_fishingpole_rack: + enabled: true + permission: "" + display_name: "Fishing pole rack" + behaviours: + furniture: + entity: item_frame + small: false + solid: true + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_fishingpole_rack + model_id: 2510060 + fisherman_floatie: + enabled: true + permission: "" + display_name: "Floatie" + behaviours: + furniture: + entity: item_frame + small: false + solid: false + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: true + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_floatie + model_id: 2510061 + fisherman_hanging_fish: + enabled: true + permission: "" + display_name: "Hanging fish" + behaviours: + furniture: + entity: item_display + small: false + solid: true + fixed_rotation: true + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: true + hitbox: + height: 1 + width: 3 + length: 1 + height_offset: 2 + sound: + place: + name: block.wood.place + break: + name: block.wood.break + display_transformation: + transform: FIXED + translation: + x: 0 + y: -0.5 + z: 0 + scale: + x: 1 + y: 1 + z: 1 + right_rotation: + axis_angle: + angle: -90 + axis: + x: 1 + y: 0 + z: 0 + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_hanging_fish + model_id: 2510062 + fisherman_landing_net: + enabled: true + permission: "" + display_name: "Landing net" + behaviours: + furniture: + entity: item_frame + small: false + solid: false + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_landing_net + model_id: 2510063 + fisherman_large_fishnet: + enabled: true + permission: "" + display_name: "Large fishnet" + behaviours: + furniture: + entity: item_display + small: false + solid: true + fixed_rotation: true + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: true + hitbox: + height: 3 + width: 3 + length: 1 + sound: + place: + name: block.wood.place + break: + name: block.wood.break + display_transformation: + transform: FIXED + translation: + x: 0 + y: -0.5 + z: 0 + scale: + x: 1 + y: 1 + z: 1 + right_rotation: + axis_angle: + angle: -90 + axis: + x: 1 + y: 0 + z: 0 + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_large_fishnet + model_id: 2510064 + fisherman_lobster_trap: + enabled: true + permission: "" + display_name: "Lobster trap" + behaviours: + furniture: + entity: item_frame + small: false + solid: false + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_lobster_trap + model_id: 2510065 + fisherman_stand: + enabled: true + permission: "" + display_name: "Fisherman stand" + behaviours: + furniture: + entity: item_display + small: false + solid: false + fixed_rotation: true + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: true + sound: + place: + name: block.wood.place + break: + name: block.wood.break + display_transformation: + transform: FIXED + translation: + x: 0 + y: -0.5 + z: 0 + scale: + x: 1 + y: 1 + z: 1 + right_rotation: + axis_angle: + angle: -90 + axis: + x: 1 + y: 0 + z: 0 + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_stand + model_id: 2510066 + fisherman_table: + enabled: true + permission: "" + display_name: "Table" + behaviours: + furniture: + entity: item_frame + small: false + solid: true + fixed_rotation: false + placeable_on: + floor: true + ceiling: false + walls: false + opposite_direction: false + hitbox: + width: 2 + width_offset: -0.5 + sound: + place: + name: block.wood.place + break: + name: block.wood.break + resource: + material: PAPER + generate: false + model_path: fisherman_props/fisherman_table + model_id: 2510067 \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/head.yml b/src/main/resources/contents/omc_daily_events/head.yml new file mode 100644 index 000000000..53b204b82 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/head.yml @@ -0,0 +1,44 @@ +info: + namespace: omc_daily_events + +items: + coin: + display_name: "Aywenito" + components_nbt_file: "nbt/head/coin.json" + material: PLAYER_HEAD + + poisson_steve_head: + display_name: "Tete du Poisson Steve" + lore: + - "§7§oSteve, le (Poi-)" + - "§7§oLe poisson Steve" + - "§7§o(Poisson Steve)" + - "§7§oIl est orange (ooh-ooh)" + - "§7§oIl a des bras" + - "§7§oEt des jambes" + - "§7§oLe poisson Steve" + - "§7§oPa-la-la, pa-la-la" + - "§7§oLa-la, la-la, la-la-la" + - "§7§oLa-la, la-la, la-la-la" + - "§7§oLa-la, la-la, la-la, la-la" + - "§7§oPa-la-la, pa-la-la" + - "§7§oLe poisson Steve (Poi-)" + - "§7§oIl est vraiment très beau" + - "§7§o(Poisson Steve)" + - "§7§oIl peut nager sur la Terre (ooh-ah, ooh-ah)" + - "§7§oIl peut marcher dans l'eau" + - "§7§oLe poisson Steve" + - "§7§oIl sent forcément mauvais" + - "§7§oMais on l'aime bien" + components_nbt_file: "nbt/head/poisson_steve.json" + material: PLAYER_HEAD + + kraken_head: + display_name: "Tete de Kraken" + components_nbt_file: "nbt/head/kraken.json" + material: PLAYER_HEAD + + leviathan_head: + display_name: "Tete de Léviathan" + components_nbt_file: "nbt/head/leviathan.json" + material: PLAYER_HEAD \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/items.yml b/src/main/resources/contents/omc_daily_events/items.yml new file mode 100644 index 000000000..ef38f1fdd --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/items.yml @@ -0,0 +1,37 @@ +info: + namespace: omc_daily_events + +items: + tenders: + display_name: "Cuisse de poulet" + resource: + generate: true + textures: + - other/tenders + material: COOKED_CHICKEN + lore: + - "§7§oMhh le poulet eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeett" + + bob_sponge: + display_name: "Bob l'éponge" + resource: + material: SPONGE + generate: false + model_path: "minecraft:item/sponge" + lore: + - "§7§oBOB L'ÉPONGE CARRÉ" + glint: true + + kebab_fermented: + display_name: "Kebab fermenté" + resource: + material: COOKED_BEEF + generate: true + textures: + - "omc_foods:items/kebab" + lore: + - "§7§ol'originel, une légende raconte qu'il existait avant la kebaberie" + glint: true + attribute_modifiers: + mainhand: + luck: 1.1 \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/lootbox.yml b/src/main/resources/contents/omc_daily_events/lootbox.yml new file mode 100644 index 000000000..5a7c8fd99 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/lootbox.yml @@ -0,0 +1,82 @@ +info: + namespace: omc_daily_events +items: + rare_fishing_treasure_lootbox: + display_name: Trésor de pêche rare + resource: + material: PAPER + generate: false + model_path: lootbox/rare_box + behaviours: + furniture: + small: false + solid: true + entity: armor_stand + hitbox: + length: 1 + width: 1 + height: 1 + length_offset: 0 + width_offset: 0 + height_offset: 0 + + epic_fishing_treasure_lootbox: + display_name: Trésor de pêche épique + resource: + material: PAPER + generate: false + model_path: lootbox/epic_box + behaviours: + furniture: + small: false + solid: true + entity: armor_stand + hitbox: + length: 1 + width: 1 + height: 1 + length_offset: 0 + width_offset: 0 + height_offset: 0 + + legendary_fishing_treasure_lootbox: + display_name: Trésor de pêche légendaire + resource: + material: PAPER + generate: false + model_path: lootbox/legendary_box + behaviours: + furniture: + small: false + solid: true + entity: armor_stand + hitbox: + length: 1 + width: 1 + height: 1 + length_offset: 0 + width_offset: 0 + height_offset: 0 + + fishing_furniture_lootbox: + display_name: Boîte d'équipement de pêche + resource: + material: PAPER + generate: false + model_path: lootbox/fishing_furniture_chest + behaviours: + furniture: + solid: true + fixed_rotation: true + entity: item_frame + hitbox: + length: 1 + width: 1 + height: 1 + length_offset: 0 + width_offset: 0 + height_offset: 0 + placeable_on: + walls: false + ceiling: false + floor: true diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_blue_fish.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_blue_fish.json new file mode 100644 index 000000000..55a6ccf1f --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_blue_fish.json @@ -0,0 +1,333 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "omc_daily_events:fisherman_props/fisherman", + "particle": "omc_daily_events:fisherman_props/fisherman" + }, + "elements": [ + { + "from": [ + 6.1106, + 0.04828, + 4.1196 + ], + "to": [ + 10.1106, + 2.04828, + 13.1196 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8.1106, + 1.04828, + 7.8696 + ] + }, + "faces": { + "north": { + "uv": [ + 0.375, + 2.5625, + 0.4375, + 2.3125 + ], + "rotation": 90, + "texture": "#0" + }, + "east": { + "uv": [ + 0.375, + 2.3125, + 0.9375, + 2.375 + ], + "rotation": 180, + "texture": "#0" + }, + "south": { + "uv": [ + 0.875, + 2.5625, + 0.9375, + 2.3125 + ], + "rotation": 270, + "texture": "#0" + }, + "west": { + "uv": [ + 0.375, + 2.5, + 0.9375, + 2.5625 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0.375, + 2.3125, + 0.9375, + 2.5625 + ], + "rotation": 90, + "texture": "#0" + }, + "down": { + "uv": [ + 0.375, + 2.5625, + 0.9375, + 2.3125 + ], + "rotation": 270, + "texture": "#0" + } + } + }, + { + "from": [ + 6.1106, + 1.04828, + 1.1196 + ], + "to": [ + 11.1106, + 1.04828, + 13.1196 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8.1106, + 1.04828, + 7.8696 + ] + }, + "faces": { + "up": { + "uv": [ + 0.1875, + 2.25, + 0.9375, + 2.5625 + ], + "rotation": 90, + "texture": "#0" + }, + "down": { + "uv": [ + 0.1875, + 2.5625, + 0.9375, + 2.25 + ], + "rotation": 270, + "texture": "#0" + } + } + }, + { + "from": [ + 7.6106, + -1.95172, + 7.6196 + ], + "to": [ + 7.6106, + 4.04828, + 9.6196 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8.1106, + 1.04828, + 7.8696 + ] + }, + "faces": { + "east": { + "uv": [ + 0.5, + 2.625, + 0.625, + 3 + ], + "rotation": 180, + "texture": "#0" + }, + "west": { + "uv": [ + 0.5, + 2.625, + 0.625, + 3 + ], + "texture": "#0" + } + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [ + -91, + 0, + 0 + ], + "translation": [ + 0, + 4.75, + -5.75 + ], + "scale": [ + 1.03828, + 1.03828, + 1.03828 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + -91, + 0, + 0 + ], + "translation": [ + 0.25, + 4.75, + -5.75 + ], + "scale": [ + 1.03828, + 1.03828, + 1.03828 + ] + }, + "firstperson_righthand": { + "rotation": [ + -145, + -13, + -180 + ], + "translation": [ + 7.75, + 4.25, + -0.5 + ], + "scale": [ + 0.75352, + 0.75352, + 0.75352 + ] + }, + "firstperson_lefthand": { + "rotation": [ + -145, + -13, + -180 + ], + "translation": [ + 7.75, + 4.25, + -0.5 + ], + "scale": [ + 0.75352, + 0.75352, + 0.75352 + ] + }, + "ground": { + "translation": [ + 0, + 4.5, + 0 + ], + "scale": [ + 0.41406, + 0.41406, + 0.41406 + ] + }, + "gui": { + "rotation": [ + -142.73, + 39.63, + -89.3 + ], + "translation": [ + 7, + -3, + 0 + ], + "scale": [ + 1.36914, + 1.36914, + 1.36914 + ] + }, + "head": { + "translation": [ + 0, + 12.75, + 0 + ], + "scale": [ + 0.79492, + 0.79492, + 0.79492 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -16 + ], + "scale": [ + 2.00195, + 2.00195, + 2.00195 + ] + } + }, + "groups": [ + { + "name": "group", + "origin": [ + 8, + 8, + 8 + ], + "color": 0, + "children": [ + { + "name": "group", + "origin": [ + 8, + 8, + 8 + ], + "color": 0, + "children": [ + 0, + 1, + 2 + ] + } + ] + } + ], + "mcmodels": "47e9fc11ef703093a1d6a70bdf75f953" +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_boat.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_boat.json new file mode 100644 index 000000000..8d01b87d9 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_boat.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[1.72358,4.0293,2.96186],"to":[19.71186,10.0293,12.96186],"rotation":{"angle":0,"axis":"y","origin":[4,8.97328,7.96186]},"faces":{"north":{"uv":[0,8.125,2.24854,8.875],"rotation":180,"texture":"#0"},"east":{"uv":[0,8.9375,1.25,9.6875],"rotation":180,"texture":"#0"},"south":{"uv":[0,8.125,2.24854,8.875],"rotation":180,"texture":"#0"},"down":{"uv":[0,9.75,2.24854,11],"rotation":180,"texture":"#0"}}},{"from":[-1.24106,4.05469,5.97687],"to":[5.83511,10.0293,13.04328],"rotation":{"angle":-45,"axis":"y","origin":[3.88153,8.97228,8.04894]},"faces":{"south":{"uv":[0,8.9375,0.88452,9.6875],"rotation":180,"texture":"#0"},"west":{"uv":[0,9.6875,0.86719,8.9375],"texture":"#0"},"down":{"uv":[2.3335,9.77393,3.1665,10.60693],"rotation":270,"texture":"#0"}}},{"name":"cube inverted","from":[19.71186,10.0293,12.96186],"to":[1.72358,4.25,2.96186],"rotation":{"angle":0,"axis":"y","origin":[4,8.97328,7.96186]},"faces":{"north":{"uv":[0,8.875,2.24854,8.125],"rotation":180,"texture":"#0"},"south":{"uv":[0,8.875,2.24854,8.125],"rotation":180,"texture":"#0"},"west":{"uv":[0,9.6875,1.25,8.9375],"rotation":180,"texture":"#0"},"up":{"uv":[2.24854,9.75,0,11],"rotation":180,"texture":"#0"}}},{"name":"cube inverted","from":[5.83511,10.0293,13.04328],"to":[-1.24106,4.23828,5.97687],"rotation":{"angle":-45,"axis":"y","origin":[3.88153,8.97228,8.04894]},"faces":{"north":{"uv":[0,9.6875,0.88452,8.9375],"rotation":180,"texture":"#0"},"east":{"uv":[0,8.9375,0.86719,9.6875],"texture":"#0"},"up":{"uv":[2.3335,10.60693,3.1665,9.77393],"rotation":270,"texture":"#0"}}},{"from":[13,6.5293,3],"to":[16.5,7.0293,12.94922],"rotation":{"angle":0,"axis":"y","origin":[13.5,6.0293,3]},"faces":{"east":{"uv":[0,11.0625,1.24365,11.125],"texture":"#0"},"west":{"uv":[0,11.0625,1.24365,11.125],"texture":"#0"},"up":{"uv":[0,11.0625,1.24365,11.5],"rotation":90,"texture":"#0"},"down":{"uv":[0,11.0625,1.24365,11.5],"rotation":90,"texture":"#0"}}},{"from":[4.5,6.5293,3],"to":[8,7.0293,12.94922],"rotation":{"angle":0,"axis":"y","origin":[5,6.0293,3]},"faces":{"east":{"uv":[0,11.0625,1.24365,11.125],"texture":"#0"},"west":{"uv":[0,11.0625,1.24365,11.125],"texture":"#0"},"up":{"uv":[0,11.0625,1.24365,11.5],"rotation":90,"texture":"#0"},"down":{"uv":[0,11.0625,1.24365,11.5],"rotation":90,"texture":"#0"}}},{"from":[-1.44884,8.0293,12.58502],"to":[5.97303,10.0293,13.58502],"rotation":{"angle":-45,"axis":"y","origin":[4.29289,8.97328,8.25475]},"faces":{"north":{"uv":[0.9375,7.125,0.6875,8.05273],"rotation":90,"texture":"#0"},"east":{"uv":[0.6875,7.125,0.8125,7.375],"rotation":180,"texture":"#0"},"south":{"uv":[0.6875,7.125,0.9375,8.05273],"rotation":270,"texture":"#0"},"west":{"uv":[0.9375,7.125,0.6875,7.1875],"rotation":90,"texture":"#0"},"up":{"uv":[1,7.125,1.125,8.05273],"rotation":270,"texture":"#0"},"down":{"uv":[1.1875,7.125,1.3125,8.05273],"rotation":270,"texture":"#0"}}},{"from":[-1.14093,8.0293,2.68794],"to":[6.10907,10.03125,3.68794],"rotation":{"angle":45,"axis":"y","origin":[3.93934,8.97328,8.0078]},"faces":{"north":{"uv":[0.9375,7.125,0.6875,8],"rotation":90,"texture":"#0"},"south":{"uv":[0.6875,7.125,0.9375,8],"rotation":270,"texture":"#0"},"west":{"uv":[0.8125,7.125,0.6875,7.375],"texture":"#0"},"up":{"uv":[1.125,7.125,1,8],"rotation":270,"texture":"#0"},"down":{"uv":[1.3125,7.125,1.1875,8],"rotation":270,"texture":"#0"}}},{"from":[1.71186,8.0293,2.71186],"to":[19.96186,10.0293,3.71186],"rotation":{"angle":0,"axis":"y","origin":[4,8.97328,6.96186]},"faces":{"north":{"uv":[0.25,5.8125,0,8.0625],"rotation":90,"texture":"#0"},"east":{"uv":[0,5.9375,0.25,5.8125],"rotation":270,"texture":"#0"},"south":{"uv":[0,5.8125,0.25,8.0625],"rotation":270,"texture":"#0"},"west":{"uv":[0,0,0.125,0.25],"texture":"#0"},"up":{"uv":[0.3125,5.8125,0.4375,8.0625],"rotation":270,"texture":"#0"},"down":{"uv":[0.5,5.8125,0.625,8.0625],"rotation":270,"texture":"#0"}}},{"from":[1.71186,8.0293,12.21186],"to":[19.96186,10.0293,13.21186],"rotation":{"angle":0,"axis":"y","origin":[17.67372,8.97328,16.46186]},"faces":{"north":{"uv":[0.25,5.8125,0,8.0625],"rotation":90,"texture":"#0"},"east":{"uv":[0.25,5.9375,0,5.8125],"rotation":90,"texture":"#0"},"south":{"uv":[0,5.8125,0.25,8.0625],"rotation":270,"texture":"#0"},"west":{"uv":[0,5.8125,0.25,5.9375],"rotation":270,"texture":"#0"},"up":{"uv":[0.3125,5.8125,0.4375,8.0625],"rotation":270,"texture":"#0"},"down":{"uv":[0.5,5.8125,0.625,8.0625],"rotation":270,"texture":"#0"}}},{"from":[18.96186,8.0293,3.71186],"to":[19.96186,10.0293,12.21186],"rotation":{"angle":0,"axis":"y","origin":[11.75,8.97328,7.96186]},"faces":{"north":{"uv":[0,0,0.25,0.125],"rotation":90,"texture":"#0"},"east":{"uv":[0.6875,6,0.9375,7.0625],"rotation":270,"texture":"#0"},"south":{"uv":[0,0,0.25,0.125],"rotation":270,"texture":"#0"},"west":{"uv":[0.9375,6,0.6875,7.0625],"rotation":90,"texture":"#0"},"up":{"uv":[1,6,1.125,7.0625],"rotation":180,"texture":"#0"},"down":{"uv":[1.1875,6,1.3125,7.0625],"texture":"#0"}}},{"from":[-4.57772,4.39478,7.46922],"to":[-1.07772,5.39478,8.46922],"rotation":{"angle":-45,"axis":"z","origin":[4,8.97328,7.96186]},"faces":{"north":{"uv":[0.9375,5.3125,1.0625,5.75],"rotation":90,"texture":"#0"},"south":{"uv":[0.9375,5.3125,1.0625,5.75],"rotation":270,"texture":"#0"},"west":{"uv":[0.9375,5.3125,1.0625,5.375],"texture":"#0"},"up":{"uv":[0.9375,5.3125,1.0625,5.75],"rotation":270,"texture":"#0"},"down":{"uv":[0.9375,5.3125,1.0625,5.75],"rotation":270,"texture":"#0"}}},{"from":[14.21186,10.0293,2.96186],"to":[15.71186,11.0293,3.46186],"rotation":{"angle":0,"axis":"y","origin":[12.5,8.97328,6.96186]},"faces":{"north":{"uv":[0.1875,5.75,0.375,5.625],"rotation":180,"texture":"#0"},"east":{"uv":[0.1875,5.75,0.25,5.625],"rotation":180,"texture":"#0"},"south":{"uv":[0.1875,5.625,0.375,5.75],"texture":"#0"},"west":{"uv":[0.1875,5.625,0.25,5.75],"texture":"#0"},"up":{"uv":[0.375,5.625,0.1875,5.6875],"rotation":180,"texture":"#0"}}},{"from":[5.71186,10.0293,2.96186],"to":[7.21186,11.0293,3.46186],"rotation":{"angle":0,"axis":"y","origin":[4,8.97328,6.96186]},"faces":{"north":{"uv":[0.1875,5.75,0.375,5.625],"rotation":180,"texture":"#0"},"east":{"uv":[0.1875,5.75,0.25,5.625],"rotation":180,"texture":"#0"},"south":{"uv":[0.1875,5.625,0.375,5.75],"texture":"#0"},"west":{"uv":[0.1875,5.625,0.25,5.75],"texture":"#0"},"up":{"uv":[0.375,5.625,0.1875,5.6875],"rotation":180,"texture":"#0"}}},{"from":[5.71186,10.0293,12.46186],"to":[7.21186,11.0293,12.96186],"rotation":{"angle":0,"axis":"y","origin":[4,8.97328,16.46186]},"faces":{"north":{"uv":[0.1875,5.75,0.375,5.625],"rotation":180,"texture":"#0"},"east":{"uv":[0.1875,5.75,0.25,5.625],"rotation":180,"texture":"#0"},"south":{"uv":[0.1875,5.625,0.375,5.75],"texture":"#0"},"west":{"uv":[0.1875,5.625,0.25,5.75],"texture":"#0"},"up":{"uv":[0.375,5.625,0.1875,5.6875],"rotation":180,"texture":"#0"}}},{"from":[14.21186,10.0293,12.46186],"to":[15.71186,11.0293,12.96186],"rotation":{"angle":0,"axis":"y","origin":[12.5,8.97328,16.46186]},"faces":{"north":{"uv":[0.1875,5.75,0.375,5.625],"rotation":180,"texture":"#0"},"east":{"uv":[0.1875,5.75,0.25,5.625],"rotation":180,"texture":"#0"},"south":{"uv":[0.1875,5.625,0.375,5.75],"texture":"#0"},"west":{"uv":[0.1875,5.625,0.25,5.75],"texture":"#0"},"up":{"uv":[0.375,5.625,0.1875,5.6875],"rotation":180,"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[90,-90,0],"translation":[0.25,4,2.25],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[90,90,0],"translation":[0.25,4,2.25],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,-86,0],"translation":[5.25,2.75,1.5],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,75.75,0],"translation":[5.25,2.75,2],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[0.5,-0.25,0],"scale":[0.625,0.625,0.625]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"children":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,1,2,3]},{"name":"group","origin":[8,8,8],"color":0,"children":[4,5]},{"name":"group","origin":[0,0,0],"color":0,"children":[6,7,8,9,10,11]},{"name":"group","origin":[8,8,8],"color":0,"children":[12,13,14,15]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_chair.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_chair.json new file mode 100644 index 000000000..f31b6adb6 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_chair.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[7,-1,1],"to":[9,15,15],"rotation":{"angle":45,"axis":"z","origin":[8,4.5,8]},"faces":{"north":{"uv":[2.5,5.75,2.5625,6.75],"texture":"#0"},"east":{"uv":[2.5,5.75,3.375,6.75],"texture":"#0"},"south":{"uv":[3.3125,5.75,3.375,6.75],"texture":"#0"},"west":{"uv":[3.375,5.75,2.5,6.75],"texture":"#0"},"up":{"uv":[2.5,5.75,3.375,5.8125],"rotation":90,"texture":"#0"},"down":{"uv":[2.5,6.6875,3.375,6.75],"rotation":90,"texture":"#0"}}},{"from":[7,0,14],"to":[9,14,2],"rotation":{"angle":45,"axis":"z","origin":[8,4.5,21]},"faces":{"north":{"uv":[2.5,5.8125,2.5625,6.6875],"texture":"#0"},"south":{"uv":[2.5,5.8125,2.5625,6.6875],"texture":"#0"},"up":{"uv":[2.5625,5.75,3.3125,5.8125],"rotation":90,"texture":"#0"},"down":{"uv":[3.3125,6.6875,2.5625,6.75],"rotation":90,"texture":"#0"}}},{"from":[8.76777,-1.73223,1],"to":[10.76777,14.26777,15],"rotation":{"angle":-45,"axis":"z","origin":[9.76777,6.26777,8]},"faces":{"north":{"uv":[2.5625,5.75,2.5,6.75],"texture":"#0"},"east":{"uv":[2.5,5.75,3.375,6.75],"texture":"#0"},"south":{"uv":[3.375,5.75,3.3125,6.75],"texture":"#0"},"west":{"uv":[3.375,5.75,2.5,6.75],"texture":"#0"},"up":{"uv":[2.5,5.8125,3.375,5.75],"rotation":90,"texture":"#0"},"down":{"uv":[2.5,6.75,3.375,6.6875],"rotation":90,"texture":"#0"}}},{"from":[8.76777,-0.73223,14],"to":[10.76777,13.26777,2],"rotation":{"angle":-45,"axis":"z","origin":[9.76777,6.26777,8]},"faces":{"north":{"uv":[2.5625,5.8125,2.5,6.6875],"texture":"#0"},"south":{"uv":[2.5625,5.8125,2.5,6.6875],"texture":"#0"},"up":{"uv":[2.5625,5.8125,3.3125,5.75],"rotation":90,"texture":"#0"},"down":{"uv":[3.3125,6.75,2.5625,6.6875],"rotation":90,"texture":"#0"}}},{"from":[-0.5,10,2],"to":[2.5,13,14],"rotation":{"angle":0,"axis":"z","origin":[1,11.5,8]},"faces":{"east":{"uv":[3.4375,7,4.1875,6.8125],"rotation":180,"texture":"#0"},"west":{"uv":[4.1875,6.8125,3.4375,7],"rotation":180,"texture":"#0"},"up":{"uv":[4.1875,6.8125,3.4375,7],"rotation":90,"texture":"#0"},"down":{"uv":[4.1875,7,3.4375,6.8125],"rotation":90,"texture":"#0"}}},{"from":[13.5,10,2],"to":[16.5,13,14],"rotation":{"angle":0,"axis":"z","origin":[15,11.5,8]},"faces":{"east":{"uv":[3.4375,6.8125,4.1875,7],"rotation":180,"texture":"#0"},"west":{"uv":[4.1875,7,3.4375,6.8125],"rotation":180,"texture":"#0"},"up":{"uv":[4.1875,7,3.4375,6.8125],"rotation":90,"texture":"#0"},"down":{"uv":[4.1875,6.8125,3.4375,7],"rotation":90,"texture":"#0"}}},{"from":[2.5,12,2],"to":[13.5,12,14],"rotation":{"angle":0,"axis":"y","origin":[11.5,10,2]},"faces":{"up":{"uv":[3.4375,6.0625,4.1875,6.75],"rotation":90,"texture":"#0"},"down":{"uv":[3.4375,6.0625,4.1875,6.75],"rotation":90,"texture":"#0"}}},{"name":"cube inverted","from":[16.5,13,14],"to":[13.5,10,2],"rotation":{"angle":0,"axis":"z","origin":[15,11.5,8]},"faces":{"east":{"uv":[4.1875,6.8125,3.4375,7],"rotation":180,"texture":"#0"},"west":{"uv":[3.4375,7,4.1875,6.8125],"rotation":180,"texture":"#0"},"up":{"uv":[4.1875,7,3.4375,6.8125],"rotation":90,"texture":"#0"},"down":{"uv":[4.1875,6.8125,3.4375,7],"rotation":90,"texture":"#0"}}},{"name":"cube inverted","from":[2.5,13,14],"to":[-0.5,10,2],"rotation":{"angle":0,"axis":"z","origin":[1,11.5,8]},"faces":{"east":{"uv":[4.1875,7,3.4375,6.8125],"rotation":180,"texture":"#0"},"west":{"uv":[3.4375,6.8125,4.1875,7],"rotation":180,"texture":"#0"},"up":{"uv":[4.1875,6.8125,3.4375,7],"rotation":90,"texture":"#0"},"down":{"uv":[4.1875,7,3.4375,6.8125],"rotation":90,"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[0,2.75,3.25],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[-0.5,3,3.25],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,75.75,0],"translation":[5.25,2.25,1.5],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,75.75,0],"translation":[5.25,2.75,2],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[0.25,-0.25,0],"scale":[0.625,0.625,0.625]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[0,1,2,3,{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[4,5,6,7,8]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_cyan_fish.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_cyan_fish.json new file mode 100644 index 000000000..4a6b6a9fa --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_cyan_fish.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[6.1106,0.04828,4.1196],"to":[10.1106,2.04828,13.1196],"rotation":{"angle":0,"axis":"y","origin":[8.1106,1.04828,7.8696]},"faces":{"north":{"uv":[0.375,3.5,0.4375,3.25],"rotation":90,"texture":"#0"},"east":{"uv":[0.375,3.25,0.9375,3.3125],"rotation":180,"texture":"#0"},"south":{"uv":[0.875,3.5,0.9375,3.25],"rotation":270,"texture":"#0"},"west":{"uv":[0.375,3.4375,0.9375,3.5],"texture":"#0"},"up":{"uv":[0.375,3.25,0.9375,3.5],"rotation":90,"texture":"#0"},"down":{"uv":[0.375,3.5,0.9375,3.25],"rotation":270,"texture":"#0"}}},{"from":[6.1106,1.04828,1.1196],"to":[11.1106,1.04828,13.1196],"rotation":{"angle":0,"axis":"y","origin":[8.1106,1.04828,7.8696]},"faces":{"up":{"uv":[0.1875,3.1875,0.9375,3.5],"rotation":90,"texture":"#0"},"down":{"uv":[0.1875,3.5,0.9375,3.1875],"rotation":270,"texture":"#0"}}},{"from":[7.6106,-1.95172,7.6196],"to":[7.6106,4.04828,9.6196],"rotation":{"angle":0,"axis":"y","origin":[8.1106,1.04828,7.8696]},"faces":{"east":{"uv":[0.5,3.5625,0.625,3.9375],"rotation":180,"texture":"#0"},"west":{"uv":[0.5,3.5625,0.625,3.9375],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[-91,0,0],"translation":[0,4.75,-5.75],"scale":[1.03828,1.03828,1.03828]},"thirdperson_lefthand":{"rotation":[-91,0,0],"translation":[0.25,4.75,-5.75],"scale":[1.03828,1.03828,1.03828]},"firstperson_righthand":{"rotation":[-145,-13,-180],"translation":[7.75,4.25,-0.5],"scale":[0.75352,0.75352,0.75352]},"firstperson_lefthand":{"rotation":[-145,-13,-180],"translation":[7.75,4.25,-0.5],"scale":[0.75352,0.75352,0.75352]},"ground":{"translation":[0,4.5,0],"scale":[0.41406,0.41406,0.41406]},"gui":{"rotation":[-142.73,39.63,-89.3],"translation":[7,-3,0],"scale":[1.36914,1.36914,1.36914]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"children":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,1,2]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fish_box.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fish_box.json new file mode 100644 index 000000000..be290dd1d --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fish_box.json @@ -0,0 +1 @@ +{"credit":"132818 / 18007B1J3WA9PZIDHN","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[0,0,0],"to":[16,16,16],"faces":{"north":{"uv":[4.25,6.3125,5.25,7.3125],"texture":"#0"},"east":{"uv":[4.25,6.3125,5.25,7.3125],"texture":"#0"},"south":{"uv":[4.25,6.3125,5.25,7.3125],"texture":"#0"},"west":{"uv":[4.25,6.3125,5.25,7.3125],"texture":"#0"},"up":{"uv":[4.25,7.375,5.25,8.375],"texture":"#0"},"down":{"uv":[3.1875,7.0625,4.1875,8.0625],"texture":"#0"}}},{"from":[2.1106,16.04828,5.1196],"to":[6.1106,18.04828,14.1196],"rotation":{"angle":22.5,"axis":"y","origin":[4.1106,17.04828,8.8696]},"faces":{"north":{"uv":[0.375,2.5625,0.4375,2.3125],"rotation":90,"texture":"#0"},"east":{"uv":[0.375,2.3125,0.9375,2.375],"rotation":180,"texture":"#0"},"south":{"uv":[0.875,2.5625,0.9375,2.3125],"rotation":270,"texture":"#0"},"west":{"uv":[0.375,2.5,0.9375,2.5625],"texture":"#0"},"up":{"uv":[0.375,2.3125,0.9375,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[0.375,2.5625,0.9375,2.3125],"rotation":270,"texture":"#0"}}},{"from":[2.1106,17.04828,2.1196],"to":[7.1106,17.04828,14.1196],"rotation":{"angle":22.5,"axis":"y","origin":[4.1106,17.04828,8.8696]},"faces":{"up":{"uv":[0.1875,2.25,0.9375,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[0.1875,2.5625,0.9375,2.25],"rotation":270,"texture":"#0"}}},{"from":[3.6106,14.04828,8.6196],"to":[3.6106,20.04828,10.6196],"rotation":{"angle":22.5,"axis":"y","origin":[4.1106,17.04828,8.8696]},"faces":{"east":{"uv":[0.5,2.625,0.625,3],"rotation":180,"texture":"#0"},"west":{"uv":[0.5,2.625,0.625,3],"texture":"#0"}}},{"from":[7.87622,16.04828,1.42429],"to":[11.87622,18.04828,10.42429],"rotation":{"angle":45,"axis":"y","origin":[9.87622,17.04828,5.17429]},"faces":{"north":{"uv":[1.3125,2.5625,1.375,2.3125],"rotation":90,"texture":"#0"},"east":{"uv":[1.3125,2.3125,1.875,2.375],"rotation":180,"texture":"#0"},"south":{"uv":[1.8125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"},"west":{"uv":[1.3125,2.5,1.875,2.5625],"texture":"#0"},"up":{"uv":[1.3125,2.3125,1.875,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[1.3125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"}}},{"from":[7.87622,17.04828,-1.57571],"to":[12.87622,17.04828,10.42429],"rotation":{"angle":45,"axis":"y","origin":[9.87622,17.04828,5.17429]},"faces":{"up":{"uv":[1.125,2.25,1.875,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[1.125,2.5625,1.875,2.25],"rotation":270,"texture":"#0"}}},{"from":[9.37622,14.04828,4.92429],"to":[9.37622,20.04828,6.92429],"rotation":{"angle":45,"axis":"y","origin":[9.87622,17.04828,5.17429]},"faces":{"east":{"uv":[1.4375,2.625,1.5625,3],"rotation":180,"texture":"#0"},"west":{"uv":[1.4375,2.625,1.5625,3],"texture":"#0"}}},{"from":[9.1106,12.79828,12.8696],"to":[13.1106,21.79828,14.8696],"rotation":{"angle":22.5,"axis":"x","origin":[11.1106,18.04828,13.8696]},"faces":{"north":{"uv":[1.3125,3.5,1.875,3.25],"rotation":90,"texture":"#0"},"east":{"uv":[1.3125,3.25,1.875,3.3125],"rotation":90,"texture":"#0"},"south":{"uv":[1.3125,3.25,1.875,3.5],"rotation":90,"texture":"#0"},"west":{"uv":[1.3125,3.4375,1.875,3.5],"rotation":90,"texture":"#0"},"up":{"uv":[1.3125,3.5,1.375,3.25],"rotation":270,"texture":"#0"},"down":{"uv":[1.8125,3.5,1.875,3.25],"rotation":270,"texture":"#0"}}},{"from":[9.1106,12.79828,13.8696],"to":[14.1106,24.79828,13.8696],"rotation":{"angle":22.5,"axis":"x","origin":[11.1106,18.04828,13.8696]},"faces":{"north":{"uv":[1.125,3.5,1.875,3.1875],"rotation":90,"texture":"#0"},"south":{"uv":[1.125,3.1875,1.875,3.5],"rotation":90,"texture":"#0"}}},{"from":[10.6106,16.29828,10.8696],"to":[10.6106,18.29828,16.8696],"rotation":{"angle":22.5,"axis":"x","origin":[11.1106,18.04828,13.8696]},"faces":{"east":{"uv":[1.4375,3.5625,1.5625,3.9375],"rotation":90,"texture":"#0"},"west":{"uv":[1.4375,3.5625,1.5625,3.9375],"rotation":90,"texture":"#0"}}},{"from":[4.1106,18.04828,1.6196],"to":[8.1106,20.04828,10.6196],"rotation":{"angle":-45,"axis":"y","origin":[6.1106,19.04828,6.8696]},"faces":{"north":{"uv":[0.875,3.5,0.9375,3.25],"rotation":90,"texture":"#0"},"east":{"uv":[0.375,3.25,0.9375,3.3125],"texture":"#0"},"south":{"uv":[0.375,3.5,0.4375,3.25],"rotation":270,"texture":"#0"},"west":{"uv":[0.375,3.4375,0.9375,3.5],"rotation":180,"texture":"#0"},"up":{"uv":[0.375,3.5,0.9375,3.25],"rotation":270,"texture":"#0"},"down":{"uv":[0.375,3.25,0.9375,3.5],"rotation":90,"texture":"#0"}}},{"from":[4.1106,19.04828,1.6196],"to":[9.1106,19.04828,13.6196],"rotation":{"angle":-45,"axis":"y","origin":[6.1106,19.04828,6.8696]},"faces":{"up":{"uv":[0.1875,3.5,0.9375,3.1875],"rotation":270,"texture":"#0"},"down":{"uv":[0.1875,3.1875,0.9375,3.5],"rotation":90,"texture":"#0"}}},{"from":[5.6106,16.04828,5.1196],"to":[5.6106,22.04828,7.1196],"rotation":{"angle":-45,"axis":"y","origin":[6.1106,19.04828,6.8696]},"faces":{"east":{"uv":[0.5,3.5625,0.625,3.9375],"texture":"#0"},"west":{"uv":[0.5,3.5625,0.625,3.9375],"rotation":180,"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[2.75,2.5,2],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[2.25,2,1.75],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,75.75,0],"translation":[5.25,-0.75,1.5],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,75.75,0],"translation":[5.25,-0.5,2],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[0.25,-0.25,0],"scale":[0.49219,0.49219,0.49219]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[0]},{"name":"fisherman_hanging_fish","origin":[8,8,8],"color":0,"boneType":"","children":[{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[1,2,3]},{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[4,5,6]},{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[7,8,9]},{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[10,11,12]}]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fish_rack.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fish_rack.json new file mode 100644 index 000000000..cbb5e887c --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fish_rack.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[14,0,-5],"to":[16,14,-3],"rotation":{"angle":0,"axis":"x","origin":[15,7.5,-4]},"faces":{"north":{"uv":[0.125,12.9375,0.0625,13.8125],"texture":"#0"},"east":{"uv":[0,12.9375,0.125,13.8125],"texture":"#0"},"south":{"uv":[0.0625,12.9375,0,13.8125],"texture":"#0"},"west":{"uv":[0.125,12.9375,0,13.8125],"texture":"#0"},"down":{"uv":[0,13.875,0.125,14],"rotation":90,"texture":"#0"}}},{"from":[-16,0,-5],"to":[-14,14,-3],"rotation":{"angle":0,"axis":"x","origin":[-15,7,-4]},"faces":{"north":{"uv":[0.0625,12.9375,0.125,13.8125],"texture":"#0"},"east":{"uv":[0,12.9375,0.125,13.8125],"texture":"#0"},"south":{"uv":[0,12.9375,0.0625,13.8125],"texture":"#0"},"west":{"uv":[0.125,12.9375,0,13.8125],"texture":"#0"},"down":{"uv":[0,14,0.125,13.875],"rotation":90,"texture":"#0"}}},{"from":[-16,0,14],"to":[-14,14,16],"rotation":{"angle":0,"axis":"x","origin":[-15,7,15]},"faces":{"north":{"uv":[0.0625,12.9375,0,13.8125],"texture":"#0"},"east":{"uv":[0.125,12.9375,0,13.8125],"texture":"#0"},"south":{"uv":[0.125,12.9375,0.0625,13.8125],"texture":"#0"},"west":{"uv":[0,12.9375,0.125,13.8125],"texture":"#0"},"down":{"uv":[0.125,14,0,13.875],"rotation":90,"texture":"#0"}}},{"from":[14,0,14],"to":[16,14,16],"rotation":{"angle":0,"axis":"x","origin":[15,7.5,15]},"faces":{"north":{"uv":[0,12.9375,0.0625,13.8125],"texture":"#0"},"east":{"uv":[0.125,12.9375,0,13.8125],"texture":"#0"},"south":{"uv":[0.0625,12.9375,0.125,13.8125],"texture":"#0"},"west":{"uv":[0,12.9375,0.125,13.8125],"texture":"#0"},"down":{"uv":[0.125,13.875,0,14],"rotation":90,"texture":"#0"}}},{"from":[-16,4,-3],"to":[-14,6,14],"rotation":{"angle":0,"axis":"x","origin":[-15,5,4]},"faces":{"east":{"uv":[0.1875,13.125,1.25,13.25],"rotation":180,"texture":"#0"},"west":{"uv":[0.1875,13.125,1.25,13.25],"rotation":180,"texture":"#0"},"up":{"uv":[0.1875,13.1875,1.25,13.25],"rotation":270,"texture":"#0"},"down":{"uv":[0.1875,13.125,1.25,13.1875],"rotation":270,"texture":"#0"}}},{"from":[14,4,-3],"to":[16,6,14],"rotation":{"angle":0,"axis":"x","origin":[15,5,4]},"faces":{"east":{"uv":[0.1875,13.125,1.25,13.25],"rotation":180,"texture":"#0"},"west":{"uv":[0.1875,13.125,1.25,13.25],"rotation":180,"texture":"#0"},"up":{"uv":[0.1875,13.1875,1.25,13.25],"rotation":270,"texture":"#0"},"down":{"uv":[0.1875,13.125,1.25,13.1875],"rotation":270,"texture":"#0"}}},{"from":[-14,4,-5],"to":[14,6,-3],"rotation":{"angle":0,"axis":"y","origin":[5.5,5,-4]},"faces":{"north":{"uv":[0.1875,12.9375,1.9375,13.0625],"rotation":180,"texture":"#0"},"south":{"uv":[0.1875,12.9375,1.9375,13.0625],"rotation":180,"texture":"#0"},"up":{"uv":[0.1875,13,1.9375,13.0625],"rotation":180,"texture":"#0"},"down":{"uv":[0.1875,12.9375,1.9375,13],"rotation":180,"texture":"#0"}}},{"from":[-14,4,14],"to":[14,6,16],"rotation":{"angle":0,"axis":"y","origin":[5.5,5,15]},"faces":{"north":{"uv":[0.1875,12.9375,1.9375,13.0625],"rotation":180,"texture":"#0"},"south":{"uv":[0.1875,12.9375,1.9375,13.0625],"rotation":180,"texture":"#0"},"up":{"uv":[0.1875,13,1.9375,13.0625],"rotation":180,"texture":"#0"},"down":{"uv":[0.1875,12.9375,1.9375,13],"rotation":180,"texture":"#0"}}},{"from":[-13,9,-4],"to":[13,11,-4],"rotation":{"angle":22.5,"axis":"z","origin":[0,10,-4]},"faces":{"north":{"uv":[1.3125,11.375,2.9375,11.5],"texture":"#0"},"south":{"uv":[1.3125,11.375,2.9375,11.5],"texture":"#0"}}},{"from":[-13,9,-3.94531],"to":[13,11,-3.94531],"rotation":{"angle":-22.5,"axis":"z","origin":[0,10,-3.94531]},"faces":{"north":{"uv":[1.3125,11.375,2.9375,11.5],"texture":"#0"},"south":{"uv":[1.3125,11.375,2.9375,11.5],"texture":"#0"}}},{"from":[-13,9,15],"to":[13,11,15],"rotation":{"angle":22.5,"axis":"z","origin":[0,10,15]},"faces":{"north":{"uv":[2.9375,11.375,1.3125,11.5],"texture":"#0"},"south":{"uv":[2.9375,11.375,1.3125,11.5],"texture":"#0"}}},{"from":[-13,9,14.94531],"to":[13,11,14.94531],"rotation":{"angle":-22.5,"axis":"z","origin":[0,10,14.94531]},"faces":{"north":{"uv":[2.9375,11.375,1.3125,11.5],"texture":"#0"},"south":{"uv":[2.9375,11.375,1.3125,11.5],"texture":"#0"}}},{"from":[-16,14,-5],"to":[-14,16,16],"rotation":{"angle":0,"axis":"x","origin":[0,15,5.5]},"faces":{"north":{"uv":[1.8125,11.5625,1.9375,11.625],"rotation":90,"texture":"#0"},"east":{"uv":[1.8125,11.5625,1.875,12.875],"rotation":270,"texture":"#0"},"south":{"uv":[1.8125,11.5625,1.9375,11.625],"rotation":90,"texture":"#0"},"west":{"uv":[1.875,11.5625,1.9375,12.875],"rotation":90,"texture":"#0"},"up":{"uv":[1.8125,11.5625,1.9375,12.875],"rotation":180,"texture":"#0"},"down":{"uv":[1.9375,11.5625,1.8125,12.875],"texture":"#0"}}},{"from":[14,14,-5],"to":[16,16,16],"rotation":{"angle":0,"axis":"x","origin":[0,15,5.5]},"faces":{"north":{"uv":[1.8125,11.625,1.9375,11.5625],"rotation":90,"texture":"#0"},"east":{"uv":[1.875,12.875,1.9375,11.5625],"rotation":90,"texture":"#0"},"south":{"uv":[1.8125,11.625,1.9375,11.5625],"rotation":90,"texture":"#0"},"west":{"uv":[1.8125,12.875,1.875,11.5625],"rotation":270,"texture":"#0"},"up":{"uv":[1.9375,11.5625,1.8125,12.875],"rotation":180,"texture":"#0"},"down":{"uv":[1.8125,11.5625,1.9375,12.875],"texture":"#0"}}},{"from":[-14,14.999,-3.5],"to":[14,14.999,14.5],"rotation":{"angle":0,"axis":"x","origin":[0,15.35255,5.35355]},"faces":{"up":{"uv":[0,11.5625,1.75,12.6875],"rotation":180,"texture":"#0"},"down":{"uv":[0,11.5625,1.75,12.6875],"texture":"#0"}}},{"from":[-14,14,-5],"to":[14,16,-3],"rotation":{"angle":0,"axis":"x","origin":[0,15,5.5]},"faces":{"north":{"uv":[0,12.8125,1.75,12.875],"rotation":180,"texture":"#0"},"south":{"uv":[0,12.75,1.75,12.8125],"texture":"#0"},"up":{"uv":[0,12.75,1.75,12.875],"rotation":180,"texture":"#0"},"down":{"uv":[0,12.75,1.75,12.875],"texture":"#0"}}},{"from":[-14,14,14],"to":[14,16,16],"rotation":{"angle":0,"axis":"x","origin":[0,15,5.5]},"faces":{"north":{"uv":[0,12.8125,1.75,12.75],"rotation":180,"texture":"#0"},"south":{"uv":[0,12.875,1.75,12.8125],"texture":"#0"},"up":{"uv":[1.75,12.75,0,12.875],"texture":"#0"},"down":{"uv":[1.75,12.75,0,12.875],"rotation":180,"texture":"#0"}}},{"from":[8.6106,15.54828,2.1196],"to":[12.6106,17.54828,11.1196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,4.3696]},"faces":{"north":{"uv":[0.375,2.5625,0.4375,2.3125],"rotation":90,"texture":"#0"},"east":{"uv":[0.375,2.3125,0.9375,2.375],"rotation":180,"texture":"#0"},"south":{"uv":[0.875,2.5625,0.9375,2.3125],"rotation":270,"texture":"#0"},"west":{"uv":[0.375,2.5,0.9375,2.5625],"texture":"#0"},"up":{"uv":[0.375,2.3125,0.9375,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[0.375,2.5625,0.9375,2.3125],"rotation":270,"texture":"#0"}}},{"from":[8.6106,16.54828,-0.8804],"to":[13.6106,16.54828,11.1196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,4.3696]},"faces":{"up":{"uv":[0.1875,2.25,0.9375,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[0.1875,2.5625,0.9375,2.25],"rotation":270,"texture":"#0"}}},{"from":[10.1106,13.54828,5.6196],"to":[10.1106,19.54828,7.6196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,4.3696]},"faces":{"east":{"uv":[0.5,2.625,0.625,3],"rotation":180,"texture":"#0"},"west":{"uv":[0.5,2.625,0.625,3],"texture":"#0"}}},{"from":[-6.3894,15.54828,3.1196],"to":[-2.3894,17.54828,12.1196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,8.3696]},"faces":{"north":{"uv":[1.3125,2.5625,1.375,2.3125],"rotation":90,"texture":"#0"},"east":{"uv":[1.3125,2.3125,1.875,2.375],"rotation":180,"texture":"#0"},"south":{"uv":[1.8125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"},"west":{"uv":[1.3125,2.5,1.875,2.5625],"texture":"#0"},"up":{"uv":[1.3125,2.3125,1.875,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[1.3125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"}}},{"from":[-6.3894,16.54828,0.1196],"to":[-1.3894,16.54828,12.1196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,8.3696]},"faces":{"up":{"uv":[1.125,2.25,1.875,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[1.125,2.5625,1.875,2.25],"rotation":270,"texture":"#0"}}},{"from":[-4.8894,13.54828,6.6196],"to":[-4.8894,19.54828,8.6196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,8.3696]},"faces":{"east":{"uv":[1.4375,2.625,1.5625,3],"rotation":180,"texture":"#0"},"west":{"uv":[1.4375,2.625,1.5625,3],"texture":"#0"}}},{"from":[1.6106,15.54828,-0.8804],"to":[5.6106,17.54828,8.1196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,4.3696]},"faces":{"north":{"uv":[1.3125,3.5,1.375,3.25],"rotation":90,"texture":"#0"},"east":{"uv":[1.3125,3.25,1.875,3.3125],"rotation":180,"texture":"#0"},"south":{"uv":[1.8125,3.5,1.875,3.25],"rotation":270,"texture":"#0"},"west":{"uv":[1.3125,3.4375,1.875,3.5],"texture":"#0"},"up":{"uv":[1.3125,3.25,1.875,3.5],"rotation":90,"texture":"#0"},"down":{"uv":[1.3125,3.5,1.875,3.25],"rotation":270,"texture":"#0"}}},{"from":[1.6106,16.54828,-3.8804],"to":[6.6106,16.54828,8.1196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,4.3696]},"faces":{"up":{"uv":[1.125,3.1875,1.875,3.5],"rotation":90,"texture":"#0"},"down":{"uv":[1.125,3.5,1.875,3.1875],"rotation":270,"texture":"#0"}}},{"from":[3.1106,13.54828,2.6196],"to":[3.1106,19.54828,4.6196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,4.3696]},"faces":{"east":{"uv":[1.4375,3.5625,1.5625,3.9375],"rotation":180,"texture":"#0"},"west":{"uv":[1.4375,3.5625,1.5625,3.9375],"texture":"#0"}}},{"from":[-13.3894,15.54828,0.1196],"to":[-9.3894,17.54828,9.1196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,2.3696]},"faces":{"north":{"uv":[0.375,3.5,0.4375,3.25],"rotation":90,"texture":"#0"},"east":{"uv":[0.375,3.25,0.9375,3.3125],"rotation":180,"texture":"#0"},"south":{"uv":[0.875,3.5,0.9375,3.25],"rotation":270,"texture":"#0"},"west":{"uv":[0.375,3.4375,0.9375,3.5],"texture":"#0"},"up":{"uv":[0.375,3.25,0.9375,3.5],"rotation":90,"texture":"#0"},"down":{"uv":[0.375,3.5,0.9375,3.25],"rotation":270,"texture":"#0"}}},{"from":[-13.3894,16.54828,-2.8804],"to":[-8.3894,16.54828,9.1196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,2.3696]},"faces":{"up":{"uv":[0.1875,3.1875,0.9375,3.5],"rotation":90,"texture":"#0"},"down":{"uv":[0.1875,3.5,0.9375,3.1875],"rotation":270,"texture":"#0"}}},{"from":[-11.8894,13.54828,3.6196],"to":[-11.8894,19.54828,5.6196],"rotation":{"angle":0,"axis":"y","origin":[-0.3894,16.54828,2.3696]},"faces":{"east":{"uv":[0.5,3.5625,0.625,3.9375],"rotation":180,"texture":"#0"},"west":{"uv":[0.5,3.5625,0.625,3.9375],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[4.5,6.75,1.25],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[0.75,3.75,2.75],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,75.75,0],"translation":[3,1.75,1.5],"scale":[0.18906,0.18906,0.18906]},"firstperson_lefthand":{"rotation":[0,75.75,0],"translation":[3,1.75,4.5],"scale":[0.18906,0.18906,0.18906]},"ground":{"translation":[2.25,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[-3,-0.75,0],"scale":[0.4082,0.4082,0.4082]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[-15,-4.91852,14.49569],"color":0,"boneType":"","children":[0,1,2,3,4,5,6,7,8,9,10,11]},{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[12,13,14,15,16]},{"name":"fisherman_hanging_fish","origin":[8,8,8],"color":0,"boneType":"","children":[{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[17,18,19]},{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[20,21,22]},{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[23,24,25]},{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[26,27,28]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fishing_pole.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fishing_pole.json new file mode 100644 index 000000000..ca1286381 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fishing_pole.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[-2.22266,1.02734,6.5],"to":[16.77734,2.02734,7.5],"rotation":{"angle":0,"axis":"y","origin":[5.27734,1.27734,7]},"faces":{"north":{"uv":[2.6875,4.4375,2.75,5.625],"rotation":270,"texture":"#0"},"east":{"uv":[2.6875,4.4375,2.75,4.5],"texture":"#0"},"south":{"uv":[2.6875,4.4375,2.75,5.625],"rotation":90,"texture":"#0"},"west":{"uv":[2.6875,5.5625,2.75,5.625],"texture":"#0"},"up":{"uv":[2.6875,4.4375,2.75,5.625],"rotation":90,"texture":"#0"},"down":{"uv":[2.6875,4.4375,2.75,5.625],"rotation":90,"texture":"#0"}}},{"from":[1.77734,1.52734,7.5],"to":[17.77734,1.52734,9.5],"rotation":{"angle":0,"axis":"y","origin":[9.67159,1.57734,9]},"faces":{"up":{"uv":[3.0625,4.4375,3.1875,5.4375],"rotation":90,"texture":"#0"},"down":{"uv":[3.1875,4.4375,3.0625,5.4375],"rotation":90,"texture":"#0"}}},{"from":[1.77734,0.57421,6],"to":[2.77734,2.57421,8],"rotation":{"angle":0,"axis":"y","origin":[2.27734,1.53905,7]},"faces":{"north":{"uv":[2.8125,4.4375,2.93311,4.5],"rotation":270,"texture":"#0"},"east":{"uv":[2.9375,4.4375,2.8125,4.49561],"texture":"#0"},"south":{"uv":[2.875,4.4375,2.93311,4.5],"rotation":90,"texture":"#0"},"west":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":180,"texture":"#0"},"up":{"uv":[2.8125,4.4375,2.9375,4.5],"rotation":90,"texture":"#0"},"down":{"uv":[2.9375,4.4375,2.8125,4.5],"rotation":90,"texture":"#0"}}},{"from":[6.77734,0.57421,6],"to":[7.77734,2.57421,8],"rotation":{"angle":0,"axis":"y","origin":[7.27734,1.53905,7]},"faces":{"north":{"uv":[2.8125,4.4375,2.87061,4.5],"rotation":270,"texture":"#0"},"east":{"uv":[2.9375,4.4375,2.8125,4.49561],"texture":"#0"},"south":{"uv":[2.875,4.4375,2.93311,4.5],"rotation":90,"texture":"#0"},"west":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":180,"texture":"#0"},"up":{"uv":[2.8125,4.4375,2.9375,4.5],"rotation":90,"texture":"#0"},"down":{"uv":[2.9375,4.4375,2.8125,4.5],"rotation":90,"texture":"#0"}}},{"from":[11.77734,0.57421,6],"to":[12.77734,2.57421,8],"rotation":{"angle":0,"axis":"y","origin":[12.27734,1.53905,7]},"faces":{"north":{"uv":[2.8125,4.4375,2.87061,4.5],"rotation":270,"texture":"#0"},"east":{"uv":[2.9375,4.4375,2.8125,4.49561],"texture":"#0"},"south":{"uv":[2.875,4.4375,2.93311,4.5],"rotation":90,"texture":"#0"},"west":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":180,"texture":"#0"},"up":{"uv":[2.8125,4.4375,2.9375,4.5],"rotation":90,"texture":"#0"},"down":{"uv":[2.9375,4.4375,2.8125,4.5],"rotation":90,"texture":"#0"}}},{"from":[16.77734,0.57421,6],"to":[17.77734,2.57421,8],"rotation":{"angle":0,"axis":"y","origin":[17.27734,1.53905,7]},"faces":{"north":{"uv":[2.8125,4.4375,2.87061,4.5],"rotation":270,"texture":"#0"},"east":{"uv":[2.9375,4.4375,2.8125,4.49561],"texture":"#0"},"south":{"uv":[2.875,4.4375,2.93311,4.5],"rotation":90,"texture":"#0"},"west":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":180,"texture":"#0"},"up":{"uv":[2.8125,4.4375,2.9375,4.5],"rotation":90,"texture":"#0"},"down":{"uv":[2.9375,4.4375,2.8125,4.5],"rotation":90,"texture":"#0"}}},{"from":[1.16488,0.02734,5.06127],"to":[3.16488,3.02734,7.06127],"rotation":{"angle":22.5,"axis":"y","origin":[2.16488,1.52734,6.06127]},"faces":{"north":{"uv":[2.8125,4.6875,3,4.5625],"rotation":90,"texture":"#0"},"east":{"uv":[2.8125,4.6875,3,4.5625],"rotation":270,"texture":"#0"},"south":{"uv":[2.8125,4.625,3,4.6875],"rotation":270,"texture":"#0"},"west":{"uv":[2.8125,4.625,3,4.6875],"rotation":270,"texture":"#0"},"up":{"uv":[2.8125,5.125,2.9375,5.25],"rotation":90,"texture":"#0"},"down":{"uv":[2.8125,5.125,2.9375,5.25],"rotation":180,"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[180,0,-90],"translation":[5.75,6.75,0.25],"scale":[0.85,0.85,0.85]},"thirdperson_lefthand":{"rotation":[180,0,90],"translation":[-5.25,6.75,0.25],"scale":[0.85,0.85,0.85]},"firstperson_righthand":{"rotation":[136.13,-13.99,-92.36],"translation":[8.38,3.2,-4.12],"scale":[0.68,0.68,0.68]},"firstperson_lefthand":{"rotation":[134.26,-1.41,79.34],"translation":[0.88,3.2,-3.62],"scale":[0.68,0.68,0.68]},"ground":{"translation":[0,5,0],"scale":[0.43945,0.43945,0.43945]},"gui":{"rotation":[112.78,36.47,-23.17],"translation":[2.25,-1.5,0],"scale":[0.9668,0.9668,0.9668]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,19.50355,8],"color":0,"children":[0,1,2,3,4,5,6]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fishingpole_rack.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fishingpole_rack.json new file mode 100644 index 000000000..02565735a --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_fishingpole_rack.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[11.52734,3,8.5],"to":[12.52734,22,9.5],"rotation":{"angle":0,"axis":"y","origin":[12.27734,10.5,9]},"faces":{"north":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"east":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"south":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"west":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"up":{"uv":[2.6875,4.4375,2.75,4.5],"rotation":270,"texture":"#0"},"down":{"uv":[2.6875,5.5625,2.75,5.625],"rotation":270,"texture":"#0"}}},{"from":[12.02734,7,9.5],"to":[12.02734,23,11.5],"rotation":{"angle":0,"axis":"y","origin":[11.97734,14.89425,11]},"faces":{"east":{"uv":[3.1875,4.4375,3.0625,5.4375],"texture":"#0"},"west":{"uv":[3.0625,4.4375,3.1875,5.4375],"texture":"#0"}}},{"from":[10.98047,7,8],"to":[12.98047,8,10],"rotation":{"angle":0,"axis":"y","origin":[12.01563,7.5,9]},"faces":{"north":{"uv":[2.8125,4.4375,2.93311,4.5],"texture":"#0"},"east":{"uv":[2.9375,4.4375,2.8125,4.5],"texture":"#0"},"south":{"uv":[2.875,4.4375,2.93311,4.5],"texture":"#0"},"west":{"uv":[2.8125,4.4375,2.9375,4.5],"texture":"#0"},"up":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":90,"texture":"#0"}}},{"from":[10.98047,12,8],"to":[12.98047,13,10],"rotation":{"angle":0,"axis":"y","origin":[12.01563,12.5,9]},"faces":{"north":{"uv":[2.8125,4.4375,2.87061,4.5],"texture":"#0"},"east":{"uv":[2.9375,4.4375,2.8125,4.5],"texture":"#0"},"south":{"uv":[2.875,4.4375,2.93311,4.5],"texture":"#0"},"west":{"uv":[2.8125,4.4375,2.9375,4.5],"texture":"#0"},"up":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":90,"texture":"#0"}}},{"from":[10.98047,17,8],"to":[12.98047,18,10],"rotation":{"angle":0,"axis":"y","origin":[12.01563,17.5,9]},"faces":{"north":{"uv":[2.8125,4.4375,2.87061,4.5],"texture":"#0"},"east":{"uv":[2.9375,4.4375,2.8125,4.5],"texture":"#0"},"south":{"uv":[2.875,4.4375,2.93311,4.5],"texture":"#0"},"west":{"uv":[2.8125,4.4375,2.9375,4.5],"texture":"#0"},"up":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":90,"texture":"#0"}}},{"from":[10.98047,22,8],"to":[12.98047,23,10],"rotation":{"angle":0,"axis":"y","origin":[12.01563,22.5,9]},"faces":{"north":{"uv":[2.8125,4.4375,2.87061,4.5],"texture":"#0"},"east":{"uv":[2.9375,4.4375,2.8125,4.5],"texture":"#0"},"south":{"uv":[2.875,4.4375,2.93311,4.5],"texture":"#0"},"west":{"uv":[2.8125,4.4375,2.9375,4.5],"texture":"#0"},"up":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":90,"texture":"#0"}}},{"from":[10.52734,6.38754,7.06127],"to":[13.52734,8.38754,9.06127],"rotation":{"angle":22.5,"axis":"x","origin":[12.02734,7.38754,8.06127]},"faces":{"north":{"uv":[2.8125,4.6875,3,4.5625],"rotation":180,"texture":"#0"},"east":{"uv":[2.8125,5.125,2.9375,5.25],"rotation":90,"texture":"#0"},"south":{"uv":[2.8125,4.625,3,4.6875],"rotation":180,"texture":"#0"},"west":{"uv":[2.8125,5.125,2.9375,5.25],"texture":"#0"},"up":{"uv":[2.8125,4.6875,3,4.5625],"rotation":180,"texture":"#0"},"down":{"uv":[2.8125,4.625,3,4.6875],"rotation":180,"texture":"#0"}}},{"from":[3.52734,3,8.5],"to":[4.52734,22,9.5],"rotation":{"angle":0,"axis":"y","origin":[4.27734,10.5,9]},"faces":{"north":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"east":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"south":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"west":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"up":{"uv":[2.6875,4.4375,2.75,4.5],"rotation":270,"texture":"#0"},"down":{"uv":[2.6875,5.5625,2.75,5.625],"rotation":270,"texture":"#0"}}},{"from":[4.02734,7,9.5],"to":[4.02734,23,11.5],"rotation":{"angle":0,"axis":"y","origin":[3.97734,14.89425,11]},"faces":{"east":{"uv":[3.1875,4.4375,3.0625,5.4375],"texture":"#0"},"west":{"uv":[3.0625,4.4375,3.1875,5.4375],"texture":"#0"}}},{"from":[2.98047,7,8],"to":[4.98047,8,10],"rotation":{"angle":0,"axis":"y","origin":[4.01563,7.5,9]},"faces":{"north":{"uv":[2.8125,4.4375,2.93311,4.5],"texture":"#0"},"east":{"uv":[2.9375,4.4375,2.8125,4.5],"texture":"#0"},"south":{"uv":[2.875,4.4375,2.93311,4.5],"texture":"#0"},"west":{"uv":[2.8125,4.4375,2.9375,4.5],"texture":"#0"},"up":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.4375,2.8125,4.49561],"rotation":90,"texture":"#0"}}},{"from":[2.98047,12,8],"to":[4.98047,13,10],"rotation":{"angle":0,"axis":"y","origin":[4.01563,12.5,9]},"faces":{"north":{"uv":[2.8125,4.1875,2.87061,4.25],"texture":"#0"},"east":{"uv":[2.9375,4.1875,2.8125,4.25],"texture":"#0"},"south":{"uv":[2.875,4.1875,2.93311,4.25],"texture":"#0"},"west":{"uv":[2.8125,4.1875,2.9375,4.25],"texture":"#0"},"up":{"uv":[2.9375,4.1875,2.8125,4.24561],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.1875,2.8125,4.24561],"rotation":90,"texture":"#0"}}},{"from":[2.98047,17,8],"to":[4.98047,18,10],"rotation":{"angle":0,"axis":"y","origin":[4.01563,17.5,9]},"faces":{"north":{"uv":[2.8125,4.1875,2.87061,4.25],"texture":"#0"},"east":{"uv":[2.9375,4.1875,2.8125,4.25],"texture":"#0"},"south":{"uv":[2.875,4.1875,2.93311,4.25],"texture":"#0"},"west":{"uv":[2.8125,4.1875,2.9375,4.25],"texture":"#0"},"up":{"uv":[2.9375,4.1875,2.8125,4.24561],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.1875,2.8125,4.24561],"rotation":90,"texture":"#0"}}},{"from":[2.98047,22,8],"to":[4.98047,23,10],"rotation":{"angle":0,"axis":"y","origin":[4.01563,22.5,9]},"faces":{"north":{"uv":[2.8125,4.1875,2.87061,4.25],"texture":"#0"},"east":{"uv":[2.9375,4.1875,2.8125,4.25],"texture":"#0"},"south":{"uv":[2.875,4.1875,2.93311,4.25],"texture":"#0"},"west":{"uv":[2.8125,4.1875,2.9375,4.25],"texture":"#0"},"up":{"uv":[2.9375,4.1875,2.8125,4.24561],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.1875,2.8125,4.24561],"rotation":90,"texture":"#0"}}},{"from":[2.52734,6.38754,7.06127],"to":[5.52734,8.38754,9.06127],"rotation":{"angle":22.5,"axis":"x","origin":[4.02734,7.38754,8.06127]},"faces":{"north":{"uv":[2.8125,5.0625,3,4.9375],"rotation":180,"texture":"#0"},"east":{"uv":[2.8125,5.125,2.9375,5.25],"rotation":90,"texture":"#0"},"south":{"uv":[2.8125,5,3,5.0625],"rotation":180,"texture":"#0"},"west":{"uv":[2.8125,5.125,2.9375,5.25],"texture":"#0"},"up":{"uv":[2.8125,5.0625,3,4.9375],"rotation":180,"texture":"#0"},"down":{"uv":[2.8125,5,3,5.0625],"rotation":180,"texture":"#0"}}},{"from":[7.52734,3,8.5],"to":[8.52734,22,9.5],"rotation":{"angle":0,"axis":"y","origin":[8.27734,10.5,9]},"faces":{"north":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"east":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"south":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"west":{"uv":[2.6875,4.4375,2.75,5.625],"texture":"#0"},"up":{"uv":[2.6875,4.4375,2.75,4.5],"rotation":270,"texture":"#0"},"down":{"uv":[2.6875,5.5625,2.75,5.625],"rotation":270,"texture":"#0"}}},{"from":[8.02734,7,9.5],"to":[8.02734,23,11.5],"rotation":{"angle":0,"axis":"y","origin":[7.97734,14.89425,11]},"faces":{"east":{"uv":[3.1875,4.4375,3.0625,5.4375],"texture":"#0"},"west":{"uv":[3.0625,4.4375,3.1875,5.4375],"texture":"#0"}}},{"from":[6.98047,7,8],"to":[8.98047,8,10],"rotation":{"angle":0,"axis":"y","origin":[8.01563,7.5,9]},"faces":{"north":{"uv":[2.8125,4.3125,2.93311,4.375],"texture":"#0"},"east":{"uv":[2.9375,4.3125,2.8125,4.375],"texture":"#0"},"south":{"uv":[2.875,4.3125,2.93311,4.375],"texture":"#0"},"west":{"uv":[2.8125,4.3125,2.9375,4.375],"texture":"#0"},"up":{"uv":[2.9375,4.3125,2.8125,4.37061],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.3125,2.8125,4.37061],"rotation":90,"texture":"#0"}}},{"from":[6.98047,12,8],"to":[8.98047,13,10],"rotation":{"angle":0,"axis":"y","origin":[8.01563,12.5,9]},"faces":{"north":{"uv":[2.8125,4.3125,2.87061,4.375],"texture":"#0"},"east":{"uv":[2.9375,4.3125,2.8125,4.375],"texture":"#0"},"south":{"uv":[2.875,4.3125,2.93311,4.375],"texture":"#0"},"west":{"uv":[2.8125,4.3125,2.9375,4.375],"texture":"#0"},"up":{"uv":[2.9375,4.3125,2.8125,4.37061],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.3125,2.8125,4.37061],"rotation":90,"texture":"#0"}}},{"from":[6.98047,17,8],"to":[8.98047,18,10],"rotation":{"angle":0,"axis":"y","origin":[8.01563,17.5,9]},"faces":{"north":{"uv":[2.8125,4.3125,2.87061,4.375],"texture":"#0"},"east":{"uv":[2.9375,4.3125,2.8125,4.375],"texture":"#0"},"south":{"uv":[2.875,4.3125,2.93311,4.375],"texture":"#0"},"west":{"uv":[2.8125,4.3125,2.9375,4.375],"texture":"#0"},"up":{"uv":[2.9375,4.3125,2.8125,4.37061],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.3125,2.8125,4.37061],"rotation":90,"texture":"#0"}}},{"from":[6.98047,22,8],"to":[8.98047,23,10],"rotation":{"angle":0,"axis":"y","origin":[8.01563,22.5,9]},"faces":{"north":{"uv":[2.8125,4.3125,2.87061,4.375],"texture":"#0"},"east":{"uv":[2.9375,4.3125,2.8125,4.375],"texture":"#0"},"south":{"uv":[2.875,4.3125,2.93311,4.375],"texture":"#0"},"west":{"uv":[2.8125,4.3125,2.9375,4.375],"texture":"#0"},"up":{"uv":[2.9375,4.3125,2.8125,4.37061],"rotation":270,"texture":"#0"},"down":{"uv":[2.9375,4.3125,2.8125,4.37061],"rotation":90,"texture":"#0"}}},{"from":[6.52734,6.38754,7.06127],"to":[9.52734,8.38754,9.06127],"rotation":{"angle":22.5,"axis":"x","origin":[8.02734,7.38754,8.06127]},"faces":{"north":{"uv":[2.8125,4.875,3,4.75],"rotation":180,"texture":"#0"},"east":{"uv":[2.8125,5.125,2.9375,5.25],"rotation":90,"texture":"#0"},"south":{"uv":[2.8125,4.8125,3,4.875],"rotation":180,"texture":"#0"},"west":{"uv":[2.8125,5.125,2.9375,5.25],"texture":"#0"},"up":{"uv":[2.8125,4.875,3,4.75],"rotation":180,"texture":"#0"},"down":{"uv":[2.8125,4.8125,3,4.875],"rotation":180,"texture":"#0"}}},{"from":[13,0,3],"to":[16,2,15],"rotation":{"angle":0,"axis":"y","origin":[14,0,8]},"faces":{"north":{"uv":[3.4375,5.25,3.625,5.375],"texture":"#0"},"east":{"uv":[4.25,4.4375,4.125,5.1875],"rotation":90,"texture":"#0"},"south":{"uv":[3.625,5.25,3.4375,5.375],"texture":"#0"},"west":{"uv":[4.0625,4.4375,3.9375,5.1875],"rotation":90,"texture":"#0"},"up":{"uv":[3.625,4.4375,3.4375,5.1875],"texture":"#0"},"down":{"uv":[3.6875,4.4375,3.875,5.1875],"texture":"#0"}}},{"from":[0,0,3],"to":[3,2,15],"rotation":{"angle":0,"axis":"y","origin":[2,0,8]},"faces":{"north":{"uv":[3.625,5.25,3.4375,5.375],"texture":"#0"},"east":{"uv":[4.0625,5.1875,3.9375,4.4375],"rotation":90,"texture":"#0"},"south":{"uv":[3.4375,5.25,3.625,5.375],"texture":"#0"},"west":{"uv":[4.25,5.1875,4.125,4.4375],"rotation":90,"texture":"#0"},"up":{"uv":[3.4375,4.4375,3.625,5.1875],"texture":"#0"},"down":{"uv":[3.875,4.4375,3.6875,5.1875],"texture":"#0"}}},{"from":[0.5,2,5],"to":[2.5,12,13],"rotation":{"angle":0,"axis":"y","origin":[0.5,2,8]},"faces":{"north":{"uv":[5.5625,4.4375,5.4375,5.0625],"texture":"#0"},"east":{"uv":[4.875,4.4375,5.375,5.0625],"texture":"#0"},"south":{"uv":[5.4375,4.4375,5.5625,5.0625],"texture":"#0"},"west":{"uv":[4.3125,4.4375,4.8125,5.0625],"texture":"#0"},"up":{"uv":[4.3125,5.25,4.8125,5.125],"rotation":90,"texture":"#0"}}},{"from":[13.5,2,5],"to":[15.5,12,13],"rotation":{"angle":0,"axis":"y","origin":[15.5,2,8]},"faces":{"north":{"uv":[5.4375,4.4375,5.5625,5.0625],"texture":"#0"},"east":{"uv":[4.8125,4.4375,4.3125,5.0625],"texture":"#0"},"south":{"uv":[5.5625,4.4375,5.4375,5.0625],"texture":"#0"},"west":{"uv":[5.375,4.4375,4.875,5.0625],"texture":"#0"},"up":{"uv":[4.3125,5.125,4.8125,5.25],"rotation":90,"texture":"#0"}}},{"from":[2.5,2,6],"to":[13.5,3,12],"rotation":{"angle":0,"axis":"y","origin":[10,9,11]},"faces":{"north":{"uv":[3.6875,5.3125,4.375,5.375],"texture":"#0"},"south":{"uv":[3.6875,5.3125,4.375,5.375],"texture":"#0"},"up":{"uv":[3.6875,5.3125,4.375,5.6875],"texture":"#0"},"down":{"uv":[3.6875,5.3125,4.375,5.6875],"texture":"#0"}}},{"from":[2.5,9,6.5],"to":[13.5,11,7.5],"rotation":{"angle":0,"axis":"x","origin":[8,9.5,7]},"faces":{"north":{"uv":[3.6875,5.875,4.375,5.75],"rotation":180,"texture":"#0"},"south":{"uv":[3.6875,5.75,4.375,5.875],"texture":"#0"},"up":{"uv":[3.6875,5.75,4.375,5.8125],"rotation":180,"texture":"#0"},"down":{"uv":[3.6875,5.8125,4.375,5.875],"texture":"#0"}}},{"from":[2.5,9,10.5],"to":[13.5,11,11.5],"rotation":{"angle":0,"axis":"x","origin":[8,9.5,11]},"faces":{"north":{"uv":[3.6875,5.875,4.375,5.75],"rotation":180,"texture":"#0"},"south":{"uv":[3.6875,5.75,4.375,5.875],"texture":"#0"},"up":{"uv":[3.6875,5.75,4.375,5.8125],"rotation":180,"texture":"#0"},"down":{"uv":[3.6875,5.8125,4.375,5.875],"texture":"#0"}}},{"from":[2.5,5,6],"to":[13.5,6,9],"rotation":{"angle":0,"axis":"y","origin":[10,8,4]},"faces":{"north":{"uv":[4.375,5.875,3.6875,5.9375],"texture":"#0"},"east":{"uv":[3.875,5.75,3.6875,5.8125],"texture":"#0"},"south":{"uv":[4.375,5.75,3.6875,5.8125],"texture":"#0"},"west":{"uv":[3.875,5.75,3.6875,5.8125],"texture":"#0"},"up":{"uv":[3.6875,5.9375,4.375,5.75],"texture":"#0"},"down":{"uv":[3.6875,5.75,4.375,5.9375],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[1.25,3.75,3.25],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[0,4,3.25],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,75.75,0],"translation":[5.25,2.75,1.5],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,75.75,0],"translation":[5.25,2.75,2],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[0.25,-1,0],"scale":[0.56445,0.56445,0.56445]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,19.50355,8],"color":0,"boneType":"","children":[0,1,2,3,4,5,6,{"name":"group","origin":[8,19.50355,8],"color":0,"boneType":"","children":[7,8,9,10,11,12,13]},{"name":"group","origin":[8,19.50355,8],"color":0,"boneType":"","children":[14,15,16,17,18,19,20]}]},{"name":"group","origin":[8,8,8],"color":0,"boneType":"","children":[21,22,23,24,25,26,27,28]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_floatie.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_floatie.json new file mode 100644 index 000000000..8043f4d3e --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_floatie.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench by ShizuArt","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[0,0,0],"to":[16,3,16],"faces":{"north":{"uv":[1.0625,5.1875,1.25,4.1875],"rotation":90,"texture":"#0"},"east":{"uv":[1.0625,4.1875,1.25,5.1875],"rotation":90,"texture":"#0"},"south":{"uv":[1.0625,5.1875,1.25,4.1875],"rotation":90,"texture":"#0"},"west":{"uv":[1.0625,4.1875,1.25,5.1875],"rotation":90,"texture":"#0"},"up":{"uv":[0,4.1875,1,5.1875],"texture":"#0"},"down":{"uv":[0,4.1875,1,5.1875],"rotation":90,"texture":"#0"}}},{"from":[12,0,4],"to":[4,3,12],"faces":{"north":{"uv":[0.125,4.9375,0.25,4.4375],"rotation":90,"texture":"#0"},"east":{"uv":[0.125,4.4375,0.25,4.9375],"rotation":90,"texture":"#0"},"south":{"uv":[0.125,4.9375,0.25,4.4375],"rotation":90,"texture":"#0"},"west":{"uv":[0.125,4.4375,0.25,4.9375],"rotation":90,"texture":"#0"}}},{"from":[-2,1.5,-2],"to":[18,1.5,18],"faces":{"up":{"uv":[1.3125,4.0625,2.5625,5.3125],"texture":"#0"},"down":{"uv":[2.5625,4.0625,1.3125,5.3125],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[0,2.5,3.25],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[0,2.5,3.25],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,-0.25,0],"translation":[5.25,2.75,0],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,2.75,0],"translation":[5.25,2.75,0],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.43555,0.43555,0.43555]},"gui":{"rotation":[-141.25,-45,180],"translation":[0,3.5,0],"scale":[0.56641,0.56641,0.56641]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,1,2]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_hanging_fish.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_hanging_fish.json new file mode 100644 index 000000000..75e76a52a --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_hanging_fish.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[15.97656,2.75,9.25],"to":[17.47706,26.75,10.75],"rotation":{"angle":-22.5,"axis":"x","origin":[16.72656,14.75,10]},"faces":{"north":{"uv":[5.875,0.375,5.6875,3.375],"texture":"#0"},"east":{"uv":[6.1875,0.375,6.375,3.375],"texture":"#0"},"south":{"uv":[5.6875,0.375,5.875,3.375],"texture":"#0"},"west":{"uv":[5.9375,0.375,6.125,3.375],"texture":"#0"},"up":{"uv":[5.6875,0.3125,5.875,0.125],"rotation":90,"texture":"#0"},"down":{"uv":[5.4375,0.3125,5.625,0.125],"rotation":90,"texture":"#0"}}},{"from":[16,2.75,5.25],"to":[17.5,26.75,6.75],"rotation":{"angle":22.5,"axis":"x","origin":[16.75,14.75,6]},"faces":{"north":{"uv":[5.875,0.375,5.6875,3.375],"texture":"#0"},"east":{"uv":[6.1875,0.375,6.375,3.375],"texture":"#0"},"south":{"uv":[5.6875,0.375,5.875,3.375],"texture":"#0"},"west":{"uv":[5.9375,0.375,6.125,3.375],"texture":"#0"},"up":{"uv":[5.6875,0.3125,5.875,0.125],"rotation":90,"texture":"#0"},"down":{"uv":[5.4375,0.3125,5.625,0.125],"rotation":90,"texture":"#0"}}},{"from":[-1.49414,2.75,9.25],"to":[0.00636,26.75,10.75],"rotation":{"angle":-22.5,"axis":"x","origin":[-0.74419,14.75,10]},"faces":{"north":{"uv":[5.6875,0.375,5.875,3.375],"texture":"#0"},"east":{"uv":[6.125,0.375,5.9375,3.375],"texture":"#0"},"south":{"uv":[5.875,0.375,5.6875,3.375],"texture":"#0"},"west":{"uv":[6.375,0.375,6.1875,3.375],"texture":"#0"},"up":{"uv":[5.6875,0.125,5.875,0.3125],"rotation":90,"texture":"#0"},"down":{"uv":[5.4375,0.125,5.625,0.3125],"rotation":90,"texture":"#0"}}},{"from":[-1.5,2.75,5.25],"to":[0,26.75,6.75],"rotation":{"angle":22.5,"axis":"x","origin":[-0.75,14.75,6]},"faces":{"north":{"uv":[5.6875,0.375,5.875,3.375],"texture":"#0"},"east":{"uv":[6.125,0.375,5.9375,3.375],"texture":"#0"},"south":{"uv":[5.875,0.375,5.6875,3.375],"texture":"#0"},"west":{"uv":[6.375,0.375,6.1875,3.375],"texture":"#0"},"up":{"uv":[5.6875,0.125,5.875,0.3125],"rotation":90,"texture":"#0"},"down":{"uv":[5.4375,0.125,5.625,0.3125],"rotation":90,"texture":"#0"}}},{"from":[-2.5,22.5,7.5],"to":[18.5,23.5,8.5],"rotation":{"angle":-45,"axis":"x","origin":[0,23,8]},"faces":{"north":{"uv":[2.875,3.4375,5.5,3.5625],"texture":"#0"},"east":{"uv":[2.6875,3.4375,2.8125,3.5625],"texture":"#0"},"south":{"uv":[5.5,3.5625,2.875,3.4375],"texture":"#0"},"west":{"uv":[2.6875,3.4375,2.8125,3.5625],"rotation":90,"texture":"#0"},"up":{"uv":[5.5,3.4375,2.875,3.5625],"texture":"#0"},"down":{"uv":[5.5,3.4375,2.875,3.5625],"texture":"#0"}}},{"from":[1.9,22.4,7.4],"to":[13.6,23.6,8.6],"rotation":{"angle":-45,"axis":"x","origin":[0,23,8]},"faces":{"north":{"uv":[2.875,3.1875,4.3125,3.3125],"texture":"#0"},"south":{"uv":[4.3125,3.3125,2.875,3.1875],"texture":"#0"},"up":{"uv":[4.3125,3.1875,2.875,3.3125],"texture":"#0"},"down":{"uv":[4.3125,3.1875,2.875,3.3125],"texture":"#0"}}},{"from":[2,17.29289,8],"to":[13.5,22.29289,8],"rotation":{"angle":0,"axis":"y","origin":[2.5,21.29289,7]},"faces":{"north":{"uv":[3.5,3.625,4.9375,4.25],"texture":"#0"},"south":{"uv":[3.5,3.625,4.9375,4.25],"texture":"#0"}}},{"from":[-1.85,18.9,6.9],"to":[0.35,20.1,9.1],"rotation":{"angle":0,"axis":"y","origin":[-0.75,19,7]},"faces":{"north":{"uv":[4.4375,3.1875,4.6875,3.3125],"texture":"#0"},"east":{"uv":[4.6875,3.1875,4.4375,3.3125],"texture":"#0"},"south":{"uv":[4.4375,3.1875,4.6875,3.3125],"texture":"#0"},"west":{"uv":[4.6875,3.1875,4.4375,3.3125],"texture":"#0"}}},{"name":"cube inverted","from":[0.35,20.1,9.1],"to":[-1.85,18.9,6.9],"rotation":{"angle":0,"axis":"y","origin":[-0.75,19,7]},"faces":{"north":{"uv":[4.4375,3.3125,4.6875,3.1875],"texture":"#0"},"east":{"uv":[4.6875,3.3125,4.4375,3.1875],"texture":"#0"},"south":{"uv":[4.4375,3.3125,4.6875,3.1875],"texture":"#0"},"west":{"uv":[4.6875,3.3125,4.4375,3.1875],"texture":"#0"}}},{"from":[15.65,18.9,6.9],"to":[17.85,20.1,9.1],"rotation":{"angle":0,"axis":"y","origin":[16.75,19,7]},"faces":{"north":{"uv":[4.4375,3.1875,4.6875,3.3125],"texture":"#0"},"east":{"uv":[4.6875,3.1875,4.4375,3.3125],"texture":"#0"},"south":{"uv":[4.4375,3.1875,4.6875,3.3125],"texture":"#0"},"west":{"uv":[4.6875,3.1875,4.4375,3.3125],"texture":"#0"}}},{"name":"cube inverted","from":[17.85,20.1,9.1],"to":[15.65,18.9,6.9],"rotation":{"angle":0,"axis":"y","origin":[16.75,19,7]},"faces":{"north":{"uv":[4.4375,3.3125,4.6875,3.1875],"texture":"#0"},"east":{"uv":[4.6875,3.3125,4.4375,3.1875],"texture":"#0"},"south":{"uv":[4.4375,3.3125,4.6875,3.1875],"texture":"#0"},"west":{"uv":[4.6875,3.3125,4.4375,3.1875],"texture":"#0"}}},{"from":[12.5553,14.64914,7.4348],"to":[14.5553,19.14914,8.4348],"rotation":{"angle":0,"axis":"y","origin":[13.5553,16.52414,7.9348]},"faces":{"north":{"uv":[0.375,2.3125,0.9375,2.5625],"rotation":270,"texture":"#0"},"east":{"uv":[0.375,2.3125,0.9375,2.375],"rotation":270,"texture":"#0"},"south":{"uv":[0.375,2.5625,0.9375,2.3125],"rotation":270,"texture":"#0"},"west":{"uv":[0.375,2.5,0.9375,2.5625],"rotation":270,"texture":"#0"},"up":{"uv":[0.875,2.5625,0.9375,2.3125],"rotation":270,"texture":"#0"},"down":{"uv":[0.375,2.5625,0.4375,2.3125],"rotation":270,"texture":"#0"}}},{"from":[12.5553,13.14914,7.9348],"to":[15.0553,19.14914,7.9348],"rotation":{"angle":0,"axis":"y","origin":[13.5553,16.52414,7.9348]},"faces":{"north":{"uv":[0.1875,2.25,0.9375,2.5625],"rotation":270,"texture":"#0"},"south":{"uv":[0.1875,2.5625,0.9375,2.25],"rotation":270,"texture":"#0"}}},{"from":[13.3053,16.39914,6.4348],"to":[13.3053,17.39914,9.4348],"rotation":{"angle":0,"axis":"y","origin":[13.5553,16.52414,7.9348]},"faces":{"east":{"uv":[0.5,2.625,0.625,3],"rotation":270,"texture":"#0"},"west":{"uv":[0.5,2.625,0.625,3],"rotation":270,"texture":"#0"}}},{"from":[5.0553,13.14914,7.4348],"to":[7.0553,17.64914,8.4348],"rotation":{"angle":0,"axis":"y","origin":[6.0553,15.02414,7.9348]},"faces":{"north":{"uv":[1.3125,2.3125,1.875,2.5625],"rotation":270,"texture":"#0"},"east":{"uv":[1.3125,2.3125,1.875,2.375],"rotation":270,"texture":"#0"},"south":{"uv":[1.3125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"},"west":{"uv":[1.3125,2.5,1.875,2.5625],"rotation":270,"texture":"#0"},"up":{"uv":[1.8125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"},"down":{"uv":[1.3125,2.5625,1.375,2.3125],"rotation":270,"texture":"#0"}}},{"from":[5.0553,11.64914,7.9348],"to":[7.5553,17.64914,7.9348],"rotation":{"angle":0,"axis":"y","origin":[6.0553,15.02414,7.9348]},"faces":{"north":{"uv":[1.125,2.25,1.875,2.5625],"rotation":270,"texture":"#0"},"south":{"uv":[1.125,2.5625,1.875,2.25],"rotation":270,"texture":"#0"}}},{"from":[5.8053,14.89914,6.4348],"to":[5.8053,15.89914,9.4348],"rotation":{"angle":0,"axis":"y","origin":[6.0553,15.02414,7.9348]},"faces":{"east":{"uv":[1.4375,2.625,1.5625,3],"rotation":270,"texture":"#0"},"west":{"uv":[1.4375,2.625,1.5625,3],"rotation":270,"texture":"#0"}}},{"from":[9.0553,13.14914,7.4348],"to":[11.0553,17.64914,8.4348],"rotation":{"angle":0,"axis":"y","origin":[10.0553,15.02414,7.9348]},"faces":{"north":{"uv":[1.3125,3.25,1.875,3.5],"rotation":270,"texture":"#0"},"east":{"uv":[1.3125,3.25,1.875,3.3125],"rotation":270,"texture":"#0"},"south":{"uv":[1.3125,3.5,1.875,3.25],"rotation":270,"texture":"#0"},"west":{"uv":[1.3125,3.4375,1.875,3.5],"rotation":270,"texture":"#0"},"up":{"uv":[1.8125,3.5,1.875,3.25],"rotation":270,"texture":"#0"},"down":{"uv":[1.3125,3.5,1.375,3.25],"rotation":270,"texture":"#0"}}},{"from":[9.0553,11.64914,7.9348],"to":[11.5553,17.64914,7.9348],"rotation":{"angle":0,"axis":"y","origin":[10.0553,15.02414,7.9348]},"faces":{"north":{"uv":[1.125,3.1875,1.875,3.5],"rotation":270,"texture":"#0"},"south":{"uv":[1.125,3.5,1.875,3.1875],"rotation":270,"texture":"#0"}}},{"from":[9.8053,14.89914,6.4348],"to":[9.8053,15.89914,9.4348],"rotation":{"angle":0,"axis":"y","origin":[10.0553,15.02414,7.9348]},"faces":{"east":{"uv":[1.4375,3.5625,1.5625,3.9375],"rotation":270,"texture":"#0"},"west":{"uv":[1.4375,3.5625,1.5625,3.9375],"rotation":270,"texture":"#0"}}},{"from":[1.5553,14.64914,7.4348],"to":[3.5553,19.14914,8.4348],"rotation":{"angle":0,"axis":"y","origin":[2.5553,16.52414,7.9348]},"faces":{"north":{"uv":[0.375,3.25,0.9375,3.5],"rotation":270,"texture":"#0"},"east":{"uv":[0.375,3.25,0.9375,3.3125],"rotation":270,"texture":"#0"},"south":{"uv":[0.375,3.5,0.9375,3.25],"rotation":270,"texture":"#0"},"west":{"uv":[0.375,3.4375,0.9375,3.5],"rotation":270,"texture":"#0"},"up":{"uv":[0.875,3.5,0.9375,3.25],"rotation":270,"texture":"#0"},"down":{"uv":[0.375,3.5,0.4375,3.25],"rotation":270,"texture":"#0"}}},{"from":[1.5553,13.14914,7.9348],"to":[4.0553,19.14914,7.9348],"rotation":{"angle":0,"axis":"y","origin":[2.5553,16.52414,7.9348]},"faces":{"north":{"uv":[0.1875,3.1875,0.9375,3.5],"rotation":270,"texture":"#0"},"south":{"uv":[0.1875,3.5,0.9375,3.1875],"rotation":270,"texture":"#0"}}},{"from":[2.3053,16.39914,6.4348],"to":[2.3053,17.39914,9.4348],"rotation":{"angle":0,"axis":"y","origin":[2.5553,16.52414,7.9348]},"faces":{"east":{"uv":[0.5,3.5625,0.625,3.9375],"rotation":270,"texture":"#0"},"west":{"uv":[0.5,3.5625,0.625,3.9375],"rotation":270,"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[2.75,2.5,2],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[2.25,2,1.75],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,75.75,0],"translation":[5.25,-0.75,1.5],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,75.75,0],"translation":[5.25,-0.5,2],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[0.25,-3.25,0],"scale":[0.49219,0.49219,0.49219]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,1,2,3,4,5,6,7,8,9,10,{"name":"group","origin":[8,8,8],"color":0,"children":[11,12,13]},{"name":"group","origin":[8,8,8],"color":0,"children":[14,15,16]},{"name":"group","origin":[8,8,8],"color":0,"children":[17,18,19]},{"name":"group","origin":[8,8,8],"color":0,"children":[20,21,22]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_landing_net.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_landing_net.json new file mode 100644 index 000000000..fe1d01331 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_landing_net.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[7.5,5.54297,-4.5],"to":[8.5,6.54297,12.5],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"east":{"uv":[5.625,4.4375,5.6875,5.5],"rotation":90,"texture":"#0"},"west":{"uv":[5.625,5.5,5.6875,4.4375],"rotation":90,"texture":"#0"},"up":{"uv":[5.625,4.4375,5.6875,5.5],"texture":"#0"},"down":{"uv":[5.625,5.5,5.6875,4.4375],"texture":"#0"}}},{"from":[7,5.04297,11.5],"to":[9,7.04297,12.5],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.1875,6,5.3125,6.125],"rotation":270,"texture":"#0"},"east":{"uv":[5.3125,6,5.1875,6.0625],"rotation":90,"texture":"#0"},"west":{"uv":[5.3125,6,5.1875,6.0625],"rotation":90,"texture":"#0"},"up":{"uv":[5.25,6,5.3125,6.0625],"texture":"#0"},"down":{"uv":[5.1875,6,5.25,6.0625],"texture":"#0"}}},{"from":[7,5.04297,2.5],"to":[9,7.04297,3.5],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.1875,6,5.3125,6.125],"rotation":270,"texture":"#0"},"east":{"uv":[5.3125,6,5.1875,6.0625],"rotation":90,"texture":"#0"},"south":{"uv":[5.1875,6,5.3125,6.125],"rotation":270,"texture":"#0"},"west":{"uv":[5.3125,6,5.1875,6.0625],"rotation":90,"texture":"#0"},"up":{"uv":[5.25,6,5.3125,6.0625],"texture":"#0"},"down":{"uv":[5.1875,6,5.25,6.0625],"texture":"#0"}}},{"from":[7,5.04297,-5.5],"to":[9,7.04297,-4.5],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.1875,6,5.3125,6.125],"rotation":270,"texture":"#0"},"east":{"uv":[5.3125,6,5.1875,6.0625],"rotation":90,"texture":"#0"},"south":{"uv":[5.1875,6,5.3125,6.125],"rotation":270,"texture":"#0"},"west":{"uv":[5.3125,6,5.1875,6.0625],"rotation":90,"texture":"#0"},"up":{"uv":[5.25,6,5.3125,6.0625],"texture":"#0"},"down":{"uv":[5.1875,6,5.25,6.0625],"texture":"#0"}}},{"from":[4,5.04297,12.5],"to":[12,7.04297,13.5],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.375,5.8125,5.25,5.3125],"rotation":90,"texture":"#0"},"south":{"uv":[5.375,5.8125,5.25,5.3125],"rotation":90,"texture":"#0"},"up":{"uv":[5.3125,5.3125,5.375,5.8125],"rotation":270,"texture":"#0"},"down":{"uv":[5.25,5.3125,5.3125,5.8125],"rotation":90,"texture":"#0"}}},{"from":[4,5.04297,21.5],"to":[12,7.04297,22.5],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.375,5.3125,5.25,5.8125],"rotation":90,"texture":"#0"},"south":{"uv":[5.375,5.8125,5.25,5.3125],"rotation":90,"texture":"#0"},"up":{"uv":[5.3125,5.3125,5.375,5.8125],"rotation":270,"texture":"#0"},"down":{"uv":[5.25,5.3125,5.3125,5.8125],"rotation":90,"texture":"#0"}}},{"from":[12,5.04297,12.5],"to":[13,7.04297,22.5],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.1875,5.3125,5.0625,5.375],"rotation":90,"texture":"#0"},"east":{"uv":[5.1875,5.3125,5.0625,5.9375],"rotation":90,"texture":"#0"},"south":{"uv":[5.1875,5.3125,5.0625,5.375],"rotation":90,"texture":"#0"},"west":{"uv":[5.1875,5.9375,5.0625,5.3125],"rotation":90,"texture":"#0"},"up":{"uv":[5.125,5.3125,5.1875,5.9375],"texture":"#0"},"down":{"uv":[5.0625,5.3125,5.125,5.9375],"texture":"#0"}}},{"from":[3,5.04297,12.5],"to":[4,7.04297,22.5],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.1875,5.3125,5.0625,5.375],"rotation":90,"texture":"#0"},"east":{"uv":[5.1875,5.3125,5.0625,5.9375],"rotation":90,"texture":"#0"},"south":{"uv":[5.1875,5.3125,5.0625,5.375],"rotation":90,"texture":"#0"},"west":{"uv":[5.1875,5.9375,5.0625,5.3125],"rotation":90,"texture":"#0"},"up":{"uv":[5.125,5.3125,5.1875,5.9375],"texture":"#0"},"down":{"uv":[5.0625,5.3125,5.125,5.9375],"texture":"#0"}}},{"from":[3.5,0.04297,13],"to":[12.5,5.04297,22],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[4.4375,5.3125,5,5.625],"texture":"#0"},"east":{"uv":[4.4375,5.3125,5,5.625],"texture":"#0"},"south":{"uv":[4.4375,5.3125,5,5.625],"texture":"#0"},"west":{"uv":[4.4375,5.3125,5,5.625],"texture":"#0"},"down":{"uv":[4.4375,5.6875,5,6.25],"texture":"#0"}}},{"name":"cube inverted","from":[12.5,5.04297,22],"to":[3.5,0.04297,13],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[4.4375,5.625,5,5.3125],"texture":"#0"},"east":{"uv":[4.4375,5.625,5,5.3125],"texture":"#0"},"south":{"uv":[4.4375,5.625,5,5.3125],"texture":"#0"},"west":{"uv":[4.4375,5.625,5,5.3125],"texture":"#0"},"up":{"uv":[5,5.6875,4.4375,6.25],"texture":"#0"}}},{"name":"cube inverted","from":[4.1,7.14297,15.1],"to":[2.9,4.94297,13.9],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"east":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"west":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"up":{"uv":[5.125,6.0625,5.0625,6.125],"texture":"#0"},"down":{"uv":[5.125,6,5.0625,6.0625],"texture":"#0"}}},{"from":[2.9,4.94297,13.9],"to":[4.1,7.14297,15.1],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"east":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"west":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"up":{"uv":[5.0625,6,5.125,6.0625],"texture":"#0"},"down":{"uv":[5.0625,6.0625,5.125,6.125],"texture":"#0"}}},{"from":[10.4,4.94297,21.4],"to":[11.6,7.14297,22.6],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"south":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"up":{"uv":[5.0625,6,5.125,6.0625],"rotation":90,"texture":"#0"},"down":{"uv":[5.0625,6.0625,5.125,6.125],"rotation":270,"texture":"#0"}}},{"name":"cube inverted","from":[11.6,7.14297,22.6],"to":[10.4,4.94297,21.4],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"south":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"up":{"uv":[5.125,6.0625,5.0625,6.125],"rotation":90,"texture":"#0"},"down":{"uv":[5.125,6,5.0625,6.0625],"rotation":270,"texture":"#0"}}},{"from":[4.4,4.94297,21.4],"to":[5.6,7.14297,22.6],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"south":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"up":{"uv":[5.0625,6,5.125,6.0625],"rotation":90,"texture":"#0"},"down":{"uv":[5.0625,6.0625,5.125,6.125],"rotation":270,"texture":"#0"}}},{"name":"cube inverted","from":[5.6,7.14297,22.6],"to":[4.4,4.94297,21.4],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"south":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"up":{"uv":[5.125,6.0625,5.0625,6.125],"rotation":90,"texture":"#0"},"down":{"uv":[5.125,6,5.0625,6.0625],"rotation":270,"texture":"#0"}}},{"from":[4.4,4.94297,12.4],"to":[5.6,7.14297,13.6],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"south":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"up":{"uv":[5.0625,6,5.125,6.0625],"rotation":90,"texture":"#0"},"down":{"uv":[5.0625,6.0625,5.125,6.125],"rotation":270,"texture":"#0"}}},{"name":"cube inverted","from":[5.6,7.14297,13.6],"to":[4.4,4.94297,12.4],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"south":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"up":{"uv":[5.125,6.0625,5.0625,6.125],"rotation":90,"texture":"#0"},"down":{"uv":[5.125,6,5.0625,6.0625],"rotation":270,"texture":"#0"}}},{"from":[10.4,4.94297,12.4],"to":[11.6,7.14297,13.6],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"south":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"up":{"uv":[5.0625,6,5.125,6.0625],"rotation":90,"texture":"#0"},"down":{"uv":[5.0625,6.0625,5.125,6.125],"rotation":270,"texture":"#0"}}},{"name":"cube inverted","from":[11.6,7.14297,13.6],"to":[10.4,4.94297,12.4],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"north":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"south":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"up":{"uv":[5.125,6.0625,5.0625,6.125],"rotation":90,"texture":"#0"},"down":{"uv":[5.125,6,5.0625,6.0625],"rotation":270,"texture":"#0"}}},{"from":[2.9,4.94297,19.9],"to":[4.1,7.14297,21.1],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"east":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"west":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"up":{"uv":[5.0625,6,5.125,6.0625],"texture":"#0"},"down":{"uv":[5.0625,6.0625,5.125,6.125],"texture":"#0"}}},{"name":"cube inverted","from":[4.1,7.14297,21.1],"to":[2.9,4.94297,19.9],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"east":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"west":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"up":{"uv":[5.125,6.0625,5.0625,6.125],"texture":"#0"},"down":{"uv":[5.125,6,5.0625,6.0625],"texture":"#0"}}},{"name":"cube inverted","from":[13.1,7.14297,15.1],"to":[11.9,4.94297,13.9],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"east":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"west":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"up":{"uv":[5.125,6.0625,5.0625,6.125],"texture":"#0"},"down":{"uv":[5.125,6,5.0625,6.0625],"texture":"#0"}}},{"from":[11.9,4.94297,13.9],"to":[13.1,7.14297,15.1],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"east":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"west":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"up":{"uv":[5.0625,6,5.125,6.0625],"texture":"#0"},"down":{"uv":[5.0625,6.0625,5.125,6.125],"texture":"#0"}}},{"from":[11.9,4.94297,19.9],"to":[13.1,7.14297,21.1],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"east":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"west":{"uv":[5.0625,6,5.125,6.125],"texture":"#0"},"up":{"uv":[5.0625,6,5.125,6.0625],"texture":"#0"},"down":{"uv":[5.0625,6.0625,5.125,6.125],"texture":"#0"}}},{"name":"cube inverted","from":[13.1,7.14297,21.1],"to":[11.9,4.94297,19.9],"rotation":{"angle":0,"axis":"x","origin":[8,4.29297,8.5]},"faces":{"east":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"west":{"uv":[5.0625,6.125,5.125,6],"texture":"#0"},"up":{"uv":[5.125,6.0625,5.0625,6.125],"texture":"#0"},"down":{"uv":[5.125,6,5.0625,6.0625],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[-90,0,180],"translation":[0,7.5,3.5]},"thirdperson_lefthand":{"rotation":[-90,0,180],"translation":[0,6.75,3.25]},"firstperson_righthand":{"rotation":[-155.49,-5.92,164.48],"translation":[17.5,0,-12.5]},"firstperson_lefthand":{"rotation":[-155.49,-5.92,164.48],"translation":[17.5,0,-12.5]},"ground":{"translation":[0.25,6.25,-1.5],"scale":[0.46875,0.46875,0.46875]},"gui":{"rotation":[-140.22,33.97,176.22],"translation":[-1,1.25,0],"scale":[0.66211,0.66211,0.66211]},"head":{"translation":[0,19.75,0]},"fixed":{"rotation":[-90,0,0],"translation":[0,9.5,-16.25],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,1,2,3,4,5,6,7,8,9,{"name":"cube inverted","origin":[2,-0.5,14.5],"color":0,"children":[10,11,12,13,14,15,16,17,18,19,20,21]},{"name":"cube inverted","origin":[2,-0.5,14.5],"color":0,"children":[22,23,24,25]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_large_fishnet.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_large_fishnet.json new file mode 100644 index 000000000..bd0025d9a --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_large_fishnet.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[0,10.5,8],"to":[16,26.5,8],"rotation":{"angle":0,"axis":"y","origin":[8,10.5,7]},"faces":{"north":{"uv":[2.4375,0.5625,4.4375,2.5625],"texture":"#0"},"south":{"uv":[2.4375,0.5625,4.4375,2.5625],"texture":"#0"}}},{"from":[11.0553,19.14914,6.9348],"to":[13.0553,23.64914,7.9348],"rotation":{"angle":0,"axis":"y","origin":[12.0553,21.02414,7.4348]},"faces":{"north":{"uv":[0.375,2.3125,0.9375,2.5625],"rotation":270,"texture":"#0"},"east":{"uv":[0.375,2.3125,0.9375,2.375],"rotation":270,"texture":"#0"},"south":{"uv":[0.375,2.5625,0.9375,2.3125],"rotation":270,"texture":"#0"},"west":{"uv":[0.375,2.5,0.9375,2.5625],"rotation":270,"texture":"#0"},"up":{"uv":[0.875,2.5625,0.9375,2.3125],"rotation":270,"texture":"#0"},"down":{"uv":[0.375,2.5625,0.4375,2.3125],"rotation":270,"texture":"#0"}}},{"from":[11.0553,17.64914,7.4348],"to":[13.5553,23.64914,7.4348],"rotation":{"angle":0,"axis":"y","origin":[12.0553,21.02414,7.4348]},"faces":{"north":{"uv":[0.1875,2.25,0.9375,2.5625],"rotation":270,"texture":"#0"},"south":{"uv":[0.1875,2.5625,0.9375,2.25],"rotation":270,"texture":"#0"}}},{"from":[11.8053,20.89914,5.9348],"to":[11.8053,21.89914,8.9348],"rotation":{"angle":0,"axis":"y","origin":[12.0553,21.02414,7.4348]},"faces":{"east":{"uv":[0.5,2.625,0.625,3],"rotation":270,"texture":"#0"},"west":{"uv":[0.5,2.625,0.625,3],"rotation":270,"texture":"#0"}}},{"from":[7.0553,14.14914,6.9348],"to":[9.0553,18.64914,7.9348],"rotation":{"angle":0,"axis":"y","origin":[8.0553,16.02414,7.4348]},"faces":{"north":{"uv":[1.3125,2.3125,1.875,2.5625],"rotation":270,"texture":"#0"},"east":{"uv":[1.3125,2.3125,1.875,2.375],"rotation":270,"texture":"#0"},"south":{"uv":[1.3125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"},"west":{"uv":[1.3125,2.5,1.875,2.5625],"rotation":270,"texture":"#0"},"up":{"uv":[1.8125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"},"down":{"uv":[1.3125,2.5625,1.375,2.3125],"rotation":270,"texture":"#0"}}},{"from":[7.0553,12.64914,7.4348],"to":[9.5553,18.64914,7.4348],"rotation":{"angle":0,"axis":"y","origin":[8.0553,16.02414,7.4348]},"faces":{"north":{"uv":[1.125,2.25,1.875,2.5625],"rotation":270,"texture":"#0"},"south":{"uv":[1.125,2.5625,1.875,2.25],"rotation":270,"texture":"#0"}}},{"from":[7.8053,15.89914,5.9348],"to":[7.8053,16.89914,8.9348],"rotation":{"angle":0,"axis":"y","origin":[8.0553,16.02414,7.4348]},"faces":{"east":{"uv":[1.4375,2.625,1.5625,3],"rotation":270,"texture":"#0"},"west":{"uv":[1.4375,2.625,1.5625,3],"rotation":270,"texture":"#0"}}},{"from":[2.0553,17.14914,6.9348],"to":[4.0553,21.64914,7.9348],"rotation":{"angle":0,"axis":"y","origin":[3.0553,19.02414,7.4348]},"faces":{"north":{"uv":[0.375,3.25,0.9375,3.5],"rotation":270,"texture":"#0"},"east":{"uv":[0.375,3.25,0.9375,3.3125],"rotation":270,"texture":"#0"},"south":{"uv":[0.375,3.5,0.9375,3.25],"rotation":270,"texture":"#0"},"west":{"uv":[0.375,3.4375,0.9375,3.5],"rotation":270,"texture":"#0"},"up":{"uv":[0.875,3.5,0.9375,3.25],"rotation":270,"texture":"#0"},"down":{"uv":[0.375,3.5,0.4375,3.25],"rotation":270,"texture":"#0"}}},{"from":[2.0553,15.64914,7.4348],"to":[4.5553,21.64914,7.4348],"rotation":{"angle":0,"axis":"y","origin":[3.0553,19.02414,7.4348]},"faces":{"north":{"uv":[0.1875,3.1875,0.9375,3.5],"rotation":270,"texture":"#0"},"south":{"uv":[0.1875,3.5,0.9375,3.1875],"rotation":270,"texture":"#0"}}},{"from":[2.8053,18.89914,5.9348],"to":[2.8053,19.89914,8.9348],"rotation":{"angle":0,"axis":"y","origin":[3.0553,19.02414,7.4348]},"faces":{"east":{"uv":[0.5,3.5625,0.625,3.9375],"rotation":270,"texture":"#0"},"west":{"uv":[0.5,3.5625,0.625,3.9375],"rotation":270,"texture":"#0"}}},{"from":[16,4,7.25],"to":[17.5,28,8.75],"rotation":{"angle":0,"axis":"y","origin":[18.5,4,7.25]},"faces":{"north":{"uv":[5.0625,0.375,4.875,3.375],"texture":"#0"},"east":{"uv":[5.375,0.375,5.5625,3.375],"texture":"#0"},"south":{"uv":[4.875,0.375,5.0625,3.375],"texture":"#0"},"west":{"uv":[5.125,0.375,5.3125,3.375],"texture":"#0"},"up":{"uv":[5.6875,0.3125,5.875,0.125],"rotation":90,"texture":"#0"},"down":{"uv":[5.4375,0.3125,5.625,0.125],"rotation":90,"texture":"#0"}}},{"from":[15.95,12.95,7.2],"to":[17.55,26.55,8.8],"rotation":{"angle":0,"axis":"y","origin":[18.5,13,7.25]},"faces":{"north":{"uv":[6.625,2,6.4375,3.6875],"texture":"#0"},"east":{"uv":[6.9375,2,7.125,3.6875],"texture":"#0"},"south":{"uv":[6.4375,2,6.625,3.6875],"texture":"#0"},"west":{"uv":[6.6875,2,6.875,3.6875],"texture":"#0"},"up":{"uv":[5.6875,0.3125,5.875,0.125],"rotation":90,"texture":"#0"},"down":{"uv":[5.4375,0.3125,5.625,0.125],"rotation":90,"texture":"#0"}}},{"from":[-1.55,12.95,7.2],"to":[0.05,26.55,8.8],"rotation":{"angle":0,"axis":"y","origin":[1,13,7.25]},"faces":{"north":{"uv":[6.625,2,6.4375,3.6875],"texture":"#0"},"east":{"uv":[6.9375,2,7.125,3.6875],"texture":"#0"},"south":{"uv":[6.4375,2,6.625,3.6875],"texture":"#0"},"west":{"uv":[6.6875,2,6.875,3.6875],"texture":"#0"},"up":{"uv":[5.6875,0.3125,5.875,0.125],"rotation":90,"texture":"#0"},"down":{"uv":[5.4375,0.3125,5.625,0.125],"rotation":90,"texture":"#0"}}},{"from":[-1.5,4,7.25],"to":[0,28,8.75],"rotation":{"angle":0,"axis":"y","origin":[-2.5,4,7.25]},"faces":{"north":{"uv":[4.875,0.375,5.0625,3.375],"texture":"#0"},"east":{"uv":[5.3125,0.375,5.125,3.375],"texture":"#0"},"south":{"uv":[5.0625,0.375,4.875,3.375],"texture":"#0"},"west":{"uv":[5.5625,0.375,5.375,3.375],"texture":"#0"},"up":{"uv":[5.6875,0.125,5.875,0.3125],"rotation":90,"texture":"#0"},"down":{"uv":[5.4375,0.125,5.625,0.3125],"rotation":90,"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[2.75,2.5,2],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[2.25,2,1.75],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,75.75,0],"translation":[5.25,-0.75,1.5],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,75.75,0],"translation":[5.25,-0.5,2],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[0.25,-3.25,0],"scale":[0.49219,0.49219,0.49219]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,{"name":"group","origin":[8,8,8],"color":0,"children":[1,2,3]},{"name":"group","origin":[8,8,8],"color":0,"children":[4,5,6]},{"name":"group","origin":[8,8,8],"color":0,"children":[7,8,9]},10,11,12,13]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_lobster_trap.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_lobster_trap.json new file mode 100644 index 000000000..a87f4eb78 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_lobster_trap.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[2,0,3.5],"to":[14,2,13.5],"rotation":{"angle":0,"axis":"y","origin":[2,0,3.5]},"faces":{"north":{"uv":[5.375,8.5625,6.125,8.6875],"texture":"#0"},"east":{"uv":[6.1875,7.875,6.3125,8.5],"rotation":90,"texture":"#0"},"south":{"uv":[5.375,8.5625,6.125,8.6875],"texture":"#0"},"west":{"uv":[6.1875,8.5,6.3125,7.875],"rotation":90,"texture":"#0"},"up":{"uv":[5.375,7.875,6.125,8.5],"texture":"#0"},"down":{"uv":[6.125,9.375,5.375,8.75],"texture":"#0"}}},{"from":[2,8,3.5],"to":[14,10,13.5],"rotation":{"angle":0,"axis":"y","origin":[2,8,3.5]},"faces":{"north":{"uv":[5.375,8.5625,6.125,8.6875],"texture":"#0"},"east":{"uv":[6.1875,7.875,6.3125,8.5],"rotation":90,"texture":"#0"},"south":{"uv":[5.375,8.5625,6.125,8.6875],"texture":"#0"},"west":{"uv":[6.1875,8.5,6.3125,7.875],"rotation":90,"texture":"#0"},"up":{"uv":[5.3125,8.625,4.5625,9.25],"texture":"#0"},"down":{"uv":[6.125,9.375,5.375,8.75],"texture":"#0"}}},{"from":[2.5,2,4],"to":[13.5,8,13],"rotation":{"angle":0,"axis":"y","origin":[1.5,2,3]},"faces":{"north":{"uv":[5.375,7.4375,6.0625,7.8125],"texture":"#0"},"east":{"uv":[5.375,7.4375,5.9375,7.8125],"texture":"#0"},"south":{"uv":[5.375,7.4375,6.0625,7.8125],"texture":"#0"},"west":{"uv":[5.375,7.4375,5.9375,7.8125],"texture":"#0"}}},{"name":"cube inverted","from":[13.5,8,13],"to":[2.5,2,4],"rotation":{"angle":0,"axis":"y","origin":[1.5,2,3]},"faces":{"north":{"uv":[5.375,7.8125,6.0625,7.4375],"texture":"#0"},"east":{"uv":[5.375,7.8125,5.9375,7.4375],"texture":"#0"},"south":{"uv":[5.375,7.8125,6.0625,7.4375],"texture":"#0"},"west":{"uv":[5.375,7.8125,5.9375,7.4375],"texture":"#0"}}},{"from":[5,9,6.5],"to":[11,10,10.5],"rotation":{"angle":45,"axis":"z","origin":[5,9.5,8.5]},"faces":{"north":{"uv":[4.75,9.3125,5.125,9.375],"texture":"#0"},"east":{"uv":[4.75,9.3125,4.8125,9.5625],"rotation":90,"texture":"#0"},"south":{"uv":[4.75,9.5,5.125,9.5625],"texture":"#0"},"west":{"uv":[4.75,9.3125,5,9.375],"texture":"#0"},"up":{"uv":[5.125,9.3125,4.75,9.5625],"texture":"#0"},"down":{"uv":[5.125,9.5625,4.75,9.3125],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[0,3.75,3.25],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[0,4,3.25],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,75.75,0],"translation":[5.25,2.75,1.5],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,75.75,0],"translation":[5.25,2.75,2],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[0.25,1.75,0],"scale":[0.87305,0.87305,0.87305]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,1,2,3,4]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_orange_fish.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_orange_fish.json new file mode 100644 index 000000000..1ff3df591 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_orange_fish.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[6.1106,0.04828,4.1196],"to":[10.1106,2.04828,13.1196],"rotation":{"angle":0,"axis":"y","origin":[8.1106,1.04828,7.8696]},"faces":{"north":{"uv":[1.3125,2.5625,1.375,2.3125],"rotation":90,"texture":"#0"},"east":{"uv":[1.3125,2.3125,1.875,2.375],"rotation":180,"texture":"#0"},"south":{"uv":[1.8125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"},"west":{"uv":[1.3125,2.5,1.875,2.5625],"texture":"#0"},"up":{"uv":[1.3125,2.3125,1.875,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[1.3125,2.5625,1.875,2.3125],"rotation":270,"texture":"#0"}}},{"from":[6.1106,1.04828,1.1196],"to":[11.1106,1.04828,13.1196],"rotation":{"angle":0,"axis":"y","origin":[8.1106,1.04828,7.8696]},"faces":{"up":{"uv":[1.125,2.25,1.875,2.5625],"rotation":90,"texture":"#0"},"down":{"uv":[1.125,2.5625,1.875,2.25],"rotation":270,"texture":"#0"}}},{"from":[7.6106,-1.95172,7.6196],"to":[7.6106,4.04828,9.6196],"rotation":{"angle":0,"axis":"y","origin":[8.1106,1.04828,7.8696]},"faces":{"east":{"uv":[1.4375,2.625,1.5625,3],"rotation":180,"texture":"#0"},"west":{"uv":[1.4375,2.625,1.5625,3],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[-91,0,0],"translation":[0,4.75,-5.75],"scale":[1.03828,1.03828,1.03828]},"thirdperson_lefthand":{"rotation":[-91,0,0],"translation":[0.25,4.75,-5.75],"scale":[1.03828,1.03828,1.03828]},"firstperson_righthand":{"rotation":[-145,-13,-180],"translation":[7.75,4.25,-0.5],"scale":[0.75352,0.75352,0.75352]},"firstperson_lefthand":{"rotation":[-145,-13,-180],"translation":[7.75,4.25,-0.5],"scale":[0.75352,0.75352,0.75352]},"ground":{"translation":[0,4.5,0],"scale":[0.41406,0.41406,0.41406]},"gui":{"rotation":[-142.73,39.63,-89.3],"translation":[7,-3,0],"scale":[1.36914,1.36914,1.36914]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"children":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,1,2]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_red_fish.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_red_fish.json new file mode 100644 index 000000000..229802567 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_red_fish.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[6.1106,0.04828,4.1196],"to":[10.1106,2.04828,13.1196],"rotation":{"angle":0,"axis":"y","origin":[8.1106,1.04828,7.8696]},"faces":{"north":{"uv":[1.3125,3.5,1.375,3.25],"rotation":90,"texture":"#0"},"east":{"uv":[1.3125,3.25,1.875,3.3125],"rotation":180,"texture":"#0"},"south":{"uv":[1.8125,3.5,1.875,3.25],"rotation":270,"texture":"#0"},"west":{"uv":[1.3125,3.4375,1.875,3.5],"texture":"#0"},"up":{"uv":[1.3125,3.25,1.875,3.5],"rotation":90,"texture":"#0"},"down":{"uv":[1.3125,3.5,1.875,3.25],"rotation":270,"texture":"#0"}}},{"from":[6.1106,1.04828,1.1196],"to":[11.1106,1.04828,13.1196],"rotation":{"angle":0,"axis":"y","origin":[8.1106,1.04828,7.8696]},"faces":{"up":{"uv":[1.125,3.1875,1.875,3.5],"rotation":90,"texture":"#0"},"down":{"uv":[1.125,3.5,1.875,3.1875],"rotation":270,"texture":"#0"}}},{"from":[7.6106,-1.95172,7.6196],"to":[7.6106,4.04828,9.6196],"rotation":{"angle":0,"axis":"y","origin":[8.1106,1.04828,7.8696]},"faces":{"east":{"uv":[1.4375,3.5625,1.5625,3.9375],"rotation":180,"texture":"#0"},"west":{"uv":[1.4375,3.5625,1.5625,3.9375],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[-91,0,0],"translation":[0,4.75,-5.75],"scale":[1.03828,1.03828,1.03828]},"thirdperson_lefthand":{"rotation":[-91,0,0],"translation":[0.25,4.75,-5.75],"scale":[1.03828,1.03828,1.03828]},"firstperson_righthand":{"rotation":[-145,-13,-180],"translation":[7.75,4.25,-0.5],"scale":[0.75352,0.75352,0.75352]},"firstperson_lefthand":{"rotation":[-145,-13,-180],"translation":[7.75,4.25,-0.5],"scale":[0.75352,0.75352,0.75352]},"ground":{"translation":[0,4.5,0],"scale":[0.41406,0.41406,0.41406]},"gui":{"rotation":[-142.73,39.63,-89.3],"translation":[7,-3,0],"scale":[1.36914,1.36914,1.36914]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[8,8,8],"color":0,"children":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,1,2]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_stand.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_stand.json new file mode 100644 index 000000000..56fa33049 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_stand.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[20,4,1],"to":[22,28,3],"rotation":{"angle":0,"axis":"y","origin":[20,4,1]},"faces":{"north":{"uv":[15.75,0,16,3],"texture":"#0"},"east":{"uv":[16,0,15.75,3],"texture":"#0"},"south":{"uv":[15.75,0,16,3],"texture":"#0"},"west":{"uv":[16,0,15.75,3],"texture":"#0"},"up":{"uv":[15.75,3.0625,16,3.3125],"texture":"#0"},"down":{"uv":[15.75,3.375,16,3.625],"texture":"#0"}}},{"from":[-6,4,1],"to":[-4,28,3],"rotation":{"angle":0,"axis":"y","origin":[-4,4,1]},"faces":{"north":{"uv":[16,0,15.75,3],"texture":"#0"},"east":{"uv":[15.75,0,16,3],"texture":"#0"},"south":{"uv":[16,0,15.75,3],"texture":"#0"},"west":{"uv":[15.75,0,16,3],"texture":"#0"},"up":{"uv":[16,3.0625,15.75,3.3125],"texture":"#0"},"down":{"uv":[16,3.375,15.75,3.625],"texture":"#0"}}},{"from":[-7,19,15.5],"to":[23,20.5,17],"rotation":{"angle":0,"axis":"z","origin":[10,19.5,16]},"faces":{"north":{"uv":[11.625,0.5,15.375,0.6875],"texture":"#0"},"east":{"uv":[12.875,0,13.0625,0.1875],"texture":"#0"},"south":{"uv":[11.625,0.75,15.375,0.9375],"texture":"#0"},"west":{"uv":[12.875,0,13.0625,0.1875],"texture":"#0"},"up":{"uv":[11.625,0.5,15.375,0.6875],"texture":"#0"},"down":{"uv":[15.375,0.5,11.625,0.6875],"texture":"#0"}}},{"from":[-7,24.93159,1.17987],"to":[23,26.43159,2.67987],"rotation":{"angle":0,"axis":"z","origin":[6,25.43159,2.17987]},"faces":{"north":{"uv":[11.625,0.75,15.375,0.9375],"texture":"#0"},"east":{"uv":[12.875,0,13.0625,0.1875],"texture":"#0"},"south":{"uv":[11.625,0.5,15.375,0.6875],"texture":"#0"},"west":{"uv":[12.875,0,13.0625,0.1875],"texture":"#0"},"up":{"uv":[15.375,1.1875,11.625,1],"texture":"#0"},"down":{"uv":[11.625,0.6875,15.375,0.5],"texture":"#0"}}},{"from":[20.25,19,0],"to":[21.75,20.5,18],"rotation":{"angle":0,"axis":"y","origin":[21,19.75,3]},"faces":{"north":{"uv":[12.875,0,13.0625,0.1875],"rotation":180,"texture":"#0"},"east":{"uv":[13.125,0,15.375,0.1875],"rotation":180,"texture":"#0"},"south":{"uv":[12.625,0,12.8125,0.1875],"rotation":180,"texture":"#0"},"west":{"uv":[15.375,0,13.125,0.1875],"rotation":180,"texture":"#0"},"up":{"uv":[15.375,0,13.125,0.1875],"rotation":270,"texture":"#0"},"down":{"uv":[13.125,0,15.375,0.1875],"rotation":270,"texture":"#0"}}},{"from":[-5.75,19,0],"to":[-4.25,20.5,18],"rotation":{"angle":0,"axis":"y","origin":[-5,19.75,3]},"faces":{"north":{"uv":[12.875,0,13.0625,0.1875],"rotation":180,"texture":"#0"},"east":{"uv":[13.125,0,15.375,0.1875],"rotation":180,"texture":"#0"},"south":{"uv":[12.625,0,12.8125,0.1875],"rotation":180,"texture":"#0"},"west":{"uv":[15.375,0,13.125,0.1875],"rotation":180,"texture":"#0"},"up":{"uv":[15.375,0,13.125,0.1875],"rotation":270,"texture":"#0"},"down":{"uv":[13.125,0,15.375,0.1875],"rotation":270,"texture":"#0"}}},{"from":[20.25,22.11294,2.0279],"to":[21.75,23.61294,16.0279],"rotation":{"angle":22.5,"axis":"x","origin":[21,22.86294,11.0279]},"faces":{"north":{"uv":[15.5625,0,15.75,0.1875],"rotation":180,"texture":"#0"},"east":{"uv":[13.625,0.25,15.375,0.4375],"rotation":180,"texture":"#0"},"south":{"uv":[15.5625,0,15.75,0.1875],"rotation":180,"texture":"#0"},"west":{"uv":[15.375,0.25,13.625,0.4375],"rotation":180,"texture":"#0"},"up":{"uv":[15.375,0.25,13.625,0.4375],"rotation":270,"texture":"#0"},"down":{"uv":[13.625,0.25,15.375,0.4375],"rotation":270,"texture":"#0"}}},{"from":[-5.75,22.11294,2.0279],"to":[-4.25,23.61294,16.0279],"rotation":{"angle":22.5,"axis":"x","origin":[-5,22.86294,11.0279]},"faces":{"north":{"uv":[15.5625,0,15.75,0.1875],"rotation":180,"texture":"#0"},"east":{"uv":[13.625,0.25,15.375,0.4375],"rotation":180,"texture":"#0"},"south":{"uv":[15.5625,0,15.75,0.1875],"rotation":180,"texture":"#0"},"west":{"uv":[15.375,0.25,13.625,0.4375],"rotation":180,"texture":"#0"},"up":{"uv":[15.375,0.25,13.625,0.4375],"rotation":270,"texture":"#0"},"down":{"uv":[13.625,0.25,15.375,0.4375],"rotation":270,"texture":"#0"}}},{"from":[20,4,15],"to":[22,23,17],"rotation":{"angle":0,"axis":"y","origin":[20,4,15]},"faces":{"north":{"uv":[15.4375,0,15.6875,2.375],"texture":"#0"},"east":{"uv":[15.6875,0,15.4375,2.375],"texture":"#0"},"south":{"uv":[15.4375,0,15.6875,2.375],"texture":"#0"},"west":{"uv":[15.6875,0,15.4375,2.375],"texture":"#0"},"up":{"uv":[15.75,3.0625,16,3.3125],"texture":"#0"},"down":{"uv":[15.75,3.375,16,3.625],"texture":"#0"}}},{"from":[-6,4,15],"to":[-4,23,17],"rotation":{"angle":0,"axis":"y","origin":[-4,4,15]},"faces":{"north":{"uv":[15.6875,0,15.4375,2.375],"texture":"#0"},"east":{"uv":[15.4375,0,15.6875,2.375],"texture":"#0"},"south":{"uv":[15.6875,0,15.4375,2.375],"texture":"#0"},"west":{"uv":[15.4375,0,15.6875,2.375],"texture":"#0"},"up":{"uv":[16,3.0625,15.75,3.3125],"texture":"#0"},"down":{"uv":[16,3.375,15.75,3.625],"texture":"#0"}}},{"from":[-4.5,23.15668,2.1278],"to":[20.5,23.65668,17.6278],"rotation":{"angle":22.5,"axis":"x","origin":[10,23.65668,9.3778]},"faces":{"east":{"uv":[8.4375,2.3125,8.5,4.25],"rotation":90,"texture":"#0"},"west":{"uv":[8.4375,2.3125,8.5,4.25],"rotation":90,"texture":"#0"},"up":{"uv":[8.4375,2.3125,11.5625,4.25],"texture":"#0"},"down":{"uv":[8.4375,4.25,11.5625,2.3125],"texture":"#0"}}},{"from":[-4,9.5,16.9995],"to":[20,20.5,16.9995],"rotation":{"angle":0,"axis":"x","origin":[10,11.25,16.9995]},"faces":{"north":{"uv":[11.625,4.25,14.625,2.875],"rotation":180,"texture":"#0"},"south":{"uv":[11.625,2.875,14.625,4.25],"texture":"#0"}}},{"from":[-4,21.93159,1.17987],"to":[20,26.43159,1.17987],"rotation":{"angle":0,"axis":"x","origin":[11,17.18159,1.17987]},"faces":{"north":{"uv":[11.625,2.8125,14.625,2.25],"rotation":180,"texture":"#0"},"south":{"uv":[11.625,2.25,14.625,2.8125],"texture":"#0"}}},{"from":[-4,18.93159,1.15448],"to":[20,26.93159,1.15448],"rotation":{"angle":0,"axis":"x","origin":[11,17.68159,1.15448]},"faces":{"north":{"uv":[8.4375,1,11.4375,0],"rotation":180,"texture":"#0"},"south":{"uv":[8.4375,0,11.4375,1],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[1.75,5.5,1],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[1,5.25,2.25],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,86.25,0],"translation":[0.5,1.25,3.25],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,84.25,0],"translation":[0.5,1.25,3.5],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,-0.25],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[0.5,-2.5,0],"scale":[0.42578,0.42578,0.42578]},"head":{"translation":[0,12.75,-11.25],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,-17,-16],"scale":[2.00195,2.00195,2.00195]}},"groups":[{"name":"group","origin":[-16,0,28],"color":0,"children":[{"name":"group","origin":[8,8,8],"color":0,"children":[0,1,2,3,4,5,6,7,8,9]},{"name":"group","origin":[-16,0,28],"color":0,"children":[10,11,12,13]}]}],"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_table.json b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_table.json new file mode 100644 index 000000000..cef25b468 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/fisherman_props/fisherman_table.json @@ -0,0 +1 @@ +{"credit":"Made with Blockbench","texture_size":[256,256],"textures":{"0":"omc_daily_events:fisherman_props/fisherman","particle":"omc_daily_events:fisherman_props/fisherman"},"elements":[{"from":[16,0,0],"to":[32,12,16],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"north":{"uv":[4.25,6.5,5.25,7.25],"texture":"#0"},"east":{"uv":[4.25,6.5,5.25,7.25],"texture":"#0"},"south":{"uv":[4.25,6.5,5.25,7.25],"texture":"#0"},"west":{"uv":[4.25,6.5,5.25,7.25],"texture":"#0"},"up":{"uv":[3.1875,8.125,4.1875,9.125],"texture":"#0"},"down":{"uv":[3.1875,7.0625,4.1875,8.0625],"texture":"#0"}}},{"from":[-16,0,0],"to":[0,12,16],"rotation":{"angle":0,"axis":"y","origin":[-16,0,0]},"faces":{"north":{"uv":[4.25,6.5,5.25,7.25],"texture":"#0"},"east":{"uv":[4.25,6.5,5.25,7.25],"texture":"#0"},"south":{"uv":[4.25,6.5,5.25,7.25],"texture":"#0"},"west":{"uv":[4.25,6.5,5.25,7.25],"texture":"#0"},"up":{"uv":[3.1875,8.125,4.1875,9.125],"texture":"#0"},"down":{"uv":[3.1875,7.0625,4.1875,8.0625],"texture":"#0"}}},{"from":[-16,14,0],"to":[32,16,16],"rotation":{"angle":0,"axis":"y","origin":[-32,10,0]},"faces":{"north":{"uv":[5.375,6.3125,8.375,6.375],"texture":"#0"},"east":{"uv":[5.375,6.3125,5.4375,7.3125],"rotation":90,"texture":"#0"},"south":{"uv":[5.375,6.3125,8.375,6.375],"texture":"#0"},"west":{"uv":[5.375,6.3125,5.4375,7.3125],"rotation":90,"texture":"#0"},"up":{"uv":[8.375,7.3125,5.375,6.3125],"texture":"#0"},"down":{"uv":[5.375,6.3125,8.375,7.3125],"texture":"#0"}}},{"from":[17,12,1],"to":[31,14,15],"rotation":{"angle":0,"axis":"y","origin":[-32,8,0]},"faces":{"north":{"uv":[4.25,8.4375,5.125,8.5625],"texture":"#0"},"east":{"uv":[4.25,8.4375,5.125,8.5625],"texture":"#0"},"south":{"uv":[4.25,8.4375,5.125,8.5625],"texture":"#0"},"west":{"uv":[4.25,8.4375,5.125,8.5625],"texture":"#0"}}},{"from":[-15,12,1],"to":[-1,14,15],"rotation":{"angle":0,"axis":"y","origin":[-64,8,0]},"faces":{"north":{"uv":[4.25,8.4375,5.125,8.5625],"texture":"#0"},"east":{"uv":[4.25,8.4375,5.125,8.5625],"texture":"#0"},"south":{"uv":[4.25,8.4375,5.125,8.5625],"texture":"#0"},"west":{"uv":[4.25,8.4375,5.125,8.5625],"texture":"#0"}}}],"gui_light":"front","display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[5.5,7.25,3.25],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[5.5,7.25,1.5],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,75.75,0],"translation":[5.25,2.75,1.5],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,75.75,0],"translation":[5.25,2.75,2],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"translation":[0,-0.25,0],"scale":[0.33398,0.33398,0.33398]},"head":{"translation":[0,12.75,0],"scale":[0.79492,0.79492,0.79492]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-16],"scale":[2.00195,2.00195,2.00195]}},"mcmodels":"47e9fc11ef703093a1d6a70bdf75f953"} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/lootbox/epic_box.json b/src/main/resources/contents/omc_daily_events/models/lootbox/epic_box.json new file mode 100644 index 000000000..8016a24a1 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/lootbox/epic_box.json @@ -0,0 +1,1173 @@ +{ + "texture_size": [128, 128], + "textures": { + "0": "omc_daily_events:lootbox/epic_box", + "particle": "omc_daily_events:lootbox/epic_box" + }, + "elements": [ + { + "from": [-2, 0, 2], + "to": [18, 15, 14], + "faces": { + "north": {"uv": [3, 3.75, 5.5, 5.625], "texture": "#0"}, + "east": {"uv": [0, 5.875, 1.5, 7.75], "texture": "#0"}, + "south": {"uv": [0, 4, 2.5, 5.875], "texture": "#0"}, + "west": {"uv": [5.5, 6, 7, 7.875], "texture": "#0"}, + "up": {"uv": [8, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [3, 15, 2], + "to": [13, 17, 14], + "faces": { + "north": {"uv": [0.625, 4, 1.875, 4.25], "texture": "#0"}, + "east": {"uv": [0, 5.875, 1.5, 6.125], "texture": "#0"}, + "south": {"uv": [0.625, 4, 1.875, 4.25], "texture": "#0"}, + "west": {"uv": [5.5, 6, 7, 6.25], "texture": "#0"}, + "up": {"uv": [7.375, 4.5, 6.125, 3], "texture": "#0"}, + "down": {"uv": [6.75, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [-2, 0, 13.8], + "to": [18, 2.8, 14.8], + "faces": { + "north": {"uv": [3, 3.75, 5.5, 4], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.125, 6.125], "texture": "#0"}, + "south": {"uv": [0, 5.5, 2.5, 5.875], "texture": "#0"}, + "west": {"uv": [5.5, 6, 5.625, 6.25], "texture": "#0"}, + "up": {"uv": [5.5, 3.5, 3, 3.375], "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 4.625], "texture": "#0"} + } + }, + { + "from": [-2, 0, 1.2], + "to": [18, 2.8, 2.2], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, + "faces": { + "north": {"uv": [2.5, 5.5, 0, 5.875], "texture": "#0"}, + "east": {"uv": [0.125, 5.875, 0, 6.125], "texture": "#0"}, + "south": {"uv": [5.5, 3.75, 3, 4], "texture": "#0"}, + "west": {"uv": [5.625, 6, 5.5, 6.25], "texture": "#0"}, + "up": {"uv": [5.5, 3.375, 3, 3.5], "texture": "#0"}, + "down": {"uv": [8, 4.625, 5.5, 4.5], "texture": "#0"} + } + }, + { + "from": [17.5, 0, 2.7], + "to": [18.5, 2.8, 13.7], + "rotation": {"angle": 0, "axis": "y", "origin": [22, 1.4, 1.7]}, + "faces": { + "north": {"uv": [5.625, 6, 5.5, 6.35], "texture": "#0"}, + "east": {"uv": [1.875, 5.5, 0.5, 5.85], "texture": "#0"}, + "south": {"uv": [0.125, 5.875, 0, 6.125], "texture": "#0"}, + "west": {"uv": [5.5, 3.75, 3, 4], "texture": "#0"}, + "up": {"uv": [5.5, 3.375, 3, 3.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [8, 4.625, 5.5, 4.5], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [-2.5, 0, 2.7], + "to": [-1.5, 2.8, 13.7], + "rotation": {"angle": 0, "axis": "y", "origin": [-6, 1.4, 1.7]}, + "faces": { + "north": {"uv": [5.5, 6, 5.625, 6.35], "texture": "#0"}, + "east": {"uv": [3, 3.75, 5.5, 4], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.125, 6.125], "texture": "#0"}, + "west": {"uv": [0.5, 5.5, 1.875, 5.85], "texture": "#0"}, + "up": {"uv": [5.5, 3.5, 3, 3.375], "rotation": 90, "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 4.625], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [17.2, 10.3, 2], + "to": [19.2, 15.3, 14], + "rotation": {"angle": 22.5, "axis": "z", "origin": [18.5, 12.5, 8]}, + "faces": { + "north": {"uv": [3, 3.75, 3.25, 4.375], "texture": "#0"}, + "east": {"uv": [0, 5.875, 1.5, 6.5], "texture": "#0"}, + "south": {"uv": [0, 4, 0.25, 4.625], "texture": "#0"}, + "west": {"uv": [5.5, 6, 7, 6.625], "texture": "#0"}, + "up": {"uv": [5.75, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.75, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [-3.2, 10.3, 2], + "to": [-1.2, 15.3, 14], + "rotation": {"angle": -22.5, "axis": "z", "origin": [-2.5, 12.5, 8]}, + "faces": { + "north": {"uv": [3.25, 3.75, 3, 4.375], "texture": "#0"}, + "east": {"uv": [7, 6, 5.5, 6.625], "texture": "#0"}, + "south": {"uv": [0.25, 4, 0, 4.625], "texture": "#0"}, + "west": {"uv": [1.5, 5.875, 0, 6.5], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 5.75, 3], "texture": "#0"}, + "down": {"uv": [5.5, 4.5, 5.75, 6], "texture": "#0"} + } + }, + { + "from": [17.30803, 10.86236, 13.3], + "to": [19.30803, 15.26236, 15.3], + "rotation": {"angle": 0, "axis": "z", "origin": [18.10803, 13.36236, 14.5]}, + "faces": { + "north": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "west": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "up": {"uv": [5.75, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.75, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [17.40803, 14.56236, 13.2], + "to": [19.40803, 16.56236, 15.4], + "shade": false, + "rotation": {"angle": -45, "axis": "z", "origin": [18.40803, 15.76236, 14.3]}, + "faces": { + "north": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "east": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "up": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"} + } + }, + { + "from": [-3.30803, 10.86236, 13.3], + "to": [-1.30803, 15.26236, 15.3], + "rotation": {"angle": 0, "axis": "z", "origin": [-2.10803, 13.36236, 14.5]}, + "faces": { + "north": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "east": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "south": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "west": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 5.75, 3], "texture": "#0"}, + "down": {"uv": [5.5, 4.5, 5.75, 6], "texture": "#0"} + } + }, + { + "from": [-3.40803, 14.56236, 13.2], + "to": [-1.40803, 16.56236, 15.4], + "rotation": {"angle": 45, "axis": "z", "origin": [-2.40803, 15.76236, 14.3]}, + "faces": { + "north": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "east": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "up": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"} + } + }, + { + "from": [17.30803, 10.86236, 1.3], + "to": [19.30803, 15.26236, 3.3], + "rotation": {"angle": 0, "axis": "z", "origin": [18.10803, 13.36236, 2.5]}, + "faces": { + "north": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "west": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "up": {"uv": [5.75, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.75, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [17.40803, 14.56236, 1.2], + "to": [19.40803, 16.56236, 3.4], + "rotation": {"angle": -45, "axis": "z", "origin": [18.40803, 15.76236, 2.3]}, + "faces": { + "north": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "east": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "up": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"} + } + }, + { + "from": [-3.30803, 10.86236, 1.3], + "to": [-1.30803, 15.26236, 3.3], + "rotation": {"angle": 0, "axis": "z", "origin": [-2.10803, 13.36236, 2.5]}, + "faces": { + "north": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "east": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "south": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "west": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 5.75, 3], "texture": "#0"}, + "down": {"uv": [5.5, 4.5, 5.75, 6], "texture": "#0"} + } + }, + { + "from": [-3.40803, 14.56236, 1.2], + "to": [-1.40803, 16.56236, 3.4], + "rotation": {"angle": 45, "axis": "z", "origin": [-2.40803, 15.76236, 2.3]}, + "faces": { + "north": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "east": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "up": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"} + } + }, + { + "from": [-2.1, 10, 15], + "to": [18.1, 15, 17], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 7.5, 14.5]}, + "faces": { + "north": {"uv": [3, 3.75, 5.5, 4.375], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.25, 6.5], "texture": "#0"}, + "south": {"uv": [0, 4, 2.5, 4.625], "texture": "#0"}, + "west": {"uv": [5.5, 6, 5.75, 6.625], "texture": "#0"}, + "up": {"uv": [8, 3.25, 5.5, 3], "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 4.75], "texture": "#0"} + } + }, + { + "from": [-2.1, 10, -1], + "to": [18.1, 15, 1], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 7.5, 1.5]}, + "faces": { + "north": {"uv": [2.5, 4, 0, 4.625], "texture": "#0"}, + "east": {"uv": [0.25, 5.875, 0, 6.5], "texture": "#0"}, + "south": {"uv": [5.5, 3.75, 3, 4.375], "texture": "#0"}, + "west": {"uv": [5.75, 6, 5.5, 6.625], "texture": "#0"}, + "up": {"uv": [8, 3, 5.5, 3.25], "texture": "#0"}, + "down": {"uv": [8, 4.75, 5.5, 4.5], "texture": "#0"} + } + }, + { + "from": [-4, 0, 0], + "to": [1, 1, 5], + "faces": { + "north": {"uv": [1.5, 7.375, 2.125, 7.5], "texture": "#0"}, + "east": {"uv": [4.75, 7.75, 5.375, 7.875], "texture": "#0"}, + "south": {"uv": [8, 5.875, 8.625, 6], "texture": "#0"}, + "west": {"uv": [8.375, 3.875, 9, 4], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [2.125, 6.5, 1.5, 7.125], "texture": "#0"} + } + }, + { + "from": [-3, 1, 1], + "to": [0, 8, 4], + "faces": { + "north": {"uv": [2.5, 4, 2.875, 4.875], "texture": "#0"}, + "east": {"uv": [2.125, 5.875, 2.5, 6.75], "texture": "#0"}, + "south": {"uv": [1.875, 8, 2.25, 8.875], "texture": "#0"}, + "west": {"uv": [8, 1.875, 8.375, 2.75], "texture": "#0"}, + "up": {"uv": [5.25, 8.625, 4.875, 8.25], "texture": "#0"}, + "down": {"uv": [5.625, 8.25, 5.25, 8.625], "texture": "#0"} + } + }, + { + "from": [-3, 1, 12], + "to": [0, 8, 15], + "faces": { + "north": {"uv": [2.25, 8, 2.625, 8.875], "texture": "#0"}, + "east": {"uv": [2.625, 8, 3, 8.875], "texture": "#0"}, + "south": {"uv": [8, 2.75, 8.375, 3.625], "texture": "#0"}, + "west": {"uv": [3, 8, 3.375, 8.875], "texture": "#0"}, + "up": {"uv": [6, 8.625, 5.625, 8.25], "texture": "#0"}, + "down": {"uv": [6.375, 8.25, 6, 8.625], "texture": "#0"} + } + }, + { + "from": [-4, 0, 11], + "to": [1, 1, 16], + "faces": { + "north": {"uv": [8.375, 4, 9, 4.125], "texture": "#0"}, + "east": {"uv": [8.375, 4.125, 9, 4.25], "texture": "#0"}, + "south": {"uv": [8.375, 4.25, 9, 4.375], "texture": "#0"}, + "west": {"uv": [8.375, 4.375, 9, 4.5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 0.625, 8.375], "texture": "#0"} + } + }, + { + "from": [16, 1, 12], + "to": [19, 8, 15], + "faces": { + "north": {"uv": [3.375, 8, 3.75, 8.875], "texture": "#0"}, + "east": {"uv": [8, 3.625, 8.375, 4.5], "texture": "#0"}, + "south": {"uv": [3.75, 8, 4.125, 8.875], "texture": "#0"}, + "west": {"uv": [4.125, 8, 4.5, 8.875], "texture": "#0"}, + "up": {"uv": [6.75, 8.625, 6.375, 8.25], "texture": "#0"}, + "down": {"uv": [0.375, 8.375, 0, 8.75], "texture": "#0"} + } + }, + { + "from": [15, 0, 11], + "to": [20, 1, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 9, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 9, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.625, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [20, 0, 11], + "to": [21, 1, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 8.5, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 8.5, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.125, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.125, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [20, 0, 0], + "to": [21, 1, 5], + "faces": { + "north": {"uv": [8.375, 4.5, 8.5, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 8.5, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.125, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.125, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-5, 0, 0], + "to": [-4, 1, 5], + "faces": { + "north": {"uv": [8.375, 4.5, 8.5, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 8.5, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.125, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.125, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-5, 0, 11], + "to": [-4, 1, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 8.5, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 8.5, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.125, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.125, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [16, 1, 1], + "to": [19, 8, 4], + "faces": { + "north": {"uv": [8, 4.5, 8.375, 5.375], "texture": "#0"}, + "east": {"uv": [6.75, 8.125, 7.125, 9], "texture": "#0"}, + "south": {"uv": [7.125, 8.125, 7.5, 9], "texture": "#0"}, + "west": {"uv": [7.5, 8.125, 7.875, 9], "texture": "#0"}, + "up": {"uv": [0.75, 8.75, 0.375, 8.375], "texture": "#0"}, + "down": {"uv": [1.125, 8.375, 0.75, 8.75], "texture": "#0"} + } + }, + { + "from": [15, 0, 0], + "to": [20, 1, 5], + "faces": { + "north": {"uv": [8.375, 5, 9, 5.125], "texture": "#0"}, + "east": {"uv": [8.375, 5.125, 9, 5.25], "texture": "#0"}, + "south": {"uv": [8.375, 5.25, 9, 5.375], "texture": "#0"}, + "west": {"uv": [8.5, 8.125, 9.125, 8.25], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.625, 1.25, 8, 1.875], "texture": "#0"} + } + }, + { + "from": [15, 2, 11], + "to": [20, 3, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 9, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 9, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [8.625, 0.625, 8, 0], "texture": "#0"}, + "down": {"uv": [8.625, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-4, 2, 11], + "to": [1, 3, 16], + "faces": { + "north": {"uv": [8.375, 4, 9, 4.125], "texture": "#0"}, + "east": {"uv": [8.375, 4.125, 9, 4.25], "texture": "#0"}, + "south": {"uv": [8.375, 4.25, 9, 4.375], "texture": "#0"}, + "west": {"uv": [8.375, 4.375, 9, 4.5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 0.625, 8.375], "texture": "#0"} + } + }, + { + "from": [-4, 2, 0], + "to": [1, 3, 5], + "faces": { + "north": {"uv": [1.5, 7.375, 2.125, 7.5], "texture": "#0"}, + "east": {"uv": [4.75, 7.75, 5.375, 7.875], "texture": "#0"}, + "south": {"uv": [8, 5.875, 8.625, 6], "texture": "#0"}, + "west": {"uv": [8.375, 3.875, 9, 4], "texture": "#0"}, + "up": {"uv": [2.125, 6.5, 1.5, 5.875], "texture": "#0"}, + "down": {"uv": [2.125, 6.5, 1.5, 7.125], "texture": "#0"} + } + }, + { + "from": [15, 2, 0], + "to": [20, 3, 5], + "faces": { + "north": {"uv": [8.375, 5, 9, 5.125], "texture": "#0"}, + "east": {"uv": [8.375, 5.125, 9, 5.25], "texture": "#0"}, + "south": {"uv": [8.375, 5.25, 9, 5.375], "texture": "#0"}, + "west": {"uv": [8.5, 8.125, 9.125, 8.25], "texture": "#0"}, + "up": {"uv": [1.875, 8.625, 1.25, 8], "texture": "#0"}, + "down": {"uv": [8.625, 1.25, 8, 1.875], "texture": "#0"} + } + }, + { + "from": [15, 6, 11], + "to": [20, 7, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 9, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 9, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [8.625, 0.625, 8, 0], "texture": "#0"}, + "down": {"uv": [8.625, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-4, 6, 11], + "to": [1, 7, 16], + "faces": { + "north": {"uv": [8.375, 4, 9, 4.125], "texture": "#0"}, + "east": {"uv": [8.375, 4.125, 9, 4.25], "texture": "#0"}, + "south": {"uv": [8.375, 4.25, 9, 4.375], "texture": "#0"}, + "west": {"uv": [8.375, 4.375, 9, 4.5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 0.625, 8.375], "texture": "#0"} + } + }, + { + "from": [-4, 6, 0], + "to": [1, 7, 5], + "faces": { + "north": {"uv": [1.5, 7.375, 2.125, 7.5], "texture": "#0"}, + "east": {"uv": [4.75, 7.75, 5.375, 7.875], "texture": "#0"}, + "south": {"uv": [8, 5.875, 8.625, 6], "texture": "#0"}, + "west": {"uv": [8.375, 3.875, 9, 4], "texture": "#0"}, + "up": {"uv": [2.125, 6.5, 1.5, 5.875], "texture": "#0"}, + "down": {"uv": [2.125, 6.5, 1.5, 7.125], "texture": "#0"} + } + }, + { + "from": [15, 6, 0], + "to": [20, 7, 5], + "faces": { + "north": {"uv": [8.375, 5, 9, 5.125], "texture": "#0"}, + "east": {"uv": [8.375, 5.125, 9, 5.25], "texture": "#0"}, + "south": {"uv": [8.375, 5.25, 9, 5.375], "texture": "#0"}, + "west": {"uv": [8.5, 8.125, 9.125, 8.25], "texture": "#0"}, + "up": {"uv": [1.875, 8.625, 1.25, 8], "texture": "#0"}, + "down": {"uv": [8.625, 1.25, 8, 1.875], "texture": "#0"} + } + }, + { + "from": [5.5, 4, 14], + "to": [10.5, 8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [8, 5.375, 8.625, 5.875], "texture": "#0"}, + "east": {"uv": [8.375, 1.875, 8.625, 2.375], "texture": "#0"}, + "south": {"uv": [7.875, 8.125, 8.5, 8.625], "texture": "#0"}, + "west": {"uv": [8.375, 2.375, 8.625, 2.875], "texture": "#0"}, + "up": {"uv": [2.125, 7.375, 1.5, 7.125], "texture": "#0"}, + "down": {"uv": [5.375, 7.5, 4.75, 7.75], "texture": "#0"} + } + }, + { + "from": [6.5, 5, 15], + "to": [9.5, 9, 17], + "shade": false, + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [2.5, 4.875, 2.875, 5.375], "texture": "#0"}, + "east": {"uv": [8.375, 2.875, 8.625, 3.375], "texture": "#0"}, + "south": {"uv": [2.125, 6.75, 2.5, 7.25], "texture": "#0"}, + "west": {"uv": [8.375, 3.375, 8.625, 3.875], "texture": "#0"}, + "up": {"uv": [2.875, 5.625, 2.5, 5.375], "texture": "#0"}, + "down": {"uv": [2.5, 7.25, 2.125, 7.5], "texture": "#0"} + } + }, + { + "from": [7.2, 13.85, 13.85], + "to": [9.2, 15.85, 14.85], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8.05, 14.9, 17.55]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [7.2, 11.85, 13.85], + "to": [9.2, 13.85, 14.85], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8.05, 14.9, 17.55]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [7.2, 11.82922, 14.81272], + "to": [9.2, 13.82922, 15.81272], + "rotation": {"angle": -45, "axis": "z", "origin": [8.2, 12.82922, 14.61272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [7.2, 3.12922, 15.21272], + "to": [9.2, 5.12922, 16.21272], + "rotation": {"angle": -45, "axis": "z", "origin": [8.2, 4.12922, 15.01272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [12.6, 11.62922, 14.51272], + "to": [14.6, 13.62922, 15.51272], + "rotation": {"angle": -45, "axis": "z", "origin": [13.6, 12.62922, 14.31272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [1.6, 11.62922, 14.51272], + "to": [3.6, 13.62922, 15.51272], + "rotation": {"angle": -45, "axis": "z", "origin": [2.6, 12.62922, 14.31272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [13, 11, 1.3], + "to": [14, 16, 14.8], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [8.625, 0, 8.75, 0.5], "texture": "#0"}, + "east": {"uv": [1.5, 7.5, 3.125, 8], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 1], "texture": "#0"}, + "west": {"uv": [3.125, 7.5, 4.75, 8], "texture": "#0"}, + "up": {"uv": [4.75, 9.625, 4.625, 8], "texture": "#0"}, + "down": {"uv": [4.875, 8.25, 4.75, 9.875], "texture": "#0"} + } + }, + { + "from": [13, 10, 14.8], + "to": [14, 15.5, 15.8], + "rotation": {"angle": -22.5, "axis": "x", "origin": [13.5, 13.25, 14.3]}, + "faces": { + "north": {"uv": [8.625, 0, 8.75, 0.5], "texture": "#0"}, + "east": {"uv": [1.5, 7.5, 3.125, 8], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 1], "texture": "#0"}, + "west": {"uv": [3.125, 7.5, 4.75, 8], "texture": "#0"}, + "up": {"uv": [4.75, 9.625, 4.625, 8], "texture": "#0"}, + "down": {"uv": [4.875, 8.25, 4.75, 9.875], "texture": "#0"} + } + }, + { + "from": [2, 10, 14.8], + "to": [3, 15.5, 15.8], + "rotation": {"angle": -22.5, "axis": "x", "origin": [13.5, 13.25, 14.3]}, + "faces": { + "north": {"uv": [8.625, 0, 8.75, 0.5], "texture": "#0"}, + "east": {"uv": [1.5, 7.5, 3.125, 8], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 1], "texture": "#0"}, + "west": {"uv": [3.125, 7.5, 4.75, 8], "texture": "#0"}, + "up": {"uv": [4.75, 9.625, 4.625, 8], "texture": "#0"}, + "down": {"uv": [4.875, 8.25, 4.75, 9.875], "texture": "#0"} + } + }, + { + "from": [2, 11, 1.3], + "to": [3, 16, 14.8], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [1.125, 8.375, 1.25, 8.875], "texture": "#0"}, + "east": {"uv": [7, 6.75, 8.625, 7.25], "texture": "#0"}, + "south": {"uv": [8.5, 8.25, 8.625, 8.75], "texture": "#0"}, + "west": {"uv": [7, 7.25, 8.625, 7.75], "texture": "#0"}, + "up": {"uv": [3, 5.625, 2.875, 4], "texture": "#0"}, + "down": {"uv": [4.625, 8, 4.5, 9.625], "texture": "#0"} + } + }, + { + "from": [-4, 8, 0], + "to": [20, 11, 16], + "faces": { + "north": {"uv": [7, 6, 10, 6.375], "texture": "#0"}, + "east": {"uv": [7, 7.75, 9, 8.125], "texture": "#0"}, + "south": {"uv": [7, 6.375, 10, 6.75], "texture": "#0"}, + "west": {"uv": [4.75, 7.875, 6.75, 8.25], "texture": "#0"}, + "up": {"uv": [3, 2, 0, 0], "texture": "#0"}, + "down": {"uv": [3, 2, 0, 4], "texture": "#0"} + } + }, + { + "from": [10.8, 16.6725, 8.5], + "to": [11.8, 17.7725, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.5, 2.125, 8.625], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [11.8, 16.6725, 7.5], + "to": [12.8, 17.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [10.8, 16.6725, 6.5], + "to": [11.8, 17.7725, 7.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [8.99289, 16.6725, 9.02132], + "to": [9.99289, 17.7725, 10.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [7.49289, 16.6725, 11.42132], + "to": [8.49289, 17.7725, 12.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [7.49289, 16.6725, 3.42132], + "to": [8.49289, 17.7725, 4.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [11.49289, 16.6725, 7.42132], + "to": [12.49289, 17.7725, 8.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3.69289, 16.6725, 7.42132], + "to": [4.69289, 17.7725, 8.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [10.99289, 16.4725, 11.02132], + "to": [11.99289, 17.5725, 12.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3.99289, 16.4725, 11.02132], + "to": [4.99289, 17.5725, 12.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3.99289, 16.4725, 4.02132], + "to": [4.99289, 17.5725, 5.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [10.99289, 16.4725, 4.02132], + "to": [11.99289, 17.5725, 5.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [8.5, 16.6725, 7.5], + "to": [9.5, 17.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 16.6725, 7.5], + "to": [8.5, 17.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 16.6725, 6.5], + "to": [8.5, 17.7725, 7.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 16.6725, 8.5], + "to": [8.5, 17.7725, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [6.5, 16.6725, 7.5], + "to": [7.5, 17.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [5.99289, 16.6725, 5.92132], + "to": [6.99289, 17.7725, 6.92132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [4.2, 16.6725, 6.5], + "to": [5.2, 17.7725, 7.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2.75, 8.375, 2.875, 8.5], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [4.2, 16.6725, 7.5], + "to": [5.2, 17.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [4.2, 16.6725, 8.5], + "to": [5.2, 17.7725, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [3.2, 16.6725, 7.5], + "to": [4.2, 17.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [8.99289, 16.6725, 5.92132], + "to": [9.99289, 17.7725, 6.92132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [10.8, 16.6725, 6.5], + "to": [11.8, 17.7725, 7.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [10.8, 16.6725, 8.5], + "to": [11.8, 17.7725, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [10.8, 16.6725, 7.5], + "to": [11.8, 17.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [11.8, 16.6725, 7.5], + "to": [12.8, 17.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [5.99289, 16.6725, 9.02132], + "to": [6.99289, 17.7725, 10.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 17.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [4.2, 16.6725, 8.5], + "to": [5.2, 17.7725, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [4.2, 16.6725, 7.5], + "to": [5.2, 17.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.5, 2.125, 8.625], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [3.2, 16.6725, 7.5], + "to": [4.2, 17.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [4.2, 16.6725, 6.5], + "to": [5.2, 17.7725, 7.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [10.8, 16.6725, 7.5], + "to": [11.8, 17.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 17.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "thirdperson_lefthand": { + "translation": [0, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "firstperson_righthand": { + "translation": [2, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "firstperson_lefthand": { + "translation": [2, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "ground": { + "scale": [0.40039, 0.40039, 0.40039] + }, + "gui": { + "rotation": [22.75, -30.5, 0], + "scale": [0.49609, 0.49609, 0.49609] + }, + "head": { + "translation": [0, -30.35, 0], + "scale": [1.6, 1.6, 1.6] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -13.75], + "scale": [1.6, 1.6, 1.6] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + { + "name": "group", + "origin": [8, 15.2225, 8], + "color": 0, + "boneType": "", + "children": [51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/lootbox/fishing_furniture_chest.json b/src/main/resources/contents/omc_daily_events/models/lootbox/fishing_furniture_chest.json new file mode 100644 index 000000000..f83545d68 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/lootbox/fishing_furniture_chest.json @@ -0,0 +1,950 @@ +{ + "textures": { + "0": "omc_daily_events:lootbox/fishing_furniture/fishing_furniture_chest", + "1": "omc_daily_events:lootbox/fishing_furniture/fishing_furniture_animation", + "2": "omc_daily_events:lootbox/fishing_furniture/fishing_furniture_animation_2", + "particle": "omc_daily_events:lootbox/fishing_furniture/fishing_furniture_chest" + }, + "elements": [ + { + "from": [0, 2, 3], + "to": [16, 6, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [16, -11, -6]}, + "faces": { + "north": {"uv": [9, 8.25, 13, 9.25], "texture": "#0"}, + "east": {"uv": [10, 2.25, 12.75, 3.25], "texture": "#0"}, + "south": {"uv": [9, 9.25, 13, 10.25], "texture": "#0"}, + "west": {"uv": [10, 3.25, 12.75, 4.25], "texture": "#0"} + } + }, + { + "from": [-3, 0, 2], + "to": [19, 2, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 14]}, + "faces": { + "north": {"uv": [10, 4.25, 15.5, 4.75], "texture": "#0"}, + "east": {"uv": [3.25, 11.25, 6.5, 11.75], "texture": "#0"}, + "south": {"uv": [10, 4.75, 15.5, 5.25], "texture": "#0"}, + "west": {"uv": [10, 11.25, 13.25, 11.75], "texture": "#0"}, + "up": {"uv": [5.5, 3.25, 0, 0], "texture": "#0"}, + "down": {"uv": [5.5, 3.25, 0, 6.5], "texture": "#0"} + } + }, + { + "from": [-1, 6, 2], + "to": [17, 8, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 14]}, + "faces": { + "north": {"uv": [10, 5.25, 14.5, 5.75], "texture": "#0"}, + "east": {"uv": [10, 10.75, 13.25, 11.25], "texture": "#0"}, + "south": {"uv": [10, 5.75, 14.5, 6.25], "texture": "#0"}, + "west": {"uv": [0, 11.25, 3.25, 11.75], "texture": "#0"}, + "up": {"uv": [10, 3.25, 5.5, 0], "texture": "#0"}, + "down": {"uv": [10, 3.25, 5.5, 6.5], "texture": "#0"} + } + }, + { + "from": [-1, 11, 2], + "to": [17, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 14]}, + "faces": { + "north": {"uv": [8, 10.25, 12.5, 10.75], "texture": "#0"}, + "east": {"uv": [6.5, 11.5, 9.75, 12], "texture": "#0"}, + "south": {"uv": [0, 10.75, 4.5, 11.25], "texture": "#0"}, + "west": {"uv": [0, 11.75, 3.25, 12.25], "texture": "#0"}, + "up": {"uv": [4.5, 9.75, 0, 6.5], "texture": "#0"}, + "down": {"uv": [9, 6.5, 4.5, 9.75], "texture": "#0"} + } + }, + { + "from": [0, 8, 3], + "to": [16, 11, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 14]}, + "faces": { + "north": {"uv": [10, 0.75, 14, 1.5], "texture": "#0"}, + "east": {"uv": [4.5, 10.5, 7.25, 11.25], "texture": "#0"}, + "south": {"uv": [10, 1.5, 14, 2.25], "texture": "#0"}, + "west": {"uv": [7.25, 10.75, 10, 11.5], "texture": "#0"} + } + }, + { + "from": [0, 12, 5], + "to": [16, 15, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 14]}, + "faces": { + "north": {"uv": [4, 9.75, 8, 10.5], "texture": "#0"}, + "east": {"uv": [3.25, 11.75, 5, 12.5], "texture": "#0"}, + "south": {"uv": [10, 0, 14, 0.75], "texture": "#0"}, + "west": {"uv": [3.25, 11.75, 5, 12.5], "texture": "#0"}, + "up": {"uv": [13, 8.25, 9, 6.5], "texture": "#0"} + } + }, + { + "from": [0, 11, 5], + "to": [16, 15, 8], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 15, 5]}, + "faces": { + "north": {"uv": [0, 9.75, 4, 10.75], "texture": "#0"}, + "east": {"uv": [13.75, 8.5, 13, 9.5], "texture": "#0"}, + "west": {"uv": [13, 8.5, 13.75, 9.5], "texture": "#0"} + } + }, + { + "from": [0, 12, 12], + "to": [16, 15, 16], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "east": {"uv": [13, 8.5, 13.75, 9.5], "rotation": 90, "texture": "#0"}, + "west": {"uv": [13.75, 8.5, 13, 9.5], "rotation": 270, "texture": "#0"}, + "up": {"uv": [4, 9.75, 0, 10.75], "texture": "#0"} + } + }, + { + "from": [7, 5, 1], + "to": [9, 9, 3], + "faces": { + "north": {"uv": [12.75, 13.75, 13.25, 14.75], "texture": "#0"}, + "east": {"uv": [13.25, 13.75, 13.75, 14.75], "texture": "#0"}, + "south": {"uv": [13.75, 13.25, 14.25, 14.25], "texture": "#0"}, + "west": {"uv": [14, 0, 14.5, 1], "texture": "#0"}, + "up": {"uv": [3, 14.75, 2.5, 14.25], "texture": "#0"}, + "down": {"uv": [9.25, 14.25, 8.75, 14.75], "texture": "#0"} + } + }, + { + "from": [3, 2, 1], + "to": [8, 3.5, 3], + "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 2, 2]}, + "faces": { + "north": {"uv": [0, 14.25, 1.25, 14.625], "texture": "#0"}, + "east": {"uv": [14.5, 14.25, 15, 14.625], "texture": "#0"}, + "south": {"uv": [1.25, 14.25, 2.5, 14.625], "texture": "#0"}, + "west": {"uv": [0, 14.75, 0.5, 15.125], "texture": "#0"}, + "up": {"uv": [5.75, 14.25, 4.5, 13.75], "texture": "#0"}, + "down": {"uv": [15, 6.25, 13.75, 6.75], "texture": "#0"} + } + }, + { + "from": [2, 2, 1.5], + "to": [3, 5.5, 2.5], + "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 2, 2]}, + "faces": { + "north": {"uv": [14.5, 7.75, 14.75, 8.625], "texture": "#0"}, + "east": {"uv": [9.25, 14.5, 9.5, 15.375], "texture": "#0"}, + "south": {"uv": [9.5, 14.5, 9.75, 15.375], "texture": "#0"}, + "west": {"uv": [9.75, 14.5, 10, 15.375], "texture": "#0"}, + "up": {"uv": [7, 11.5, 6.75, 11.25], "texture": "#0"}, + "down": {"uv": [7.25, 11.25, 7, 11.5], "texture": "#0"} + } + }, + { + "from": [3, 5, 1.5], + "to": [4, 5.5, 2.5], + "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 2, 2]}, + "faces": { + "north": {"uv": [13.25, 10, 13.5, 10.125], "texture": "#0"}, + "east": {"uv": [12.75, 13.25, 13, 13.375], "texture": "#0"}, + "south": {"uv": [13.5, 4, 13.75, 4.125], "texture": "#0"}, + "west": {"uv": [9.25, 13.5, 9.5, 13.625], "texture": "#0"}, + "up": {"uv": [11.75, 6.5, 11.5, 6.25], "texture": "#0"}, + "down": {"uv": [10, 11.5, 9.75, 11.75], "texture": "#0"} + } + }, + { + "from": [8, 2, 1], + "to": [13, 3.5, 3], + "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 2, 2]}, + "faces": { + "north": {"uv": [1.25, 14.25, 0, 14.625], "texture": "#0"}, + "east": {"uv": [0.5, 14.75, 0, 15.125], "texture": "#0"}, + "south": {"uv": [2.5, 14.25, 1.25, 14.625], "texture": "#0"}, + "west": {"uv": [15, 14.25, 14.5, 14.625], "texture": "#0"}, + "up": {"uv": [4.5, 14.25, 5.75, 13.75], "texture": "#0"}, + "down": {"uv": [13.75, 6.25, 15, 6.75], "texture": "#0"} + } + }, + { + "from": [13, 2, 1.5], + "to": [14, 5.5, 2.5], + "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 2, 2]}, + "faces": { + "north": {"uv": [14.75, 7.75, 14.5, 8.625], "texture": "#0"}, + "east": {"uv": [10, 14.5, 9.75, 15.375], "texture": "#0"}, + "south": {"uv": [9.75, 14.5, 9.5, 15.375], "texture": "#0"}, + "west": {"uv": [9.5, 14.5, 9.25, 15.375], "texture": "#0"}, + "up": {"uv": [6.75, 11.5, 7, 11.25], "texture": "#0"}, + "down": {"uv": [7, 11.25, 7.25, 11.5], "texture": "#0"} + } + }, + { + "from": [12, 5, 1.5], + "to": [13, 5.5, 2.5], + "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 2, 2]}, + "faces": { + "north": {"uv": [13.5, 10, 13.25, 10.125], "texture": "#0"}, + "east": {"uv": [9.5, 13.5, 9.25, 13.625], "texture": "#0"}, + "south": {"uv": [13.75, 4, 13.5, 4.125], "texture": "#0"}, + "west": {"uv": [13, 13.25, 12.75, 13.375], "texture": "#0"}, + "up": {"uv": [11.5, 6.5, 11.75, 6.25], "texture": "#0"}, + "down": {"uv": [9.75, 11.5, 10, 11.75], "texture": "#0"} + } + }, + { + "from": [2.1, 16.6, -0.5], + "to": [4.9, 21.6, 2.5], + "rotation": {"angle": 22.5, "axis": "x", "origin": [3.5, 16.6, -0.5]}, + "faces": { + "north": {"uv": [9.5, 12.5, 10.25, 13.75], "texture": "#0"}, + "east": {"uv": [10.25, 12.5, 11, 13.75], "texture": "#0"}, + "south": {"uv": [12.75, 2.25, 13.5, 3.5], "texture": "#0"}, + "west": {"uv": [0, 13, 0.75, 14.25], "texture": "#0"}, + "up": {"uv": [9.25, 14.25, 8.5, 13.5], "texture": "#0"}, + "down": {"uv": [14.5, 6.75, 13.75, 7.5], "texture": "#0"} + } + }, + { + "from": [2, 12, 3], + "to": [5, 18, 6], + "rotation": {"angle": -45, "axis": "x", "origin": [3.5, 13, 3]}, + "faces": { + "north": {"uv": [11.5, 11.75, 12.25, 13.25], "texture": "#0"}, + "east": {"uv": [6.5, 12, 7.25, 13.5], "texture": "#0"}, + "south": {"uv": [7.25, 12, 8, 13.5], "texture": "#0"}, + "west": {"uv": [8, 12, 8.75, 13.5], "texture": "#0"}, + "up": {"uv": [14.5, 8.25, 13.75, 7.5], "texture": "#0"}, + "down": {"uv": [14.5, 8.25, 13.75, 9], "texture": "#0"} + } + }, + { + "from": [2.2, 19.25, 1.4], + "to": [4.8, 21.25, 7.4], + "rotation": {"angle": 0, "axis": "y", "origin": [3.5, 16.6, -0.5]}, + "faces": { + "north": {"uv": [3.5, 14, 4.25, 14.5], "texture": "#0"}, + "east": {"uv": [12.5, 10.25, 14, 10.75], "texture": "#0"}, + "south": {"uv": [14.25, 3.5, 15, 4], "texture": "#0"}, + "west": {"uv": [12.75, 3.5, 14.25, 4], "texture": "#0"}, + "up": {"uv": [5.75, 13.25, 5, 11.75], "texture": "#0"}, + "down": {"uv": [6.5, 11.75, 5.75, 13.25], "texture": "#0"} + } + }, + { + "from": [2.5, 17, 8.85], + "to": [4.5, 18.5, 13.85], + "rotation": {"angle": 22.5, "axis": "x", "origin": [3.5, 21.2, 7.32855]}, + "faces": { + "north": {"uv": [14.5, 9.5, 15, 9.875], "texture": "#0"}, + "east": {"uv": [14, 3, 15.25, 3.375], "texture": "#0"}, + "south": {"uv": [10, 14.5, 10.5, 14.875], "texture": "#0"}, + "west": {"uv": [14, 10, 15.25, 10.375], "texture": "#0"}, + "up": {"uv": [6.5, 14.5, 6, 13.25], "texture": "#0"}, + "down": {"uv": [12.25, 13.25, 11.75, 14.5], "texture": "#0"} + } + }, + { + "from": [3, 17, 13.85], + "to": [4, 20.5, 14.85], + "rotation": {"angle": 22.5, "axis": "x", "origin": [3.5, 21.2, 7.32855]}, + "faces": { + "north": {"uv": [5.75, 13.75, 6, 14.625], "texture": "#0"}, + "east": {"uv": [11.5, 14.25, 11.75, 15.125], "texture": "#0"}, + "south": {"uv": [14.25, 13.75, 14.5, 14.625], "texture": "#0"}, + "west": {"uv": [14.5, 0, 14.75, 0.875], "texture": "#0"}, + "up": {"uv": [10.25, 6.5, 10, 6.25], "texture": "#0"}, + "down": {"uv": [10.5, 6.25, 10.25, 6.5], "texture": "#0"} + } + }, + { + "from": [3, 20, 12.85], + "to": [4, 20.5, 13.85], + "rotation": {"angle": 22.5, "axis": "x", "origin": [3.5, 21.2, 7.32855]}, + "faces": { + "north": {"uv": [11.75, 6.25, 12, 6.375], "texture": "#0"}, + "east": {"uv": [12, 6.25, 12.25, 6.375], "texture": "#0"}, + "south": {"uv": [9.5, 12, 9.75, 12.125], "texture": "#0"}, + "west": {"uv": [3, 12.25, 3.25, 12.375], "texture": "#0"}, + "up": {"uv": [4.25, 10.75, 4, 10.5], "texture": "#0"}, + "down": {"uv": [4.5, 10.5, 4.25, 10.75], "texture": "#0"} + } + }, + { + "from": [2.3, 17.18483, 5.41443], + "to": [4.7, 21.18483, 7.41443], + "rotation": {"angle": -22.5, "axis": "x", "origin": [3.5, 21.2, 7.32855]}, + "faces": { + "north": {"uv": [13.75, 12.75, 13, 13.75], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8, 9.75, 9, 10.25], "rotation": 270, "texture": "#0"}, + "south": {"uv": [13.75, 12.75, 13, 11.75], "texture": "#0"}, + "west": {"uv": [13.75, 9, 14.75, 9.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4.25, 14.25, 5, 14.75], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5, 14.25, 5.75, 14.75], "texture": "#0"} + } + }, + { + "from": [-3, 4.55645, 2.63747], + "to": [0, 9.55645, 5.63747], + "rotation": {"angle": -22.5, "axis": "x", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [0.75, 13, 1.5, 14.25], "texture": "#0"}, + "east": {"uv": [1.5, 13, 2.25, 14.25], "texture": "#0"}, + "south": {"uv": [2.25, 13, 3, 14.25], "texture": "#0"}, + "west": {"uv": [13, 6.25, 13.75, 7.5], "texture": "#0"}, + "up": {"uv": [10, 14.5, 9.25, 13.75], "texture": "#0"}, + "down": {"uv": [10.75, 13.75, 10, 14.5], "texture": "#0"} + } + }, + { + "from": [-2.9, 1.97057, 4.93092], + "to": [0, 4.97057, 10.93092], + "rotation": {"angle": 0, "axis": "y", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [13.75, 11.75, 14.5, 12.5], "texture": "#0"}, + "east": {"uv": [0, 12.25, 1.5, 13], "texture": "#0"}, + "south": {"uv": [13.75, 12.5, 14.5, 13.25], "texture": "#0"}, + "west": {"uv": [1.5, 12.25, 3, 13], "texture": "#0"}, + "up": {"uv": [9.5, 13.5, 8.75, 12], "texture": "#0"}, + "down": {"uv": [13, 11.75, 12.25, 13.25], "texture": "#0"} + } + }, + { + "from": [-2.9, 10.4, 3.4], + "to": [0, 12.4, 9.4], + "rotation": {"angle": -45, "axis": "x", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [6.5, 14.25, 7.25, 14.75], "texture": "#0"}, + "east": {"uv": [13, 9.5, 14.5, 10], "texture": "#0"}, + "south": {"uv": [7.25, 14.25, 8, 14.75], "texture": "#0"}, + "west": {"uv": [4.5, 13.25, 6, 13.75], "texture": "#0"}, + "up": {"uv": [3.75, 14, 3, 12.5], "texture": "#0"}, + "down": {"uv": [4.5, 12.5, 3.75, 14], "texture": "#0"} + } + }, + { + "from": [-2.5, 8.15, 10.85], + "to": [-0.5, 9.65, 15.85], + "rotation": {"angle": -45, "axis": "x", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [14.5, 11.5, 15, 11.875], "texture": "#0"}, + "east": {"uv": [14, 10.5, 15.25, 10.875], "texture": "#0"}, + "south": {"uv": [11.75, 14.5, 12.25, 14.875], "texture": "#0"}, + "west": {"uv": [14, 11, 15.25, 11.375], "texture": "#0"}, + "up": {"uv": [12.75, 14.5, 12.25, 13.25], "texture": "#0"}, + "down": {"uv": [14, 2.25, 13.5, 3.5], "texture": "#0"} + } + }, + { + "from": [-2, 8.15, 15.85], + "to": [-1, 11.65, 16.85], + "rotation": {"angle": -45, "axis": "x", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [14.5, 2, 14.75, 2.875], "texture": "#0"}, + "east": {"uv": [3.5, 14.5, 3.75, 15.375], "texture": "#0"}, + "south": {"uv": [3.75, 14.5, 4, 15.375], "texture": "#0"}, + "west": {"uv": [4, 14.5, 4.25, 15.375], "texture": "#0"}, + "up": {"uv": [10.75, 6.5, 10.5, 6.25], "texture": "#0"}, + "down": {"uv": [7.5, 10.5, 7.25, 10.75], "texture": "#0"} + } + }, + { + "from": [-2, 11.15, 14.85], + "to": [-1, 11.65, 15.85], + "rotation": {"angle": -45, "axis": "x", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [12.25, 6.25, 12.5, 6.375], "texture": "#0"}, + "east": {"uv": [9.5, 12.25, 9.75, 12.375], "texture": "#0"}, + "south": {"uv": [12.5, 6.25, 12.75, 6.375], "texture": "#0"}, + "west": {"uv": [12.75, 4, 13, 4.125], "texture": "#0"}, + "up": {"uv": [7.75, 10.75, 7.5, 10.5], "texture": "#0"}, + "down": {"uv": [8, 10.5, 7.75, 10.75], "texture": "#0"} + } + }, + { + "from": [-2.5, 2.5, 5.6], + "to": [-0.5, 5, 9.6], + "rotation": {"angle": -45, "axis": "x", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [4.5, 12.5, 5, 13.125], "texture": "#0"}, + "east": {"uv": [6.5, 13.5, 7.5, 14.125], "texture": "#0"}, + "south": {"uv": [11, 12.5, 11.5, 13.125], "texture": "#0"}, + "west": {"uv": [7.5, 13.5, 8.5, 14.125], "texture": "#0"}, + "up": {"uv": [14.5, 3, 14, 2], "texture": "#0"}, + "down": {"uv": [3.5, 14, 3, 15], "texture": "#0"} + } + }, + { + "from": [-2.5, 3, 9.6], + "to": [-0.5, 4.5, 11.6], + "rotation": {"angle": -45, "axis": "x", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [14.5, 12, 15, 12.375], "texture": "#0"}, + "east": {"uv": [12.25, 14.5, 12.75, 14.875], "texture": "#0"}, + "south": {"uv": [14.5, 12.5, 15, 12.875], "texture": "#0"}, + "west": {"uv": [14.5, 13.75, 15, 14.125], "texture": "#0"}, + "up": {"uv": [14.75, 13.75, 14.25, 13.25], "texture": "#0"}, + "down": {"uv": [14.25, 14.25, 13.75, 14.75], "texture": "#0"} + } + }, + { + "from": [-2, 3, 11.6], + "to": [-1, 6.5, 12.6], + "rotation": {"angle": -45, "axis": "x", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [14.5, 5.25, 14.75, 6.125], "texture": "#0"}, + "east": {"uv": [6, 14.5, 6.25, 15.375], "texture": "#0"}, + "south": {"uv": [6.25, 14.5, 6.5, 15.375], "texture": "#0"}, + "west": {"uv": [14.5, 6.75, 14.75, 7.625], "texture": "#0"}, + "up": {"uv": [11.5, 6.5, 11.25, 6.25], "texture": "#0"}, + "down": {"uv": [6.75, 11.25, 6.5, 11.5], "texture": "#0"} + } + }, + { + "from": [-2, 6, 10.6], + "to": [-1, 6.5, 11.6], + "rotation": {"angle": -45, "axis": "x", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [12.75, 6.25, 13, 6.375], "texture": "#0"}, + "east": {"uv": [13, 4, 13.25, 4.125], "texture": "#0"}, + "south": {"uv": [13, 10, 13.25, 10.125], "texture": "#0"}, + "west": {"uv": [13.25, 4, 13.5, 4.125], "texture": "#0"}, + "up": {"uv": [11, 6.5, 10.75, 6.25], "texture": "#0"}, + "down": {"uv": [11.25, 6.25, 11, 6.5], "texture": "#0"} + } + }, + { + "from": [-2.8, 8.91547, 7.20856], + "to": [0, 10.91547, 11.20856], + "rotation": {"angle": 0, "axis": "y", "origin": [-1.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [8, 14.25, 8.75, 14.75], "texture": "#0"}, + "east": {"uv": [14, 1, 15, 1.5], "texture": "#0"}, + "south": {"uv": [10.75, 14.25, 11.5, 14.75], "texture": "#0"}, + "west": {"uv": [14, 1.5, 15, 2], "texture": "#0"}, + "up": {"uv": [14, 11.75, 13.25, 10.75], "texture": "#0"}, + "down": {"uv": [11.75, 13.25, 11, 14.25], "texture": "#0"} + } + }, + { + "from": [11.1, 16.6, -0.5], + "to": [13.9, 21.6, 2.5], + "rotation": {"angle": 22.5, "axis": "x", "origin": [12.5, 16.6, -0.5]}, + "faces": { + "north": {"uv": [10.25, 12.5, 9.5, 13.75], "texture": "#0"}, + "east": {"uv": [0.75, 13, 0, 14.25], "texture": "#0"}, + "south": {"uv": [13.5, 2.25, 12.75, 3.5], "texture": "#0"}, + "west": {"uv": [11, 12.5, 10.25, 13.75], "texture": "#0"}, + "up": {"uv": [8.5, 14.25, 9.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 6.75, 14.5, 7.5], "texture": "#0"} + } + }, + { + "from": [0, 15, 8.5], + "to": [16, 31, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 23, 8.5]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "south": {"uv": [16, 0, 0, 16], "texture": "#1"} + } + }, + { + "from": [0, 15, 8.5], + "to": [16, 31, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 23, 8.5]}, + "faces": { + "north": {"uv": [16, 0, 0, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "from": [12, 13, 9.5], + "to": [22, 23, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 23, 8.5]}, + "faces": { + "north": {"uv": [16, 0, 0, 16], "texture": "#2"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#2"} + } + }, + { + "from": [-1, 4, 16.5], + "to": [9, 14, 16.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 23, 8.5]}, + "faces": { + "north": {"uv": [16, 0, 0, 16], "texture": "#2"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#2"} + } + }, + { + "from": [-6, 0, 3.5], + "to": [-6, 10, 13.5], + "rotation": {"angle": -45, "axis": "y", "origin": [-6, 5, 10.5]}, + "faces": { + "east": {"uv": [16, 0, 0, 16], "texture": "#2"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#2"} + } + }, + { + "from": [18, 0, 5.5], + "to": [28, 10, 5.5], + "rotation": {"angle": -45, "axis": "y", "origin": [23, 5, 3.5]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "south": {"uv": [16, 0, 0, 16], "texture": "#2"} + } + }, + { + "from": [11, 12, 3], + "to": [14, 18, 6], + "rotation": {"angle": -45, "axis": "x", "origin": [12.5, 13, 3]}, + "faces": { + "north": {"uv": [12.25, 11.75, 11.5, 13.25], "texture": "#0"}, + "east": {"uv": [8.75, 12, 8, 13.5], "texture": "#0"}, + "south": {"uv": [8, 12, 7.25, 13.5], "texture": "#0"}, + "west": {"uv": [7.25, 12, 6.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.75, 8.25, 14.5, 7.5], "texture": "#0"}, + "down": {"uv": [13.75, 8.25, 14.5, 9], "texture": "#0"} + } + }, + { + "from": [11.2, 19.25, 1.4], + "to": [13.8, 21.25, 7.4], + "rotation": {"angle": 0, "axis": "y", "origin": [12.5, 16.6, -0.5]}, + "faces": { + "north": {"uv": [4.25, 14, 3.5, 14.5], "texture": "#0"}, + "east": {"uv": [14.25, 3.5, 12.75, 4], "texture": "#0"}, + "south": {"uv": [15, 3.5, 14.25, 4], "texture": "#0"}, + "west": {"uv": [14, 10.25, 12.5, 10.75], "texture": "#0"}, + "up": {"uv": [5, 13.25, 5.75, 11.75], "texture": "#0"}, + "down": {"uv": [5.75, 11.75, 6.5, 13.25], "texture": "#0"} + } + }, + { + "from": [11.5, 17, 8.85], + "to": [13.5, 18.5, 13.85], + "rotation": {"angle": -22.5, "axis": "x", "origin": [12.5, 17, 8.85]}, + "faces": { + "north": {"uv": [15, 9.5, 14.5, 9.875], "texture": "#0"}, + "east": {"uv": [15.25, 10, 14, 10.375], "texture": "#0"}, + "south": {"uv": [10.5, 14.5, 10, 14.875], "texture": "#0"}, + "west": {"uv": [15.25, 3, 14, 3.375], "texture": "#0"}, + "up": {"uv": [6, 14.5, 6.5, 13.25], "texture": "#0"}, + "down": {"uv": [11.75, 13.25, 12.25, 14.5], "texture": "#0"} + } + }, + { + "from": [12, 17, 13.85], + "to": [13, 20.5, 14.85], + "rotation": {"angle": -22.5, "axis": "x", "origin": [12.5, 17, 8.85]}, + "faces": { + "north": {"uv": [6, 13.75, 5.75, 14.625], "texture": "#0"}, + "east": {"uv": [14.75, 0, 14.5, 0.875], "texture": "#0"}, + "south": {"uv": [14.5, 13.75, 14.25, 14.625], "texture": "#0"}, + "west": {"uv": [11.75, 14.25, 11.5, 15.125], "texture": "#0"}, + "up": {"uv": [10, 6.5, 10.25, 6.25], "texture": "#0"}, + "down": {"uv": [10.25, 6.25, 10.5, 6.5], "texture": "#0"} + } + }, + { + "from": [12, 20, 12.85], + "to": [13, 20.5, 13.85], + "rotation": {"angle": -22.5, "axis": "x", "origin": [12.5, 17, 8.85]}, + "faces": { + "north": {"uv": [12, 6.25, 11.75, 6.375], "texture": "#0"}, + "east": {"uv": [3.25, 12.25, 3, 12.375], "texture": "#0"}, + "south": {"uv": [9.75, 12, 9.5, 12.125], "texture": "#0"}, + "west": {"uv": [12.25, 6.25, 12, 6.375], "texture": "#0"}, + "up": {"uv": [4, 10.75, 4.25, 10.5], "texture": "#0"}, + "down": {"uv": [4.25, 10.5, 4.5, 10.75], "texture": "#0"} + } + }, + { + "from": [11.3, 19.25, 7.4], + "to": [13.7, 21.25, 11.4], + "rotation": {"angle": 45, "axis": "x", "origin": [12.5, 21.25, 7.4]}, + "faces": { + "north": {"uv": [5, 14.25, 4.25, 14.75], "texture": "#0"}, + "east": {"uv": [14.75, 9, 13.75, 9.5], "texture": "#0"}, + "south": {"uv": [5.75, 14.25, 5, 14.75], "texture": "#0"}, + "west": {"uv": [9, 9.75, 8, 10.25], "texture": "#0"}, + "up": {"uv": [13, 12.75, 13.75, 11.75], "texture": "#0"}, + "down": {"uv": [13, 12.75, 13.75, 13.75], "texture": "#0"} + } + }, + { + "from": [16, 4.55645, 2.63747], + "to": [19, 9.55645, 5.63747], + "rotation": {"angle": -22.5, "axis": "x", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [1.5, 13, 0.75, 14.25], "texture": "#0"}, + "east": {"uv": [13.75, 6.25, 13, 7.5], "texture": "#0"}, + "south": {"uv": [3, 13, 2.25, 14.25], "texture": "#0"}, + "west": {"uv": [2.25, 13, 1.5, 14.25], "texture": "#0"}, + "up": {"uv": [9.25, 14.5, 10, 13.75], "texture": "#0"}, + "down": {"uv": [10, 13.75, 10.75, 14.5], "texture": "#0"} + } + }, + { + "from": [16, 1.97057, 4.93092], + "to": [18.9, 4.97057, 10.93092], + "rotation": {"angle": 0, "axis": "y", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [14.5, 11.75, 13.75, 12.5], "texture": "#0"}, + "east": {"uv": [3, 12.25, 1.5, 13], "texture": "#0"}, + "south": {"uv": [14.5, 12.5, 13.75, 13.25], "texture": "#0"}, + "west": {"uv": [1.5, 12.25, 0, 13], "texture": "#0"}, + "up": {"uv": [8.75, 13.5, 9.5, 12], "texture": "#0"}, + "down": {"uv": [12.25, 11.75, 13, 13.25], "texture": "#0"} + } + }, + { + "from": [16, 10.4, 3.4], + "to": [18.9, 12.4, 9.4], + "rotation": {"angle": -45, "axis": "x", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [7.25, 14.25, 6.5, 14.75], "texture": "#0"}, + "east": {"uv": [6, 13.25, 4.5, 13.75], "texture": "#0"}, + "south": {"uv": [8, 14.25, 7.25, 14.75], "texture": "#0"}, + "west": {"uv": [14.5, 9.5, 13, 10], "texture": "#0"}, + "up": {"uv": [3, 14, 3.75, 12.5], "texture": "#0"}, + "down": {"uv": [3.75, 12.5, 4.5, 14], "texture": "#0"} + } + }, + { + "from": [16.5, 8.15, 10.85], + "to": [18.5, 9.65, 15.85], + "rotation": {"angle": -45, "axis": "x", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [15, 11.5, 14.5, 11.875], "texture": "#0"}, + "east": {"uv": [15.25, 11, 14, 11.375], "texture": "#0"}, + "south": {"uv": [12.25, 14.5, 11.75, 14.875], "texture": "#0"}, + "west": {"uv": [15.25, 10.5, 14, 10.875], "texture": "#0"}, + "up": {"uv": [12.25, 14.5, 12.75, 13.25], "texture": "#0"}, + "down": {"uv": [13.5, 2.25, 14, 3.5], "texture": "#0"} + } + }, + { + "from": [17, 8.15, 15.85], + "to": [18, 11.65, 16.85], + "rotation": {"angle": -45, "axis": "x", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [14.75, 2, 14.5, 2.875], "texture": "#0"}, + "east": {"uv": [4.25, 14.5, 4, 15.375], "texture": "#0"}, + "south": {"uv": [4, 14.5, 3.75, 15.375], "texture": "#0"}, + "west": {"uv": [3.75, 14.5, 3.5, 15.375], "texture": "#0"}, + "up": {"uv": [10.5, 6.5, 10.75, 6.25], "texture": "#0"}, + "down": {"uv": [7.25, 10.5, 7.5, 10.75], "texture": "#0"} + } + }, + { + "from": [17, 11.15, 14.85], + "to": [18, 11.65, 15.85], + "rotation": {"angle": -45, "axis": "x", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [12.5, 6.25, 12.25, 6.375], "texture": "#0"}, + "east": {"uv": [13, 4, 12.75, 4.125], "texture": "#0"}, + "south": {"uv": [12.75, 6.25, 12.5, 6.375], "texture": "#0"}, + "west": {"uv": [9.75, 12.25, 9.5, 12.375], "texture": "#0"}, + "up": {"uv": [7.5, 10.75, 7.75, 10.5], "texture": "#0"}, + "down": {"uv": [7.75, 10.5, 8, 10.75], "texture": "#0"} + } + }, + { + "from": [16.5, 2.5, 5.6], + "to": [18.5, 5, 9.6], + "rotation": {"angle": -45, "axis": "x", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [5, 12.5, 4.5, 13.125], "texture": "#0"}, + "east": {"uv": [8.5, 13.5, 7.5, 14.125], "texture": "#0"}, + "south": {"uv": [11.5, 12.5, 11, 13.125], "texture": "#0"}, + "west": {"uv": [7.5, 13.5, 6.5, 14.125], "texture": "#0"}, + "up": {"uv": [14, 3, 14.5, 2], "texture": "#0"}, + "down": {"uv": [3, 14, 3.5, 15], "texture": "#0"} + } + }, + { + "from": [16.5, 3, 9.6], + "to": [18.5, 4.5, 11.6], + "rotation": {"angle": -45, "axis": "x", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [15, 12, 14.5, 12.375], "texture": "#0"}, + "east": {"uv": [15, 13.75, 14.5, 14.125], "texture": "#0"}, + "south": {"uv": [15, 12.5, 14.5, 12.875], "texture": "#0"}, + "west": {"uv": [12.75, 14.5, 12.25, 14.875], "texture": "#0"}, + "up": {"uv": [14.25, 13.75, 14.75, 13.25], "texture": "#0"}, + "down": {"uv": [13.75, 14.25, 14.25, 14.75], "texture": "#0"} + } + }, + { + "from": [17, 3, 11.6], + "to": [18, 6.5, 12.6], + "rotation": {"angle": -45, "axis": "x", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [14.75, 5.25, 14.5, 6.125], "texture": "#0"}, + "east": {"uv": [14.75, 6.75, 14.5, 7.625], "texture": "#0"}, + "south": {"uv": [6.5, 14.5, 6.25, 15.375], "texture": "#0"}, + "west": {"uv": [6.25, 14.5, 6, 15.375], "texture": "#0"}, + "up": {"uv": [11.25, 6.5, 11.5, 6.25], "texture": "#0"}, + "down": {"uv": [6.5, 11.25, 6.75, 11.5], "texture": "#0"} + } + }, + { + "from": [17, 6, 10.6], + "to": [18, 6.5, 11.6], + "rotation": {"angle": -45, "axis": "x", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [13, 6.25, 12.75, 6.375], "texture": "#0"}, + "east": {"uv": [13.5, 4, 13.25, 4.125], "texture": "#0"}, + "south": {"uv": [13.25, 10, 13, 10.125], "texture": "#0"}, + "west": {"uv": [13.25, 4, 13, 4.125], "texture": "#0"}, + "up": {"uv": [10.75, 6.5, 11, 6.25], "texture": "#0"}, + "down": {"uv": [11, 6.25, 11.25, 6.5], "texture": "#0"} + } + }, + { + "from": [16, 8.91547, 7.20856], + "to": [18.8, 10.91547, 11.20856], + "rotation": {"angle": 0, "axis": "y", "origin": [17.5, 9.01244, 10.09626]}, + "faces": { + "north": {"uv": [8.75, 14.25, 8, 14.75], "texture": "#0"}, + "east": {"uv": [15, 1.5, 14, 2], "texture": "#0"}, + "south": {"uv": [11.5, 14.25, 10.75, 14.75], "texture": "#0"}, + "west": {"uv": [15, 1, 14, 1.5], "texture": "#0"}, + "up": {"uv": [13.25, 11.75, 14, 10.75], "texture": "#0"}, + "down": {"uv": [11, 13.25, 11.75, 14.25], "texture": "#0"} + } + }, + { + "from": [6.6, 12.49304, -2.92721], + "to": [9.4, 17.49304, 0.07279], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 18, 4.09626]}, + "faces": { + "north": {"uv": [9.5, 12.5, 10.25, 13.75], "texture": "#0"}, + "east": {"uv": [10.25, 12.5, 11, 13.75], "texture": "#0"}, + "south": {"uv": [12.75, 2.25, 13.5, 3.5], "texture": "#0"}, + "west": {"uv": [0, 13, 0.75, 14.25], "texture": "#0"}, + "up": {"uv": [9.25, 14.25, 8.5, 13.5], "texture": "#0"}, + "down": {"uv": [14.5, 6.75, 13.75, 7.5], "texture": "#0"} + } + }, + { + "from": [6.7, 11.30374, 1.84626], + "to": [9.3, 17.30374, 3.84626], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 18, 4.09626]}, + "faces": { + "north": {"uv": [5.75, 13.25, 5, 11.75], "rotation": 180, "texture": "#0"}, + "east": {"uv": [12.5, 10.25, 14, 10.75], "rotation": 90, "texture": "#0"}, + "south": {"uv": [6.5, 11.75, 5.75, 13.25], "texture": "#0"}, + "west": {"uv": [12.75, 3.5, 14.25, 4], "rotation": 270, "texture": "#0"}, + "up": {"uv": [14.25, 3.5, 15, 4], "texture": "#0"}, + "down": {"uv": [3.5, 14, 4.25, 14.5], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [7, 18.75374, 4.59626], + "to": [9, 23.75374, 6.09626], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 18, 4.09626]}, + "faces": { + "north": {"uv": [6.5, 14.5, 6, 13.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [14, 3, 15.25, 3.375], "rotation": 90, "texture": "#0"}, + "south": {"uv": [12.25, 13.25, 11.75, 14.5], "texture": "#0"}, + "west": {"uv": [14, 10, 15.25, 10.375], "rotation": 270, "texture": "#0"}, + "up": {"uv": [10, 14.5, 10.5, 14.875], "texture": "#0"}, + "down": {"uv": [14.5, 9.5, 15, 9.875], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [7.5, 23.75374, 2.59626], + "to": [8.5, 24.75374, 6.09626], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 18, 4.09626]}, + "faces": { + "north": {"uv": [10.25, 6.5, 10, 6.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [11.5, 14.25, 11.75, 15.125], "rotation": 90, "texture": "#0"}, + "south": {"uv": [10.5, 6.25, 10.25, 6.5], "texture": "#0"}, + "west": {"uv": [14.5, 0, 14.75, 0.875], "rotation": 270, "texture": "#0"}, + "up": {"uv": [14.25, 13.75, 14.5, 14.625], "texture": "#0"}, + "down": {"uv": [5.75, 13.75, 6, 14.625], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [7.5, 22.75374, 2.59626], + "to": [8.5, 23.75374, 3.09626], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 18, 4.09626]}, + "faces": { + "north": {"uv": [4.25, 10.75, 4, 10.5], "rotation": 180, "texture": "#0"}, + "east": {"uv": [12, 6.25, 12.25, 6.375], "rotation": 90, "texture": "#0"}, + "south": {"uv": [4.5, 10.5, 4.25, 10.75], "texture": "#0"}, + "west": {"uv": [3, 12.25, 3.25, 12.375], "rotation": 270, "texture": "#0"}, + "up": {"uv": [9.5, 12, 9.75, 12.125], "texture": "#0"}, + "down": {"uv": [11.75, 6.25, 12, 6.375], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [6.8, 17.09866, 2.01294], + "to": [9.2, 19.09866, 6.01294], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 18, 4.09626]}, + "faces": { + "north": {"uv": [4.25, 14.25, 5, 14.75], "texture": "#0"}, + "east": {"uv": [8, 9.75, 9, 10.25], "texture": "#0"}, + "south": {"uv": [5, 14.25, 5.75, 14.75], "texture": "#0"}, + "west": {"uv": [13.75, 9, 14.75, 9.5], "texture": "#0"}, + "up": {"uv": [13.75, 12.75, 13, 11.75], "texture": "#0"}, + "down": {"uv": [13.75, 12.75, 13, 13.75], "texture": "#0"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [62, 0, 0], + "translation": [0, 0, 1.75], + "scale": [0.38, 0.38, 0.38] + }, + "thirdperson_lefthand": { + "rotation": [62, 0, 0], + "translation": [0, 0, 1.75], + "scale": [0.38, 0.38, 0.38] + }, + "firstperson_righthand": { + "rotation": [5, 1, 3], + "translation": [-1.5, 4, 2.25], + "scale": [0.34, 0.34, 0.34] + }, + "firstperson_lefthand": { + "rotation": [5, 1, 3], + "translation": [-1.5, 4, 2.25], + "scale": [0.34, 0.34, 0.34] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [30, -135, 0], + "translation": [0.25, -0.25, 0], + "scale": [0.55164, 0.55164, 0.55164] + }, + "head": { + "translation": [0, -33, -1.5], + "scale": [1.56, 1.56, 1.56] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, -1.25, -19.75], + "scale": [2.46484, 2.46484, 2.46484] + } + }, + "groups": [ + 0, + 1, + { + "name": "group", + "origin": [8, 5, 14], + "color": 0, + "children": [2, 3, 4, 5, 6, 7, 8] + }, + { + "name": "group", + "origin": [2.5, 16.6, -0.5], + "color": 0, + "children": [9, 10, 11] + }, + { + "name": "group", + "origin": [2.5, 16.6, -0.5], + "color": 0, + "children": [12, 13, 14] + }, + { + "name": "group", + "origin": [2.5, 21.25, 7.4], + "color": 0, + "children": [ + 15, + 16, + 17, + { + "name": "group", + "origin": [2.5, 16.6, -0.5], + "color": 0, + "children": [18, 19, 20, 21] + } + ] + }, + { + "name": "group", + "origin": [2.5, 21.25, 7.4], + "color": 0, + "children": [ + 22, + 23, + 24, + 25, + 26, + 27, + { + "name": "group", + "origin": [-1.5, 9.01244, 10.09626], + "color": 0, + "children": [28, 29, 30, 31] + }, + 32 + ] + }, + { + "name": "group", + "origin": [2.5, 21.25, 7.4], + "color": 0, + "children": [ + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + { + "name": "group", + "origin": [2.5, 16.6, -0.5], + "color": 0, + "children": [42, 43, 44] + }, + 45 + ] + }, + { + "name": "group", + "origin": [2.5, 21.25, 7.4], + "color": 0, + "children": [ + 46, + 47, + 48, + 49, + 50, + 51, + { + "name": "group", + "origin": [-1.5, 9.01244, 10.09626], + "color": 0, + "children": [52, 53, 54, 55] + }, + 56 + ] + }, + { + "name": "group", + "origin": [2.5, 21.25, 7.4], + "color": 0, + "children": [ + 57, + 58, + { + "name": "group", + "origin": [2.5, 16.6, -0.5], + "color": 0, + "children": [59, 60, 61] + }, + 62 + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/lootbox/legendary_box.json b/src/main/resources/contents/omc_daily_events/models/lootbox/legendary_box.json new file mode 100644 index 000000000..69eca40f3 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/lootbox/legendary_box.json @@ -0,0 +1,1485 @@ +{ + "texture_size": [128, 128], + "textures": { + "0": "omc_daily_events:lootbox/legendary_box", + "particle": "omc_daily_events:lootbox/legendary_box" + }, + "elements": [ + { + "from": [-2, 0, 2], + "to": [18, 15, 14], + "faces": { + "north": {"uv": [3, 3.75, 5.5, 5.625], "texture": "#0"}, + "east": {"uv": [0, 5.875, 1.5, 7.75], "texture": "#0"}, + "south": {"uv": [0, 4, 2.5, 5.875], "texture": "#0"}, + "west": {"uv": [5.5, 6, 7, 7.875], "texture": "#0"}, + "up": {"uv": [8, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [3, 14.4, 2], + "to": [13, 19.4, 14], + "faces": { + "north": {"uv": [0.625, 4, 1.875, 4.625], "texture": "#0"}, + "east": {"uv": [0, 5.875, 1.5, 6.5], "texture": "#0"}, + "south": {"uv": [0.625, 4, 1.875, 4.625], "texture": "#0"}, + "west": {"uv": [5.5, 6, 7, 6.625], "texture": "#0"}, + "up": {"uv": [7.375, 4.5, 6.125, 3], "texture": "#0"}, + "down": {"uv": [6.75, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [-2, 0, 13.8], + "to": [18, 2.8, 14.8], + "faces": { + "north": {"uv": [3, 3.75, 5.5, 4], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.125, 6.125], "texture": "#0"}, + "south": {"uv": [0, 5.5, 2.5, 5.875], "texture": "#0"}, + "west": {"uv": [5.5, 6, 5.625, 6.25], "texture": "#0"}, + "up": {"uv": [5.5, 3.5, 3, 3.375], "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 4.625], "texture": "#0"} + } + }, + { + "from": [-2, 0, 1.2], + "to": [18, 2.8, 2.2], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, + "faces": { + "north": {"uv": [2.5, 5.5, 0, 5.875], "texture": "#0"}, + "east": {"uv": [0.125, 5.875, 0, 6.125], "texture": "#0"}, + "south": {"uv": [5.5, 3.75, 3, 4], "texture": "#0"}, + "west": {"uv": [5.625, 6, 5.5, 6.25], "texture": "#0"}, + "up": {"uv": [5.5, 3.375, 3, 3.5], "texture": "#0"}, + "down": {"uv": [8, 4.625, 5.5, 4.5], "texture": "#0"} + } + }, + { + "from": [17.5, 0, 2.7], + "to": [18.5, 2.8, 13.7], + "rotation": {"angle": 0, "axis": "y", "origin": [22, 1.4, 1.7]}, + "faces": { + "north": {"uv": [5.625, 6, 5.5, 6.35], "texture": "#0"}, + "east": {"uv": [1.875, 5.5, 0.5, 5.85], "texture": "#0"}, + "south": {"uv": [0.125, 5.875, 0, 6.125], "texture": "#0"}, + "west": {"uv": [5.5, 3.75, 3, 4], "texture": "#0"}, + "up": {"uv": [5.5, 3.375, 3, 3.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [8, 4.625, 5.5, 4.5], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [-2.5, 0, 2.7], + "to": [-1.5, 2.8, 13.7], + "rotation": {"angle": 0, "axis": "y", "origin": [-6, 1.4, 1.7]}, + "faces": { + "north": {"uv": [5.5, 6, 5.625, 6.35], "texture": "#0"}, + "east": {"uv": [3, 3.75, 5.5, 4], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.125, 6.125], "texture": "#0"}, + "west": {"uv": [0.5, 5.5, 1.875, 5.85], "texture": "#0"}, + "up": {"uv": [5.5, 3.5, 3, 3.375], "rotation": 90, "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 4.625], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [17.2, 10.3, 2], + "to": [19.2, 15.3, 14], + "rotation": {"angle": 22.5, "axis": "z", "origin": [18.5, 12.5, 8]}, + "faces": { + "north": {"uv": [3, 3.75, 3.25, 4.375], "texture": "#0"}, + "east": {"uv": [0, 5.875, 1.5, 6.5], "texture": "#0"}, + "south": {"uv": [0, 4, 0.25, 4.625], "texture": "#0"}, + "west": {"uv": [5.5, 6, 7, 6.625], "texture": "#0"}, + "up": {"uv": [5.75, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.75, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [14.2, 16, 2.1], + "to": [16.2, 21, 13.9], + "rotation": {"angle": 22.5, "axis": "z", "origin": [18.5, 12.5, 8]}, + "faces": { + "north": {"uv": [3, 3.75, 3.25, 4.375], "texture": "#0"}, + "east": {"uv": [0, 5.875, 1.5, 6.5], "texture": "#0"}, + "south": {"uv": [0, 4, 0.25, 4.625], "texture": "#0"}, + "west": {"uv": [5.5, 6, 7, 6.625], "texture": "#0"}, + "up": {"uv": [5.75, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.75, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [-0.2, 16, 2.1], + "to": [1.8, 21, 13.9], + "rotation": {"angle": -22.5, "axis": "z", "origin": [-2.5, 12.5, 8]}, + "faces": { + "north": {"uv": [3.25, 3.75, 3, 4.375], "texture": "#0"}, + "east": {"uv": [7, 6, 5.5, 6.625], "texture": "#0"}, + "south": {"uv": [0.25, 4, 0, 4.625], "texture": "#0"}, + "west": {"uv": [1.5, 5.875, 0, 6.5], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 5.75, 3], "texture": "#0"}, + "down": {"uv": [5.5, 4.5, 5.75, 6], "texture": "#0"} + } + }, + { + "from": [-3.2, 10.3, 2], + "to": [-1.2, 15.3, 14], + "rotation": {"angle": -22.5, "axis": "z", "origin": [-2.5, 12.5, 8]}, + "faces": { + "north": {"uv": [3.25, 3.75, 3, 4.375], "texture": "#0"}, + "east": {"uv": [7, 6, 5.5, 6.625], "texture": "#0"}, + "south": {"uv": [0.25, 4, 0, 4.625], "texture": "#0"}, + "west": {"uv": [1.5, 5.875, 0, 6.5], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 5.75, 3], "texture": "#0"}, + "down": {"uv": [5.5, 4.5, 5.75, 6], "texture": "#0"} + } + }, + { + "from": [17.30803, 10.86236, 13.3], + "to": [19.30803, 15.26236, 15.3], + "rotation": {"angle": 0, "axis": "z", "origin": [18.10803, 13.36236, 14.5]}, + "faces": { + "north": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "west": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "up": {"uv": [5.75, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.75, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [17.80803, 12.86236, 13.8], + "to": [18.80803, 17.26236, 14.8], + "rotation": {"angle": 0, "axis": "z", "origin": [18.10803, 13.36236, 14.5]}, + "faces": { + "north": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "west": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "up": {"uv": [5.625, 3.125, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.625, 4.5, 5.5, 4.625], "texture": "#0"} + } + }, + { + "from": [17.80803, 12.86236, 1.8], + "to": [18.80803, 17.26236, 2.8], + "rotation": {"angle": 0, "axis": "z", "origin": [18.10803, 13.36236, 14.5]}, + "faces": { + "north": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "west": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "up": {"uv": [5.625, 3.125, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.625, 4.5, 5.5, 4.625], "texture": "#0"} + } + }, + { + "from": [-2.89197, 12.86236, 1.8], + "to": [-1.89197, 17.26236, 2.8], + "rotation": {"angle": 0, "axis": "z", "origin": [18.10803, 13.36236, 14.5]}, + "faces": { + "north": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "west": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "up": {"uv": [5.625, 3.125, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.625, 4.5, 5.5, 4.625], "texture": "#0"} + } + }, + { + "from": [-2.89197, 12.86236, 13.9], + "to": [-1.89197, 17.26236, 14.9], + "rotation": {"angle": 0, "axis": "z", "origin": [18.10803, 13.36236, 14.5]}, + "faces": { + "north": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "west": {"uv": [0, 5.875, 0.125, 6.425], "texture": "#0"}, + "up": {"uv": [5.625, 3.125, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.625, 4.5, 5.5, 4.625], "texture": "#0"} + } + }, + { + "from": [17.40803, 16.36236, 13.2], + "to": [19.40803, 18.36236, 15.4], + "shade": false, + "rotation": {"angle": -45, "axis": "z", "origin": [18.40803, 17.56236, 14.3]}, + "faces": { + "north": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "east": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "up": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"} + } + }, + { + "from": [-3.30803, 10.86236, 13.3], + "to": [-1.30803, 15.26236, 15.3], + "rotation": {"angle": 0, "axis": "z", "origin": [-2.10803, 13.36236, 14.5]}, + "faces": { + "north": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "east": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "south": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "west": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 5.75, 3], "texture": "#0"}, + "down": {"uv": [5.5, 4.5, 5.75, 6], "texture": "#0"} + } + }, + { + "from": [-3.40803, 16.36236, 13.2], + "to": [-1.40803, 18.36236, 15.4], + "rotation": {"angle": 45, "axis": "z", "origin": [-2.40803, 17.56236, 14.3]}, + "faces": { + "north": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "east": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "up": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"} + } + }, + { + "from": [17.30803, 10.86236, 1.3], + "to": [19.30803, 15.26236, 3.3], + "rotation": {"angle": 0, "axis": "z", "origin": [18.10803, 13.36236, 2.5]}, + "faces": { + "north": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "south": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "west": {"uv": [0, 5.875, 0.25, 6.425], "texture": "#0"}, + "up": {"uv": [5.75, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [5.75, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [17.40803, 16.36236, 1.2], + "to": [19.40803, 18.36236, 3.4], + "rotation": {"angle": -45, "axis": "z", "origin": [18.40803, 17.56236, 2.3]}, + "faces": { + "north": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "east": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "up": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"} + } + }, + { + "from": [-3.30803, 10.86236, 1.3], + "to": [-1.30803, 15.26236, 3.3], + "rotation": {"angle": 0, "axis": "z", "origin": [-2.10803, 13.36236, 2.5]}, + "faces": { + "north": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "east": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "south": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "west": {"uv": [0.25, 5.875, 0, 6.425], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 5.75, 3], "texture": "#0"}, + "down": {"uv": [5.5, 4.5, 5.75, 6], "texture": "#0"} + } + }, + { + "from": [-3.40803, 16.36236, 1.2], + "to": [-1.40803, 18.36236, 3.4], + "rotation": {"angle": 45, "axis": "z", "origin": [-2.40803, 17.56236, 2.3]}, + "faces": { + "north": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "east": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "up": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"} + } + }, + { + "from": [-2.1, 10, 15], + "to": [18.1, 15, 17], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 7.5, 14.5]}, + "faces": { + "north": {"uv": [3, 3.75, 5.5, 4.375], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.25, 6.5], "texture": "#0"}, + "south": {"uv": [0, 4, 2.5, 4.625], "texture": "#0"}, + "west": {"uv": [5.5, 6, 5.75, 6.625], "texture": "#0"}, + "up": {"uv": [8, 3.25, 5.5, 3], "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 4.75], "texture": "#0"} + } + }, + { + "from": [-2.1, 10, -1], + "to": [18.1, 15, 1], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 7.5, 1.5]}, + "faces": { + "north": {"uv": [2.5, 4, 0, 4.625], "texture": "#0"}, + "east": {"uv": [0.25, 5.875, 0, 6.5], "texture": "#0"}, + "south": {"uv": [5.5, 3.75, 3, 4.375], "texture": "#0"}, + "west": {"uv": [5.75, 6, 5.5, 6.625], "texture": "#0"}, + "up": {"uv": [8, 3, 5.5, 3.25], "texture": "#0"}, + "down": {"uv": [8, 4.75, 5.5, 4.5], "texture": "#0"} + } + }, + { + "from": [-4, 0, 0], + "to": [1, 1, 5], + "faces": { + "north": {"uv": [1.5, 7.375, 2.125, 7.5], "texture": "#0"}, + "east": {"uv": [4.75, 7.75, 5.375, 7.875], "texture": "#0"}, + "south": {"uv": [8, 5.875, 8.625, 6], "texture": "#0"}, + "west": {"uv": [8.375, 3.875, 9, 4], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [2.125, 6.5, 1.5, 7.125], "texture": "#0"} + } + }, + { + "from": [-3, 1, 1], + "to": [0, 8, 4], + "faces": { + "north": {"uv": [2.5, 4, 2.875, 4.875], "texture": "#0"}, + "east": {"uv": [2.125, 5.875, 2.5, 6.75], "texture": "#0"}, + "south": {"uv": [1.875, 8, 2.25, 8.875], "texture": "#0"}, + "west": {"uv": [8, 1.875, 8.375, 2.75], "texture": "#0"}, + "up": {"uv": [5.25, 8.625, 4.875, 8.25], "texture": "#0"}, + "down": {"uv": [5.625, 8.25, 5.25, 8.625], "texture": "#0"} + } + }, + { + "from": [-3, 1, 12], + "to": [0, 8, 15], + "faces": { + "north": {"uv": [2.25, 8, 2.625, 8.875], "texture": "#0"}, + "east": {"uv": [2.625, 8, 3, 8.875], "texture": "#0"}, + "south": {"uv": [8, 2.75, 8.375, 3.625], "texture": "#0"}, + "west": {"uv": [3, 8, 3.375, 8.875], "texture": "#0"}, + "up": {"uv": [6, 8.625, 5.625, 8.25], "texture": "#0"}, + "down": {"uv": [6.375, 8.25, 6, 8.625], "texture": "#0"} + } + }, + { + "from": [-4, 0, 11], + "to": [1, 1, 16], + "faces": { + "north": {"uv": [8.375, 4, 9, 4.125], "texture": "#0"}, + "east": {"uv": [8.375, 4.125, 9, 4.25], "texture": "#0"}, + "south": {"uv": [8.375, 4.25, 9, 4.375], "texture": "#0"}, + "west": {"uv": [8.375, 4.375, 9, 4.5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 0.625, 8.375], "texture": "#0"} + } + }, + { + "from": [16, 1, 12], + "to": [19, 8, 15], + "faces": { + "north": {"uv": [3.375, 8, 3.75, 8.875], "texture": "#0"}, + "east": {"uv": [8, 3.625, 8.375, 4.5], "texture": "#0"}, + "south": {"uv": [3.75, 8, 4.125, 8.875], "texture": "#0"}, + "west": {"uv": [4.125, 8, 4.5, 8.875], "texture": "#0"}, + "up": {"uv": [6.75, 8.625, 6.375, 8.25], "texture": "#0"}, + "down": {"uv": [0.375, 8.375, 0, 8.75], "texture": "#0"} + } + }, + { + "from": [15, 0, 11], + "to": [20, 1, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 9, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 9, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.625, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [20, 0, 11], + "to": [21, 1, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 8.5, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 8.5, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.125, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.125, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [20, 0, 0], + "to": [21, 1, 5], + "faces": { + "north": {"uv": [8.375, 4.5, 8.5, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 8.5, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.125, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.125, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-5, 0, 0], + "to": [-4, 1, 5], + "faces": { + "north": {"uv": [8.375, 4.5, 8.5, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 8.5, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.125, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.125, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-5, 0, 11], + "to": [-4, 1, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 8.5, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 8.5, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [0.125, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.125, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [16, 1, 1], + "to": [19, 8, 4], + "faces": { + "north": {"uv": [8, 4.5, 8.375, 5.375], "texture": "#0"}, + "east": {"uv": [6.75, 8.125, 7.125, 9], "texture": "#0"}, + "south": {"uv": [7.125, 8.125, 7.5, 9], "texture": "#0"}, + "west": {"uv": [7.5, 8.125, 7.875, 9], "texture": "#0"}, + "up": {"uv": [0.75, 8.75, 0.375, 8.375], "texture": "#0"}, + "down": {"uv": [1.125, 8.375, 0.75, 8.75], "texture": "#0"} + } + }, + { + "from": [15, 0, 0], + "to": [20, 1, 5], + "faces": { + "north": {"uv": [8.375, 5, 9, 5.125], "texture": "#0"}, + "east": {"uv": [8.375, 5.125, 9, 5.25], "texture": "#0"}, + "south": {"uv": [8.375, 5.25, 9, 5.375], "texture": "#0"}, + "west": {"uv": [8.5, 8.125, 9.125, 8.25], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [8.625, 1.25, 8, 1.875], "texture": "#0"} + } + }, + { + "from": [15, 2, 11], + "to": [20, 3, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 9, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 9, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [8.625, 0.625, 8, 0], "texture": "#0"}, + "down": {"uv": [8.625, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-4, 2, 11], + "to": [1, 3, 16], + "faces": { + "north": {"uv": [8.375, 4, 9, 4.125], "texture": "#0"}, + "east": {"uv": [8.375, 4.125, 9, 4.25], "texture": "#0"}, + "south": {"uv": [8.375, 4.25, 9, 4.375], "texture": "#0"}, + "west": {"uv": [8.375, 4.375, 9, 4.5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 0.625, 8.375], "texture": "#0"} + } + }, + { + "from": [-4, 2, 0], + "to": [1, 3, 5], + "faces": { + "north": {"uv": [1.5, 7.375, 2.125, 7.5], "texture": "#0"}, + "east": {"uv": [4.75, 7.75, 5.375, 7.875], "texture": "#0"}, + "south": {"uv": [8, 5.875, 8.625, 6], "texture": "#0"}, + "west": {"uv": [8.375, 3.875, 9, 4], "texture": "#0"}, + "up": {"uv": [2.125, 6.5, 1.5, 5.875], "texture": "#0"}, + "down": {"uv": [2.125, 6.5, 1.5, 7.125], "texture": "#0"} + } + }, + { + "from": [15, 2, 0], + "to": [20, 3, 5], + "faces": { + "north": {"uv": [8.375, 5, 9, 5.125], "texture": "#0"}, + "east": {"uv": [8.375, 5.125, 9, 5.25], "texture": "#0"}, + "south": {"uv": [8.375, 5.25, 9, 5.375], "texture": "#0"}, + "west": {"uv": [8.5, 8.125, 9.125, 8.25], "texture": "#0"}, + "up": {"uv": [1.875, 8.625, 1.25, 8], "texture": "#0"}, + "down": {"uv": [8.625, 1.25, 8, 1.875], "texture": "#0"} + } + }, + { + "from": [15, 6, 11], + "to": [20, 7, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 9, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 9, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [8.625, 0.625, 8, 0], "texture": "#0"}, + "down": {"uv": [8.625, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-4, 6, 11], + "to": [1, 7, 16], + "faces": { + "north": {"uv": [8.375, 4, 9, 4.125], "texture": "#0"}, + "east": {"uv": [8.375, 4.125, 9, 4.25], "texture": "#0"}, + "south": {"uv": [8.375, 4.25, 9, 4.375], "texture": "#0"}, + "west": {"uv": [8.375, 4.375, 9, 4.5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 0.625, 8.375], "texture": "#0"} + } + }, + { + "from": [-4, 6, 0], + "to": [1, 7, 5], + "faces": { + "north": {"uv": [1.5, 7.375, 2.125, 7.5], "texture": "#0"}, + "east": {"uv": [4.75, 7.75, 5.375, 7.875], "texture": "#0"}, + "south": {"uv": [8, 5.875, 8.625, 6], "texture": "#0"}, + "west": {"uv": [8.375, 3.875, 9, 4], "texture": "#0"}, + "up": {"uv": [2.125, 6.5, 1.5, 5.875], "texture": "#0"}, + "down": {"uv": [2.125, 6.5, 1.5, 7.125], "texture": "#0"} + } + }, + { + "from": [15, 6, 0], + "to": [20, 7, 5], + "faces": { + "north": {"uv": [8.375, 5, 9, 5.125], "texture": "#0"}, + "east": {"uv": [8.375, 5.125, 9, 5.25], "texture": "#0"}, + "south": {"uv": [8.375, 5.25, 9, 5.375], "texture": "#0"}, + "west": {"uv": [8.5, 8.125, 9.125, 8.25], "texture": "#0"}, + "up": {"uv": [1.875, 8.625, 1.25, 8], "texture": "#0"}, + "down": {"uv": [8.625, 1.25, 8, 1.875], "texture": "#0"} + } + }, + { + "from": [5.5, 4, 14], + "to": [10.5, 8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [8, 5.375, 8.625, 5.875], "texture": "#0"}, + "east": {"uv": [8.375, 1.875, 8.625, 2.375], "texture": "#0"}, + "south": {"uv": [7.875, 8.125, 8.5, 8.625], "texture": "#0"}, + "west": {"uv": [8.375, 2.375, 8.625, 2.875], "texture": "#0"}, + "up": {"uv": [2.125, 7.375, 1.5, 7.125], "texture": "#0"}, + "down": {"uv": [5.375, 7.5, 4.75, 7.75], "texture": "#0"} + } + }, + { + "from": [6.5, 5, 15], + "to": [9.5, 8, 17], + "shade": false, + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [2.5, 4.875, 2.875, 5.375], "texture": "#0"}, + "east": {"uv": [8.375, 2.875, 8.625, 3.375], "texture": "#0"}, + "south": {"uv": [2.125, 6.875, 2.5, 7.25], "texture": "#0"}, + "west": {"uv": [8.375, 3.375, 8.625, 3.875], "texture": "#0"}, + "up": {"uv": [2.875, 5.625, 2.5, 5.375], "texture": "#0"}, + "down": {"uv": [2.5, 7.25, 2.125, 7.5], "texture": "#0"} + } + }, + { + "from": [6.5, 8, 15], + "to": [9.5, 11, 17], + "shade": false, + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [2.5, 4.875, 2.875, 5.375], "texture": "#0"}, + "east": {"uv": [8.375, 2.875, 8.625, 3.375], "texture": "#0"}, + "south": {"uv": [2.125, 6.75, 2.5, 7.125], "texture": "#0"}, + "west": {"uv": [8.375, 3.375, 8.625, 3.875], "texture": "#0"}, + "up": {"uv": [2.875, 5.625, 2.5, 5.375], "texture": "#0"}, + "down": {"uv": [2.5, 7.25, 2.125, 7.5], "texture": "#0"} + } + }, + { + "from": [7, 13.85, 13.85], + "to": [9, 15.85, 14.85], + "rotation": {"angle": -22.5, "axis": "x", "origin": [7.85, 14.9, 17.55]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [7, 15.85, 13.85], + "to": [9, 17.85, 14.85], + "rotation": {"angle": -22.5, "axis": "x", "origin": [7.85, 14.9, 17.55]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [7, 11.85, 13.85], + "to": [9, 13.85, 14.85], + "rotation": {"angle": -22.5, "axis": "x", "origin": [7.85, 14.9, 17.55]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [7, 11.82922, 14.81272], + "to": [9, 13.82922, 15.81272], + "rotation": {"angle": -45, "axis": "z", "origin": [8, 12.82922, 14.61272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [7.2, 3.12922, 15.21272], + "to": [9.2, 5.12922, 16.21272], + "rotation": {"angle": -45, "axis": "z", "origin": [8.2, 4.12922, 15.01272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [9.7, 9.82922, 15.21272], + "to": [11.7, 11.82922, 16.21272], + "rotation": {"angle": -45, "axis": "z", "origin": [10.7, 6.82922, 15.01272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [-1.3, 9.82922, 15.21272], + "to": [0.7, 11.82922, 16.21272], + "rotation": {"angle": -45, "axis": "z", "origin": [-0.3, 6.82922, 15.01272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [12.6, 11.62922, 14.51272], + "to": [14.6, 13.62922, 15.51272], + "rotation": {"angle": -45, "axis": "z", "origin": [13.6, 12.62922, 14.31272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [1.6, 11.62922, 14.51272], + "to": [3.6, 13.62922, 15.51272], + "rotation": {"angle": -45, "axis": "z", "origin": [2.6, 12.62922, 14.31272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [13, 11, 1.3], + "to": [14, 16, 14.8], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [8.625, 0, 8.75, 0.5], "texture": "#0"}, + "east": {"uv": [1.5, 7.5, 3.125, 8], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 1], "texture": "#0"}, + "west": {"uv": [3.125, 7.5, 4.75, 8], "texture": "#0"}, + "up": {"uv": [4.75, 9.625, 4.625, 8], "texture": "#0"}, + "down": {"uv": [4.875, 8.25, 4.75, 9.875], "texture": "#0"} + } + }, + { + "from": [13, 10, 14.8], + "to": [14, 15.5, 15.8], + "rotation": {"angle": -22.5, "axis": "x", "origin": [13.5, 13.25, 14.3]}, + "faces": { + "north": {"uv": [8.625, 0, 8.75, 0.5], "texture": "#0"}, + "east": {"uv": [1.5, 7.5, 3.125, 8], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 1], "texture": "#0"}, + "west": {"uv": [3.125, 7.5, 4.75, 8], "texture": "#0"}, + "up": {"uv": [4.75, 9.625, 4.625, 8], "texture": "#0"}, + "down": {"uv": [4.875, 8.25, 4.75, 9.875], "texture": "#0"} + } + }, + { + "from": [2, 10, 14.8], + "to": [3, 15.5, 15.8], + "rotation": {"angle": -22.5, "axis": "x", "origin": [13.5, 13.25, 14.3]}, + "faces": { + "north": {"uv": [8.625, 0, 8.75, 0.5], "texture": "#0"}, + "east": {"uv": [1.5, 7.5, 3.125, 8], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 1], "texture": "#0"}, + "west": {"uv": [3.125, 7.5, 4.75, 8], "texture": "#0"}, + "up": {"uv": [4.75, 9.625, 4.625, 8], "texture": "#0"}, + "down": {"uv": [4.875, 8.25, 4.75, 9.875], "texture": "#0"} + } + }, + { + "from": [2, 11, 1.3], + "to": [3, 16, 14.8], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [1.125, 8.375, 1.25, 8.875], "texture": "#0"}, + "east": {"uv": [7, 6.75, 8.625, 7.25], "texture": "#0"}, + "south": {"uv": [8.5, 8.25, 8.625, 8.75], "texture": "#0"}, + "west": {"uv": [7, 7.25, 8.625, 7.75], "texture": "#0"}, + "up": {"uv": [3, 5.625, 2.875, 4], "texture": "#0"}, + "down": {"uv": [4.625, 8, 4.5, 9.625], "texture": "#0"} + } + }, + { + "from": [-4, 8, 0], + "to": [20, 11, 16], + "faces": { + "north": {"uv": [7, 6, 10, 6.375], "texture": "#0"}, + "east": {"uv": [7, 7.75, 9, 8.125], "texture": "#0"}, + "south": {"uv": [7, 6.375, 10, 6.75], "texture": "#0"}, + "west": {"uv": [4.75, 7.875, 6.75, 8.25], "texture": "#0"}, + "up": {"uv": [3, 2, 0, 0], "texture": "#0"}, + "down": {"uv": [3, 2, 0, 4], "texture": "#0"} + } + }, + { + "from": [17.85614, 0.22209, 4], + "to": [18.85614, 3.22209, 12], + "rotation": {"angle": 22.5, "axis": "z", "origin": [19.35614, 4.72209, 8]}, + "faces": { + "north": {"uv": [7, 6, 7.125, 6.375], "texture": "#0"}, + "east": {"uv": [7.25, 7.75, 8.25, 8.125], "texture": "#0"}, + "south": {"uv": [7, 6.375, 7.125, 6.75], "texture": "#0"}, + "west": {"uv": [4.75, 7.875, 6.75, 8.25], "texture": "#0"}, + "up": {"uv": [0.125, 2, 0, 0], "texture": "#0"}, + "down": {"uv": [0.125, 2, 0, 4], "texture": "#0"} + } + }, + { + "from": [-2.85614, 0.22209, 4], + "to": [-1.85614, 3.22209, 12], + "rotation": {"angle": -22.5, "axis": "z", "origin": [-3.35614, 4.72209, 8]}, + "faces": { + "north": {"uv": [7.125, 6, 7, 6.375], "texture": "#0"}, + "east": {"uv": [6.75, 7.875, 4.75, 8.25], "texture": "#0"}, + "south": {"uv": [7.125, 6.375, 7, 6.75], "texture": "#0"}, + "west": {"uv": [8.25, 7.75, 7.25, 8.125], "texture": "#0"}, + "up": {"uv": [0, 2, 0.125, 0], "texture": "#0"}, + "down": {"uv": [0, 2, 0.125, 4], "texture": "#0"} + } + }, + { + "from": [-2.6, 12.4, 1.6], + "to": [18.6, 13.4, 15.2], + "faces": { + "north": {"uv": [7, 6.5, 10, 6.625], "texture": "#0"}, + "east": {"uv": [7, 7.875, 9, 8], "texture": "#0"}, + "south": {"uv": [7, 6.125, 10, 6.25], "texture": "#0"}, + "west": {"uv": [4.75, 8, 6.75, 8.125], "texture": "#0"}, + "up": {"uv": [7, 6.125, 10, 6.25], "texture": "#0"}, + "down": {"uv": [3, 2, 0, 4], "texture": "#0"} + } + }, + { + "from": [10.8, 18.6725, 8.5], + "to": [11.8, 19.7725, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.5, 2.125, 8.625], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [11.8, 18.6725, 7.5], + "to": [12.8, 19.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [10.8, 18.6725, 6.5], + "to": [11.8, 19.7725, 7.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [8.99289, 18.6725, 9.02132], + "to": [9.99289, 19.7725, 10.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [7.49289, 18.6725, 11.42132], + "to": [8.49289, 19.7725, 12.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [7.49289, 16.2725, 13.42132], + "to": [8.49289, 17.3725, 14.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [7.49289, 18.4725, 13.42132], + "to": [8.49289, 19.5725, 14.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [7.49289, 12.2725, 15.22132], + "to": [8.49289, 13.3725, 16.22132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.625, 0.5, 8.75, 0.6375], "texture": "#0"}, + "east": {"uv": [8.625, 0.5, 8.75, 0.6375], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 0.6375], "texture": "#0"}, + "west": {"uv": [8.625, 0.5, 8.75, 0.6375], "texture": "#0"}, + "up": {"uv": [8.625, 0.5, 8.75, 0.625], "texture": "#0"}, + "down": {"uv": [8.625, 0.5, 8.75, 0.625], "texture": "#0"} + } + }, + { + "from": [7.49289, 17.3725, 13.52132], + "to": [8.49289, 18.4725, 14.52132], + "rotation": {"angle": -45, "axis": "z", "origin": [7.99289, 17.9225, 13.92132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [7.49289, 18.6725, 3.42132], + "to": [8.49289, 19.7725, 4.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [11.49289, 18.6725, 7.42132], + "to": [12.49289, 19.7725, 8.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3.69289, 18.6725, 7.42132], + "to": [4.69289, 19.7725, 8.42132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [10.99289, 18.4725, 11.02132], + "to": [11.99289, 19.5725, 12.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3.99289, 18.4725, 11.02132], + "to": [4.99289, 19.5725, 12.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3.99289, 18.4725, 4.02132], + "to": [4.99289, 19.5725, 5.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [10.99289, 18.4725, 4.02132], + "to": [11.99289, 19.5725, 5.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [8.5, 18.6725, 7.5], + "to": [9.5, 19.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 18.6725, 7.5], + "to": [8.5, 19.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 19.8725, 7.5], + "to": [8.5, 20.9725, 8.5], + "rotation": {"angle": -45, "axis": "z", "origin": [8, 20.4225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 18.6725, 6.5], + "to": [8.5, 19.7725, 7.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 18.6725, 8.5], + "to": [8.5, 19.7725, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [6.5, 18.6725, 7.5], + "to": [7.5, 19.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [5.99289, 18.6725, 5.92132], + "to": [6.99289, 19.7725, 6.92132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [4.2, 18.6725, 6.5], + "to": [5.2, 19.7725, 7.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2.75, 8.375, 2.875, 8.5], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [4.2, 18.6725, 7.5], + "to": [5.2, 19.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [4.2, 18.6725, 8.5], + "to": [5.2, 19.7725, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [3.2, 18.6725, 7.5], + "to": [4.2, 19.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [8.99289, 18.6725, 5.92132], + "to": [9.99289, 19.7725, 6.92132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [10.8, 18.6725, 6.5], + "to": [11.8, 19.7725, 7.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [10.8, 18.6725, 8.5], + "to": [11.8, 19.7725, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [10.8, 18.6725, 7.5], + "to": [11.8, 19.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [11.8, 18.6725, 7.5], + "to": [12.8, 19.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [5.99289, 18.6725, 9.02132], + "to": [6.99289, 19.7725, 10.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 19.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [4.2, 18.6725, 8.5], + "to": [5.2, 19.7725, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [4.2, 18.6725, 7.5], + "to": [5.2, 19.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.5, 2.125, 8.625], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [3.2, 18.6725, 7.5], + "to": [4.2, 19.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [4.2, 18.6725, 6.5], + "to": [5.2, 19.7725, 7.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 19.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [9.83345, 18.6725, 9.83345], + "to": [10.83345, 19.7725, 10.83345], + "rotation": {"angle": -45, "axis": "y", "origin": [10.33345, 19.2225, 10.33345]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [9.43345, 19.2725, 9.83345], + "to": [10.43345, 20.3725, 10.83345], + "rotation": {"angle": -45, "axis": "z", "origin": [10.33345, 19.2225, 10.33345]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [9.43345, 19.2725, 5.23345], + "to": [10.43345, 20.3725, 6.23345], + "rotation": {"angle": -45, "axis": "z", "origin": [10.33345, 19.2225, 10.33345]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [4.53345, 19.2725, 5.23345], + "to": [5.53345, 20.3725, 6.23345], + "rotation": {"angle": -45, "axis": "z", "origin": [5.43345, 19.2225, 10.33345]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [4.53345, 19.2725, 9.83345], + "to": [5.53345, 20.3725, 10.83345], + "rotation": {"angle": -45, "axis": "z", "origin": [5.43345, 19.2225, 10.33345]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 20.9725, 7.5], + "to": [8.5, 22.0725, 8.5], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 21.5225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "thirdperson_lefthand": { + "translation": [0, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "firstperson_righthand": { + "translation": [2, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "firstperson_lefthand": { + "translation": [2, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "ground": { + "scale": [0.40039, 0.40039, 0.40039] + }, + "gui": { + "rotation": [22.75, -30.5, 0], + "scale": [0.49609, 0.49609, 0.49609] + }, + "head": { + "translation": [0, -30.35, 0], + "scale": [1.6, 1.6, 1.6] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -13.75], + "scale": [1.6, 1.6, 1.6] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + { + "name": "group", + "origin": [8, 15.2225, 8], + "color": 0, + "boneType": "", + "children": [64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/models/lootbox/rare_box.json b/src/main/resources/contents/omc_daily_events/models/lootbox/rare_box.json new file mode 100644 index 000000000..ac705d3eb --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/models/lootbox/rare_box.json @@ -0,0 +1,714 @@ +{ + "texture_size": [128, 128], + "textures": { + "0": "omc_daily_events:lootbox/rare_box", + "particle": "omc_daily_events:lootbox/rare_box" + }, + "elements": [ + { + "from": [-2, 0, 2], + "to": [18, 15, 14], + "faces": { + "north": {"uv": [3, 3.75, 5.5, 5.625], "texture": "#0"}, + "east": {"uv": [0, 5.875, 1.5, 7.75], "texture": "#0"}, + "south": {"uv": [0, 4, 2.5, 5.875], "texture": "#0"}, + "west": {"uv": [5.5, 6, 7, 7.875], "texture": "#0"}, + "up": {"uv": [8, 4.5, 5.5, 3], "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 6], "texture": "#0"} + } + }, + { + "from": [-2.1, 10, 15], + "to": [18.1, 15, 17], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 7.5, 14.5]}, + "faces": { + "north": {"uv": [3, 3.75, 5.5, 4.375], "texture": "#0"}, + "east": {"uv": [0, 5.875, 0.25, 6.5], "texture": "#0"}, + "south": {"uv": [0, 4, 2.5, 4.625], "texture": "#0"}, + "west": {"uv": [5.5, 6, 5.75, 6.625], "texture": "#0"}, + "up": {"uv": [8, 3.25, 5.5, 3], "texture": "#0"}, + "down": {"uv": [8, 4.5, 5.5, 4.75], "texture": "#0"} + } + }, + { + "from": [-2.1, 10, -1], + "to": [18.1, 15, 1], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 7.5, 1.5]}, + "faces": { + "north": {"uv": [2.5, 4, 0, 4.625], "texture": "#0"}, + "east": {"uv": [0.25, 5.875, 0, 6.5], "texture": "#0"}, + "south": {"uv": [5.5, 3.75, 3, 4.375], "texture": "#0"}, + "west": {"uv": [5.75, 6, 5.5, 6.625], "texture": "#0"}, + "up": {"uv": [8, 3, 5.5, 3.25], "texture": "#0"}, + "down": {"uv": [8, 4.75, 5.5, 4.5], "texture": "#0"} + } + }, + { + "from": [-4, 0, 0], + "to": [1, 1, 5], + "faces": { + "north": {"uv": [1.5, 7.375, 2.125, 7.5], "texture": "#0"}, + "east": {"uv": [4.75, 7.75, 5.375, 7.875], "texture": "#0"}, + "south": {"uv": [8, 5.875, 8.625, 6], "texture": "#0"}, + "west": {"uv": [8.375, 3.875, 9, 4], "texture": "#0"}, + "up": {"uv": [2.125, 6.5, 1.5, 5.875], "texture": "#0"}, + "down": {"uv": [2.125, 6.5, 1.5, 7.125], "texture": "#0"} + } + }, + { + "from": [-3, 1, 1], + "to": [0, 8, 4], + "faces": { + "north": {"uv": [2.5, 4, 2.875, 4.875], "texture": "#0"}, + "east": {"uv": [2.125, 5.875, 2.5, 6.75], "texture": "#0"}, + "south": {"uv": [1.875, 8, 2.25, 8.875], "texture": "#0"}, + "west": {"uv": [8, 1.875, 8.375, 2.75], "texture": "#0"}, + "up": {"uv": [5.25, 8.625, 4.875, 8.25], "texture": "#0"}, + "down": {"uv": [5.625, 8.25, 5.25, 8.625], "texture": "#0"} + } + }, + { + "from": [-3, 1, 12], + "to": [0, 8, 15], + "faces": { + "north": {"uv": [2.25, 8, 2.625, 8.875], "texture": "#0"}, + "east": {"uv": [2.625, 8, 3, 8.875], "texture": "#0"}, + "south": {"uv": [8, 2.75, 8.375, 3.625], "texture": "#0"}, + "west": {"uv": [3, 8, 3.375, 8.875], "texture": "#0"}, + "up": {"uv": [6, 8.625, 5.625, 8.25], "texture": "#0"}, + "down": {"uv": [6.375, 8.25, 6, 8.625], "texture": "#0"} + } + }, + { + "from": [-4, 0, 11], + "to": [1, 1, 16], + "faces": { + "north": {"uv": [8.375, 4, 9, 4.125], "texture": "#0"}, + "east": {"uv": [8.375, 4.125, 9, 4.25], "texture": "#0"}, + "south": {"uv": [8.375, 4.25, 9, 4.375], "texture": "#0"}, + "west": {"uv": [8.375, 4.375, 9, 4.5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 0.625, 8.375], "texture": "#0"} + } + }, + { + "from": [16, 1, 12], + "to": [19, 8, 15], + "faces": { + "north": {"uv": [3.375, 8, 3.75, 8.875], "texture": "#0"}, + "east": {"uv": [8, 3.625, 8.375, 4.5], "texture": "#0"}, + "south": {"uv": [3.75, 8, 4.125, 8.875], "texture": "#0"}, + "west": {"uv": [4.125, 8, 4.5, 8.875], "texture": "#0"}, + "up": {"uv": [6.75, 8.625, 6.375, 8.25], "texture": "#0"}, + "down": {"uv": [0.375, 8.375, 0, 8.75], "texture": "#0"} + } + }, + { + "from": [15, 0, 11], + "to": [20, 1, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 9, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 9, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [8.625, 0.625, 8, 0], "texture": "#0"}, + "down": {"uv": [8.625, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [16, 1, 1], + "to": [19, 8, 4], + "faces": { + "north": {"uv": [8, 4.5, 8.375, 5.375], "texture": "#0"}, + "east": {"uv": [6.75, 8.125, 7.125, 9], "texture": "#0"}, + "south": {"uv": [7.125, 8.125, 7.5, 9], "texture": "#0"}, + "west": {"uv": [7.5, 8.125, 7.875, 9], "texture": "#0"}, + "up": {"uv": [0.75, 8.75, 0.375, 8.375], "texture": "#0"}, + "down": {"uv": [1.125, 8.375, 0.75, 8.75], "texture": "#0"} + } + }, + { + "from": [15, 0, 0], + "to": [20, 1, 5], + "faces": { + "north": {"uv": [8.375, 5, 9, 5.125], "texture": "#0"}, + "east": {"uv": [8.375, 5.125, 9, 5.25], "texture": "#0"}, + "south": {"uv": [8.375, 5.25, 9, 5.375], "texture": "#0"}, + "west": {"uv": [8.5, 8.125, 9.125, 8.25], "texture": "#0"}, + "up": {"uv": [1.875, 8.625, 1.25, 8], "texture": "#0"}, + "down": {"uv": [8.625, 1.25, 8, 1.875], "texture": "#0"} + } + }, + { + "from": [15, 2, 11], + "to": [20, 3, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 9, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 9, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [8.625, 0.625, 8, 0], "texture": "#0"}, + "down": {"uv": [8.625, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-4, 2, 11], + "to": [1, 3, 16], + "faces": { + "north": {"uv": [8.375, 4, 9, 4.125], "texture": "#0"}, + "east": {"uv": [8.375, 4.125, 9, 4.25], "texture": "#0"}, + "south": {"uv": [8.375, 4.25, 9, 4.375], "texture": "#0"}, + "west": {"uv": [8.375, 4.375, 9, 4.5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 0.625, 8.375], "texture": "#0"} + } + }, + { + "from": [-4, 2, 0], + "to": [1, 3, 5], + "faces": { + "north": {"uv": [1.5, 7.375, 2.125, 7.5], "texture": "#0"}, + "east": {"uv": [4.75, 7.75, 5.375, 7.875], "texture": "#0"}, + "south": {"uv": [8, 5.875, 8.625, 6], "texture": "#0"}, + "west": {"uv": [8.375, 3.875, 9, 4], "texture": "#0"}, + "up": {"uv": [2.125, 6.5, 1.5, 5.875], "texture": "#0"}, + "down": {"uv": [2.125, 6.5, 1.5, 7.125], "texture": "#0"} + } + }, + { + "from": [15, 2, 0], + "to": [20, 3, 5], + "faces": { + "north": {"uv": [8.375, 5, 9, 5.125], "texture": "#0"}, + "east": {"uv": [8.375, 5.125, 9, 5.25], "texture": "#0"}, + "south": {"uv": [8.375, 5.25, 9, 5.375], "texture": "#0"}, + "west": {"uv": [8.5, 8.125, 9.125, 8.25], "texture": "#0"}, + "up": {"uv": [1.875, 8.625, 1.25, 8], "texture": "#0"}, + "down": {"uv": [8.625, 1.25, 8, 1.875], "texture": "#0"} + } + }, + { + "from": [15, 6, 11], + "to": [20, 7, 16], + "faces": { + "north": {"uv": [8.375, 4.5, 9, 4.625], "texture": "#0"}, + "east": {"uv": [8.375, 4.625, 9, 4.75], "texture": "#0"}, + "south": {"uv": [8.375, 4.75, 9, 4.875], "texture": "#0"}, + "west": {"uv": [8.375, 4.875, 9, 5], "texture": "#0"}, + "up": {"uv": [8.625, 0.625, 8, 0], "texture": "#0"}, + "down": {"uv": [8.625, 0.625, 8, 1.25], "texture": "#0"} + } + }, + { + "from": [-4, 6, 11], + "to": [1, 7, 16], + "faces": { + "north": {"uv": [8.375, 4, 9, 4.125], "texture": "#0"}, + "east": {"uv": [8.375, 4.125, 9, 4.25], "texture": "#0"}, + "south": {"uv": [8.375, 4.25, 9, 4.375], "texture": "#0"}, + "west": {"uv": [8.375, 4.375, 9, 4.5], "texture": "#0"}, + "up": {"uv": [0.625, 8.375, 0, 7.75], "texture": "#0"}, + "down": {"uv": [1.25, 7.75, 0.625, 8.375], "texture": "#0"} + } + }, + { + "from": [-4, 6, 0], + "to": [1, 7, 5], + "faces": { + "north": {"uv": [1.5, 7.375, 2.125, 7.5], "texture": "#0"}, + "east": {"uv": [4.75, 7.75, 5.375, 7.875], "texture": "#0"}, + "south": {"uv": [8, 5.875, 8.625, 6], "texture": "#0"}, + "west": {"uv": [8.375, 3.875, 9, 4], "texture": "#0"}, + "up": {"uv": [2.125, 6.5, 1.5, 5.875], "texture": "#0"}, + "down": {"uv": [2.125, 6.5, 1.5, 7.125], "texture": "#0"} + } + }, + { + "from": [15, 6, 0], + "to": [20, 7, 5], + "faces": { + "north": {"uv": [8.375, 5, 9, 5.125], "texture": "#0"}, + "east": {"uv": [8.375, 5.125, 9, 5.25], "texture": "#0"}, + "south": {"uv": [8.375, 5.25, 9, 5.375], "texture": "#0"}, + "west": {"uv": [8.5, 8.125, 9.125, 8.25], "texture": "#0"}, + "up": {"uv": [1.875, 8.625, 1.25, 8], "texture": "#0"}, + "down": {"uv": [8.625, 1.25, 8, 1.875], "texture": "#0"} + } + }, + { + "from": [5.5, 4, 14], + "to": [10.5, 8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [8, 5.375, 8.625, 5.875], "texture": "#0"}, + "east": {"uv": [8.375, 1.875, 8.625, 2.375], "texture": "#0"}, + "south": {"uv": [7.875, 8.125, 8.5, 8.625], "texture": "#0"}, + "west": {"uv": [8.375, 2.375, 8.625, 2.875], "texture": "#0"}, + "up": {"uv": [2.125, 7.375, 1.5, 7.125], "texture": "#0"}, + "down": {"uv": [5.375, 7.5, 4.75, 7.75], "texture": "#0"} + } + }, + { + "from": [6.5, 5, 15], + "to": [9.5, 9, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [2.5, 4.875, 2.875, 5.375], "texture": "#0"}, + "east": {"uv": [8.375, 2.875, 8.625, 3.375], "texture": "#0"}, + "south": {"uv": [2.125, 6.75, 2.5, 7.25], "texture": "#0"}, + "west": {"uv": [8.375, 3.375, 8.625, 3.875], "texture": "#0"}, + "up": {"uv": [2.875, 5.625, 2.5, 5.375], "texture": "#0"}, + "down": {"uv": [2.5, 7.25, 2.125, 7.5], "texture": "#0"} + } + }, + { + "from": [7.2, 13.85, 13.85], + "to": [9.2, 15.85, 14.85], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8.05, 14.9, 17.55]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [7.2, 11.82922, 14.81272], + "to": [9.2, 13.82922, 15.81272], + "rotation": {"angle": -45, "axis": "z", "origin": [8.2, 12.82922, 14.61272]}, + "faces": { + "north": {"uv": [6.75, 7.875, 7, 8.125], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.875, 1.25], "rotation": 90, "texture": "#0"}, + "south": {"uv": [1.25, 7.75, 1.5, 8], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.875, 1.125], "rotation": 270, "texture": "#0"}, + "up": {"uv": [8.875, 1, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"} + } + }, + { + "from": [7.5, 14.6725, 7.5], + "to": [8.5, 15.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [8.5, 14.6725, 7.5], + "to": [9.5, 15.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [10.8, 14.6725, 7.5], + "to": [11.8, 15.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [11.8, 14.6725, 7.5], + "to": [12.8, 15.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [10.8, 14.6725, 8.5], + "to": [11.8, 15.7725, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.5, 2.125, 8.625], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [10.8, 14.6725, 6.5], + "to": [11.8, 15.7725, 7.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [3.2, 14.6725, 7.5], + "to": [4.2, 15.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [4.2, 14.6725, 7.5], + "to": [5.2, 15.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.5, 2.125, 8.625], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [4.2, 14.6725, 8.5], + "to": [5.2, 15.7725, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [4.2, 14.6725, 6.5], + "to": [5.2, 15.7725, 7.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "east": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "west": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 7.875, 6.875, 8], "texture": "#0"} + } + }, + { + "from": [3.2, 14.6725, 7.5], + "to": [4.2, 15.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [4.2, 14.6725, 7.5], + "to": [5.2, 15.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [4.2, 14.6725, 6.5], + "to": [5.2, 15.7725, 7.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2.75, 8.375, 2.875, 8.5], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [4.2, 14.6725, 8.5], + "to": [5.2, 15.7725, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "west": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.75, 8, 6.875, 7.875], "texture": "#0"} + } + }, + { + "from": [10.8, 14.6725, 6.5], + "to": [11.8, 15.7725, 7.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [10.8, 14.6725, 7.5], + "to": [11.8, 15.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [11.8, 14.6725, 7.5], + "to": [12.8, 15.7725, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.625, 2.125, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [10.8, 14.6725, 8.5], + "to": [11.8, 15.7725, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [1.5, 8.625, 1.25, 8.75], "texture": "#0"}, + "east": {"uv": [8.625, 1.25, 8.75, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [8.75, 1, 8.625, 1.125], "texture": "#0"}, + "west": {"uv": [8.625, 1.375, 8.75, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "down": {"uv": [6.875, 8, 6.75, 7.875], "texture": "#0"} + } + }, + { + "from": [6.5, 14.6725, 7.5], + "to": [7.5, 15.7725, 8.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 14.6725, 6.5], + "to": [8.5, 15.7725, 7.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [7.5, 14.6725, 8.5], + "to": [8.5, 15.7725, 9.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 15.2225, 8]}, + "faces": { + "north": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "east": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "south": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 8.125, 2.125, 8.25], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "texture": "#0"} + } + }, + { + "from": [5.99289, 14.6725, 9.02132], + "to": [6.99289, 15.7725, 10.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 15.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [8.99289, 14.6725, 9.02132], + "to": [9.99289, 15.7725, 10.02132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 15.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [8.99289, 14.6725, 5.92132], + "to": [9.99289, 15.7725, 6.92132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 15.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [5.99289, 14.6725, 5.92132], + "to": [6.99289, 15.7725, 6.92132], + "rotation": {"angle": 0, "axis": "y", "origin": [7.29289, 15.2225, 10.12132]}, + "faces": { + "north": {"uv": [8.75, 1.375, 8.625, 1.25], "rotation": 180, "texture": "#0"}, + "east": {"uv": [8.625, 1, 8.75, 1.125], "texture": "#0"}, + "south": {"uv": [8.75, 1.25, 8.625, 1.125], "rotation": 180, "texture": "#0"}, + "west": {"uv": [1.25, 8.625, 1.5, 8.75], "texture": "#0"}, + "up": {"uv": [2, 8.25, 2.125, 8.375], "texture": "#0"}, + "down": {"uv": [6.875, 7.875, 6.75, 8], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [13, 11, 1.3], + "to": [14, 16, 14.8], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [8.625, 0, 8.75, 0.5], "texture": "#0"}, + "east": {"uv": [1.5, 7.5, 3.125, 8], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 1], "texture": "#0"}, + "west": {"uv": [3.125, 7.5, 4.75, 8], "texture": "#0"}, + "up": {"uv": [4.75, 9.625, 4.625, 8], "texture": "#0"}, + "down": {"uv": [4.875, 8.25, 4.75, 9.875], "texture": "#0"} + } + }, + { + "from": [13, 10, 14.8], + "to": [14, 15.5, 15.8], + "rotation": {"angle": -22.5, "axis": "x", "origin": [13.5, 13.25, 14.3]}, + "faces": { + "north": {"uv": [8.625, 0, 8.75, 0.5], "texture": "#0"}, + "east": {"uv": [1.5, 7.5, 3.125, 8], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 1], "texture": "#0"}, + "west": {"uv": [3.125, 7.5, 4.75, 8], "texture": "#0"}, + "up": {"uv": [4.75, 9.625, 4.625, 8], "texture": "#0"}, + "down": {"uv": [4.875, 8.25, 4.75, 9.875], "texture": "#0"} + } + }, + { + "from": [2, 10, 14.8], + "to": [3, 15.5, 15.8], + "rotation": {"angle": -22.5, "axis": "x", "origin": [13.5, 13.25, 14.3]}, + "faces": { + "north": {"uv": [8.625, 0, 8.75, 0.5], "texture": "#0"}, + "east": {"uv": [1.5, 7.5, 3.125, 8], "texture": "#0"}, + "south": {"uv": [8.625, 0.5, 8.75, 1], "texture": "#0"}, + "west": {"uv": [3.125, 7.5, 4.75, 8], "texture": "#0"}, + "up": {"uv": [4.75, 9.625, 4.625, 8], "texture": "#0"}, + "down": {"uv": [4.875, 8.25, 4.75, 9.875], "texture": "#0"} + } + }, + { + "from": [2, 11, 1.3], + "to": [3, 16, 14.8], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 0, 0]}, + "faces": { + "north": {"uv": [1.125, 8.375, 1.25, 8.875], "texture": "#0"}, + "east": {"uv": [7, 6.75, 8.625, 7.25], "texture": "#0"}, + "south": {"uv": [8.5, 8.25, 8.625, 8.75], "texture": "#0"}, + "west": {"uv": [7, 7.25, 8.625, 7.75], "texture": "#0"}, + "up": {"uv": [3, 5.625, 2.875, 4], "texture": "#0"}, + "down": {"uv": [4.625, 8, 4.5, 9.625], "texture": "#0"} + } + }, + { + "from": [-4, 8, 0], + "to": [20, 11, 16], + "faces": { + "north": {"uv": [7, 6, 10, 6.375], "texture": "#0"}, + "east": {"uv": [7, 7.75, 9, 8.125], "texture": "#0"}, + "south": {"uv": [7, 6.375, 10, 6.75], "texture": "#0"}, + "west": {"uv": [4.75, 7.875, 6.75, 8.25], "texture": "#0"}, + "up": {"uv": [3, 2, 0, 0], "texture": "#0"}, + "down": {"uv": [3, 2, 0, 4], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "thirdperson_lefthand": { + "translation": [0, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "firstperson_righthand": { + "translation": [2, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "firstperson_lefthand": { + "translation": [2, 1.75, 0], + "scale": [0.21875, 0.21875, 0.21875] + }, + "ground": { + "scale": [0.40039, 0.40039, 0.40039] + }, + "gui": { + "rotation": [22.75, -30.5, 0], + "scale": [0.53125, 0.53125, 0.53125] + }, + "head": { + "translation": [0, -30.35, 0], + "scale": [1.6, 1.6, 1.6] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -13.75], + "scale": [1.6, 1.6, 1.6] + } + } +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/nbt/head/coin.json b/src/main/resources/contents/omc_daily_events/nbt/head/coin.json new file mode 100644 index 000000000..d871b2f44 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/nbt/head/coin.json @@ -0,0 +1,12 @@ +{ + "components": { + "profile": { + "properties": [ + { + "name": "textures", + "value": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODE2MjBkYzcxYTMwMjBjOGVmMmJiOTNkZTIxMzhkOTExZTEyMmJjYTczZGQxZjdkNDYxYTY0NjU1YTBmNjFiOCJ9fX0=" + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/nbt/head/kraken.json b/src/main/resources/contents/omc_daily_events/nbt/head/kraken.json new file mode 100644 index 000000000..d611a0042 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/nbt/head/kraken.json @@ -0,0 +1,12 @@ +{ + "components": { + "profile": { + "properties": [ + { + "name": "textures", + "value": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTllZTIxNjE4NWM1NmUyOTFjOGVkZjQ3NTdiMWI3NTc3ZGY1ZjNmZDRiZmQzYTBjNzYwODRjODFkMjcwIn19fQ==" + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/nbt/head/leviathan.json b/src/main/resources/contents/omc_daily_events/nbt/head/leviathan.json new file mode 100644 index 000000000..6f3c56dbb --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/nbt/head/leviathan.json @@ -0,0 +1,12 @@ +{ + "components": { + "profile": { + "properties": [ + { + "name": "textures", + "value": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjZDA2ODI5NDZhNThlYTA1ZDEwODdjYzczMGY1ZmVlNzIzNDQzZDJlOWQxOWRmNGM3OTFmYjUxOTBmNTJmYSJ9fX0=" + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/nbt/head/poisson_steve.json b/src/main/resources/contents/omc_daily_events/nbt/head/poisson_steve.json new file mode 100644 index 000000000..962729fbe --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/nbt/head/poisson_steve.json @@ -0,0 +1,12 @@ +{ + "components": { + "profile": { + "properties": [ + { + "name": "textures", + "value": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmNkNWYwYTVkOGViMTdmZmYyYTc5MzA0MmJlNDIyYWNiYmFmNGI4OWIwODFhMzgzMTcxOGJjMGU5Yzc1YWJjOCJ9fX0=" + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/obese_crops.yml b/src/main/resources/contents/omc_daily_events/obese_crops.yml new file mode 100644 index 000000000..ac69c1eeb --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/obese_crops.yml @@ -0,0 +1,318 @@ +# assets from https://github.com/0rc1nus/Overweight-Farming + +# todo: obese crops, peeled versions +info: + namespace: omc_daily_events +items: + # --- Potato --- + obese_potato: + display_name: Patate obèse + graphics: + textures: + north: obese_crops/basic/potato/obese_potato_side + south: obese_crops/basic/potato/obese_potato_side + east: obese_crops/basic/potato/obese_potato_side + west: obese_crops/basic/potato/obese_potato_side + up: obese_crops/basic/potato/obese_potato_top + down: obese_crops/basic/potato/obese_potato_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + up_block: omc_daily_events:obese_potato_stem + hardness: 5 + break_tools_blacklist: + - WOODEN_HOE + - STONE_HOE + - IRON_HOE + - COPPER_HOE + break_tools_whitelist: + - NETHERITE_HOE + - DIAMOND_HOE + events_tools_whitelist: + - NETHERITE_HOE + - DIAMOND_HOE + events: + placed_block: + interact: + play_sound: + name: item.axe.strip + volume: 1.0 + pitch: 0.6 + category: MASTER + stop_previous: false + replace_block: + delay: 5 + from: omc_daily_events:obese_potato + to: omc_daily_events:peeled_obese_potato + replace_near_blocks: + radius: 2 + delay: 5 + from: omc_daily_events:obese_potato_stem + to: air + + obese_poisonous_potato: + display_name: Patate empoisonnée obèse + graphics: + textures: + north: obese_crops/basic/poisonous_potato/obese_poisonous_potato_side + south: obese_crops/basic/poisonous_potato/obese_poisonous_potato_side + east: obese_crops/basic/poisonous_potato/obese_poisonous_potato_side + west: obese_crops/basic/poisonous_potato/obese_poisonous_potato_side + up: obese_crops/basic/poisonous_potato/obese_poisonous_potato_top + down: obese_crops/basic/poisonous_potato/obese_poisonous_potato_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + up_block: omc_daily_events:obese_potato_stem + + obese_potato_stem: + display_name: Tige de patate obèse + graphics: + icon: obese_crops/basic/potato/obese_potato_stem + parent: block/cross + textures: + cross: obese_crops/basic/potato/obese_potato_stem + behaviours: + block: + placed_model: + type: REAL_WIRE + break_particles: ITEM + drop_when_mined: false + + # --- Baked potato --- + obese_baked_potato: + display_name: Patate cuite obèse + graphics: + textures: + north: obese_crops/basic/baked_potato/obese_baked_potato_side_2 + south: obese_crops/basic/baked_potato/obese_baked_potato_side_1 + east: obese_crops/basic/baked_potato/obese_baked_potato_side_2 + west: obese_crops/basic/baked_potato/obese_baked_potato_side_1 + up: obese_crops/basic/baked_potato/obese_baked_potato_top + down: obese_crops/basic/baked_potato/obese_baked_potato_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + + + # --- Carrot --- + obese_carrot: + display_name: Carotte obèse + graphics: + textures: + north: obese_crops/basic/carrot/obese_carrot_side + south: obese_crops/basic/carrot/obese_carrot_side + east: obese_crops/basic/carrot/obese_carrot_side + west: obese_crops/basic/carrot/obese_carrot_side + up: obese_crops/basic/carrot/obese_carrot_top + down: obese_crops/basic/carrot/obese_carrot_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + up_block: omc_daily_events:obese_carrot_stem + + + + obese_carrot_stem: + display_name: Tige de carotte obèse + graphics: + icon: obese_crops/basic/carrot/obese_carrot_stem + parent: block/cross + textures: + cross: obese_crops/basic/carrot/obese_carrot_stem + behaviours: + block: + placed_model: + type: REAL_WIRE + break_particles: ITEM + drop_when_mined: false + + # --- Beetroot --- + obese_beetroot: + display_name: Bétrave obèse + graphics: + textures: + north: obese_crops/basic/beetroot/obese_beetroot_side + south: obese_crops/basic/beetroot/obese_beetroot_side + east: obese_crops/basic/beetroot/obese_beetroot_side + west: obese_crops/basic/beetroot/obese_beetroot_side + up: obese_crops/basic/beetroot/obese_beetroot_top + down: obese_crops/basic/beetroot/obese_beetroot_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + up_block: omc_daily_events:obese_beetroot_stem + + obese_beetroot_stem: + display_name: Tige de bétrave obèse + graphics: + icon: obese_crops/basic/beetroot/obese_beetroot_stem + parent: block/cross + textures: + cross: obese_crops/basic/beetroot/obese_beetroot_stem + behaviours: + block: + placed_model: + type: REAL_WIRE + break_particles: ITEM + drop_when_mined: false + + # --- Nether Wart --- + obese_nether_wart: + display_name: Verrue du nether obèse + graphics: + textures: + north: obese_crops/basic/nether_wart/obese_nether_wart_side + south: obese_crops/basic/nether_wart/obese_nether_wart_side + east: obese_crops/basic/nether_wart/obese_nether_wart_side + west: obese_crops/basic/nether_wart/obese_nether_wart_side + up: obese_crops/basic/nether_wart/obese_nether_wart_top + down: obese_crops/basic/nether_wart/obese_nether_wart_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + up_block: omc_daily_events:obese_nether_wart_stem + + obese_nether_wart_stem: + display_name: Tige de verrue du nether obèse + graphics: + icon: obese_crops/basic/nether_wart/obese_nether_wart_stem + parent: block/cross + textures: + cross: obese_crops/basic/nether_wart/obese_nether_wart_stem + behaviours: + block: + placed_model: + type: REAL_WIRE + break_particles: ITEM + drop_when_mined: false + + # --- Onion --- + obese_onion: + display_name: Oignon obèse + graphics: + textures: + north: obese_crops/basic/onion/obese_onion_side + south: obese_crops/basic/onion/obese_onion_side + east: obese_crops/basic/onion/obese_onion_side + west: obese_crops/basic/onion/obese_onion_side + up: obese_crops/basic/onion/obese_onion_top + down: obese_crops/basic/onion/obese_onion_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + + # --- Golden Apple --- + obese_golden_apple: + display_name: Pomme dorée obèse + graphics: + textures: + north: obese_crops/basic/golden_apple/obese_golden_apple_side + south: obese_crops/basic/golden_apple/obese_golden_apple_side + east: obese_crops/basic/golden_apple/obese_golden_apple_side + west: obese_crops/basic/golden_apple/obese_golden_apple_side + up: obese_crops/basic/golden_apple/obese_golden_apple_top + down: obese_crops/basic/golden_apple/obese_golden_apple_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + up_block: omc_daily_events:obese_golden_apple_stem + + obese_golden_apple_stem: + display_name: Tige de pomme dorée obèse + graphics: + icon: obese_crops/basic/golden_apple/obese_golden_apple_stem + parent: block/cross + textures: + cross: obese_crops/basic/golden_apple/obese_golden_apple_stem + behaviours: + block: + placed_model: + type: REAL_WIRE + break_particles: ITEM + drop_when_mined: false + + # PEELED VERSIONS + # --- Peeled Potato --- + peeled_obese_potato: + display_name: Patate épluchée obèse + graphics: + textures: + north: obese_crops/peeled/potato/peeled_obese_potato + south: obese_crops/peeled/potato/peeled_obese_potato + east: obese_crops/peeled/potato/peeled_obese_potato + west: obese_crops/peeled/potato/peeled_obese_potato + up: obese_crops/peeled/potato/peeled_obese_potato + down: obese_crops/peeled/potato/peeled_obese_potato + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + + # --- Peeled Beetroot--- + peeled_beetroot_potato: + display_name: Bétrave épluchée obèse + graphics: + textures: + north: obese_crops/peeled/beetroot/peeled_obese_beetroot + south: obese_crops/peeled/beetroot/peeled_obese_beetroot + east: obese_crops/peeled/beetroot/peeled_obese_beetroot + west: obese_crops/peeled/beetroot/peeled_obese_beetroot + up: obese_crops/peeled/beetroot/peeled_obese_beetroot + down: obese_crops/peeled/beetroot/peeled_obese_beetroot + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + + # --- Peeled Carrot--- + peeled_carrot_potato: + display_name: Carotte épluchée obèse + graphics: + textures: + north: obese_crops/peeled/carrot/peeled_obese_carrot_side + south: obese_crops/peeled/carrot/peeled_obese_carrot_side + east: obese_crops/peeled/carrot/peeled_obese_carrot_side + west: obese_crops/peeled/carrot/peeled_obese_carrot_side + up: obese_crops/peeled/carrot/peeled_obese_carrot_top + down: obese_crops/peeled/carrot/peeled_obese_carrot_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM + + # --- Peeled Onion--- + peeled_onion_potato: + display_name: Oignon épluché obèse + graphics: + textures: + north: obese_crops/peeled/onion/peeled_obese_onion_side + south: obese_crops/peeled/onion/peeled_obese_onion_side + east: obese_crops/peeled/onion/peeled_obese_onion_side + west: obese_crops/peeled/onion/peeled_obese_onion_side + up: obese_crops/peeled/onion/peeled_obese_onion_top + down: obese_crops/peeled/onion/peeled_obese_onion_bottom + behaviours: + block: + placed_model: + type: REAL_NOTE + break_particles: ITEM \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/resourcepack.assets.minecraft.textures.environment.celestial.moon/full_moon.png b/src/main/resources/contents/omc_daily_events/resourcepack.assets.minecraft.textures.environment.celestial.moon/full_moon.png new file mode 100644 index 000000000..a97e7272f Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/resourcepack.assets.minecraft.textures.environment.celestial.moon/full_moon.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_armor_layer_1.png b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_armor_layer_1.png new file mode 100644 index 000000000..c0f2dd47d Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_armor_layer_1.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_armor_layer_2.png b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_armor_layer_2.png new file mode 100644 index 000000000..8c07fd7e1 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_armor_layer_2.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_boots.png b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_boots.png new file mode 100644 index 000000000..371270e6c Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_boots.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_chestplate.png b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_chestplate.png new file mode 100644 index 000000000..930c7bbf4 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_chestplate.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_helmet.png b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_helmet.png new file mode 100644 index 000000000..27b7578b2 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_helmet.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_leggings.png b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_leggings.png new file mode 100644 index 000000000..7d3cc9cde Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/armor/ancient_fishing/ancient_leggings.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/fisherman_props/fisherman.png b/src/main/resources/contents/omc_daily_events/textures/fisherman_props/fisherman.png new file mode 100644 index 000000000..aef4e3edb Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/fisherman_props/fisherman.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/lootbox/epic_box.png b/src/main/resources/contents/omc_daily_events/textures/lootbox/epic_box.png new file mode 100644 index 000000000..4db6e56e4 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/lootbox/epic_box.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation.png b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation.png new file mode 100644 index 000000000..c4f4560ad Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation.png.mcmeta b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation.png.mcmeta new file mode 100644 index 000000000..891fa8840 --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation.png.mcmeta @@ -0,0 +1,20 @@ +{ + "animation": { + "frames": [ + {"index": 0, "time": 2}, + {"index": 1, "time": 2}, + {"index": 2, "time": 2}, + {"index": 3, "time": 2}, + {"index": 4, "time": 2}, + {"index": 5, "time": 2}, + {"index": 6, "time": 2}, + {"index": 7, "time": 2}, + {"index": 8, "time": 2}, + {"index": 9, "time": 2}, + {"index": 10, "time": 2}, + {"index": 11, "time": 2}, + {"index": 12, "time": 2}, + {"index": 13, "time": 2} + ] + } +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation_2.png b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation_2.png new file mode 100644 index 000000000..dfb66d430 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation_2.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation_2.png.mcmeta b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation_2.png.mcmeta new file mode 100644 index 000000000..02e5a3fab --- /dev/null +++ b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_animation_2.png.mcmeta @@ -0,0 +1,25 @@ +{ + "animation": { + "frames": [ + {"index": 0, "time": 2}, + {"index": 1, "time": 2}, + {"index": 2, "time": 2}, + {"index": 3, "time": 2}, + {"index": 4, "time": 2}, + {"index": 5, "time": 2}, + {"index": 6, "time": 2}, + {"index": 7, "time": 2}, + {"index": 8, "time": 2}, + {"index": 9, "time": 2}, + {"index": 10, "time": 2}, + {"index": 11, "time": 2}, + {"index": 12, "time": 2}, + {"index": 13, "time": 2}, + {"index": 14, "time": 2}, + {"index": 15, "time": 2}, + {"index": 16, "time": 2}, + {"index": 17, "time": 2}, + {"index": 18, "time": 2} + ] + } +} \ No newline at end of file diff --git a/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_chest.png b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_chest.png new file mode 100644 index 000000000..b7e0dc8aa Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/lootbox/fishing_furniture/fishing_furniture_chest.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/lootbox/legendary_box.png b/src/main/resources/contents/omc_daily_events/textures/lootbox/legendary_box.png new file mode 100644 index 000000000..b9e3985a4 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/lootbox/legendary_box.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/lootbox/rare_box.png b/src/main/resources/contents/omc_daily_events/textures/lootbox/rare_box.png new file mode 100644 index 000000000..787751fb3 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/lootbox/rare_box.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_bottom.png new file mode 100644 index 000000000..bfe49e9c9 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_bottom.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_side_1.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_side_1.png new file mode 100644 index 000000000..238834666 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_side_1.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_side_2.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_side_2.png new file mode 100644 index 000000000..85790c508 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_side_2.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_top.png new file mode 100644 index 000000000..a4c08937d Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/baked_potato/obese_baked_potato_top.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/beetroot/obese_beetroot_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/beetroot/obese_beetroot_bottom.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/beetroot/obese_beetroot_bottom.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/beetroot/obese_beetroot_bottom.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/beetroot/obese_beetroot_side.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/beetroot/obese_beetroot_side.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/beetroot/obese_beetroot_side.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/beetroot/obese_beetroot_side.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/beetroot/obese_beetroot_stem.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/beetroot/obese_beetroot_stem.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/beetroot/obese_beetroot_stem.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/beetroot/obese_beetroot_stem.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/beetroot/obese_beetroot_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/beetroot/obese_beetroot_top.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/beetroot/obese_beetroot_top.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/beetroot/obese_beetroot_top.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/carrot/obese_carrot_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/carrot/obese_carrot_bottom.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/carrot/obese_carrot_bottom.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/carrot/obese_carrot_bottom.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/carrot/obese_carrot_side.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/carrot/obese_carrot_side.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/carrot/obese_carrot_side.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/carrot/obese_carrot_side.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/carrot/obese_carrot_stem.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/carrot/obese_carrot_stem.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/carrot/obese_carrot_stem.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/carrot/obese_carrot_stem.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/carrot/obese_carrot_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/carrot/obese_carrot_top.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/carrot/obese_carrot_top.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/carrot/obese_carrot_top.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_bottom.png new file mode 100644 index 000000000..70dcbb838 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_bottom.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_side.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_side.png new file mode 100644 index 000000000..6d1c06231 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_side.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_stem.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_stem.png new file mode 100644 index 000000000..3a01ce2c6 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_stem.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_top.png new file mode 100644 index 000000000..c5a87b6a6 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/golden_apple/obese_golden_apple_top.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_bottom.png new file mode 100644 index 000000000..3ed6e6ef1 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_bottom.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_side.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_side.png new file mode 100644 index 000000000..6c7f1f062 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_side.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_stem.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_stem.png new file mode 100644 index 000000000..af3b9e872 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_stem.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_top.png new file mode 100644 index 000000000..b98d71560 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/nether_wart/obese_nether_wart_top.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/onion/obese_onion_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/onion/obese_onion_bottom.png new file mode 100644 index 000000000..99d458408 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/onion/obese_onion_bottom.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/onion/obese_onion_side.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/onion/obese_onion_side.png new file mode 100644 index 000000000..8be46390f Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/onion/obese_onion_side.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/onion/obese_onion_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/onion/obese_onion_top.png new file mode 100644 index 000000000..42b9e299f Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/onion/obese_onion_top.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/poissonous_potato/obese_poisonous_potato_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/poisonous_potato/obese_poisonous_potato_bottom.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/poissonous_potato/obese_poisonous_potato_bottom.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/poisonous_potato/obese_poisonous_potato_bottom.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/poissonous_potato/obese_poisonous_potato_side.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/poisonous_potato/obese_poisonous_potato_side.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/poissonous_potato/obese_poisonous_potato_side.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/poisonous_potato/obese_poisonous_potato_side.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/poissonous_potato/obese_poisonous_potato_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/poisonous_potato/obese_poisonous_potato_top.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/poissonous_potato/obese_poisonous_potato_top.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/poisonous_potato/obese_poisonous_potato_top.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/potato/obese_potato_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/potato/obese_potato_bottom.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/potato/obese_potato_bottom.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/potato/obese_potato_bottom.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/potato/obese_potato_side.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/potato/obese_potato_side.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/potato/obese_potato_side.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/potato/obese_potato_side.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/potato/obese_potato_stem.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/potato/obese_potato_stem.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/potato/obese_potato_stem.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/potato/obese_potato_stem.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/potato/obese_potato_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/potato/obese_potato_top.png similarity index 100% rename from src/main/resources/contents/omc_daily_events/textures/obese_crops/potato/obese_potato_top.png rename to src/main/resources/contents/omc_daily_events/textures/obese_crops/basic/potato/obese_potato_top.png diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/beetroot/peeled_obese_beetroot.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/beetroot/peeled_obese_beetroot.png new file mode 100644 index 000000000..89fd75bc5 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/beetroot/peeled_obese_beetroot.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/carrot/peeled_obese_carrot_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/carrot/peeled_obese_carrot_bottom.png new file mode 100644 index 000000000..57177b16f Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/carrot/peeled_obese_carrot_bottom.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/carrot/peeled_obese_carrot_side.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/carrot/peeled_obese_carrot_side.png new file mode 100644 index 000000000..435f7b090 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/carrot/peeled_obese_carrot_side.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/carrot/peeled_obese_carrot_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/carrot/peeled_obese_carrot_top.png new file mode 100644 index 000000000..f8e15b687 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/carrot/peeled_obese_carrot_top.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/onion/peeled_obese_onion_bottom.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/onion/peeled_obese_onion_bottom.png new file mode 100644 index 000000000..d41faa8c9 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/onion/peeled_obese_onion_bottom.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/onion/peeled_obese_onion_side.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/onion/peeled_obese_onion_side.png new file mode 100644 index 000000000..3ac655f98 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/onion/peeled_obese_onion_side.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/onion/peeled_obese_onion_top.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/onion/peeled_obese_onion_top.png new file mode 100644 index 000000000..0db8777a9 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/onion/peeled_obese_onion_top.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/potato/peeled_obese_potato.png b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/potato/peeled_obese_potato.png new file mode 100644 index 000000000..219470ad2 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/obese_crops/peeled/potato/peeled_obese_potato.png differ diff --git a/src/main/resources/contents/omc_daily_events/textures/other/tenders.png b/src/main/resources/contents/omc_daily_events/textures/other/tenders.png new file mode 100644 index 000000000..11f68bbe7 Binary files /dev/null and b/src/main/resources/contents/omc_daily_events/textures/other/tenders.png differ diff --git a/src/main/resources/translations/default/dailyevents.properties b/src/main/resources/translations/default/dailyevents.properties new file mode 100644 index 000000000..5f60c97fd --- /dev/null +++ b/src/main/resources/translations/default/dailyevents.properties @@ -0,0 +1,79 @@ +feature.dailyevents.bloodynight.name=Nuit Sanglante +feature.dailyevents.goldenharvest.name=Moisson dorée +feature.dailyevents.miraculousfishing.name=Pêche miraculeuse + +feature.dailyevents.bloodynight.lore=La nuit reste d'être sanglante... \ +
Protégez-vous, battez-vous, vous allez subire différentes vagues \ +
et vous aurez surement un gros boss à battre à plusieurs +feature.dailyevents.goldenharvest.lore=Ça risque d'être sportif \ +
Attendez vous aux fermes qui tournerons au plein régime ! \ +
Bénéficiez de plusieures nouvelles ressources et de plusieures surprises +feature.dailyevents.miraculousfishing.lore=Vivez une grande session pêche ! \ +
Attention les Monstres des Mers vous attenderons avec impatience \ +
pour vous sautez dessus! \ +
Mais vous risquerez d'avoir plusieures bonnes surprises si vous êtes chanceux + +feature.dailyevents.bloodynight.toast.start=La Nuit Sanglante a débutée ! +feature.dailyevents.bloodynight.toast.end=Le calvaire de la Nuit Sanglante s'est arrêté + +feature.dailyevents.goldenharvest.toast.start=La Moisson dorée débarque dans vos granges ! +feature.dailyevents.goldenharvest.toast.end=La Moisson dorée s'est arrêtée ! + +feature.dailyevents.miraculousfishing.toast.start=La Pêche miraculeuse est ouverte ! +feature.dailyevents.miraculousfishing.toast.end=La Pêche miraculeuse est partie + +feature.dailyevents.toast.beginning_event_in_world=Un évenement va commencer dans votre monde dans %1$ss ! +feature.dailyevents.toast.beginning_event_out_world=Un évenement va commencer dans %1$ss ! + +feature.dailyevents.broadcast.soon=*un évènement commence à se rapprocher de notre monde...* + +feature.dailyevents.miraculousfishing.broadcast.start= \ +
\ +
PËCHE MIRACLEUSE ! La grande session a commencé !\ +
*sortez vous canne à pêche et découvrez les mystères des lacs*\ +
\ +
+feature.dailyevents.miraculousfishing.broadcast.end= \ +
\ +
PËCHE MIRACLEUSE ! La bénédiction est finie! \ +
*réjouissez vous de vos captures!*\ +
\ +
+ +feature.dailyevents.bloodynight.broadcast.start= \ +
\ +
NUIT SANGLANTE ! Le bain de sang commence !\ +
*sortez vos armes et combattez les vagues de monstres*\ +
\ +
+feature.dailyevents.bloodynight.broadcast.end= \ +
\ +
NUIT SANGLANTE ! La calamité a pris fin ! \ +
*retour à un monde calme et paisible*\ +
\ +
+ +feature.dailyevents.goldenharvest.broadcast.start= \ +
\ +
MOISSON DOREE ! Les cultures sont désormais bénie !\ +
*trouvez des mutations de cultures, et d'autres surprises...*\ +
\ +
+feature.dailyevents.goldenharvest.broadcast.end= \ +
\ +
MOISSON DOREE ! La productivité des cultures s'arretent ! \ +
*stocker, vendez vos ressources que vous avec pu farmer*\ +
\ +
+ +# ** Pêche miraculeuse ** +feature.dailyevents.miraculousfishing.lootbox.fishing_furniture.name=Boîte d'équipement de pêche +feature.dailyevents.miraculousfishing.lootbox.rare_fishing_treasure.name=Trésor de pêche rare +feature.dailyevents.miraculousfishing.lootbox.epic_fishing_treasure.name=Trésor de pêche épique +feature.dailyevents.miraculousfishing.lootbox.legendary_fishing_treasure.name=Trésor de pêche légendaire + +feature.dailyevents.miraculousfishing.loottable.get=Vous avez pêché %1$s objets ! + +feature.dailyevents.miraculousfishing.eat_kebab_fermented.smelt=Beuuurk, ça pue ! +feature.dailyevents.miraculousfishing.eat_kebab_fermented.boat=Votre bateau a coulé. +feature.dailyevents.miraculousfishing.eat_kebab_fermented.broadcast=[a] PROUT !!! %1$s a pété. Beuurk ! \ No newline at end of file diff --git a/src/main/resources/translations/default/events.properties b/src/main/resources/translations/default/events.properties index 209220f0e..0c087ed92 100644 --- a/src/main/resources/translations/default/events.properties +++ b/src/main/resources/translations/default/events.properties @@ -1,6 +1,9 @@ feature.events.calendar.unknown_phase=Inconnu feature.events.calendar.title=Calendrier Evenementiel feature.events.calendar.weekend_event_name=Evenement du Weekend +feature.events.calendar.start_in=Commence dans %1$s +feature.events.calendar.start_date=Date de début : %1$s à %2$s +feature.events.calendar.end_date=Date de fin : %1$s à %2$s feature.events.calendar.phases=Phases : feature.events.calendar.phase.line=- %1$s le %2$s à %3$s diff --git a/src/main/resources/translations/default/main.properties b/src/main/resources/translations/default/main.properties index c18968f81..9d00a7b30 100644 --- a/src/main/resources/translations/default/main.properties +++ b/src/main/resources/translations/default/main.properties @@ -1,6 +1,14 @@ # Language file for the plugin # Native language: French # Do not use color codes in this file if there is an agument +# * KEY DE TEST +test=TESTTTT + +# ** UTILS ** +utils.world.overworld=l'Overworld +utils.world.nether=le Nether +utils.world.end=l'End +utils.world.dream=les Rêves # ** MESSAGES ** messages.global.cannot_do_this=Vous n'avez pas le droit de faire ceci.