diff --git a/custom.css b/custom.css
index 7714c16c..08af558a 100644
--- a/custom.css
+++ b/custom.css
@@ -1,3 +1,7 @@
+.card.child {
+ background-color: #eee;
+}
+
.card.bg-info {
background-color: #91cdd6 !important;
color: black !important;
diff --git a/index.html b/index.html
index 11729aef..f409182d 100644
--- a/index.html
+++ b/index.html
@@ -33,7 +33,7 @@
-
@@ -532,11 +532,20 @@
Condition
@@ -567,11 +576,6 @@
-
@@ -603,6 +644,15 @@
+
diff --git a/model.js b/model.js
index e4f07df6..9fd2afc1 100644
--- a/model.js
+++ b/model.js
@@ -5,7 +5,7 @@ $('#tableType').val("minecraft:generic");
$('#indentationSelect').val("2");
let indentation = 2;
let luck_based = false;
-let nodes = '.table, .pool, .entry, .child, .term, .terms, .function, .condition, .modifier, .operation';
+let nodes = '.loot-table, .pool, .entry, .child, .term, .terms, .function, .condition, .modifier, .operation';
let table = {
type: "minecraft:generic",
pools: []
@@ -28,8 +28,11 @@ function updateSouce() {
try {
table = JSON.parse($('#source').val());
} catch {
- $('#source').addClass('invalid');
- return;
+ if ($('#source').val().length > 0) {
+ $('#source').addClass('invalid');
+ return;
+ }
+ table = {};
}
invalidated();
}
@@ -51,7 +54,7 @@ function copySource(el) {
function getParent(el) {
let $parent = $(el).closest(nodes);
let index = $parent.attr('data-index');
- if ($parent.hasClass('table')) {
+ if ($parent.hasClass('loot-table')) {
return table;
} else if ($parent.hasClass('pool')) {
return getParent($parent.parent()).pools[index];
@@ -85,16 +88,22 @@ function getIndex(el) {
}
function addPool(el) {
+ if (!table.pools) {
+ table.pools = [];
+ }
table.pools.push({
- rolls: 1,
- entries: []
+ rolls: 1
});
invalidated();
}
function removePool(el) {
+ let parent = getSuperParent(el);
let index = getIndex(el);
- getSuperParent(el).pools.splice(index, 1);
+ parent.pools.splice(index, 1);
+ if (parent.pools.length === 0) {
+ delete parent.pools;
+ }
invalidated();
}
@@ -111,8 +120,12 @@ function addEntry(el) {
}
function removeEntry(el) {
+ let parent = getSuperParent(el);
let index = getIndex(el);
- getSuperParent(el).entries.splice(index, 1);
+ parent.entries.splice(index, 1);
+ if (parent.entries.length === 0) {
+ delete parent.entries;
+ }
invalidated();
}
@@ -359,7 +372,7 @@ function removeOperation(el) {
invalidated();
}
-function updateIntField(el, field) {
+function updateParameterIntField(el, field) {
let value = parseInt($(el).val());
if (isNaN(value)) {
delete getParent(el).parameters[field];
@@ -369,7 +382,7 @@ function updateIntField(el, field) {
invalidated();
}
-function updateFloatField(el, field) {
+function updateParameterFloatField(el, field) {
let value = parseFloat($(el).val());
if (isNaN(value)) {
delete getParent(el).parameters[field];
@@ -378,3 +391,25 @@ function updateFloatField(el, field) {
}
invalidated();
}
+
+function addBlockProperty(el) {
+ let func = getParent(el);
+ let blockstate = $(el).closest('.condition-block-properties').find('input').val();
+ if (!func.properties) {
+ func.properties = {};
+ }
+ func.properties[blockstate] = '';
+ invalidated();
+}
+
+function removeBlockProperty(el) {
+ let blockstate = $(el).closest('.block-property').attr('data-blockstate');
+ delete getParent(el).properties[blockstate];
+ invalidated();
+}
+
+function updateBlockPropertyField(el) {
+ let blockstate = $(el).closest('.block-property').attr('data-blockstate');
+ getParent(el).properties[blockstate] = $(el).val();
+ invalidated();
+}
diff --git a/view.js b/view.js
index 8918326c..8aae4091 100644
--- a/view.js
+++ b/view.js
@@ -27,11 +27,18 @@ function generateRange($el, data) {
function generateStructure() {
$('#structure').html('');
- for (let i = 0; i < table.pools.length; i += 1) {
- let $pool = generatePool(table.pools[i], i);
- $('#structure').append($pool);
+ if (!table.type) {
+ table.type = 'minecraft:empty';
+ }
+ $('#tableType').val(table.type);
- $('#luck-based').attr('checked', luck_based);
+ if (table.pools) {
+ for (let i = 0; i < table.pools.length; i += 1) {
+ let $pool = generatePool(table.pools[i], i);
+ $('#structure').append($pool);
+
+ $('#luck-based').attr('checked', luck_based);
+ }
}
}
@@ -56,9 +63,11 @@ function generatePool(pool, i) {
$pool.find('.bonus-rolls').addClass('d-none');
}
- for (let j = 0; j < pool.entries.length; j += 1) {
- let $entry = generateEntry(pool.entries[j], j, pool.entries.length);
- $pool.children('.card-body').append($entry);
+ if (pool.entries) {
+ for (let j = 0; j < pool.entries.length; j += 1) {
+ let $entry = generateEntry(pool.entries[j], j, pool.entries.length);
+ $pool.children('.card-body').append($entry);
+ }
}
if (pool.conditions) {
@@ -394,18 +403,21 @@ function generateCondition(condition, i) {
$condition.removeAttr('id').attr('data-index', i);
$condition.find('.condition-type').val(condition.condition);
+
if (condition.condition === 'minecraft:random_chance' || condition.condition === 'minecraft:random_chance_with_looting') {
$condition.find('.condition-chance').removeClass('d-none');
$condition.find('.condition-chance input').val(condition.chance);
} else {
delete condition.chance;
}
+
if (condition.condition === 'minecraft:random_chance_with_looting') {
$condition.find('.condition-looting-multiplier').removeClass('d-none');
$condition.find('.condition-looting-multiplier input').val(condition.looting_multiplier);
} else {
delete condition.looting_multiplier;
}
+
if (condition.condition === 'minecraft:killed_by_player') {
$condition.find('.condition-killed-inverted').removeClass('d-none');
let inverted = false;
@@ -419,36 +431,80 @@ function generateCondition(condition, i) {
} else {
delete condition.inverted;
}
+
if (condition.condition === 'minecraft:entity_properties' || condition.condition === 'minecraft:entity_scores') {
$condition.find('.condition-entity').removeClass('d-none');
$condition.find('.condition-entity select').val(condition.entity);
} else {
delete condition.entity;
}
- if (condition.condition === 'minecraft:entity_properties') {
+
+ if (condition.condition === 'minecraft:blockstate_propery') {
+ $condition.find('.condition-block').removeClass('d-none');
+ $condition.find('.condition-block input').val(condition.block);
+ $condition.find('.condition-block-properties').removeClass('d-none');
+ } else {
+ delete condition.block;
+ delete condition.properties;
+ }
+
+ if (condition.condition === 'minecraft:entity_properties' || condition.condition === 'minecraft:location_predicate' || condition.condition === 'minecraft:match_tool') {
$condition.find('.condition-predicate').removeClass('d-none');
} else {
delete condition.predicate;
}
+
if (condition.condition === 'minecraft:entity_scores') {
$condition.find('.condition-entity-scores').removeClass('d-none');
-
- if (condition.scores) {
- $condition.find('.scores-list').removeClass('d-none');
- for (let objective in condition.scores) {
- let score = condition.scores[objective];
- delete score.type;
- let $score = $('#scoreTemplate').clone();
- $score.removeAttr('id').attr('data-objective', objective);
- $score.find('.objective').text(objective);
- generateRange($score, score);
-
- $condition.find('.scores-list').append($score);
- }
- }
} else {
delete condition.scores;
}
+ if (condition.condition === 'minecraft:alternatives') {
+ $condition.find('.condition-terms').removeCLass('d-none');
+ } else {
+ delete condition.terms;
+ }
+
+ if (condition.scores) {
+ $condition.find('.scores-list').removeClass('d-none');
+ for (let objective in condition.scores) {
+ let score = condition.scores[objective];
+ delete score.type;
+ let $score = $('#scoreTemplate').clone();
+ $score.removeAttr('id').attr('data-objective', objective);
+ $score.find('.objective').text(objective);
+ generateRange($score, score);
+
+ $condition.find('.scores-list').append($score);
+ }
+ }
+
+ if (condition.properties) {
+ $condition.find('.property-list').removeClass('d-none');
+ for (let blockstate in condition.properties) {
+ let $property = $('#blockPropertyTemplate').clone();
+ $property.removeAttr('id').attr('data-blockstate', blockstate);
+ $property.find('input').val(condition.properties[blockstate]);
+ $property.find('.blockstate').text(blockstate);
+
+ $condition.find('.property-list').append($property);
+ }
+ }
+
+ if (condition.term) {
+ let $term = generateCondition(condition.term, 0);
+ $term.removeClass('condition').addClass('term');
+ $condition.children('.card-body').append($term);
+ }
+
+ if (condition.terms) {
+ for (let j = 0; j < condition.terms.length; j += 1) {
+ let $term = generateCondition(condition.terms[j], j);
+ $term.removeClass('condition').addClass('terms');
+ $condition.children('.card-body').append($term);
+ }
+ }
+
return $condition;
}