Compare commits
26 commits
v1.0.0-rc1
...
master
Author | SHA1 | Date | |
---|---|---|---|
Timo Ley | 312762412f | ||
Timo Ley | 17cbfc7755 | ||
Timo Ley | 72154ef308 | ||
LordMZTE | 0a60997ae5 | ||
Timo Ley | 7355277cbc | ||
Timo Ley | baf78144ea | ||
Timo Ley | 3b48cd1d8f | ||
Timo Ley | 357d9cbd8a | ||
Timo Ley | 3fad9a8bf5 | ||
LordMZTE | 308987fea6 | ||
Timo Ley | cdfec1a0cd | ||
Timo Ley | cd4e65171b | ||
LordMZTE | aa328f37ac | ||
LordMZTE | e3ff938569 | ||
LordMZTE | 7bbf1be07a | ||
LordMZTE | aace4755f7 | ||
Timo Ley | 3ecb006ac0 | ||
Timo Ley | ea0f0f0949 | ||
Timo Ley | 2d3cf39ec1 | ||
Timo Ley | f0b53eb190 | ||
Timo Ley | 09d6d3c28a | ||
Timo Ley | 8105df3a12 | ||
Timo Ley | c54dea6554 | ||
Timo Ley | a0ac9b4852 | ||
Timo Ley | 8b35f4822f | ||
Timo Ley | 20d3dfb0a0 |
41
addon.json
41
addon.json
|
@ -4,7 +4,7 @@
|
||||||
},
|
},
|
||||||
"id": "mineteck-reloaded",
|
"id": "mineteck-reloaded",
|
||||||
"namespace": "net.anvilcraft",
|
"namespace": "net.anvilcraft",
|
||||||
"version": "1.0.0-rc1",
|
"version": "1.0.4",
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required", "instance"]
|
"both": ["required", "instance"]
|
||||||
},
|
},
|
||||||
|
@ -190,7 +190,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-appeng",
|
"qualifier": "mod-appeng",
|
||||||
"link": [
|
"link": [
|
||||||
"https://maven.tilera.xyz/appeng/appliedenergistics2/rv3-beta-22/appliedenergistics2-rv3-beta-22.jar"
|
"https://maven.tilera.xyz/appeng/appliedenergistics2/rv3-beta-23/appliedenergistics2-rv3-beta-23.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -385,7 +385,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-ee3",
|
"qualifier": "mod-ee3",
|
||||||
"link": [
|
"link": [
|
||||||
"https://git.tilera.org/api/packages/Anvilcraft/generic/ee3/0.5.0/EquivalentExchange3-1.7.10-0.5.0.0.jar"
|
"https://git.tilera.org/api/packages/Anvilcraft/generic/ee3/0.5.1/EquivalentExchange3-1.7.10-0.5.1.0.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -400,7 +400,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-factorization",
|
"qualifier": "mod-factorization",
|
||||||
"link": [
|
"link": [
|
||||||
"https://mediafiles.forgecdn.net/files/2990/432/Factorization-1.7.10-0.8.108+(Unofficial).jar"
|
"https://cdn.modrinth.com/data/XmseIqaa/versions/0.8.109/Factorization-1.7.10-0.8.109.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -548,7 +548,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-mekanism",
|
"qualifier": "mod-mekanism",
|
||||||
"link": [
|
"link": [
|
||||||
"https://maven.tilera.xyz/mekanism/Mekanism/1.7.10-9.13.0/Mekanism-1.7.10-9.13.0.jar"
|
"https://maven.tilera.xyz/mekanism/Mekanism/1.7.10-9.13.1/Mekanism-1.7.10-9.13.1.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -983,7 +983,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-redpower",
|
"qualifier": "mod-redpower",
|
||||||
"link": [
|
"link": [
|
||||||
"https://maven.tilera.xyz/com/eloraam/redpower/RedPower/2.0pr9-dirty/RedPower-2.0pr9-dirty.jar"
|
"https://maven.tilera.xyz/com/eloraam/redpower/RedPower/2.0pr10-dirty/RedPower-2.0pr10-dirty.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -1028,7 +1028,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-cwg",
|
"qualifier": "mod-cwg",
|
||||||
"link": [
|
"link": [
|
||||||
"https://maven.tilera.xyz/dev/tilera/modding/cwg/1.7.0/cwg-1.7.0.jar"
|
"https://maven.tilera.xyz/dev/tilera/modding/cwg/1.7.1/cwg-1.7.1.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -1043,7 +1043,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-mixins",
|
"qualifier": "mod-mixins",
|
||||||
"link": [
|
"link": [
|
||||||
"https://cdn.tilera.xyz/minecraft/mods/mtreloaded/00gasstation-mc1.7.10-0.3.5.jar"
|
"https://mediafilez.forgecdn.net/files/4399/569/_unimixins-all-1.7.10-0.1.4.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -1088,7 +1088,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-electricexpansion",
|
"qualifier": "mod-electricexpansion",
|
||||||
"link": [
|
"link": [
|
||||||
"https://maven.tilera.xyz/universalelectricity/electricexpansion/1.0.1/electricexpansion-1.0.1.jar"
|
"https://maven.tilera.xyz/universalelectricity/electricexpansion/1.0.2/electricexpansion-1.0.2.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -1133,7 +1133,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-mffs",
|
"qualifier": "mod-mffs",
|
||||||
"link": [
|
"link": [
|
||||||
"https://maven.tilera.xyz/universalelectricity/mffs/1.0.7/mffs-1.0.7.jar"
|
"https://maven.tilera.xyz/universalelectricity/mffs/1.0.8/mffs-1.0.8.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -1148,7 +1148,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-icbm",
|
"qualifier": "mod-icbm",
|
||||||
"link": [
|
"link": [
|
||||||
"https://maven.tilera.xyz/universalelectricity/icbm/1.0.6/icbm-1.0.6.jar"
|
"https://maven.tilera.xyz/universalelectricity/icbm/1.0.8/icbm-1.0.8.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -1163,7 +1163,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-auracore",
|
"qualifier": "mod-auracore",
|
||||||
"link": [
|
"link": [
|
||||||
"https://maven.tilera.xyz/dev/tilera/auracore/1.8.8/auracore-1.8.8.jar"
|
"https://maven.tilera.xyz/dev/tilera/auracore/1.8.9/auracore-1.8.9.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -1178,7 +1178,7 @@
|
||||||
{
|
{
|
||||||
"qualifier": "mod-classiccasting",
|
"qualifier": "mod-classiccasting",
|
||||||
"link": [
|
"link": [
|
||||||
"https://maven.tilera.xyz/net/anvilcraft/classic-casting/1.3.1/classic-casting-1.3.1.jar"
|
"https://maven.tilera.xyz/net/anvilcraft/classic-casting/1.4.1/classic-casting-1.4.1.jar"
|
||||||
],
|
],
|
||||||
"flags": {
|
"flags": {
|
||||||
"both": ["required"]
|
"both": ["required"]
|
||||||
|
@ -1310,6 +1310,21 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"qualifier": "mod-archaicfix",
|
||||||
|
"link": [
|
||||||
|
"https://mediafilez.forgecdn.net/files/4405/338/archaicfix-0.5.0.jar"
|
||||||
|
],
|
||||||
|
"flags": {
|
||||||
|
"both": ["required"]
|
||||||
|
},
|
||||||
|
"install": [
|
||||||
|
{
|
||||||
|
"action": "move",
|
||||||
|
"args": ["./mods"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"qualifier": "mod-mousetweaks",
|
"qualifier": "mod-mousetweaks",
|
||||||
"link": [
|
"link": [
|
||||||
|
|
484
build.zig
484
build.zig
|
@ -1,484 +0,0 @@
|
||||||
//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 {
|
|
||||||
const simple_output = std.os.getenv("BUILD_SIMPLE_OUTPUT") != null;
|
|
||||||
|
|
||||||
// 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 => {
|
|
||||||
if (simple_output) {
|
|
||||||
stdout.print(
|
|
||||||
"Writing Directory\t{s}\n",
|
|
||||||
.{e.path},
|
|
||||||
) catch {};
|
|
||||||
} else {
|
|
||||||
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 => {
|
|
||||||
if (simple_output) {
|
|
||||||
stdout.print("Writing File\t\t{s}\n", .{e.path}) catch {};
|
|
||||||
} else {
|
|
||||||
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.?, simple_output) 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,
|
|
||||||
simple_output: bool,
|
|
||||||
|
|
||||||
fn logStart(self: *CurlInfo) !void {
|
|
||||||
if (!self.simple_output)
|
|
||||||
return;
|
|
||||||
|
|
||||||
try std.io.getStdOut().writer().print(
|
|
||||||
"[{d:[3]}/{d}] {s} Downloading...\n",
|
|
||||||
.{ self.index, self.total, self.filename, self.mod_number_width },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn logProgress(self: *CurlInfo, percentage: u8) !void {
|
|
||||||
if (self.simple_output)
|
|
||||||
return;
|
|
||||||
|
|
||||||
try std.io.getStdOut().writer().print(
|
|
||||||
"\r\x1b[34m[{d:[4]}/{d}] \x1b[97m{s} \x1b[32m{}%",
|
|
||||||
.{
|
|
||||||
self.index,
|
|
||||||
self.total,
|
|
||||||
self.filename,
|
|
||||||
percentage,
|
|
||||||
self.mod_number_width,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn logZipping(self: *CurlInfo) !void {
|
|
||||||
if (!self.simple_output) {
|
|
||||||
try std.io.getStdOut().writer().print(
|
|
||||||
"\r\x1b[34m[{d:[3]}/{d}] \x1b[97m{s} \x1b[31mZipping...",
|
|
||||||
.{ self.index, self.total, self.filename, self.mod_number_width },
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
try std.io.getStdOut().writer().print(
|
|
||||||
"[{d:[3]}/{d}] {s} Zipping...\n",
|
|
||||||
.{ self.index, self.total, self.filename, self.mod_number_width },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn logDone(self: *CurlInfo) !void {
|
|
||||||
if (self.simple_output)
|
|
||||||
return;
|
|
||||||
|
|
||||||
std.io.getStdOut().writer().print(
|
|
||||||
"\x1b[2K\r\x1b[34m[{d:[3]}/{d}] \x1b[97m{s}\n",
|
|
||||||
.{ self.index, self.total, self.filename, self.mod_number_width },
|
|
||||||
) catch {};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
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;
|
|
||||||
info.logProgress(
|
|
||||||
@intCast(u8, if (dltotal != 0) @divTrunc(dlnow * 100, dltotal) else 0),
|
|
||||||
) catch {};
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn downloadMods(
|
|
||||||
mods: []const []const u8,
|
|
||||||
zip: *c.archive,
|
|
||||||
entry: *c.archive_entry,
|
|
||||||
simple_output: bool,
|
|
||||||
) !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,
|
|
||||||
.simple_output = simple_output,
|
|
||||||
};
|
|
||||||
try handleCurlErr(c.curl_easy_setopt(curl, c.CURLOPT_XFERINFODATA, &info));
|
|
||||||
// hide cursor
|
|
||||||
if (!simple_output) {
|
|
||||||
std.io.getStdOut().writeAll("\x1b[?25l") catch {};
|
|
||||||
}
|
|
||||||
// show cursor & reset
|
|
||||||
defer if (!simple_output) {
|
|
||||||
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 info.logStart();
|
|
||||||
|
|
||||||
try handleCurlErr(c.curl_easy_perform(curl));
|
|
||||||
|
|
||||||
try info.logZipping();
|
|
||||||
|
|
||||||
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);
|
|
||||||
try info.logDone();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
15
settings.zig
15
settings.zig
|
@ -1,15 +0,0 @@
|
||||||
pub const name = "mineteck-reloaded";
|
|
||||||
|
|
||||||
/// Version number used for the archive name
|
|
||||||
pub const version = "0.1.0";
|
|
||||||
pub const build_dir = "build";
|
|
||||||
pub const minecraft_version = "1.7.10";
|
|
||||||
pub const forge_version = "10.13.4.1614";
|
|
||||||
|
|
||||||
/// the data for the `instance.cfg` file
|
|
||||||
pub const instance_cfg_data =
|
|
||||||
\\InstanceType=OneSix
|
|
||||||
;
|
|
||||||
|
|
||||||
/// zip compression level. 9 is max. ask libarchive why this is a string.
|
|
||||||
pub const compression_level = "9";
|
|
|
@ -4,7 +4,7 @@
|
||||||
"id": "mineteck-reloaded",
|
"id": "mineteck-reloaded",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"version": "1.0.0-rc1",
|
"version": "1.0.4",
|
||||||
"versionid": -1,
|
"versionid": -1,
|
||||||
"mcversion": [
|
"mcversion": [
|
||||||
"1.7.10"
|
"1.7.10"
|
||||||
|
@ -167,7 +167,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-appeng",
|
"id": "mod-appeng",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://maven.tilera.xyz/appeng/appliedenergistics2/rv3-beta-22/appliedenergistics2-rv3-beta-22.jar",
|
"link": "https://maven.tilera.xyz/appeng/appliedenergistics2/rv3-beta-23/appliedenergistics2-rv3-beta-23.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -349,7 +349,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-ee3",
|
"id": "mod-ee3",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://git.tilera.org/api/packages/Anvilcraft/generic/ee3/0.5.0/EquivalentExchange3-1.7.10-0.5.0.0.jar",
|
"link": "https://git.tilera.org/api/packages/Anvilcraft/generic/ee3/0.5.1/EquivalentExchange3-1.7.10-0.5.1.0.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -363,7 +363,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-factorization",
|
"id": "mod-factorization",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://mediafiles.forgecdn.net/files/2990/432/Factorization-1.7.10-0.8.108+(Unofficial).jar",
|
"link": "https://cdn.modrinth.com/data/XmseIqaa/versions/0.8.109/Factorization-1.7.10-0.8.109.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -503,7 +503,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-mekanism",
|
"id": "mod-mekanism",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://maven.tilera.xyz/mekanism/Mekanism/1.7.10-9.13.0/Mekanism-1.7.10-9.13.0.jar",
|
"link": "https://maven.tilera.xyz/mekanism/Mekanism/1.7.10-9.13.1/Mekanism-1.7.10-9.13.1.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -909,7 +909,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-redpower",
|
"id": "mod-redpower",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://maven.tilera.xyz/com/eloraam/redpower/RedPower/2.0pr9-dirty/RedPower-2.0pr9-dirty.jar",
|
"link": "https://maven.tilera.xyz/com/eloraam/redpower/RedPower/2.0pr10-dirty/RedPower-2.0pr10-dirty.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -951,7 +951,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-cwg",
|
"id": "mod-cwg",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://maven.tilera.xyz/dev/tilera/modding/cwg/1.7.0/cwg-1.7.0.jar",
|
"link": "https://maven.tilera.xyz/dev/tilera/modding/cwg/1.7.1/cwg-1.7.1.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -965,7 +965,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-mixins",
|
"id": "mod-mixins",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://cdn.tilera.xyz/minecraft/mods/mtreloaded/00gasstation-mc1.7.10-0.3.5.jar",
|
"link": "https://mediafilez.forgecdn.net/files/4399/569/_unimixins-all-1.7.10-0.1.4.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -1007,7 +1007,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-electricexpansion",
|
"id": "mod-electricexpansion",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://maven.tilera.xyz/universalelectricity/electricexpansion/1.0.1/electricexpansion-1.0.1.jar",
|
"link": "https://maven.tilera.xyz/universalelectricity/electricexpansion/1.0.2/electricexpansion-1.0.2.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -1049,7 +1049,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-mffs",
|
"id": "mod-mffs",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://maven.tilera.xyz/universalelectricity/mffs/1.0.7/mffs-1.0.7.jar",
|
"link": "https://maven.tilera.xyz/universalelectricity/mffs/1.0.8/mffs-1.0.8.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -1063,7 +1063,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-icbm",
|
"id": "mod-icbm",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://maven.tilera.xyz/universalelectricity/icbm/1.0.6/icbm-1.0.6.jar",
|
"link": "https://maven.tilera.xyz/universalelectricity/icbm/1.0.8/icbm-1.0.8.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -1077,7 +1077,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-auracore",
|
"id": "mod-auracore",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://maven.tilera.xyz/dev/tilera/auracore/1.8.8/auracore-1.8.8.jar",
|
"link": "https://maven.tilera.xyz/dev/tilera/auracore/1.8.9/auracore-1.8.9.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -1091,7 +1091,7 @@
|
||||||
{
|
{
|
||||||
"id": "mod-classiccasting",
|
"id": "mod-classiccasting",
|
||||||
"file": {
|
"file": {
|
||||||
"link": "https://maven.tilera.xyz/net/anvilcraft/classic-casting/1.3.1/classic-casting-1.3.1.jar",
|
"link": "https://maven.tilera.xyz/net/anvilcraft/classic-casting/1.4.1/classic-casting-1.4.1.jar",
|
||||||
"installer": "internal.dir:mods"
|
"installer": "internal.dir:mods"
|
||||||
},
|
},
|
||||||
"type": "mod",
|
"type": "mod",
|
||||||
|
@ -1214,6 +1214,20 @@
|
||||||
"included"
|
"included"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "mod-archaicfix",
|
||||||
|
"file": {
|
||||||
|
"link": "https://mediafilez.forgecdn.net/files/4405/338/archaicfix-0.5.0.jar",
|
||||||
|
"installer": "internal.dir:mods"
|
||||||
|
},
|
||||||
|
"type": "mod",
|
||||||
|
"options": [
|
||||||
|
"server",
|
||||||
|
"client",
|
||||||
|
"required",
|
||||||
|
"included"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "mod-mousetweaks",
|
"id": "mod-mousetweaks",
|
||||||
"file": {
|
"file": {
|
||||||
|
|
|
@ -23,7 +23,7 @@ tweaks {
|
||||||
B:disableNewFlowers=true
|
B:disableNewFlowers=true
|
||||||
|
|
||||||
# reenable the Farlands! [default: false]
|
# reenable the Farlands! [default: false]
|
||||||
B:enableFarlands=true
|
B:enableFarlands=false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
21
src/overrides/config/EnderStorage.cfg
Normal file
21
src/overrides/config/EnderStorage.cfg
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#EnderStorage Configuration File
|
||||||
|
#Deleting any element will restore it to it's default value
|
||||||
|
#Block ID's will be automatically generated the first time it's run
|
||||||
|
|
||||||
|
#Causes chests to lose personal settings and drop the diamond on break
|
||||||
|
anarchy-mode=false
|
||||||
|
|
||||||
|
checkUpdates=false
|
||||||
|
|
||||||
|
#Set to true to make the vanilla enderchest unplaceable.
|
||||||
|
disable-vanilla=false
|
||||||
|
|
||||||
|
#Set to true to make the vanilla enderchest uncraftable.
|
||||||
|
disable-vanilla_recipe=false
|
||||||
|
|
||||||
|
#The size of each inventory of EnderStorage. 0 = 3x3, 1 = 3x9, 2 = 6x9
|
||||||
|
item.storage-size=1
|
||||||
|
|
||||||
|
|
||||||
|
#The name of the item used to set the chest to personal. Diamond by default
|
||||||
|
personalItemID=diamond
|
|
@ -51,7 +51,7 @@ general {
|
||||||
B:allow_warded_stone=true
|
B:allow_warded_stone=true
|
||||||
|
|
||||||
# Can Taint be caused by flux effects.
|
# Can Taint be caused by flux effects.
|
||||||
B:biome_taint_from_flux=true
|
B:biome_taint_from_flux=false
|
||||||
|
|
||||||
# The chance per block update (1 in n) of the Taint biome spreading. Setting it to 0 prevents the spread of Taint biomes.
|
# The chance per block update (1 in n) of the Taint biome spreading. Setting it to 0 prevents the spread of Taint biomes.
|
||||||
I:biome_taint_spread=200
|
I:biome_taint_spread=200
|
||||||
|
|
0
src/overrides/scripts/ae2.zs
Executable file → Normal file
0
src/overrides/scripts/ae2.zs
Executable file → Normal file
7
src/overrides/scripts/aspects.zs
Normal file
7
src/overrides/scripts/aspects.zs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import mods.thaumcraft.Aspects;
|
||||||
|
|
||||||
|
// Corrupted Essence
|
||||||
|
Aspects.set(<SSTOW:sstow_materials:4>, "vitium 1, spiritus 2, tenebrae 2");
|
||||||
|
|
||||||
|
// Soulium Ingot
|
||||||
|
Aspects.set(<SSTOW:sstow_materials:2>, "vitium 4, spiritus 4, metallum 8");
|
17
src/overrides/scripts/logisticspipes.zs
Normal file
17
src/overrides/scripts/logisticspipes.zs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
var upgradeModuleUpgrade = <LogisticsPipes:item.itemUpgrade:44>;
|
||||||
|
var paper = <minecraft:paper>;
|
||||||
|
var blankModule = <LogisticsPipes:item.itemModule>;
|
||||||
|
var redstone = <ore:dustRedstone>;
|
||||||
|
var goldenChipset = <ore:chipsetGold>;
|
||||||
|
var goldNugget = <ore:nuggetGold>;
|
||||||
|
|
||||||
|
// This item has no recipe by default.
|
||||||
|
// It also has no texture, but it is implemented.
|
||||||
|
recipes.addShaped(
|
||||||
|
upgradeModuleUpgrade,
|
||||||
|
[
|
||||||
|
[paper, blankModule, paper],
|
||||||
|
[redstone, goldenChipset, redstone],
|
||||||
|
[paper, goldNugget, paper]
|
||||||
|
]
|
||||||
|
);
|
2
src/overrides/scripts/mekanism.zs
Executable file → Normal file
2
src/overrides/scripts/mekanism.zs
Executable file → Normal file
|
@ -11,7 +11,7 @@ val thermodynamicConductor = <Mekanism:PartTransmitter:18>;
|
||||||
function pipeRecipe(pipe as IItemStack, middleItem as IIngredient) {
|
function pipeRecipe(pipe as IItemStack, middleItem as IIngredient) {
|
||||||
recipes.remove(pipe);
|
recipes.remove(pipe);
|
||||||
recipes.addShaped(
|
recipes.addShaped(
|
||||||
pipe,
|
pipe * 8,
|
||||||
[[<ore:ingotOsmium>, middleItem, <ore:ingotOsmium>]]
|
[[<ore:ingotOsmium>, middleItem, <ore:ingotOsmium>]]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
3
src/overrides/scripts/oredict.zs
Normal file
3
src/overrides/scripts/oredict.zs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
// Fix rubber wood not counting as wood
|
||||||
|
|
||||||
|
<ore:logWood>.addAll(<ore:woodRubber>);
|
|
@ -92,6 +92,8 @@ Research.addPrereq("DISTILESSENTIA", "BASICFLUX");
|
||||||
Research.addPrereq("INFUSION", "THETHEORYOFEVERYTHING", true);
|
Research.addPrereq("INFUSION", "THETHEORYOFEVERYTHING", true);
|
||||||
Research.clearPrereqs("JARLABEL");
|
Research.clearPrereqs("JARLABEL");
|
||||||
Research.addPrereq("JARLABEL", "UNIFIEDTHAUMICFIELDTHEORY");
|
Research.addPrereq("JARLABEL", "UNIFIEDTHAUMICFIELDTHEORY");
|
||||||
|
Research.setAspects("JARLABEL", "vitreus 16, vinculum 16, vacuos 16, tutamen 8");
|
||||||
|
Research.setStub("JARLABEL", false);
|
||||||
Arcane.removeRecipe(<Thaumcraft:ItemResource:8>);
|
Arcane.removeRecipe(<Thaumcraft:ItemResource:8>);
|
||||||
Research.clearPages("DISTILESSENTIA");
|
Research.clearPages("DISTILESSENTIA");
|
||||||
Research.addPage("DISTILESSENTIA", "tc.research_page.DISTILESSENTIA.1");
|
Research.addPage("DISTILESSENTIA", "tc.research_page.DISTILESSENTIA.1");
|
||||||
|
|
Loading…
Reference in a new issue