Add 1.13 functions

This commit is contained in:
Misode
2019-06-18 04:13:17 +02:00
parent b51c681e2e
commit 05abec2399
2 changed files with 652 additions and 127 deletions

View File

@@ -12,6 +12,11 @@
textarea.invalid {
border-color: red !important;
}
.scrollable-menu {
height: auto;
max-height: 300px;
overflow-x: hidden;
}
</style>
</head>
<body>
@@ -21,7 +26,7 @@
</nav>
<div class="container">
<div class="row my-4">
<div class="col-12 col-md-7 mb-3">
<div class="col-12 col-lg-7 mb-3">
<div class="input-group">
<button type="button" class="btn btn-success d-block mr-3 float-left" onclick="addPool(this)">Add Pool</button>
<div class="input-group-prepend">
@@ -35,18 +40,16 @@
<option value="minecraft:fishing">Fishing</option>
<option value="minecraft:generic">Generic</option>
</select>
<div class="input-group-prepend">
<div class="input-group-text rounded-left">
<input id="luckBased" type="checkbox" onchange="updateLuckBased(this)">
</div>
<div class="custom-control custom-checkbox" style="margin: auto 0">
<input type="checkbox" class="custom-control-input" id="luckBased" onchange="updateLuckBased(this)">
<label class="custom-control-label" for="luckBased">Luck-based</label>
</div>
<label class="form-control overflow-hidden" for="luckBased" style="max-width: 7em;">Luck based</label>
</div>
<div id="structure"">
</div>
</div>
<div class="col-12 col-md-5">
<div class="mb-3 float-md-right">
<div class="col-12 col-lg-5">
<div class="mb-3 float-lg-right">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Indentation</span>
@@ -82,15 +85,15 @@
<a class="dropdown-item" onclick="switchRollsType(this, 'binomial')">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" onchange="updateRollsField(this)">
<input type="text" class="form-control exact d-none rounded-right" onchange="updateRollsField(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="updateRollsField(this)">
<input type="text" class="form-control range min d-none" value="1" onchange="updateRollsField(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="updateRollsField(this)">
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateRollsField(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="updateRollsField(this)">
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateRollsField(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="updateRollsField(this)">
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateRollsField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 bonus-rolls" data-type="exact">
<div class="input-group-prepend">
@@ -102,15 +105,15 @@
<a class="dropdown-item" onclick="switchBonusRollsType(this, 'binomial')">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" onchange="updateBonusRollsField(this)">
<input type="text" class="form-control exact d-none rounded-right" onchange="updateBonusRollsField(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="updateBonusRollsField(this)">
<input type="text" class="form-control range min d-none" value="1" onchange="updateBonusRollsField(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="updateBonusRollsField(this)">
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateBonusRollsField(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="updateBonusRollsField(this)">
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateBonusRollsField(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="updateBonusRollsField(this)">
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateBonusRollsField(this)" onclick="this.select()">
</div>
</div>
</div>
@@ -118,7 +121,7 @@
<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-outline-success mr-3 mb-2 float-left">Add Condition</button>
<button type="button" class="btn btn-outline-success mr-3 mb-2 float-left">Add Function</button>
<button type="button" class="btn btn-outline-success mr-3 mb-2 float-left" onclick="addFunction(this)">Add Function</button>
</div>
<div class="card-body">
<div class="input-group entry-type">
@@ -140,25 +143,263 @@
<div class="input-group-prepend">
<span class="input-group-text">Name</span>
</div>
<input type="text" class="form-control" onchange="updateEntryName(this)">
<input type="text" class="form-control" onchange="updateEntryName(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 entry-weight d-none">
<div class="input-group-prepend">
<span class="input-group-text">Weight</span>
</div>
<input type="text" class="form-control" onchange="updateEntryWeight(this)">
<input type="text" class="form-control" onchange="updateEntryWeight(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 entry-quality d-none">
<div class="input-group-prepend">
<span class="input-group-text">Quality</span>
</div>
<input type="text" class="form-control" onchange="updateEntryQuality(this)">
<input type="text" class="form-control" onchange="updateEntryQuality(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 entry-children d-none">
<button type="button" class="btn btn-outline-success">Add Child</button>
</div>
</div>
</div>
<div id="functionTemplate" class="card mt-3 function">
<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-outline-success mr-3 mb-2 float-left">Add Condition</button>
</div>
<div class="card-body">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Function</span>
</div>
<select class="form-control function-type" onchange="updateFunctionType(this)">
<option value="minecraft:set_count">Set Count</option>
<option value="minecraft:set_damage">Set Damage</option>
<option value="minecraft:set_nbt">Set NBT</option>
<option value="minecraft:set_attributes">Set Attributes</option>
<option value="minecraft:enchant_randomly">Enchant Randomly</option>
<option value="minecraft:enchant_with_levels">Enchant With Levels</option>
<option value="minecraft:looting_enchant">Looting Enchant</option>
<option value="minecraft:furnace_smelt">Furnace Smelt</option>
</select>
</div>
<div class="input-group function-count mt-3 d-none" data-type="exact">
<div class="input-group-prepend">
<span class="input-group-text">Count</span>
<button type="button" class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" onclick="switchCountType(this, 'exact')">Exact</a>
<a class="dropdown-item" onclick="switchCountType(this, 'range')">Range</a>
<a class="dropdown-item" onclick="switchCountType(this, 'binomial')">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" onchange="updateCountField(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="updateCountField(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="updateCountField(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="updateCountField(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="updateCountField(this)" onclick="this.select()">
</div>
<div class="input-group function-damage mt-3 d-none" data-type="exact">
<div class="input-group-prepend">
<span class="input-group-text">Damage</span>
<button type="button" class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" onclick="switchDamageType(this, 'exact')">Exact</a>
<a class="dropdown-item" onclick="switchDamageType(this, 'range')">Range</a>
<a class="dropdown-item" onclick="switchDamageType(this, 'binomial')">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" onchange="updateDamageField(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="updateDamageField(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="updateDamageField(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="updateDamageField(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="updateDamageField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 function-nbt d-none">
<div class="input-group-prepend">
<span class="input-group-text">Tag</span>
</div>
<input type="text" class="form-control" onchange="updateTagField(this)" onclick="this.select()">
</div>
<div class="mt-3 function-ench-rand d-none">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Optional Enchantments</span>
</div>
<div class="input-group-append">
<button type="button" class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split rounded-right" data-toggle="dropdown"></button>
<div class="dropdown-menu scrollable-menu">
<a class="dropdown-item" data-ench="minecraft:aqua_affinity" onclick="addEnchantment(this)">Aqua Affinity</a>
<a class="dropdown-item" data-ench="minecraft:bane_of_arthropods" onclick="addEnchantment(this)">Bane of Arthropods</a>
<a class="dropdown-item" data-ench="minecraft:blast_protection" onclick="addEnchantment(this)">Blast Protection</a>
<a class="dropdown-item" data-ench="minecraft:channeling" onclick="addEnchantment(this)">Channeling</a>
<a class="dropdown-item" data-ench="minecraft:binding_curse" onclick="addEnchantment(this)">Curse of Binding</a>
<a class="dropdown-item" data-ench="minecraft:vanishing_curse" onclick="addEnchantment(this)">Curse of Vanishing</a>
<a class="dropdown-item" data-ench="minecraft:depth_strider" onclick="addEnchantment(this)">Depth Strider</a>
<a class="dropdown-item" data-ench="minecraft:efficiency" onclick="addEnchantment(this)">Efficiency</a>
<a class="dropdown-item" data-ench="minecraft:feather_falling" onclick="addEnchantment(this)">Feather Falling</a>
<a class="dropdown-item" data-ench="minecraft:fire_aspect" onclick="addEnchantment(this)">Fire Aspect</a>
<a class="dropdown-item" data-ench="minecraft:fire_protection" onclick="addEnchantment(this)">Fire Protection</a>
<a class="dropdown-item" data-ench="minecraft:flame" onclick="addEnchantment(this)">Flame</a>
<a class="dropdown-item" data-ench="minecraft:fortune" onclick="addEnchantment(this)">Fortune</a>
<a class="dropdown-item" data-ench="minecraft:frost_walker" onclick="addEnchantment(this)">Frost Walker</a>
<a class="dropdown-item" data-ench="minecraft:impaling" onclick="addEnchantment(this)">Impaling</a>
<a class="dropdown-item" data-ench="minecraft:infinity" onclick="addEnchantment(this)">Infinity</a>
<a class="dropdown-item" data-ench="minecraft:knockback" onclick="addEnchantment(this)">Knockback</a>
<a class="dropdown-item" data-ench="minecraft:looting" onclick="addEnchantment(this)">Looting</a>
<a class="dropdown-item" data-ench="minecraft:loyalty" onclick="addEnchantment(this)">Loyalty</a>
<a class="dropdown-item" data-ench="minecraft:luck_of_the_sea" onclick="addEnchantment(this)">Luck of the Sea</a>
<a class="dropdown-item" data-ench="minecraft:lure" onclick="addEnchantment(this)">Lure</a>
<a class="dropdown-item" data-ench="minecraft:mending" onclick="addEnchantment(this)">Mending</a>
<a class="dropdown-item" data-ench="minecraft:multishot" onclick="addEnchantment(this)">Multishot</a>
<a class="dropdown-item" data-ench="minecraft:piercing" onclick="addEnchantment(this)">Piercing</a>
<a class="dropdown-item" data-ench="minecraft:power" onclick="addEnchantment(this)">Power</a>
<a class="dropdown-item" data-ench="minecraft:projectile_protection" onclick="addEnchantment(this)">Projectile Protection</a>
<a class="dropdown-item" data-ench="minecraft:protection" onclick="addEnchantment(this)">Protection</a>
<a class="dropdown-item" data-ench="minecraft:punch" onclick="addEnchantment(this)">Punch</a>
<a class="dropdown-item" data-ench="minecraft:quick_charge" onclick="addEnchantment(this)">Quick Charge</a>
<a class="dropdown-item" data-ench="minecraft:respiration" onclick="addEnchantment(this)">Respiration</a>
<a class="dropdown-item" data-ench="minecraft:riptide" onclick="addEnchantment(this)">Riptide</a>
<a class="dropdown-item" data-ench="minecraft:sharpness" onclick="addEnchantment(this)">Sharpness</a>
<a class="dropdown-item" data-ench="minecraft:silk_touch" onclick="addEnchantment(this)">Silk Touch</a>
<a class="dropdown-item" data-ench="minecraft:smite" onclick="addEnchantment(this)">Smite</a>
<a class="dropdown-item" data-ench="minecraft:sweeping" onclick="addEnchantment(this)">Sweeping Edge</a>
<a class="dropdown-item" data-ench="minecraft:thorns" onclick="addEnchantment(this)">Thorns</a>
<a class="dropdown-item" data-ench="minecraft:unbreaking" onclick="addEnchantment(this)">Unbreaking</a>
</div>
</div>
</div>
<div class="enchantment-list">
</div>
</div>
<div class="input-group function-ench-levels mt-3 d-none" data-type="exact">
<div class="input-group-prepend">
<span class="input-group-text">Levels</span>
<button type="button" class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" onclick="switchLevelsType(this, 'exact')">Exact</a>
<a class="dropdown-item" onclick="switchLevelsType(this, 'range')">Range</a>
<a class="dropdown-item" onclick="switchLevelsType(this, 'binomial')">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" onchange="updateLevelsField(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="updateLevelsField(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="updateLevelsField(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="updateLevelsField(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="updateLevelsField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 function-ench-treasure d-none">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="treasureCheckbox" onchange="updateTreasureField(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-prepend">
<span class="input-group-text">Limit</span>
</div>
<input type="text" class="form-control" onchange="updateLimitField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 function-attributes d-none">
<button type="button" class="btn btn-outline-success" onclick="addModifier(this)">Add Modifier</button>
</div>
</div>
</div>
<div id="modifierTemplate" class="card mt-3 modifier">
<div class="card-header pb-1">
<button type="button" class="btn btn-danger mb-2 float-right" onclick="removeModifier(this)">Remove Modifier</button>
</div>
<div class="card-body">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Attribute</span>
</div>
<select class="form-control modifier-attribute" onchange="updateModifierAttribute(this)">
<option value="generic.maxHealth">Max Health</option>
<option value="generic.followRange">Follow Range</option>
<option value="generic.knockbackResistance">Knockback Resistance</option>
<option value="generic.movementSpeed">Movement Speed</option>
<option value="generic.attackDamage">Attack Damage</option>
<option value="generic.armor">Armor</option>
<option value="generic.armorThoughness">Armor Toughness</option>
<option value="generic.attackSpeed">Attack Speed</option>
<option value="generic.luck">Luck</option>
<option value="horse.jumpStrength">Jump Strength</option>
<option value="generic.attackKnockback">Attack Knockback</option>
<option value="generic.flyingSpeed">Flying Speed</option>
<option value="zombie.spawnReinforcements">Spawn Reinforcements</option>
</select>
</div>
<div class="input-group mt-3">
<div class="input-group-prepend">
<span class="input-group-text">Name</span>
</div>
<input type="text" class="form-control modifier-name" onchange="updateModifierName(this)" onclick="this.select()">
</div>
<div class="input-group mt-3 modifier-amount" data-type="exact">
<div class="input-group-prepend">
<span class="input-group-text">Amount</span>
<button type="button" class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" onclick="switchModifierAmountType(this, 'exact')">Exact</a>
<a class="dropdown-item" onclick="switchModifierAmountType(this, 'range')">Range</a>
<a class="dropdown-item" onclick="switchModifierAmountType(this, 'binomial')">Binomial</a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" onchange="updateModifierAmountField(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="updateModifierAmountField(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="updateModifierAmountField(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="updateModifierAmountField(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="updateModifierAmountField(this)" onclick="this.select()">
</div>
<div class="input-group mt-3">
<div class="input-group-prepend">
<span class="input-group-text">Operation</span>
</div>
<select class="form-control modifier-operation" onchange="updateModifierOperation(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-prepend">
<span class="input-group-text">Slots</span>
</div>
<div class="input-group-append">
<button type="button" class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split rounded-right" data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" data-slot="mainhand" onclick="addModifierSlot(this)">Mainhand</a>
<a class="dropdown-item" data-slot="offhand" onclick="addModifierSlot(this)">Offhand</a>
<a class="dropdown-item" data-slot="head" onclick="addModifierSlot(this)">Head</a>
<a class="dropdown-item" data-slot="chest" onclick="addModifierSlot(this)">Chest</a>
<a class="dropdown-item" data-slot="legs" onclick="addModifierSlot(this)">Legs</a>
<a class="dropdown-item" data-slot="feet" onclick="addModifierSlot(this)">Feet</a>
</div>
</div>
</div>
<div class="modifier-slots-list">
</div>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>

494
script.js
View File

@@ -1,5 +1,6 @@
$("#source").val('');
$('#luckBased').prop('checked', false);
$('#tableType').val("minecraft:generic");
$('#indentationSelect').val("2");
let indentation = 2;
@@ -12,14 +13,23 @@ addPool();
addEntry($('.pool').get());
function getPool(el) {
let poolIndex = parseInt($(el).closest('.pool').attr('data-index'));
return table.pools[poolIndex];
let index = parseInt($(el).closest('.pool').attr('data-index'));
return table.pools[index];
}
function getEntry(el) {
let poolIndex = parseInt($(el).closest('.pool').attr('data-index'));
let entryIndex = parseInt($(el).closest('.entry').attr('data-index'));
return table.pools[poolIndex].entries[entryIndex];
let index = parseInt($(el).closest('.entry').attr('data-index'));
return getPool(el).entries[index];
}
function getFunction(el) {
let index = parseInt($(el).closest('.function').attr('data-index'));
return getEntry(el).functions[index];
}
function getModifier(el) {
let index = parseInt($(el).closest('.modifier').attr('data-index'));
return getFunction(el).modifiers[index];
}
function addPool(el) {
@@ -31,12 +41,8 @@ function addPool(el) {
}
function removePool(el) {
let poolIndex = parseInt($(el).closest('.pool').attr('data-index'));
if (poolIndex === 0) {
table.pools.shift();
} else {
table.pools.splice(poolIndex, poolIndex);
}
let index = parseInt($(el).closest('.pool').attr('data-index'));
table.pools.splice(index, 1);
invalidated();
}
@@ -49,12 +55,25 @@ function addEntry(el) {
}
function removeEntry(el) {
let entryIndex = parseInt($(el).closest('.entry').attr('data-index'));
if (entryIndex === 0) {
getPool(el).entries.shift();
} else {
getPool(el).entries.splice(entryIndex, entryIndex);
let index = parseInt($(el).closest('.entry').attr('data-index'));
getPool(el).entries.splice(index, 1);
invalidated();
}
function addFunction(el) {
let entry = getEntry(el);
if (!entry.functions) {
entry.functions = [];
}
entry.functions.push({
function: "minecraft:set_count"
});
invalidated();
}
function removeFunction(el) {
let index = parseInt($(el).closest('.function').attr('data-index'));
getEntry(el).functions.splice(index, 1);
invalidated();
}
@@ -145,6 +164,173 @@ function updateEntryQuality(el) {
invalidated();
}
function updateFunctionType(el) {
getFunction(el).function = $(el).val();
invalidated();
}
function switchCountType(el, type) {
$(el).closest('.function-count').attr('data-type', type);
updateCountField(el);
}
function updateCountField(el) {
let type = $(el).closest('.function-count').attr('data-type');
let data = getRangeField($(el).closest('.function-count'), type);
getFunction(el).count = data;
invalidated();
}
function switchDamageType(el, type) {
$(el).closest('.function-damage').attr('data-type', type);
updateCountField(el);
}
function updateDamageField(el) {
let type = $(el).closest('.function-damage').attr('data-type');
let data = getRangeField($(el).closest('.function-damage'), type);
getFunction(el).damage = data;
invalidated();
}
function updateTagField(el) {
let nbt = $(el).val();
if (!nbt.startsWith('{')) {
nbt = '{' + nbt;
}
if (!nbt.endsWith('}')) {
nbt = nbt + '}';
}
getFunction(el).tag = nbt;
invalidated();
}
function addEnchantment(el) {
let func = getFunction(el);
let enchantment = $(el).attr('data-ench');
if (!func.enchantments) {
func.enchantments = [];
}
func.enchantments.push(enchantment);
invalidated();
}
function removeEnchantment(el) {
let func = getFunction(el);
let ench = $(el).attr('data-ench');
let index = func.enchantments.indexOf(ench);
if (index > -1) {
func.enchantments.splice(index, 1);
if (func.enchantments.length === 0) {
delete func.enchantments;
}
invalidated();
}
}
function switchLevelsType(el, type) {
$(el).closest('.function-ench-levels').attr('data-type', type);
updateLevelsField(el);
}
function updateLevelsField(el) {
let type = $(el).closest('.function-ench-levels').attr('data-type');
let data = getRangeField($(el).closest('.function-ench-levels'), type);
getFunction(el).levels = data;
invalidated();
}
function updateTreasureField(el) {
let treasure = $(el).prop('checked');
console.log(treasure);
if (treasure) {
getFunction(el).treasure = true;
} else {
delete getFunction(el).treasure;
}
invalidated();
}
function updateLimitField(el) {
let limit = parseInt($(el).val());
if (isNaN(limit)) {
delete getFunction(el).limit;
} else {
getFunction(el).limit = limit;
}
invalidated();
}
function addModifier(el) {
let func = getFunction(el);
if (!func.modifiers) {
func.modifiers = [];
}
func.modifiers.push({
attribute: 'generic.attackDamage',
name: 'Attack Damage',
amount: 1,
operation: 'addition',
slot: []
});
invalidated();
}
function removeModifier(el) {
let index = parseInt($(el).closest('.modifier').attr('data-index'));
getFunction(el).modifiers.splice(index, 1);
invalidated();
}
function updateModifierAttribute(el) {
getModifier(el).attribute = $(el).val();
invalidated();
}
function updateModifierName(el) {
getModifier(el).name = $(el).val();
invalidated();
}
function switchModifierAmountType(el, type) {
$(el).closest('.modifier-amount').attr('data-type', type);
updateModifierAmountField(el);
}
function updateModifierAmountField(el) {
let type = $(el).closest('.modifier-amount').attr('data-type');
let data = getRangeField($(el).closest('.modifier-amount'), type);
getModifier(el).amount = data;
invalidated();
}
function updateModifierOperation(el) {
getModifier(el).operation = $(el).val();
invalidated();
}
function addModifierSlot(el) {
let modifier = getModifier(el);
if (!modifier.slots) {
modifier.slots = [];
}
modifier.slots.push($(el).attr('data-slot'));
invalidated();
}
function removeModifierSlot(el) {
let modifier = getModifier(el);
let slot = $(el).attr('data-slot');
let index = modifier.slots.indexOf(slot);
if (index > -1) {
modifier.slots.splice(index, 1);
if (modifier.slots.length === 0) {
delete modifier.slots;
}
invalidated();
}
}
function updateTableType() {
table.type = $('#tableType').val();
invalidated();
@@ -185,101 +371,199 @@ function invalidated() {
$('#source').val(JSON.stringify(table, null, indentation));
}
function generateRange($el, data) {
if (typeof data === 'object') {
if (data.type && data.type.match(/(minecraft:)?binomial/)) {
$el.attr('data-type', 'binomial');
$el.find('.binomial').removeClass('d-none');
$el.find('.binomial.n').val(data.n);
$el.find('.binomial.p').val(data.p);
} else {
$el.attr('data-type', 'range');
$el.find('.range').removeClass('d-none');
$el.find('.range.min').val(data.min);
$el.find('.range.max').val(data.max);
}
} else {
$el.attr('data-type', 'exact');
$el.find('.exact').removeClass('d-none');
$el.find('.exact').val(data);
}
}
function generateStructure() {
$('#structure').html('');
for (let i = 0; i < table.pools.length; i += 1) {
let pool = table.pools[i];
let $pool = $('#poolTemplate').clone();
$pool.removeAttr('id').attr('data-index', i);
// Rolls
if (!pool.rolls) {
pool.rolls = 1;
}
let $rolls = $pool.find('.rolls');
if (typeof pool.rolls === 'object') {
if (pool.rolls.type && pool.rolls.type.match(/(minecraft:)?binomial/)) {
$rolls.attr('data-type', 'binomial');
$rolls.find('.binomial').removeClass('d-none');
$rolls.find('.binomial.n').val(pool.rolls.n);
$rolls.find('.binomial.p').val(pool.rolls.p);
} else {
$rolls.attr('data-type', 'range');
$rolls.find('.range').removeClass('d-none');
$rolls.find('.range.min').val(pool.rolls.min);
$rolls.find('.range.max').val(pool.rolls.max);
}
} else {
$rolls.attr('data-type', 'exact');
$rolls.find('.exact').removeClass('d-none');
$rolls.find('.exact').val(pool.rolls);
}
// Bonus Rolls
let $bonus_rolls = $pool.find('.bonus-rolls');
if (pool.bonus_rolls) {
luck_based = true;
if (typeof pool.bonus_rolls === 'object') {
if (pool.bonus_rolls.type && pool.bonus_rolls.type.match(/(minecraft:)?binomial/)) {
$bonus_rolls.attr('data-type', 'binomial');
$bonus_rolls.find('.binomial').removeClass('d-none');
$bonus_rolls.find('.binomial.n').val(pool.bonus_rolls.n);
$bonus_rolls.find('.binomial.p').val(pool.bonus_rolls.p);
} else {
$bonus_rolls.attr('data-type', 'range');
$bonus_rolls.find('.range').removeClass('d-none');
$bonus_rolls.find('.range.min').val(pool.bonus_rolls.min);
$bonus_rolls.find('.range.max').val(pool.bonus_rolls.max);
}
} else {
$bonus_rolls.attr('data-type', 'exact');
$bonus_rolls.find('.exact').removeClass('d-none');
$bonus_rolls.find('.exact').val(pool.bonus_rolls);
}
} else {
$bonus_rolls.find('.exact').removeClass('d-none');
}
if (!luck_based) {
$pool.find('.bonus-rolls').addClass('d-none');
}
// Entries
for (let j = 0; j < pool.entries.length; j += 1) {
let entry = pool.entries[j];
let $entry = $('#entryTemplate').clone();
$entry.removeAttr('id').attr('data-index', j);
$entry.find('.entry-type').val(entry.type);
if (entry.type === 'minecraft:item' || entry.type === 'minecraft:tag' || entry.type === 'minecraft:loot_table' || entry.type === 'minecraft:dynamic') {
$entry.find('.entry-name').removeClass('d-none');
if (entry.type === 'minecraft:dynamic') {
entry.name = 'minecraft:contents';
}
$entry.find('.entry-name input').val(entry.name);
}
$entry.find('.entry-weight').removeClass('d-none');
if (luck_based) {
$entry.find('.entry-quality').removeClass('d-none');
} else {
$entry.find('.entry-quality').addClass('d-none');
}
if (entry.weight) {
$entry.find('.entry-weight input').val(entry.weight);
}
if (entry.quality) {
luck_based = true;
$entry.find('.entry-quality input').val(entry.quality);
}
if (entry.type === 'minecraft:alternatives' || entry.type === 'minecraft:sequence' || entry.type === 'minecraft:group') {
delete entry.name;
$entry.find('.entry-children').removeClass('d-none');
}
$pool.children('.card-body').append($entry);
}
let $pool = generatePool(table.pools[i], i);
$('#structure').append($pool);
$('#luck-based').attr('checked', luck_based);
}
}
function generatePool(pool, i) {
let $pool = $('#poolTemplate').clone();
$pool.removeAttr('id').attr('data-index', i);
// Rolls
if (!pool.rolls) {
pool.rolls = 1;
}
let $rolls = $pool.find('.rolls');
generateRange($rolls, pool.rolls);
// Bonus Rolls
let $bonus_rolls = $pool.find('.bonus-rolls');
if (pool.bonus_rolls) {
luck_based = true;
generateRange($bonus_rolls, pool.bonus_rolls);
} else {
$bonus_rolls.find('.exact').removeClass('d-none');
}
if (!luck_based) {
$pool.find('.bonus-rolls').addClass('d-none');
}
// Entries
for (let j = 0; j < pool.entries.length; j += 1) {
let $entry = generateEntry(pool.entries[j], j);
$pool.children('.card-body').append($entry);
}
return $pool;
}
function generateEntry(entry, i) {
let $entry = $('#entryTemplate').clone();
$entry.removeAttr('id').attr('data-index', i);
$entry.find('.entry-type').val(entry.type);
if (entry.type === 'minecraft:item' || entry.type === 'minecraft:tag' || entry.type === 'minecraft:loot_table' || entry.type === 'minecraft:dynamic') {
$entry.find('.entry-name').removeClass('d-none');
if (entry.type === 'minecraft:dynamic') {
entry.name = 'minecraft:contents';
}
$entry.find('.entry-name input').val(entry.name);
}
$entry.find('.entry-weight').removeClass('d-none');
if (luck_based) {
$entry.find('.entry-quality').removeClass('d-none');
} else {
$entry.find('.entry-quality').addClass('d-none');
}
if (entry.weight) {
$entry.find('.entry-weight input').val(entry.weight);
}
if (entry.quality) {
luck_based = true;
$entry.find('.entry-quality input').val(entry.quality);
}
if (entry.type === 'minecraft:alternatives' || entry.type === 'minecraft:sequence' || entry.type === 'minecraft:group') {
delete entry.name;
$entry.find('.entry-children').removeClass('d-none');
}
if (entry.functions) {
for (let j = 0; j < entry.functions.length; j += 1) {
let $function = generateFunction(entry.functions[j], j);
$entry.children('.card-body').append($function);
}
}
return $entry;
}
function generateFunction(func, i) {
let $function = $('#functionTemplate').clone();
$function.removeAttr('id').attr('data-index', i);
$function.find('.function-type').val(func.function);
if (func.function === 'minecraft:set_count' || func.function === 'minecraft:looting_enchant') {
$function.find('.function-count').removeClass('d-none');
generateRange($function.find('.function-count'), func.count);
} else {
delete func.count;
}
if (func.function === 'minecraft:set_damage') {
$function.find('.function-damage').removeClass('d-none');
generateRange($function.find('.function-damage'), func.damage);
} else {
delete func.damage;
}
if (func.function === 'minecraft:set_nbt') {
$function.find('.function-nbt').removeClass('d-none');
$function.find('.function-nbt input').val(func.tag);
} else {
delete func.tag;
}
if (func.function === 'minecraft:enchant_randomly') {
$function.find('.function-ench-rand').removeClass('d-none');
if (func.enchantments) {
for (let e of func.enchantments) {
let item = $function.find('.dropdown-item[data-ench="' + e + '"]');
item.addClass('d-none');
let html = '<button type="button" class="btn btn-outline-danger btn-sm mr-2 mt-2" data-ench="' + e + '" onclick="removeEnchantment(this)">' + item.text() + '</button>';
$function.find('.enchantment-list').append(html);
}
}
} else {
delete func.enchantments;
}
if (func.function === 'minecraft:enchant_with_levels') {
$function.find('.function-ench-levels').removeClass('d-none');
generateRange($function.find('.function-ench-levels'), func.levels);
$function.find('.function-ench-treasure').removeClass('d-none');
let treasure = false;
if (func.treasure) {
treasure = true;
}
let id = 'treasureCheckbox' + Math.floor(1000000*Math.random());
$function.find('.function-ench-treasure label').attr('for', id);
$function.find('.function-ench-treasure input').prop('checked', treasure).attr('id', id);
} else {
delete func.levels;
delete func.treasure;
}
if (func.function === 'minecraft:looting_enchant') {
$function.find('.function-limit').removeClass('d-none');
$function.find('.function-limit input').val(func.limit);
} else {
delete func.limit;
}
if (func.function === 'minecraft:set_attributes') {
$function.find('.function-attributes').removeClass('d-none');
if (func.modifiers) {
for (let j = 0; j < func.modifiers.length; j += 1) {
let $modifier = generateModifier(func.modifiers[j], j);
$function.children('.card-body').append($modifier);
}
}
} else {
delete func.modifiers;
}
return $function;
}
function generateModifier(modifier, i) {
let $modifier = $('#modifierTemplate').clone();
$modifier.removeAttr('id').attr('data-index', i);
$modifier.find('.modifier-attribute').val(modifier.attribute);
$modifier.find('.modifier-name').val(modifier.name);
generateRange($modifier.find('.modifier-amount'), modifier.amount);
$modifier.find('.modifier-operation').val(modifier.operation);
if (modifier.slots) {
for (let s of modifier.slots) {
console.log(s);
let item = $modifier.find('.dropdown-item[data-slot="' + s + '"]');
item.addClass('d-none');
let html = '<button type="button" class="btn btn-outline-danger btn-sm mr-2 mt-2" data-slot="' + s + '" onclick="removeModifierSlot(this)">' + item.text() + '</button>';
$modifier.find('.modifier-slots-list').append(html);
}
}
return $modifier
}