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 @@
-
-
- -
-
@@ -583,6 +587,43 @@
+
+ +
+
+
+ Block +
+ +
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
@@ -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; }