mirror of
https://github.com/misode/misode.github.io.git
synced 2026-04-30 09:42:44 +00:00
Add damage object and improve NBT fields
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
132
index.html
132
index.html
@@ -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>
|
||||
|
||||
68
model.js
68
model.js
@@ -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
76
view.js
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user