Abstraction of data fields and nodes

This commit is contained in:
Misode
2019-06-24 16:05:51 +02:00
parent bfdec4ef2d
commit 45001a3204
4 changed files with 375 additions and 457 deletions

View File

@@ -23,7 +23,7 @@
background-color: #eee !important;
}
.card.term, .card.terms {
.card.bg-info .card.bg-info {
background-color: #7cb6bf !important;
}

View File

@@ -36,7 +36,7 @@
<button type="button" class="btn btn-secondary" onclick="showSource()">Show Source</button>
</div>
</div>
<div id="structure" class="loot-table">
<div id="structure" class="loot-table" data-field="table">
</div>
</div>
<div class="col-12 col-lg-5 source-container">
@@ -63,67 +63,67 @@
</div>
<div class="d-none">
<div id="poolTemplate" class="card bg-success text-white mt-3 pool">
<div id="poolTemplate" class="card bg-success text-white mt-3 pool" data-field="pools[]">
<div class="card-header pb-1">
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removePool(this)">Remove Pool</button>
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeField(this)">Remove Pool</button>
<button type="button" class="btn btn-light mr-3 mb-2 float-left" onclick="addEntry(this)">Add Entry</button>
<button type="button" class="btn btn-info mr-3 mb-2 float-left" onclick="addCondition(this)">Add Condition</button>
</div>
<div class="card-body">
<div class="input-group rolls" data-type="range">
<div class="input-group rolls" data-type="range" data-field="rolls">
<div class="input-group-prepend">
<span class="input-group-text">Rolls</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, 'rolls', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'rolls', 'range')">Range</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'rolls', 'binomial')">Binomial</a>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
<a class="dropdown-item" value="binomial" onclick="updateRangeType(this)">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateRangeField(this, 'rolls')" onclick="this.select()">
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)" 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, 'rolls')" onclick="this.select()">
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" 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 rounded-right" value="2" onchange="updateRangeField(this, 'rolls')" onclick="this.select()">
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">n</span>
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateRangeField(this, 'rolls')" onclick="this.select()">
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">p</span>
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateRangeField(this, 'rolls')" onclick="this.select()">
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 bonus-rolls" data-type="range">
<div class="input-group mt-3 bonus-rolls" data-type="range" data-field="bonus_rolls">
<div class="input-group-prepend">
<span class="input-group-text">Bonus Rolls</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, 'bonus_rolls', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'bonus_rolls', 'range')">Range</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'bonus_rolls', 'binomial')">Binomial</a>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
<a class="dropdown-item" value="binomial" onclick="updateRangeType(this)">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateRangeField(this, 'bonus_rolls')" onclick="this.select()">
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)" 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, 'bonus_rolls')" onclick="this.select()">
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" 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 rounded-right" value="2" onchange="updateRangeField(this, 'bonus_rolls')" onclick="this.select()">
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">n</span>
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateRangeField(this, 'bonus_rolls')" onclick="this.select()">
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">p</span>
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateRangeField(this, 'bonus_rolls')" onclick="this.select()">
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateField(this)" onclick="this.select()">
</div>
</div>
</div>
<div id="entryTemplate" class="card mt-3 entry">
<div id="entryTemplate" class="card mt-3 entry" data-field="entries[]">
<div class="card-header pb-1">
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeEntry(this)">Remove Entry</button>
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeField(this)">Remove Entry</button>
<button type="button" class="btn btn-secondary mr-3 mb-2 float-left" onclick="addFunction(this)">Add Function</button>
<button type="button" class="btn btn-info mr-3 mb-2 float-left" onclick="addCondition(this)">Add Condition</button>
</div>
<div class="card-body">
<div class="input-group">
<div class="input-group" data-type="enum" data-field="type">
<div class="input-group-prepend">
<span class="input-group-text">Type</span>
</div>
<select class="form-control entry-type" onchange="updateField(this, 'type')">
<select class="form-control entry-type" onchange="updateField(this)">
<option value="minecraft:empty">Empty</option>
<option value="minecraft:item">Item</option>
<option value="minecraft:tag">Item Tag</option>
@@ -134,40 +134,40 @@
<option value="minecraft:dynamic">Dynamic</option>
</select>
</div>
<div class="input-group mt-3 entry-name d-none">
<div class="input-group mt-3 entry-name d-none" data-type="string" data-field="name">
<div class="input-group-prepend">
<span class="input-group-text">Name</span>
</div>
<input type="text" class="form-control" onchange="updateField(this, 'name')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 entry-weight d-none">
<div class="input-group mt-3 entry-weight d-none" data-type="int" data-field="weight">
<div class="input-group-prepend">
<span class="input-group-text">Weight</span>
</div>
<input type="text" class="form-control" onchange="updateIntField(this, 'weight')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 entry-quality d-none">
<div class="input-group mt-3 entry-quality d-none" data-type="int" data-field="quality">
<div class="input-group-prepend">
<span class="input-group-text">Quality</span>
</div>
<input type="text" class="form-control" onchange="updateIntField(this, 'quality')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 entry-children d-none">
<button type="button" class="btn btn-outline-success" onclick="addChild(this)">Add Child</button>
</div>
</div>
</div>
<div id="functionTemplate" class="card bg-secondary mt-3 function">
<div id="functionTemplate" class="card bg-secondary mt-3 function" data-field="functions[]">
<div class="card-header pb-1">
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeFunction(this)">Remove Function</button>
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeField(this)">Remove Function</button>
<button type="button" class="btn btn-info mr-3 mb-2 float-left" onclick="addCondition(this)">Add Condition</button>
</div>
<div class="card-body">
<div class="input-group">
<div class="input-group" data-type="enum" data-field="function">
<div class="input-group-prepend">
<span class="input-group-text">Function</span>
</div>
<select class="form-control function-type" onchange="updateField(this, 'function')">
<select class="form-control function-type" onchange="updateField(this)">
<option value="minecraft:set_count">Set Count</option>
<option value="minecraft:set_damage">Set Damage</option>
<option value="minecraft:set_name">Set Name</option>
@@ -187,53 +187,53 @@
<option value="minecraft:apply_bonus">Apply Bonus</option>
</select>
</div>
<div class="input-group function-count mt-3 d-none" data-type="range">
<div class="input-group function-count mt-3 d-none" data-type="range" data-field="count">
<div class="input-group-prepend">
<span class="input-group-text">Count</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, 'count', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'count', 'range')">Range</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'count', 'binomial')">Binomial</a>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
<a class="dropdown-item" value="binomial" onclick="updateRangeType(this)">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateRangeField(this, 'count')" onclick="this.select()">
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)" 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, 'count')" onclick="this.select()">
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" 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 rounded-right" value="2" onchange="updateRangeField(this, 'count')" onclick="this.select()">
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">n</span>
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateRangeField(this, 'count')" onclick="this.select()">
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">p</span>
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateRangeField(this, 'count')" onclick="this.select()">
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group function-damage mt-3 d-none" data-type="range">
<div class="input-group function-damage mt-3 d-none" data-type="range" data-field="damage">
<div class="input-group-prepend">
<span class="input-group-text">Damage</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, 'damage', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'damage', 'range')">Range</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'damage', 'binomial')">Binomial</a>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
<a class="dropdown-item" value="binomial" onclick="updateRangeType(this)">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateRangeField(this, 'damage')" onclick="this.select()">
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)" 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="0" onchange="updateRangeField(this, 'damage')" onclick="this.select()">
<input type="text" class="form-control range min d-none" value="0" onchange="updateField(this)" 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 rounded-right" value="1" onchange="updateRangeField(this, 'damage')" onclick="this.select()">
<input type="text" class="form-control range max d-none rounded-right" value="1" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">n</span>
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateRangeField(this, 'damage')" onclick="this.select()">
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">p</span>
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateRangeField(this, 'damage')" onclick="this.select()">
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 function-nbt d-none">
<div class="input-group mt-3 function-nbt d-none" data-type="nbt" data-field="tag">
<div class="input-group-prepend">
<span class="input-group-text">Tag</span>
<span class="input-group-text">NBT</span>
</div>
<textarea type="text" class="form-control code" onchange="updateField(this, 'tag')" onclick="this.select()"></textarea>
<textarea type="text" class="form-control code" onchange="updateField(this)" onclick="this.select()"></textarea>
</div>
<div class="mt-3 function-ench-rand d-none">
<div class="mt-3 function-ench-rand d-none" data-type="set" data-field="enchantments">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Optional Enchantments</span>
@@ -284,95 +284,84 @@
<div class="enchantment-list">
</div>
</div>
<div class="input-group function-ench-levels mt-3 d-none" data-type="range">
<div class="input-group function-ench-levels mt-3 d-none" data-type="range" data-field="levels">
<div class="input-group-prepend">
<span class="input-group-text">Levels</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, 'levels', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'levels', 'range')">Range</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'levels', 'binomial')">Binomial</a>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
<a class="dropdown-item" value="binomial" onclick="updateRangeType(this)">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateRangeField(this, 'levels')" onclick="this.select()">
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)" 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, 'levels')" onclick="this.select()">
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" 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 rounded-right" value="2" onchange="updateRangeField(this, 'levels')" onclick="this.select()">
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">n</span>
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateRangeField(this, 'levels')" onclick="this.select()">
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">p</span>
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateRangeField(this, 'levels')" onclick="this.select()">
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 function-ench-treasure d-none">
<div class="input-group mt-3 function-ench-treasure d-none" data-type="checkbox" data-field="treasure">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="treasureCheckbox" onchange="updateCheckedField(this, 'treasure')">
<input type="checkbox" class="custom-control-input" id="treasureCheckbox" onchange="updateField(this)">
<label class="custom-control-label" for="treasureCheckbox">Treasure</label>
</div>
</div>
<div class="input-group mt-3 function-limit d-none">
<div class="input-group mt-3 function-limit d-none" data-type="int" data-field="limit">
<div class="input-group-prepend">
<span class="input-group-text">Limit</span>
</div>
<input type="text" class="form-control" onchange="updateField(this, 'limit')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 function-attributes d-none">
<button type="button" class="btn btn-dark" onclick="addModifier(this)">Add Modifier</button>
</div>
<div class="input-group mt-3 function-source d-none">
<div class="input-group mt-3 function-source d-none" data-type="enum" data-field="source">
<div class="input-group-prepend">
<span class="input-group-text">Source</span>
</div>
<select class="form-control" onchange="updateField(this, 'source')">
<select class="form-control" onchange="updateField(this)">
<option value="block_entity">Block Entity</option>
<option value="this">This</option>
<option value="killer">Killer</option>
<option value="killer_player">Killer Player</option>
</select>
</div>
<div class="input-group mt-3 function-name d-none">
<div class="input-group mt-3 function-name d-none" data-type="json" data-field="name">
<div class="input-group-prepend">
<span class="input-group-text">Name</span>
</div>
<textarea type="text" class="form-control code" onchange="updateJSONField(this, 'name')" onclick="this.select()" style="height: 0px"></textarea>
<textarea type="text" class="form-control code" onchange="updateField(this)" onclick="this.select()" style="height: 0px"></textarea>
</div>
<div class="input-group function-limit-range mt-3 d-none" data-type="range">
<div class="input-group function-limit-range mt-3 d-none" data-type="range" data-field="limit">
<div class="input-group-prepend">
<span class="input-group-text">limit</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, 'limit', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'limit', 'range')">Range</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'limit', 'binomial')">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateRangeField(this, 'limit')" 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, 'limit')" 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 rounded-right" value="2" onchange="updateRangeField(this, 'limit')" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">n</span>
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateRangeField(this, 'limit')" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">p</span>
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateRangeField(this, 'limit')" onclick="this.select()">
<span class="input-group-text rounded-0 range">Min</span>
<input type="text" class="form-control range min" value="1" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 range">Max</span>
<input type="text" class="form-control range max rounded-right" value="2" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 function-entries d-none">
<button type="button" class="btn btn-light" onclick="addEntry(this)">Add Entry</button>
</div>
<div class="input-group mt-3 function-lore d-none">
<div class="input-group mt-3 function-lore d-none" data-type="json-list" data-field="lore">
<textarea class="form-control code" onchange="updateLoreField(this)" rows=3></textarea>
</div>
<div class="input-group mt-3 function-lore-replace d-none">
<div class="input-group mt-3 function-lore-replace d-none" data-type="checkbox" data-field="replace">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="loreReplaceCheckbox" onchange="updateCheckedField(this, 'replace')">
<input type="checkbox" class="custom-control-input" id="loreReplaceCheckbox" onchange="updateField(this)">
<label class="custom-control-label" for="loreReplaceCheckbox">Replace</label>
</div>
</div>
<div class="input-group mt-3 function-entity d-none">
<div class="input-group mt-3 function-entity d-none" data-type="enum" data-field="entity">
<div class="input-group-prepend">
<span class="input-group-text">Entity</span>
</div>
<select class="form-control" onchange="updateField(this, 'entity')">
<select class="form-control" onchange="updateField(this)">
<option value="this">This</option>
<option value="killer">Killer</option>
<option value="killer_player">Killer Player</option>
@@ -381,52 +370,52 @@
<div class="input-group mt-3 function-operations d-none">
<button type="button" class="btn btn-dark" onclick="addOperation(this)">Add Operation</button>
</div>
<div class="input-group mt-3 function-enchantment d-none">
<div class="input-group mt-3 function-enchantment d-none" data-type="string" data-field="enchantment">
<div class="input-group-prepend">
<span class="input-group-text">Enchantment</span>
</div>
<input type="text" class="form-control" onchange="updateField(this, 'enchantment')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 function-formula d-none">
<div class="input-group mt-3 function-formula d-none" data-type="enum" data-field="formula">
<div class="input-group-prepend">
<span class="input-group-text">Formula</span>
</div>
<select class="form-control function-type" onchange="updateField(this, 'formula')">
<select class="form-control" onchange="updateField(this)">
<option value="minecraft:uniform_bonus_count">Uniform Bonus Count</option>
<option value="minecraft:binomial_with_bonus_count">Binomial with Bonus Count</option>
<option value="minecraft:ore_drops">Ore Drops</option>
</select>
</div>
<div class="input-group mt-3 function-bonus-multiplier d-none">
<div class="input-group mt-3 function-bonus-multiplier d-none" data-type="float" data-field="parameters.bonusMultiplier">
<div class="input-group-prepend">
<span class="input-group-text">Multiplier</span>
</div>
<input type="text" class="form-control" onchange="updateIntField(this, 'parameters.bonusMultiplier')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this, 'parameters.bonusMultiplier')" onclick="this.select()">
</div>
<div class="input-group mt-3 function-bonus-extra d-none">
<div class="input-group mt-3 function-bonus-extra d-none" data-type="int" data-field="parameters.extra">
<div class="input-group-prepend">
<span class="input-group-text">Extra</span>
</div>
<input type="text" class="form-control" onchange="updateIntField(this, 'parameters.extra')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this, 'parameters.extra')" onclick="this.select()">
</div>
<div class="input-group mt-3 function-bonus-probability d-none">
<div class="input-group mt-3 function-bonus-probability d-none" data-type="float" data-field="parameters.probability">
<div class="input-group-prepend">
<span class="input-group-text">Propability</span>
</div>
<input type="text" class="form-control" onchange="updateFloatField(this, 'parameters.probability')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this, 'parameters.probability')" onclick="this.select()">
</div>
</div>
</div>
<div id="modifierTemplate" class="card bg-dark mt-3 modifier">
<div id="modifierTemplate" class="card bg-dark mt-3 modifier" data-field="modifiers[]">
<div class="card-header pb-1">
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeModifier(this)">Remove Modifier</button>
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeField(this)">Remove Modifier</button>
</div>
<div class="card-body">
<div class="input-group">
<div class="input-group" data-type="enum" data-field="attribute">
<div class="input-group-prepend">
<span class="input-group-text">Attribute</span>
</div>
<select class="form-control modifier-attribute" onchange="updateField(this, 'attribute')">
<select class="form-control modifier-attribute" onchange="updateField(this)">
<option value="generic.maxHealth">Max Health</option>
<option value="generic.followRange">Follow Range</option>
<option value="generic.knockbackResistance">Knockback Resistance</option>
@@ -442,44 +431,44 @@
<option value="zombie.spawnReinforcements">Spawn Reinforcements</option>
</select>
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="string" data-field="name">
<div class="input-group-prepend">
<span class="input-group-text">Name</span>
</div>
<input type="text" class="form-control modifier-name" onchange="updateField(this, 'name')" onclick="this.select()">
<input type="text" class="form-control modifier-name" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 modifier-amount" data-type="range">
<div class="input-group mt-3 modifier-amount" data-type="range" data-field="amount">
<div class="input-group-prepend">
<span class="input-group-text">Amount</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, 'amount', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'amount', 'range')">Range</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'amount', 'binomial')">Binomial</a>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
<a class="dropdown-item" value="binomial" onclick="updateRangeType(this)">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateRangeField(this, 'amount')" onclick="this.select()">
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)" 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, 'amount')" onclick="this.select()">
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" 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 rounded-right" value="2" onchange="updateRangeField(this, 'amount')" onclick="this.select()">
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">n</span>
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateRangeField(this, 'amount')" onclick="this.select()">
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0 binomial d-none">p</span>
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateRangeField(this, 'amount')" onclick="this.select()">
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="enum" data-field="operation">
<div class="input-group-prepend">
<span class="input-group-text">Operation</span>
</div>
<select class="form-control modifier-operation" onchange="updateField(this, 'operation')">
<select class="form-control modifier-operation" onchange="updateField(this)">
<option value="addition">Addition</option>
<option value="multiply_base">Multiply Base</option>
<option value="multiply_total">Multiply Total</option>
</select>
</div>
<div class="mt-3 modifier-slots">
<div class="input-group">
<div class="input-group" data-type="set" data-field="slot">
<div class="input-group-prepend">
<span class="input-group-text">Slots</span>
</div>
@@ -500,28 +489,28 @@
</div>
</div>
</div>
<div id="operationTemplate" class="card bg-dark mt-3 operation">
<div id="operationTemplate" class="card bg-dark mt-3 operation" data-field="ops[]">
<div class="card-header pb-1">
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeOperation(this)">Remove Operation</button>
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeField(this)">Remove Operation</button>
</div>
<div class="card-body">
<div class="input-group">
<div class="input-group" data-type="string" data-field="source">
<div class="input-group-prepend">
<span class="input-group-text">Source</span>
</div>
<input type="text" class="form-control code operation-source" onchange="updateField(this, 'source')" onclick="this.select()">
<input type="text" class="form-control code operation-source" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="string" data-field="target">
<div class="input-group-prepend">
<span class="input-group-text">Target</span>
</div>
<input type="text" class="form-control code operation-target" onchange="updateField(this, 'target')" onclick="this.select()">
<input type="text" class="form-control code operation-target" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="enum" data-field="op">
<div class="input-group-prepend">
<span class="input-group-text">Operation</span>
</div>
<select class="form-control operation-type" onchange="updateField(this, 'op')">
<select class="form-control operation-type" onchange="updateField(this)">
<option value="replace">Replace</option>
<option value="append">Append</option>
<option value="merge">Merge</option>
@@ -529,16 +518,16 @@
</div>
</div>
</div>
<div id="conditionTemplate" class="card mt-3 bg-info condition">
<div id="conditionTemplate" class="card mt-3 bg-info condition" data-field="conditions[]">
<div class="card-header pb-1">
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeCondition(this)">Remove Condition</button>
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeField(this)">Remove Condition</button>
</div>
<div class="card-body">
<div class="input-group">
<div class="input-group" data-type="enum" data-field="condition">
<div class="input-group-prepend">
<span class="input-group-text">Condition</span>
</div>
<select class="form-control condition-type" onchange="updateField(this, 'condition')">
<select class="form-control condition-type" onchange="updateField(this)">
<option value="minecraft:alternative">Alternative</option>
<option value="minecraft:inverted">Inverted</option>
<option value="minecraft:entity_properties">Entity Properties</option>
@@ -555,29 +544,29 @@
<option value="minecraft:survives_explosion">Survives Explosion</option>
</select>
</div>
<div class="input-group mt-3 condition-chance d-none">
<div class="input-group mt-3 condition-chance d-none" data-type="float" data-field="chance">
<div class="input-group-prepend">
<span class="input-group-text">Chance</span>
</div>
<input type="text" class="form-control" onchange="updateFloatField(this, 'chance')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 condition-looting-multiplier d-none">
<div class="input-group mt-3 condition-looting-multiplier d-none" data-type="float" data-field="looting_multiplier">
<div class="input-group-prepend">
<span class="input-group-text">Looting Multiplier</span>
</div>
<input type="text" class="form-control" onchange="updateFloatField(this, 'looting_multiplier')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 condition-killed-inverted d-none">
<div class="input-group mt-3 condition-killed-inverted d-none" data-type="checkbox" data-field="inverted">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="invertedCheckbox" onchange="updateCheckedField(this, 'inverted')">
<input type="checkbox" class="custom-control-input" id="invertedCheckbox" onchange="updateField(this)">
<label class="custom-control-label" for="invertedCheckbox">Inverted</label>
</div>
</div>
<div class="input-group mt-3 condition-entity d-none">
<div class="input-group mt-3 condition-entity d-none" data-type="enum" data-field="entity">
<div class="input-group-prepend">
<span class="input-group-text">Entity</span>
</div>
<select class="form-control" onchange="updateField(this, 'entity')">
<select class="form-control" onchange="updateField(this)">
<option value="this">This</option>
<option value="killer">Killer</option>
<option value="killer_player">Killer Player</option>
@@ -597,11 +586,11 @@
<div class="input-group mt-3 condition-terms d-none">
<button type="button" class="btn btn-light" onclick="addTerm(this)">Add Term</button>
</div>
<div class="input-group mt-3 condition-block d-none">
<div class="input-group mt-3 condition-block d-none" data-type="string" data-field="block">
<div class="input-group-prepend">
<span class="input-group-text">Block</span>
</div>
<input type="text" class="form-control" onchange="updateField(this, 'block')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 condition-block-properties d-none">
<div class="input-group-prepend">
@@ -614,31 +603,31 @@
</div>
<div class="mt-3 property-list d-none">
</div>
<div class="input-group mt-3 condition-raining d-none">
<div class="input-group mt-3 condition-raining d-none" data-type="boolean" data-field="raining">
<div class="input-group-prepend">
<span class="input-group-text">Raining</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'raining')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'raining')">True</button>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this)">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this)">True</button>
</div>
</div>
<div class="input-group mt-3 condition-thundering d-none">
<div class="input-group mt-3 condition-thundering d-none" data-type="boolean" data-field="thundering">
<div class="input-group-prepend">
<span class="input-group-text">Thundering</span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateRadioField(this, 'thundering')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateRadioField(this, 'thundering')">True</button>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this)">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this)">True</button>
</div>
</div>
<div class="input-group mt-3 condition-enchantment d-none">
<div class="input-group mt-3 condition-enchantment d-none" data-type="string" data-field="enchantment">
<div class="input-group-prepend">
<span class="input-group-text">Enchantment</span>
</div>
<input type="text" class="form-control" onchange="updateField(this, 'enchantment')" onclick="this.select()">
<input type="text" class="form-control" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 condition-chances d-none">
<div class="input-group mt-3 condition-chances d-none" data-type="list" data-field="chances">
<div class="input-group-prepend">
<span class="input-group-text">Chances</span>
</div>
@@ -646,7 +635,7 @@
</div>
</div>
</div>
<div id="scoreTemplate" class="input-group mt-3 score" data-type="range">
<div id="scoreTemplate" class="input-group mt-3 score" data-type="range" data-field="scores">
<div class="input-group-prepend">
<span class="input-group-text objective"></span>
<button type="button" class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
@@ -673,53 +662,53 @@
<button class="btn btn-outline-danger bg-light" type="button" onclick="removeBlockProperty(this)">Remove</button>
</div>
</div>
<div id="locationTemplate" class="card bg-dark mt-3">
<div id="locationTemplate" class="card bg-dark mt-3" data-field="predicate">
<div class="card-body">
<button class="btn btn-light dropdown-toggle" type="button" data-shows="false" onclick="togglePosition(this)">Position</button>
<div class="input-group mt-2 position-collapse position-x d-none">
<div class="input-group mt-2 position-collapse position-x d-none" data-type="range" data-field="position.x">
<div class="input-group-prepend">
<span class="input-group-text">X</span>
</div>
<span class="input-group-text rounded-0 range">Min</span>
<input type="text" class="form-control min" onchange="updateFloatField(this, 'position.x.min')" onclick="this.select()">
<span class="input-group-text rounded-0 range">Max</span>
<input type="text" class="form-control max" onchange="updateFloatField(this, 'position.x.max')" onclick="this.select()">
<span class="input-group-text rounded-0">Min</span>
<input type="text" class="form-control range min" onchange="updateField(this)" onclick="this.select()">
<span class="input-group-text rounded-0">Max</span>
<input type="text" class="form-control range max" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-2 position-collapse position-y d-none">
<div class="input-group mt-2 position-collapse position-y d-none" data-type="range" data-field="position.y">
<div class="input-group-prepend">
<span class="input-group-text">Y</span>
</div>
<span class="input-group-text rounded-0 range">Min</span>
<input type="text" class="form-control min" onchange="updateFloatField(this, 'position.y.min')" onclick="this.select()">
<span class="input-group-text rounded-0 range">Max</span>
<input type="text" class="form-control max" onchange="updateFloatField(this, 'position.y.max')" onclick="this.select()">
<span class="input-group-text rounded-0">Min</span>
<input type="text" class="form-control range min" onchange="updateField(this, 'position.y.min')" onclick="this.select()">
<span class="input-group-text rounded-0">Max</span>
<input type="text" class="form-control range max" onchange="updateField(this, 'position.y.max')" onclick="this.select()">
</div>
<div class="input-group mt-2 position-collapse position-z d-none">
<div class="input-group mt-2 position-collapse position-z d-none" data-type="range" data-field="position.z">
<div class="input-group-prepend">
<span class="input-group-text">Z</span>
</div>
<span class="input-group-text rounded-0">Min</span>
<input type="text" class="form-control min" onchange="updateFloatField(this, 'position.z.min')" onclick="this.select()">
<input type="text" class="form-control range min" onchange="updateField(this, 'position.z.min')" onclick="this.select()">
<span class="input-group-text rounded-0">Max</span>
<input type="text" class="form-control max" onchange="updateFloatField(this, 'position.z.max')" onclick="this.select()">
<input type="text" class="form-control range max" onchange="updateField(this, 'position.z.max')" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="string" data-field="biome">
<div class="input-group-prepend">
<span class="input-group-text">Biome</span>
</div>
<input type="text" class="form-control biome" onchange="updateField(this, 'biome')" onclick="this.select()">
<input type="text" class="form-control biome" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="string" data-field="feature">
<div class="input-group-prepend">
<span class="input-group-text">Feature</span>
</div>
<input type="text" class="form-control feature" onchange="updateField(this, 'feature')" onclick="this.select()">
<input type="text" class="form-control feature" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="enum" data-field="dimension">
<div class="input-group-prepend">
<span class="input-group-text">Dimension</span>
</div>
<select class="form-control dimension" onchange="updateField(this, 'dimension')">
<select class="form-control dimension" onchange="updateField(this)">
<option value="">Unset</option>
<option value="minecraft:overworld">Overworld</option>
<option value="minecraft:the_nether">The Nether</option>
@@ -728,24 +717,24 @@
</div>
</div>
</div>
<div id="entityTemplate" class="card bg-dark mt-3">
<div id="entityTemplate" class="card bg-dark mt-3" data-field="predicate">
<div class="card-body">
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="string" data-field="type">
<div class="input-group-prepend">
<span class="input-group-text">Type</span>
</div>
<input type="text" class="form-control type" onchange="updateField(this, 'type')" onclick="this.select()">
<input type="text" class="form-control type" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="nbt" data-field="nbt">
<div class="input-group-prepend">
<span class="input-group-text">NBT</span>
</div>
<textarea type="text" class="form-control nbt code" onchange="updateField(this, 'nbt')" onclick="this.select()"></textarea>
<textarea type="text" class="form-control nbt code" onchange="updateField(this)" onclick="this.select()"></textarea>
</div>
<button class="btn btn-light mt-3 dropdown-toggle" type="button" onclick="toggleEntityLocation(this)">Location</button>
</div>
</div>
<div id="itemTemplate" class="card bg-dark mt-3">
<div id="itemTemplate" class="card bg-dark mt-3" data-field="predicate">
<div class="card-body">
<div class="input-group mt-3 item-type">
<div class="input-group-prepend">
@@ -761,162 +750,162 @@
<span class="input-group-text rounded-0 tag d-none">Tag</span>
<input type="text" class="form-control tag d-none" onchange="updateItemField(this, 'tag')" onclick="this.select()">
</div>
<div class="input-group mt-3 item-count" data-type="range">
<div class="input-group mt-3 item-count" data-type="range" data-field="count">
<div class="input-group-prepend">
<span class="input-group-text">Count</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, 'count', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'count', 'range')">Range</a>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
</div>
</div>
<input type="text" class="form-control exact d-none" value="1" onchange="updateRangeField(this, 'count')" onclick="this.select()">
<input type="text" class="form-control exact d-none" value="1" onchange="updateField(this)" 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, 'count')" onclick="this.select()">
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" 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, 'count')" onclick="this.select()">
<input type="text" class="form-control range max d-none" value="2" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 item-durability" data-type="range">
<div class="input-group mt-3 item-durability" data-type="range" data-field="durability">
<div class="input-group-prepend">
<span class="input-group-text">Durability</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, 'durability', 'exact')">Exact</a>
<a class="dropdown-item" onclick="updateRangeType(this, 'durability', 'range')">Range</a>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
</div>
</div>
<input type="text" class="form-control exact d-none" value="1" onchange="updateRangeField(this, 'durability')" onclick="this.select()">
<input type="text" class="form-control exact d-none" value="1" onchange="updateField(this)" 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, 'durability')" onclick="this.select()">
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" 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, 'durability')" onclick="this.select()">
<input type="text" class="form-control range max d-none" value="2" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="string" data-field="potion">
<div class="input-group-prepend">
<span class="input-group-text">Potion</span>
</div>
<input type="text" class="form-control potion" onchange="updateField(this, 'potion')" onclick="this.select()">
<input type="text" class="form-control potion" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group mt-3" data-type="nbt" data-field="nbt">
<div class="input-group-prepend">
<span class="input-group-text">NBT</span>
</div>
<textarea type="text" class="form-control nbt code" onchange="updateField(this, 'nbt')" onclick="this.select()"></textarea>
<textarea type="text" class="form-control nbt code" onchange="updateField(this)" onclick="this.select()"></textarea>
</div>
</div>
</div>
<div id="damageTemplate" class="card bg-dark mt-3 damage">
<div id="damageTemplate" class="card bg-dark mt-3 damage" data-field="predicate">
<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 mt-3 damage-flag damage-projectile d-none" data-type="boolean" data-field="type.is_projectile">
<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>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this, 'type.is_projectile')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this, 'type.is_projectile')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-explosion d-none">
<div class="input-group mt-3 damage-flag damage-explosion d-none" data-type="boolean" data-field="type.is_explosion">
<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>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this, 'type.is_explosion')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this, 'type.is_explosion')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-fire d-none">
<div class="input-group mt-3 damage-flag damage-fire d-none" data-type="boolean" data-field="type.is_fire">
<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>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this, 'type.is_fire')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this, 'type.is_fire')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-magic d-none">
<div class="input-group mt-3 damage-flag damage-magic d-none" data-type="boolean" data-field="type.is_magic">
<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>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this, 'type.is_magic')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this, 'type.is_magic')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-lightning d-none">
<div class="input-group mt-3 damage-flag damage-lightning d-none" data-type="boolean" data-field="is_lightning">
<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>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this)">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this)">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-starvation d-none">
<div class="input-group mt-3 damage-flag damage-starvation d-none" data-type="boolean" data-field="type.bypasses_magic">
<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>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this, 'type.bypasses_magic')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this, 'type.bypasses_magic')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-void d-none">
<div class="input-group mt-3 damage-flag damage-void d-none" data-type="boolean" data-field="type.bypasses_invulnerability">
<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>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this, 'type.bypasses_invulnerability')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this, 'type.bypasses_invulnerability')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-flag damage-armor d-none">
<div class="input-group mt-3 damage-flag damage-armor d-none" data-type="boolean" data-field="type.bypasses_armor">
<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>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this, 'type.bypasses_armor')">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this, 'type.bypasses_armor')">True</button>
</div>
</div>
<div class="input-group mt-3 damage-dealt" data-type="range">
<div class="input-group mt-3 damage-dealt" data-type="range" data-field="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>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
</div>
</div>
<input type="text" class="form-control exact d-none" value="1" onchange="updateRangeField(this, 'dealt')" onclick="this.select()">
<input type="text" class="form-control exact d-none" value="1" onchange="updateField(this)" 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()">
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" 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()">
<input type="text" class="form-control range max d-none" value="2" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 damage-taken" data-type="range">
<div class="input-group mt-3 damage-taken" data-type="range" data-field="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>
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)">Exact</a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)">Range</a>
</div>
</div>
<input type="text" class="form-control exact d-none" value="1" onchange="updateRangeField(this, 'taken')" onclick="this.select()">
<input type="text" class="form-control exact d-none" value="1" onchange="updateField(this)" 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()">
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" 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()">
<input type="text" class="form-control range max d-none" value="2" onchange="updateField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 damage-blocked">
<div class="input-group mt-3 damage-blocked" data-type="boolean" data-field="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>
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this)">False</button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this)">True</button>
</div>
</div>
<button class="btn btn-light dropdown-toggle mt-3" type="button" data-shows="false" onclick="toggleSourceEntity(this)">Source Entity</button>

343
model.js
View File

@@ -6,7 +6,6 @@ $('#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, .source-entity, .direct-entity';
let table = {
type: "minecraft:generic",
pools: []
@@ -77,46 +76,64 @@ function copySource(el) {
}
function getParent(el) {
let $parent = $(el).closest(nodes);
let index = $parent.attr('data-index');
if ($parent.hasClass('loot-table')) {
let $node = $(el).closest('[data-field]');
let fields = $node.attr('data-field').split('.');
if (fields.length === 1 && fields[0] === 'table') {
return table;
} else if ($parent.hasClass('pool')) {
return getParent($parent.parent()).pools[index];
} else if ($parent.hasClass('entry')) {
return getParent($parent.parent()).entries[index];
} else if ($parent.hasClass('child')) {
return getParent($parent.parent()).children[index];
} else if ($parent.hasClass('term')) {
return getParent($parent.parent()).term;
} else if ($parent.hasClass('terms')) {
return getParent($parent.parent()).terms[index];
} else if ($parent.hasClass('function')) {
return getParent($parent.parent()).functions[index];
} else if ($parent.hasClass('condition')) {
return getParent($parent.parent()).conditions[index];
} else if ($parent.hasClass('modifier')) {
return getParent($parent.parent()).modifiers[index];
} else if ($parent.hasClass('operation')) {
return getParent($parent.parent()).ops[index];
} else if ($parent.hasClass('predicate')) {
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;
}
if ($node.attr('data-type')) {
fields = fields.slice(0, -1);
}
let node = getParent($node.parent());
for (let f of fields) {
if (f.endsWith('[]')) {
f = f.slice(0, -2);
let index = $node.attr('data-index');
node = node[f][index];
} else {
if (node[f] === undefined) {
node[f] = {};
}
node = node[f];
}
}
return node;
}
function getSuperParent(el) {
let $parent = $(el).closest(nodes);
let $parent = $(el).closest('[data-field]');
return getParent($parent.parent());
}
function setField(node, field, value) {
let fields = field.split('.');
let last = fields.splice(-1)[0];
for (let f of fields) {
node = node[f];
}
node[last] = value;
}
function deleteField(node, field) {
let fields = field.split('.');
let last = fields.splice(-1)[0];
for (let f of fields) {
node = node[f];
}
delete node[last];
}
function getField(node, field) {
let fields = field.split('.');
let last = fields.splice(-1)[0];
for (let f of fields) {
node = node[f];
}
return node[last];
}
function getIndex(el) {
let $parent = $(el).closest(nodes);
let $parent = $(el).closest('[data-field]');
return parseInt($parent.attr('data-index'));
}
@@ -130,16 +147,6 @@ function addPool(el) {
invalidated();
}
function removePool(el) {
let parent = getSuperParent(el);
let index = getIndex(el);
parent.pools.splice(index, 1);
if (parent.pools.length === 0) {
delete parent.pools;
}
invalidated();
}
function addEntry(el) {
let pool = getParent(el);
if (!pool.entries) {
@@ -152,16 +159,6 @@ function addEntry(el) {
invalidated();
}
function removeEntry(el) {
let parent = getSuperParent(el);
let index = getIndex(el);
parent.entries.splice(index, 1);
if (parent.entries.length === 0) {
delete parent.entries;
}
invalidated();
}
function addChild(el) {
let entry = getParent(el);
if (!entry.children) {
@@ -174,16 +171,6 @@ function addChild(el) {
invalidated();
}
function removeChild(el) {
let parent = getSuperParent(el);
let index = getIndex(el);
parent.children.splice(index, 1);
if (parent.children.length === 0) {
delete parent.children;
}
invalidated();
}
function addFunction(el) {
let entry = getParent(el);
if (!entry.functions) {
@@ -195,15 +182,6 @@ function addFunction(el) {
invalidated();
}
function removeFunction(el) {
let parent = getSuperParent(el);
parent.functions.splice(getIndex(el), 1);
if (parent.functions.length === 0) {
delete parent.functions;
}
invalidated();
}
function addCondition(el) {
let parent = getParent(el);
if (!parent.conditions) {
@@ -216,161 +194,115 @@ function addCondition(el) {
invalidated();
}
function removeCondition(el) {
let parent = getSuperParent(el);
if (parent.conditions) {
parent.conditions.splice(getIndex(el), 1);
if (parent.conditions.length === 0) {
delete parent.conditions;
function updateField(el) {
let $field = $(el).closest('[data-field]');
let fields = $field.attr('data-field');
let field = fields.split('.').slice(-1)[0];
let type = $field.attr('data-type');
let node = getParent(el);
let value = undefined;
if (type === 'string' || type === 'int' || type === 'float' || type === 'enum' || type === 'json' || type === 'nbt') {
value = $(el).val();
}
if (type === 'int') {
value = parseInt(value);
if (isNaN(value)) {
value = '';
}
} else {
parent.terms.splice(getIndex(el), 1);
if (parent.terms.length === 0) {
delete parent.terms;
} else if (type === 'float') {
value = parseFloat(value);
if (isNaN(value)) {
value = '';
}
} else if (type === 'nbt') {
if (!value.startsWith('{')) {
value = '{' + value;
}
if (!value.endsWith('}')) {
value = value + '}';
}
} else if (type === 'json') {
value = parseJSONValue(value)
} else if (type === 'range') {
value = getRangeValue($field, node[field]);
} else if (type === 'checkbox') {
value = $(el).prop('checked');
} else if (type === 'boolean') {
value = getBooleanValue(node[field], ($(el).val() === 'true'));
}
invalidated();
}
function updateValue(root, field, value) {
let f = field.split('.');
if (f.length === 1) return root[f[0]] = value;
if (!root[f[0]]) root[f[0]] = {};
if (f.length === 2) return root[f[0]][f[1]] = value;
if (!root[f[0]][f[1]]) root[f[0]][f[1]] = {};
if (f.length === 3) return root[f[0]][f[1]][f[2]] = value;
if (!root[f[0]][f[1]][f[2]]) root[f[0]][f[1]][f[2]] = {};
if (f.length === 4) return root[f[0]][f[1]][f[2]][f[3]] = value;
if (!root[f[0]][f[1]][f[2]][f[3]]) 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]] = value;
if (!root[f[0]][f[1]][f[2]][f[3]][f[4]]) 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[5]] = value;
}
function deleteValue(root, field) {
let f = field.split('.');
if (f.length === 1) delete root[f[0]];
if (f.length === 2) delete root[f[0]][f[1]];
if (f.length === 3) delete root[f[0]][f[1]][f[2]];
if (f.length === 4) delete root[f[0]][f[1]][f[2]][f[3]];
if (f.length === 5) delete root[f[0]][f[1]][f[2]][f[3]][f[4]];
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) {
updateValue(getParent(el), field, $(el).val());
invalidated();
}
function updateJSONField(el, field) {
let value = parseJSONValue($(el).val());
updateValue(getParent(el), field, value);
invalidated();
}
function updateIntField(el, field) {
let value = parseInt($(el).val());
if (isNaN(value)) {
deleteValue(getParent(el), field);
if (value === '') {
deleteField(node, field);
} else {
updateValue(getParent(el), field, value);
setField(node, field, value);
}
invalidated();
}
function updateFloatField(el, field) {
let value = parseFloat($(el).val());
if (isNaN(value)) {
deleteValue(getParent(el), field);
} else {
updateValue(getParent(el), field, value);
function removeField(el) {
let node = getSuperParent(el);
let $field = $(el).closest('[data-field]');
let index = $field.attr('data-index');
let last = $field.attr('data-field').slice(0, -2);
node[last].splice(index, 1);
if (node[last].length === 0) {
delete node[last];
}
invalidated();
}
function updateCheckedField(el, field) {
getParent(el)[field] = $(el).prop('checked');
invalidated();
}
function updateRangeType(el, field, type) {
function updateRangeType(el) {
let $field = $(el).closest('[data-field]');
let field = $field.attr('data-field');
let type = $(el).attr('value');
if (type === 'range') {
updateValue(getParent(el), field, {});
setField(getParent(el), field, {});
} else if (type === 'binomial') {
updateValue(getParent(el), field, {type: "minecraft:binomial"});
setField(getParent(el), field, {type: "minecraft:binomial"});
} else {
updateValue(getParent(el), field, 0);
setField(getParent(el), field, 0);
}
updateRangeField(el, field);
updateField(el);
}
function updateRangeField(el, field) {
let parent = getParent(el);
let data = getValue(parent, field);
let $range = $(el).closest('[data-type="range"]');
function getRangeValue($field, data) {
console.log(data);
if (typeof data === 'object') {
console.log('object');
if (data.type && data.type.match(/(minecraft:)?binomial/)) {
let n = $range.find('.binomial.n').val();
let p = $range.find('.binomial.p').val();
if (n) {
data.n = parseInt(n);
} else {
delete data.n;
}
if (p) {
data.p = parseFloat(p);
} else {
delete data.min;
}
let n = $field.find('.binomial.n').val();
let p = $field.find('.binomial.p').val();
if (n) data.n = parseInt(n);
else delete data.n;
if (p) data.p = parseFloat(p);
else delete data.p;
} else {
let min = $range.find('.range.min').val();
let max = $range.find('.range.max').val();
if (min) {
data.min = parseFloat(min);
} else {
delete data.min;
}
if (max) {
data.max = parseFloat(max);
} else {
delete data.max;
}
let min = $field.find('.range.min').val();
let max = $field.find('.range.max').val();
if (min) data.min = parseFloat(min);
else delete data.min;
if (max) data.max = parseFloat(max);
else delete data.max;
}
} else {
data = parseFloat($range.find('.exact').val());
console.log('else');
data = parseFloat($field.find('.exact').val());
if (isNaN(data)) {
data = '';
}
}
updateValue(parent, field, data);
invalidated();
return data;
}
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);
}
function getBooleanValue(oldvalue, newvalue) {
if (oldvalue === newvalue) {
return '';
} else if (newvalue) {
return true;
} else {
return false;
}
invalidated();
}
function addEnchantment(el) {
@@ -419,22 +351,19 @@ function removeModifier(el) {
function addModifierSlot(el) {
let modifier = getParent(el);
if (!modifier.slots) {
modifier.slots = [];
if (!modifier.slot) {
modifier.slot = [];
}
modifier.slots.push($(el).attr('data-slot'));
modifier.slot.push($(el).attr('data-slot'));
invalidated();
}
function removeModifierSlot(el) {
let modifier = getParent(el);
let slot = $(el).attr('data-slot');
let index = modifier.slots.indexOf(slot);
let index = modifier.slot.indexOf(slot);
if (index > -1) {
modifier.slots.splice(index, 1);
if (modifier.slots.length === 0) {
delete modifier.slots;
}
modifier.slot.splice(index, 1);
invalidated();
}
}

24
view.js
View File

@@ -127,7 +127,7 @@ function generateEntry(entry, i, size) {
if (entry.children) {
for (let j = 0; j < entry.children.length; j += 1) {
let $child = generateEntry(entry.children[j], j, entry.children.length);
$child.removeClass('entry').addClass('child');
$child.attr('data-field', 'children[]');
$entry.children('.card-body').append($child);
}
}
@@ -216,8 +216,8 @@ function generateFunction(func, i) {
delete func.treasure;
}
if (func.function === 'minecraft:looting_enchant' || func.function === 'minecraft:looting_enchant' || func.function === 'minecraft:limit_count') {
if (func.function === 'minecraft:looting_enchant' || func.function === 'minecraft:limit_count') {
if (func.function === 'minecraft:looting_enchant' || func.function === 'minecraft:limit_count') {
if (func.function === 'minecraft:looting_enchant') {
$function.find('.function-limit').removeClass('d-none');
$function.find('.function-limit input').val(func.limit);
} else {
@@ -317,7 +317,7 @@ function generateFunction(func, i) {
if (func.function === 'minecraft:apply_bonus') {
$function.find('.function-enchantment').removeClass('d-none');
$function.find('.function-entity input').val(func.enchantment);
$function.find('.function-enchantment input').val(func.enchantment);
} else {
delete func.enchantment;
}
@@ -392,8 +392,8 @@ function generateModifier(modifier, i) {
generateRange($modifier.find('.modifier-amount'), modifier.amount);
$modifier.find('.modifier-operation').val(modifier.operation);
if (modifier.slots) {
for (let s of modifier.slots) {
if (modifier.slot) {
for (let s of modifier.slot) {
let item = $modifier.find('.dropdown-item[data-slot="' + s + '"]');
item.addClass('d-none');
let html = '<button type="button" class="btn btn-outline-danger bg-light btn-sm mr-2 mt-2" data-slot="' + s + '" onclick="removeModifierSlot(this)">' + item.text() + '</button>';
@@ -623,7 +623,7 @@ function generateCondition(condition, i) {
if (condition.term) {
let $term = generateCondition(condition.term, 0);
$term.removeClass('condition').addClass('term');
$term.attr('data-field', 'term');
$term.find('.card-header').remove();
$condition.children('.card-body').append($term);
}
@@ -631,7 +631,7 @@ function generateCondition(condition, i) {
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');
$term.attr('data-field', 'terms[]');
$condition.children('.card-body').append($term);
}
}
@@ -693,7 +693,7 @@ function generateEntity(entity) {
}
if (entity.location) {
let $location = generateLocation(entity.location);
$location.removeClass('predicate').addClass('location');
$location.attr('data-field', 'location');
$entity.children('.card-body').append($location);
}
if (entity.nbt) {
@@ -756,7 +756,7 @@ function generateItem(item) {
}
function generateDamage(damage) {
let $damage = $('#damageTemplate').clone().removeAttr('id').addClass('predicate');
let $damage = $('#damageTemplate').clone().removeAttr('id');
if (!damage) {
damage = {};
}
@@ -774,12 +774,12 @@ function generateDamage(damage) {
if (damage.source_entity) {
let $entity = generateEntity(damage.source_entity);
$entity.removeClass('predicate');
$entity.attr('data-field', 'source_entity');
$damage.find('.source-entity').append($entity);
}
if (damage.direct_entity) {
let $entity = generateEntity(damage.direct_entity);
$entity.removeClass('predicate');
$entity.attr('data-field', 'direct_entity');
$damage.find('.direct-entity').append($entity);
}