This commit is contained in:
LordMZTE 2022-10-10 20:38:11 +02:00
commit b25764ea40
Signed by: LordMZTE
GPG key ID: B64802DC33A64FF6
202 changed files with 904 additions and 0 deletions

39
.drone.yml Normal file
View file

@ -0,0 +1,39 @@
kind: pipeline
type: docker
steps:
- name: release
image: debian:bullseye
commands:
- apt update
- apt install -y
curl
jq
libarchive-dev
libcurl4-openssl-dev
pkgconf
xz-utils
- mkdir -p zig
- cd zig
# this always downloads the latest zig
- curl -o zig.tar.xz $(curl 'https://ziglang.org/download/index.json' | jq -r '.master."x86_64-linux".tarball')
- tar xf zig.tar.xz
- mv zig-linux*/* .
- export PATH="$PATH:$(pwd)"
- cd ..
- ./build.zig
- name: publish
image: plugins/gitea-release
settings:
base_url: https://git.tilera.org
api_key:
from_secret: gitea_token
note: CHANGELOG.md
title: tag-${DRONE_TAG}
files:
- build/mineteck-reloaded-*.zip
when:
event: tag
depends_on:
- release

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
build/

6
.prettierrc.json5 Normal file
View file

@ -0,0 +1,6 @@
// Formatter configuration for the KubeJS scripts.
{
tabWidth: 4,
trailingComma: "always",
}

423
build.zig Executable file
View file

@ -0,0 +1,423 @@
//usr/bin/env zig run $0 -lc `pkgconf --libs libarchive libcurl`; exit
// This script requires a zig compiler, libarchive and libcurl to run.
// If you're on windows, screw you lol
const std = @import("std");
const c = @cImport({
@cInclude("curl/curl.h");
@cInclude("archive.h");
@cInclude("archive_entry.h");
});
const settings = @import("settings.zig");
pub fn main() !void {
// used to buffer whatever
var buf: [512]u8 = undefined;
try std.fs.cwd().deleteTree(settings.build_dir);
try std.fs.cwd().makeDir(settings.build_dir);
var zip = c.archive_write_new();
if (zip == null)
return error.ArchiveNewError;
defer _ = c.archive_write_free(zip);
try handleArchiveErr(c.archive_write_set_format_zip(zip), zip);
try handleArchiveErr(c.archive_write_set_format_option(
zip,
"zip",
"compression-level",
settings.compression_level,
), zip);
try handleArchiveErr(c.archive_write_open_filename(
zip,
settings.build_dir ++ "/" ++ settings.name ++ "-" ++ settings.version ++ ".zip",
), zip);
var entry = c.archive_entry_new();
defer c.archive_entry_free(entry);
try archiveCreateDir(zip.?, entry.?, "minecraft/");
try archiveCreateDir(zip.?, entry.?, "minecraft/mods/");
const writer = ArchiveWriter{ .context = zip.? };
var overrides = try std.fs.cwd().openIterableDir("overrides", .{});
defer overrides.close();
var walker = try overrides.walk(std.heap.c_allocator);
defer walker.deinit();
const stdout = std.io.getStdOut().writer();
while (try walker.next()) |e| {
switch (e.kind) {
.Directory => {
stdout.print(
"Writing Directory\t\x1b[34m{s}/\x1b[0m\n",
.{e.path},
) catch {};
const path = try std.mem.concatWithSentinel(
std.heap.c_allocator,
u8,
&[_][]const u8{ "minecraft/", e.path },
0,
);
defer std.heap.c_allocator.free(path);
try archiveCreateDir(zip.?, entry.?, path.ptr);
},
.File => {
stdout.print("Writing File\t\t\x1b[34m{s}\x1b[0m\n", .{e.path}) catch {};
const path = try std.mem.concatWithSentinel(
std.heap.c_allocator,
u8,
&[_][]const u8{ "minecraft/", e.path },
0,
);
defer std.heap.c_allocator.free(path);
var file = try overrides.dir.openFile(e.path, .{});
defer file.close();
try archiveFile(
zip.?,
entry.?,
&buf,
path.ptr,
file,
);
},
else => {},
}
}
try installMmcPackJson(zip.?, entry.?);
c.archive_entry_set_pathname(entry, "instance.cfg");
c.archive_entry_set_size(entry, settings.instance_cfg_data.len);
try handleArchiveErr(c.archive_write_header(zip, entry), zip);
try writer.writeAll(settings.instance_cfg_data);
var mods_arena = std.heap.ArenaAllocator.init(std.heap.c_allocator);
defer mods_arena.deinit();
var mods = std.ArrayList([]u8).init(std.heap.c_allocator);
defer mods.deinit();
readMods(&mods, mods_arena.allocator()) catch |err| {
std.log.err("Error reading mods.conf", .{});
return err;
};
downloadMods(mods.items, zip.?, entry.?) catch |err| {
std.log.err("Error downloading mods", .{});
return err;
};
try handleArchiveErr(c.archive_write_close(zip), zip);
}
const ArchiveWriter = std.io.Writer(
*c.archive,
error{ArchiveError},
writeArchive,
);
fn writeArchive(archive: *c.archive, bytes: []const u8) error{ArchiveError}!usize {
const result = c.archive_write_data(archive, bytes.ptr, bytes.len);
if (result < 0) {
try handleArchiveErr(result, archive);
}
return @intCast(usize, result);
}
fn archiveFile(
archive: *c.archive,
entry: *c.archive_entry,
buf: []u8,
name: [*c]const u8,
file: std.fs.File,
) !void {
entrySetFile(entry);
c.archive_entry_set_pathname(entry, name);
c.archive_entry_set_size(entry, @intCast(i64, (try file.stat()).size));
try handleArchiveErr(c.archive_write_header(archive, entry), archive);
const writer = ArchiveWriter{ .context = archive };
var fifo = std.fifo.LinearFifo(u8, .Slice).init(buf);
try fifo.pump(file.reader(), writer);
}
/// `name` must end with '/'!
fn archiveCreateDir(
archive: *c.archive,
entry: *c.archive_entry,
name: [*c]const u8,
) !void {
entrySetDir(entry);
c.archive_entry_set_pathname(entry, name);
try handleArchiveErr(c.archive_write_header(archive, entry), archive);
}
fn installMmcPackJson(archive: *c.archive, entry: *c.archive_entry) !void {
const Requires = struct {
uid: []const u8,
equals: ?[]const u8 = null,
suggests: ?[]const u8 = null,
};
const Component = struct {
cachedName: []const u8,
cachedRequires: ?[]const Requires = null,
cachedVersion: []const u8,
cachedVolatile: ?bool = null,
dependencyOnly: ?bool = null,
important: ?bool = null,
uid: []const u8,
version: []const u8,
};
const data = .{
.components = &[_]Component{
.{
.cachedName = "LWJGL 2",
.cachedVersion = "2.9.4-nightly-20150209",
.cachedVolatile = true,
.dependencyOnly = true,
.uid = "org.lwjgl",
.version = "2.9.4-nightly-20150209",
},
.{
.cachedName = "Minecraft",
.cachedRequires = &.{
.{
.uid = "org.lwjgl",
.suggests = "2.9.4-nightly-20150209",
},
},
.cachedVersion = settings.minecraft_version,
.important = true,
.uid = "net.minecraft",
.version = settings.minecraft_version,
},
.{
.cachedName = "Forge",
.cachedRequires = &.{
.{
.uid = "net.minecraft",
.equals = settings.minecraft_version,
},
},
.uid = "net.minecraftforge",
.cachedVersion = settings.forge_version,
.version = settings.forge_version,
},
},
.formatVersion = 1,
};
// We run the serializer twice, because we need to know the size ahead of time for zip.
// This is faster than allocating the json on the heap.
var counter = std.io.countingWriter(std.io.null_writer);
try std.json.stringify(
data,
.{ .emit_null_optional_fields = false },
counter.writer(),
);
entrySetFile(entry);
c.archive_entry_set_size(entry, @intCast(i64, counter.bytes_written));
c.archive_entry_set_pathname(entry, "mmc-pack.json");
try handleArchiveErr(c.archive_write_header(archive, entry), archive);
try std.json.stringify(
data,
.{ .emit_null_optional_fields = false },
ArchiveWriter{ .context = archive },
);
}
fn readMods(list: *std.ArrayList([]u8), alloc: std.mem.Allocator) !void {
var file = try std.fs.cwd().openFile("mods.conf", .{});
defer file.close();
var line_buf: [1024]u8 = undefined;
while (try file.reader().readUntilDelimiterOrEof(&line_buf, '\n')) |line| {
// mods.txt has comments with "#"
const line_without_comment = std.mem.sliceTo(line, '#');
const trimmed_line = std.mem.trim(u8, line_without_comment, "\n\r\t ");
if (trimmed_line.len != 0) {
try list.append(try alloc.dupe(u8, trimmed_line));
}
}
}
fn curlWriteCallback(
data: [*]const u8,
size: usize,
nmemb: usize,
out: *std.ArrayList(u8),
) callconv(.C) usize {
const realsize = size * nmemb;
out.writer().writeAll(data[0..realsize]) catch return 0;
return realsize;
}
const CurlInfo = struct {
filename: []const u8,
index: usize,
total: usize,
mod_number_width: usize,
};
fn curlInfoCallback(
info: *CurlInfo,
dltotal: c.curl_off_t,
dlnow: c.curl_off_t,
ultotal: c.curl_off_t,
ulnow: c.curl_off_t,
) callconv(.C) usize {
_ = ultotal;
_ = ulnow;
std.io.getStdOut().writer().print(
"\r\x1b[34m[{d:[4]}/{d}] \x1b[97m{s} \x1b[32m{}%",
.{
info.index,
info.total,
info.filename,
if (dltotal != 0) @divTrunc(dlnow * 100, dltotal) else 0,
info.mod_number_width,
},
) catch {};
return 0;
}
fn downloadMods(
mods: []const []const u8,
zip: *c.archive,
entry: *c.archive_entry,
) !void {
var curl = c.curl_easy_init();
if (curl == null)
return error.CurlInitError;
defer c.curl_easy_cleanup(curl);
try handleCurlErr(c.curl_easy_setopt(
curl,
c.CURLOPT_WRITEFUNCTION,
&curlWriteCallback,
));
try handleCurlErr(c.curl_easy_setopt(
curl,
c.CURLOPT_XFERINFOFUNCTION,
&curlInfoCallback,
));
try handleCurlErr(c.curl_easy_setopt(curl, c.CURLOPT_NOPROGRESS, @as(c_long, 0)));
try handleCurlErr(c.curl_easy_setopt(curl, c.CURLOPT_FOLLOWLOCATION, @as(c_long, 1)));
const mod_number_width = std.math.log10(mods.len) + 1;
const writer = ArchiveWriter{ .context = zip };
var mod_buf = std.ArrayList(u8).init(std.heap.c_allocator);
defer mod_buf.deinit();
var info = CurlInfo{
.filename = "",
.index = 0,
.total = mods.len,
.mod_number_width = mod_number_width,
};
try handleCurlErr(c.curl_easy_setopt(curl, c.CURLOPT_XFERINFODATA, &info));
// hide cursor
std.io.getStdOut().writeAll("\x1b[?25l") catch {};
// show cursor & reset
defer std.io.getStdOut().writeAll("\x1b[?25h\x1b[0\n") catch {};
for (mods) |mod| {
info.index += 1;
mod_buf.clearRetainingCapacity();
var splits = std.mem.split(u8, mod, "/");
var filename_esc: ?[]const u8 = null;
while (splits.next()) |split|
filename_esc = split;
if (filename_esc == null or filename_esc.?.len == 0) {
std.log.err("Failed to get filename of URL {s}", .{mod});
return error.BorkedUrl;
}
var filename_len: c_int = undefined;
var filename_cstr = c.curl_easy_unescape(
curl,
filename_esc.?.ptr,
@intCast(c_int, filename_esc.?.len),
&filename_len,
);
defer c.curl_free(filename_cstr);
var filename = filename_cstr[0..@intCast(usize, filename_len)];
// Replace + with space in URL decoded filename
for (filename) |*ch| {
if (ch.* == '+') {
ch.* = ' ';
}
}
info.filename = filename;
try handleCurlErr(c.curl_easy_setopt(curl, c.CURLOPT_WRITEDATA, &mod_buf));
const mod_cstr = try std.cstr.addNullByte(std.heap.c_allocator, mod);
defer std.heap.c_allocator.free(mod_cstr);
try handleCurlErr(c.curl_easy_setopt(
curl,
c.CURLOPT_URL,
mod_cstr.ptr,
));
try handleCurlErr(c.curl_easy_perform(curl));
std.io.getStdOut().writer().print(
"\r\x1b[34m[{d:[3]}/{d}] \x1b[97m{s} \x1b[31mZipping...",
.{ info.index, info.total, info.filename, mod_number_width },
) catch {};
var archive_path = try std.mem.concatWithSentinel(
std.heap.c_allocator,
u8,
&.{ "minecraft/mods/", filename },
0,
);
defer std.heap.c_allocator.free(archive_path);
c.archive_entry_set_pathname(entry, archive_path.ptr);
c.archive_entry_set_size(entry, @intCast(i64, mod_buf.items.len));
try handleArchiveErr(c.archive_write_header(zip, entry), zip);
try writer.writeAll(mod_buf.items);
std.io.getStdOut().writer().print(
"\x1b[2K\r\x1b[34m[{d:[3]}/{d}] \x1b[97m{s}\n",
.{ info.index, info.total, info.filename, mod_number_width },
) catch {};
}
}
fn entrySetDir(entry: *c.archive_entry) void {
c.archive_entry_set_filetype(entry, c.S_IFDIR);
c.archive_entry_set_perm(entry, 0o755);
c.archive_entry_unset_size(entry);
}
fn entrySetFile(entry: *c.archive_entry) void {
c.archive_entry_set_filetype(entry, c.S_IFREG);
c.archive_entry_set_perm(entry, 0o644);
}
fn handleCurlErr(code: c.CURLcode) !void {
if (code != c.CURLE_OK) {
std.log.err("Curl error: {s}", .{c.curl_easy_strerror(code)});
return error.CurlError;
}
}
fn handleArchiveErr(err: anytype, archive: ?*c.archive) !void {
if (err != c.ARCHIVE_OK) {
if (archive) |ar| {
if (c.archive_error_string(ar)) |err_s|
std.log.err("Archive error: {s}", .{err_s});
}
return error.ArchiveError;
}
}

72
mods.conf Normal file
View file

@ -0,0 +1,72 @@
# mods in mods/1.7.10/, should be fine to just put in mods/
https://mediafiles.forgecdn.net/files/2227/503/[1.7.10]bspkrsCore-universal-6.16.jar
https://mediafiles.forgecdn.net/files/2224/857/Baubles-1.7.10-1.0.1.10.jar
https://mediafiles.forgecdn.net/files/2242/993/ForgeMultipart-1.7.10-1.2.0.345-universal.jar
# other mods
https://mediafiles.forgecdn.net/files/2692/129/[1.7.10]DamageIndicatorsMod-3.3.2.jar
https://mediafiles.forgecdn.net/files/2218/771/[1.7.10]Treecapitator-universal-2.0.4.jar
https://mediafiles.forgecdn.net/files/2614/309/additionalpipes-4.7.7.jar
https://immibis.com/mcmoddl/files/advanced-machines-59.0.2.jar
https://git.tilera.org/api/packages/Anvilcraft/generic/apm2/2.0.1A/AdvPowerMan-2.0.1A.jar
https://immibis.com/mcmoddl/files/adv-repulsion-systems-59.0.4.jar
https://mediafiles.forgecdn.net/files/3280/117/aether-1.7.10-v1.1.2.2.jar
https://mediafiles.forgecdn.net/files/2221/721/AnimationAPI-1.7.10-1.2.4.jar
https://maven.tilera.xyz/appeng/appliedenergistics2/rv3-beta-18/appliedenergistics2-rv3-beta-18.jar
https://mediafiles.forgecdn.net/files/2257/644/Aroma1997Core-1.7.10-1.0.2.16.jar
https://mediafiles.forgecdn.net/files/2268/883/backpack-2.0.1-1.7.x.jar
https://mediafiles.forgecdn.net/files/2423/369/BiblioCraft[v1.11.7][MC1.7.10].jar
https://mediafiles.forgecdn.net/files/2279/911/BiomeTweaker-1.7.10-2.0.182.jar
https://mediafiles.forgecdn.net/files/3538/651/buildcraft-7.1.24.jar
https://mediafiles.forgecdn.net/files/2233/250/ChickenChunks-1.7.10-1.3.4.19-universal.jar
https://mediafiles.forgecdn.net/files/3293/859/CodeChickenCore-1.7.10-1.0.7.48-universal.jar
https://mediafiles.forgecdn.net/files/2388/750/CoFHCore-[1.7.10]3.1.4-329.jar
https://mediafiles.forgecdn.net/files/2230/918/CompactSolars-1.7.10-4.4.39.315-universal.jar
https://mediafiles.forgecdn.net/files/2269/339/ComputerCraft1.75.jar
https://mediafiles.forgecdn.net/files/2266/759/ContentTweaker-1.0.5.jar
https://mediafiles.forgecdn.net/files/2838/720/CraftTweaker-1.7.10-3.1.0-legacy.jar
https://mediafiles.forgecdn.net/files/2281/660/DynamicDynamos-0.2.1.jar
https://mediafiles.forgecdn.net/files/2262/92/EnderStorage-1.7.10-1.4.7.37-universal.jar
https://git.tilera.org/api/packages/Anvilcraft/generic/ee3/1.7.10-0.3.0.0/EquivalentExchange3-1.7.10-0.3.0.0.jar
https://mediafiles.forgecdn.net/files/2990/432/Factorization-1.7.10-0.8.108+(Unofficial).jar
https://mediafiles.forgecdn.net/files/2288/74/Fluxed-Core-MC1710-1.0.9.jar
https://mediafiles.forgecdn.net/files/2333/823/forestry_1.7.10-4.2.16.64.jar
https://mediafiles.forgecdn.net/files/3802/63/IC2NuclearControl-2.4.5a.jar
https://mediafiles.forgecdn.net/files/2338/148/iChunUtil-4.2.3.jar
https://immibis.com/mcmoddl/files/immibis-core-59.1.4.jar
https://mediafiles.forgecdn.net/files/2353/971/industrialcraft-2-2.2.827-experimental.jar
https://mediafiles.forgecdn.net/files/2210/792/InventoryTweaks-1.59-dev-152.jar
https://mediafiles.forgecdn.net/files/2230/908/ironchest-1.7.10-6.0.62.742-universal.jar
https://mediafiles.forgecdn.net/files/2427/862/logisticspipes-0.9.3.132.jar
https://git.tilera.org/api/packages/tilera/generic/mekanism/1.7.10-9.10.16/Mekanism-1.7.10-Community-Edition-1.7.10-9.10.16.jar
https://mediafiles.forgecdn.net/files/2366/149/MineFactoryReloaded-[1.7.10]2.8.2B1-201.jar
https://mediafiles.forgecdn.net/files/2313/730/ModTweaker2-0.9.6.jar
https://mediafiles.forgecdn.net/files/2666/986/ModularPowersuits-1.7.10-0.11.1.117.jar
https://mediafiles.forgecdn.net/files/2250/71/MutantCreatures-1.7.10-1.4.9.jar
https://mediafiles.forgecdn.net/files/2417/42/mystcraft-1.7.10-0.12.3.04.jar
https://mediafiles.forgecdn.net/files/2369/671/NetherOres-[1.7.10]2.3.2B1-25.jar
https://mediafiles.forgecdn.net/files/2302/312/NotEnoughItems-1.7.10-1.0.5.120-universal.jar
https://mediafiles.forgecdn.net/files/2266/997/PortalGun-4.0.0-beta-6.jar
https://mediafiles.forgecdn.net/files/2263/111/PowerConverters-1.7.10-2.11.jar
https://mediafiles.forgecdn.net/files/2340/786/ProjectE-1.7.10-PE1.10.1.jar
https://mediafiles.forgecdn.net/files/2458/987/Railcraft_1.7.10-9.12.2.1.jar
https://mediafiles.forgecdn.net/files/2292/845/ResourceLoader-MC1.7.10-1.3.jar
https://mediafiles.forgecdn.net/files/2511/803/secretroomsmod-1.7.10-4.7.1.413.jar
https://mediafiles.forgecdn.net/files/2230/425/StevesCarts2.0.0.b18.jar
https://mediafiles.forgecdn.net/files/2227/552/Thaumcraft-1.7.10-4.2.3.5.jar
https://mediafiles.forgecdn.net/files/2241/913/thaumcraftneiplugin-1.7.10-1.7a.jar
https://mediafiles.forgecdn.net/files/2388/756/ThermalDynamics-[1.7.10]1.2.1-172.jar
https://mediafiles.forgecdn.net/files/2388/758/ThermalExpansion-[1.7.10]4.1.5-248.jar
https://mediafiles.forgecdn.net/files/2388/752/ThermalFoundation-[1.7.10]1.2.6-118.jar
https://mediafiles.forgecdn.net/files/3039/937/twilightforest-1.7.10-2.3.8.jar
https://mediafiles.forgecdn.net/files/2295/873/Uncomplication-1.7.10-0.1.2.1.b77.jar
https://mediafiles.forgecdn.net/files/2230/518/Waila-1.5.10_1.7.10.jar
https://mediafiles.forgecdn.net/files/2216/459/weaponmod-1.14.3.jar
https://mediafiles.forgecdn.net/files/2233/235/WR-CBE-1.7.10-1.4.1.9-universal.jar
https://mediafiles.forgecdn.net/files/3040/151/Numina-0.4.1.0-kmecpp-3.jar
https://immibis.com/mcmoddl/files/tubestuff-59.0.4.jar
https://cdn.tilera.xyz/minecraft/mods/mtreloaded/GraviSuite_1.7.10_2.0.3.jar
https://cdn.tilera.xyz/minecraft/mods/mtreloaded/MineChem%20Mod%201.7.10.jar
https://cdn.tilera.xyz/minecraft/mods/mtreloaded/PlayerAPI-1.7.10-1.4.jar
https://cdn.tilera.xyz/minecraft/mods/mtreloaded/RedPower-2.0pr7-dirty.jar
https://cdn.tilera.xyz/minecraft/mods/mtreloaded/powercraft-0.1.0B.jar

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,001 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View file

@ -0,0 +1,45 @@
{
"animation": {
"frametime": 4,
"frames": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
18,
17,
16,
15,
14,
13,
12,
11,
10,
9,
8,
7,
6,
5,
4,
3,
2,
1
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,3 @@
{
"animation": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,5 @@
{
"animation": {
"frametime": 2
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View file

@ -0,0 +1,5 @@
{
"animation": {
"frametime": 2
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View file

@ -0,0 +1,45 @@
{
"animation": {
"frametime": 4,
"frames": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
18,
17,
16,
15,
14,
13,
12,
11,
10,
9,
8,
7,
6,
5,
4,
3,
2,
1
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -0,0 +1,5 @@
{
"animation": {
"frametime": 2
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -0,0 +1,45 @@
{
"animation": {
"frametime": 4,
"frames": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
18,
17,
16,
15,
14,
13,
12,
11,
10,
9,
8,
7,
6,
5,
4,
3,
2,
1
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

View file

@ -0,0 +1,5 @@
{
"animation": {
"frametime": 2
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View file

@ -0,0 +1,45 @@
{
"animation": {
"frametime": 4,
"frames": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
18,
17,
16,
15,
14,
13,
12,
11,
10,
9,
8,
7,
6,
5,
4,
3,
2,
1
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View file

@ -0,0 +1,45 @@
{
"animation": {
"frametime": 2,
"frames": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
18,
17,
16,
15,
14,
13,
12,
11,
10,
9,
8,
7,
6,
5,
4,
3,
2,
1
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View file

@ -0,0 +1,45 @@
{
"animation": {
"frametime": 4,
"frames": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
18,
17,
16,
15,
14,
13,
12,
11,
10,
9,
8,
7,
6,
5,
4,
3,
2,
1
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -0,0 +1,5 @@
{
"animation": {
"frametime": 2
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View file

@ -0,0 +1,45 @@
{
"animation": {
"frametime": 4,
"frames": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
18,
17,
16,
15,
14,
13,
12,
11,
10,
9,
8,
7,
6,
5,
4,
3,
2,
1
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 709 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Some files were not shown because too many files have changed in this diff Show more