Add damage object and improve NBT fields

This commit is contained in:
Misode
2019-06-21 16:46:56 +02:00
parent ebacf9ec5e
commit d8ce84e385
4 changed files with 272 additions and 12 deletions

View File

@@ -28,6 +28,10 @@
}
.card.bg-dark .card.bg-dark {
background-color: #565b60 !important;
}
.card.bg-dark .card.bg-dark .card.bg-dark {
background-color: #4b4f54 !important;
}
@@ -43,6 +47,10 @@
-webkit-tab-size: 4;
}
textarea {
min-height: 37.6px;
}
textarea.invalid {
border-color: red !important;
}

View File

@@ -10,7 +10,7 @@
<body>
<nav class="navbar navbar-dark bg-dark">
<span class="navbar-brand mb-0 h1">Loot Table Generator for Minecraft 1.14</span>
<span class="float-right"><a href="https://github.com/misode" style="color: #ddd;">by Misode</a></span>
<span class="float-right"><a href="https://github.com/misode/loot-table" style="color: #ddd;">by Misode</a></span>
</nav>
<div class="container">
<div class="row my-4">
@@ -226,7 +226,7 @@
<div class="input-group-prepend">
<span class="input-group-text">Tag</span>
</div>
<input type="text" class="form-control code" onchange="updateField(this, 'tag')" onclick="this.select()">
<textarea type="text" class="form-control code" onchange="updateField(this, 'tag')" onclick="this.select()"></textarea>
</div>
<div class="mt-3 function-ench-rand d-none">
<div class="input-group">
@@ -329,7 +329,7 @@
<div class="input-group-prepend">
<span class="input-group-text">Name</span>
</div>
<input type="text" class="form-control code" onchange="updateJSONField(this, 'name')" onclick="this.select()">
<textarea type="text" class="form-control code" onchange="updateField(this, 'name')" onclick="this.select()" style="height: 0px"></textarea>
</div>
<div class="input-group function-limit-range mt-3 d-none" data-type="exact">
<div class="input-group-prepend">
@@ -717,7 +717,7 @@
<div class="input-group-prepend">
<span class="input-group-text">NBT</span>
</div>
<input type="text" class="form-control nbt code" onchange="updateField(this, 'nbt')" onclick="this.select()">
<textarea type="text" class="form-control code" onchange="updateField(this, 'nbt')" onclick="this.select()"></textarea>
</div>
<button class="btn btn-light mt-3 dropdown-toggle" type="button" onclick="toggleEntityLocation(this)">Location</button>
</div>
@@ -778,7 +778,129 @@
<div class="input-group-prepend">
<span class="input-group-text">NBT</span>
</div>
<input type="text" class="form-control nbt code" onchange="updateField(this, 'nbt')" onclick="this.select()">
<textarea type="text" class="form-control code" onchange="updateField(this, 'nbt')" onclick="this.select()"></textarea>
</div>
</div>
</div>
<div id="damageTemplate" class="card bg-dark mt-3 damage">
<div class="card-body">
<button class="btn btn-light dropdown-toggle" type="button" data-shows="false" onclick="toggleDamageFlags(this)">Damage Type</button>
<div class="input-group mt-3 damage-flag damage-projectile d-none">
<div class="input-group-prepend">
<span class="input-group-text">Projectile</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'type.is_projectile')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'type.is_projectile')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-explosion d-none">
<div class="input-group-prepend">
<span class="input-group-text">Explosion</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'type.is_explosion')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'type.is_explosion')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-fire d-none">
<div class="input-group-prepend">
<span class="input-group-text">Fire</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'type.is_fire')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'type.is_fire')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-magic d-none">
<div class="input-group-prepend">
<span class="input-group-text">Magic</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'type.is_magic')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'type.is_magic')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-lightning d-none">
<div class="input-group-prepend">
<span class="input-group-text">Lightning</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'is_lightning')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'is_lightning')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-starvation d-none">
<div class="input-group-prepend">
<span class="input-group-text">Starvation</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'type.bypasses_magic')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'type.bypasses_magic')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-void d-none">
<div class="input-group-prepend">
<span class="input-group-text">Void</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'type.bypasses_invulnerability')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'type.bypasses_invulnerability')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-armor d-none">
<div class="input-group-prepend">
<span class="input-group-text">Bypass Armor</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'type.bypasses_armor')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'type.bypasses_armor')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-dealt">
<div class="input-group-prepend">
<span class="input-group-text">Dealt</span>
<button type="button" class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" onclick="updateRangeType(this, 'dealt', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'dealt', 'range')">Range</a>
</div>
</div>
<input type="text" class="form-control exact d-none" value="1" onchange="updateRangeField(this, 'dealt')" onclick="this.select()">
<span class="input-group-text rounded-0 range d-none">Min</span>
<input type="text" class="form-control range min d-none" value="1" onchange="updateRangeField(this, 'dealt')" onclick="this.select()">
<span class="input-group-text rounded-0 range d-none">Max</span>
<input type="text" class="form-control range max d-none" value="2" onchange="updateRangeField(this, 'dealt')" onclick="this.select()">
</div>
<div class="input-group mt-3 damage-taken">
<div class="input-group-prepend">
<span class="input-group-text">Taken</span>
<button type="button" class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" onclick="updateRangeType(this, 'taken', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'taken', 'range')">Range</a>
</div>
</div>
<input type="text" class="form-control exact d-none" value="1" onchange="updateRangeField(this, 'taken')" onclick="this.select()">
<span class="input-group-text rounded-0 range d-none">Min</span>
<input type="text" class="form-control range min d-none" value="1" onchange="updateRangeField(this, 'taken')" onclick="this.select()">
<span class="input-group-text rounded-0 range d-none">Max</span>
<input type="text" class="form-control range max d-none" value="2" onchange="updateRangeField(this, 'taken')" onclick="this.select()">
</div>
<div class="input-group mt-3 damage-blocked">
<div class="input-group-prepend">
<span class="input-group-text">Blocked</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'blocked')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'blocked')">True</button>
</div>
</div>
<button class="btn btn-light dropdown-toggle mt-3" type="button" data-shows="false" onclick="toggleSourceEntity(this)">Source Entity</button>
<div class="source-entity">
</div>
<button class="btn btn-light dropdown-toggle mt-3" type="button" data-shows="false" onclick="toggleDirectEntity(this)">Direct Entity</button>
<div class="direct-entity">
</div>
</div>
</div>

View File

@@ -6,7 +6,7 @@ $('#indentationSelect').val("2");
let indentation = 2;
let luck_based = false;
const nodes = '.loot-table, .pool, .entry, .child, .term, .terms, .function, .condition, .modifier, .operation, .predicate, .location';
const nodes = '.loot-table, .pool, .entry, .child, .term, .terms, .function, .condition, .modifier, .operation, .predicate, .location, .source-entity, .direct-entity';
let table = {
type: "minecraft:generic",
pools: []
@@ -95,6 +95,10 @@ function getParent(el) {
return getParent($parent.parent()).predicate;
} else if ($parent.hasClass('location')) {
return getParent($parent.parent()).location;
} else if ($parent.hasClass('source-entity')) {
return getParent($parent.parent()).source_entity;
} else if ($parent.hasClass('direct-entity')) {
return getParent($parent.parent()).direct_entity;
}
}
@@ -245,7 +249,19 @@ function deleteValue(root, field) {
if (f.length === 6) delete root[f[0]][f[1]][f[2]][f[3]][f[4]][f[6]];
}
function getValue(root, field) {
let f = field.split('.');
if (f.length === 1) return root[f[0]];
if (f.length === 2) return root[f[0]][f[1]];
if (f.length === 3) return root[f[0]][f[1]][f[2]];
if (f.length === 4) return root[f[0]][f[1]][f[2]][f[3]];
if (f.length === 5) return root[f[0]][f[1]][f[2]][f[3]][f[4]];
if (f.length === 6) return root[f[0]][f[1]][f[2]][f[3]][f[4]][f[6]];
}
function updateField(el, field) {
console.log('update', field, '->', $(el).val());
console.log(getParent(el));
updateValue(getParent(el), field, $(el).val());
invalidated();
}
@@ -313,6 +329,26 @@ function getRangeField($el, type) {
}
}
function updateRadioField(el, field) {
let parent = getParent(el);
let value = $(el).val();
let oldvalue = getValue(parent, field);
if (value === 'true') {
if (oldvalue === true) {
deleteValue(parent, field);
} else {
updateValue(getParent(el), field, true);
}
} else if (value === 'false') {
if (oldvalue === false) {
deleteValue(parent, field);
} else {
updateValue(getParent(el), field, false);
}
}
invalidated();
}
function addEnchantment(el) {
let func = getParent(el);
let enchantment = $(el).attr('data-ench');
@@ -527,3 +563,33 @@ function updateItemField(el, type) {
}
invalidated();
}
function toggleDamageFlags(el) {
let parent = getParent(el);
if (parent.type) {
delete parent.type;
} else {
parent.type = {};
}
invalidated();
}
function toggleSourceEntity(el) {
let parent = getParent(el);
if (parent.source_entity) {
delete parent.source_entity;
} else {
parent.source_entity = {};
}
invalidated();
}
function toggleDirectEntity(el) {
let parent = getParent(el);
if (parent.direct_entity) {
delete parent.direct_entity;
} else {
parent.direct_entity = {};
}
invalidated();
}

76
view.js
View File

@@ -4,6 +4,13 @@ function invalidated() {
$('#source').val(JSON.stringify(table, null, indentation));
}
function preventNewline(e) {
if (e.which === 13) {
$(e.target).trigger('change');
e.preventDefault();
}
}
function generateRange($el, data) {
if (typeof data === 'object') {
if (data.type && data.type.match(/(minecraft:)?binomial/)) {
@@ -24,6 +31,14 @@ function generateRange($el, data) {
}
}
function generateRadio($el, data) {
if (data === true) {
$el.find('[value="true"]').addClass('active');
} else if (data === false) {
$el.find('[value="false"]').addClass('active');
}
}
function generateStructure() {
$('#structure').html('');
@@ -167,7 +182,7 @@ function generateFunction(func, i) {
}
}
$function.find('.function-nbt').removeClass('d-none');
$function.find('.function-nbt input').val(func.tag);
$function.find('.function-nbt textarea').val(func.tag).keydown(e => preventNewline(e));
} else {
delete func.tag;
}
@@ -234,7 +249,7 @@ function generateFunction(func, i) {
if (typeof value !== 'string') {
value = JSON.stringify(value);
}
$function.find('.function-name input').val(value);
$function.find('.function-name input').val(value).keydown(e => preventNewline(e));
} else {
delete func.name;
}
@@ -485,7 +500,7 @@ function generateCondition(condition, i) {
delete condition.properties;
}
if (condition.condition === 'minecraft:entity_properties' || condition.condition === 'minecraft:location_check' || condition.condition === 'minecraft:match_tool') {
if (condition.condition === 'minecraft:entity_properties' || condition.condition === 'minecraft:location_check' || condition.condition === 'minecraft:match_tool' || condition.condition === 'minecraft:damage_source_properties') {
if(!condition.predicate) {
condition.predicate = {};
@@ -514,10 +529,17 @@ function generateCondition(condition, i) {
}
}
if (condition.condition === 'minecraft:damage_source_properties') {
let $damage = generateDamage(condition.predicate);
$condition.children('.card-body').append($damage);
if (condition.predicate) {
delete condition.nbt;
}
}
if (condition.condition === 'minecraft:match_tool') {
let $item = generateItem(condition.predicate);
$condition.children('.card-body').append($item);
} else {
}
} else {
@@ -684,7 +706,7 @@ function generateEntity(entity) {
}
}
$entity.find('.type').val(entity.type);
$entity.find('.nbt').val(entity.nbt);
$entity.find('.nbt').val(entity.nbt).keydown(e => preventNewline(e));
if (entity.type === '') {
delete entity.type;
}
@@ -716,7 +738,7 @@ function generateItem(item) {
}
generateRange($item.find('.item-count'), item.count);
generateRange($item.find('.item-durability'), item.durability);
$item.find('.nbt').val(item.nbt);
$item.find('.nbt').val(item.nbt).keydown(e => preventNewline(e));
$item.find('.potion').val(item.potion);
if (item.name === '') {
delete item.name;
@@ -733,3 +755,45 @@ function generateItem(item) {
return $item;
}
function generateDamage(damage) {
let $damage = $('#damageTemplate').clone().removeAttr('id').addClass('predicate');
if (!damage) {
damage = {};
}
if (damage.type) {
$damage.find('.damage-flag').removeClass('d-none');
generateRadio($damage.find('.damage-projectile'), damage.type.is_projectile);
generateRadio($damage.find('.damage-explosion'), damage.type.is_explosion);
generateRadio($damage.find('.damage-fire'), damage.type.is_fire);
generateRadio($damage.find('.damage-magic'), damage.type.is_magic);
generateRadio($damage.find('.damage-lightning'), damage.is_lightning);
generateRadio($damage.find('.damage-starvation'), damage.type.bypasses_magic);
generateRadio($damage.find('.damage-void'), damage.type.bypasses_invulnerability);
generateRadio($damage.find('.damage-armor'), damage.type.bypasses_armor);
}
if (damage.source_entity) {
let $entity = generateEntity(damage.source_entity);
$entity.removeClass('predicate');
$damage.find('.source-entity').append($entity);
}
if (damage.direct_entity) {
let $entity = generateEntity(damage.direct_entity);
$entity.removeClass('predicate');
$damage.find('.direct-entity').append($entity);
}
if (typeof damage.dealt !== 'object' && isNaN(damage.dealt)) {
delete damage.dealt;
}
if (typeof damage.dealt !== 'object' && isNaN(damage.taken)) {
delete damage.taken;
}
generateRange($damage.find('.damage-dealt'), damage.dealt);
generateRange($damage.find('.damage-taken'), damage.taken);
generateRadio($damage.find('.damage-blocked'), damage.blocked);
return $damage;
}