Added ability to add/edit buffs
This commit is contained in:
@@ -16,6 +16,15 @@ Schemas.CustomBuff = new SimpleSchema({
|
|||||||
optional: true,
|
optional: true,
|
||||||
trim: false,
|
trim: false,
|
||||||
},
|
},
|
||||||
|
target: {
|
||||||
|
type: String,
|
||||||
|
allowedValues: [
|
||||||
|
"self",
|
||||||
|
"others",
|
||||||
|
"both"
|
||||||
|
],
|
||||||
|
defaultValue: "self",
|
||||||
|
},
|
||||||
enabled: {
|
enabled: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
autoValue: function(){
|
autoValue: function(){
|
||||||
@@ -23,27 +32,14 @@ Schemas.CustomBuff = new SimpleSchema({
|
|||||||
//enabled is ALWAYS false on these, so that its children are also not enabled, so that the buff templates have no effects.
|
//enabled is ALWAYS false on these, so that its children are also not enabled, so that the buff templates have no effects.
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
type: {
|
|
||||||
type: String,
|
|
||||||
allowedValues: [
|
|
||||||
"inate", //this should be "innate", but changing it could be problematic
|
|
||||||
"custom",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
"lifeTime.total": {
|
"lifeTime.total": {
|
||||||
type: Number,
|
type: Number,
|
||||||
defaultValue: 0, //0 is infinite
|
defaultValue: 0, //0 is infinite
|
||||||
min: 0,
|
min: 0,
|
||||||
},
|
},
|
||||||
color: {
|
|
||||||
type: String,
|
|
||||||
allowedValues: _.pluck(colorOptions, "key"),
|
|
||||||
defaultValue: "q",
|
|
||||||
},
|
|
||||||
//the id of the feature, buff or item that creates this buff
|
//the id of the feature, buff or item that creates this buff
|
||||||
parent: {
|
parent: {
|
||||||
type: Schemas.Parent,
|
type: Schemas.Parent,
|
||||||
optional: true,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -51,7 +47,7 @@ CustomBuffs.attachSchema(Schemas.CustomBuff);
|
|||||||
|
|
||||||
CustomBuffs.attachBehaviour("softRemovable");
|
CustomBuffs.attachBehaviour("softRemovable");
|
||||||
makeParent(CustomBuffs, ["name", "enabled"]); //parents of effects, attacks, proficiencies. Since this represents a template, "enabled" is always false.
|
makeParent(CustomBuffs, ["name", "enabled"]); //parents of effects, attacks, proficiencies. Since this represents a template, "enabled" is always false.
|
||||||
makeChild(CustomBuffs, ["enabled"]); //children of lots of things
|
makeChild(CustomBuffs); //children of lots of things
|
||||||
|
|
||||||
CustomBuffs.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
CustomBuffs.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
||||||
CustomBuffs.deny(CHARACTER_SUBSCHEMA_DENY);
|
CustomBuffs.deny(CHARACTER_SUBSCHEMA_DENY);
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ openParentDialog = function({
|
|||||||
} else if (parent.collection === "Spells") {
|
} else if (parent.collection === "Spells") {
|
||||||
template = "spellDialog";
|
template = "spellDialog";
|
||||||
data = {spellId: parent.id};
|
data = {spellId: parent.id};
|
||||||
|
} else if (parent.collection === "Buffs") {
|
||||||
|
template = "buffDialog";
|
||||||
|
data = {buffId: parent.id};
|
||||||
}
|
}
|
||||||
pushDialogStack({template, data, element, returnElement, callback});
|
pushDialogStack({template, data, element, returnElement, callback});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
<!-- data is the CustomBuff -->
|
||||||
|
<template name="applyBuffDialog">
|
||||||
|
<div class="fit layout vertical">
|
||||||
|
<app-header-layout has-scrolling-region class="feedback flex">
|
||||||
|
<app-header fixed effects="waterfall">
|
||||||
|
<app-toolbar>
|
||||||
|
Apply Buff
|
||||||
|
</app-toolbar>
|
||||||
|
</app-header>
|
||||||
|
<div class="form flex">
|
||||||
|
<paper-dropdown-menu class=flex label="Target" style="flex-basis: 150px; max-width: 200px;">
|
||||||
|
<dicecloud-selector selected="default" class="dropdown-content target-dropdown">
|
||||||
|
{{#if canApplyToSelf}}
|
||||||
|
<paper-item name="default" style="width: 150px;">
|
||||||
|
Self
|
||||||
|
</paper-item>
|
||||||
|
{{else}}
|
||||||
|
<paper-item name="default" style="width: 150px;">
|
||||||
|
Choose a character
|
||||||
|
</paper-item>
|
||||||
|
{{/if}}
|
||||||
|
{{#each character in writableCharacters}}
|
||||||
|
<paper-item name="{{character._id}}">
|
||||||
|
{{character.name}}
|
||||||
|
</paper-item>
|
||||||
|
{{/each}}
|
||||||
|
</dicecloud-selector>
|
||||||
|
</paper-dropdown-menu>
|
||||||
|
</div>
|
||||||
|
</app-header-layout>
|
||||||
|
<div class="buttons layout horizontal end-justified">
|
||||||
|
<paper-button id="cancelButton">
|
||||||
|
Cancel
|
||||||
|
</paper-button>
|
||||||
|
<paper-button id="applyButton" disabled={{cantApply}}>
|
||||||
|
Apply
|
||||||
|
</paper-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
Template.applyBuffDialog.onCreated(function(){
|
||||||
|
this.selectedTarget = new ReactiveVar("default");
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.applyBuffDialog.helpers({
|
||||||
|
cantApply: function() {
|
||||||
|
return this.buff.target === "others" && Template.instance().selectedTarget.get() === "default"; //this is the only case where we can't apply a buff
|
||||||
|
},
|
||||||
|
canApplyToSelf: function() {
|
||||||
|
return this.buff.target !== "others"; //i.e. it is "self" or "both"
|
||||||
|
},
|
||||||
|
writableCharacters: function() {
|
||||||
|
var returnArray = [];
|
||||||
|
Characters.find({}).forEach(function(char){ //we look through all characters we have access to
|
||||||
|
if (canEditCharacter(char._id)) {
|
||||||
|
returnArray.push(char)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return returnArray;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.applyBuffDialog.events({
|
||||||
|
"iron-select .target-dropdown": function(event){
|
||||||
|
var detail = event.originalEvent.detail;
|
||||||
|
var value = detail.item.getAttribute("name");
|
||||||
|
Template.instance().selectedTarget.set(value);
|
||||||
|
},
|
||||||
|
"click #applyButton": function(event, instance){
|
||||||
|
var targetId = Template.instance().selectedTarget.get();
|
||||||
|
var parent = global[this.buff.parent.collection].findOne(this.buff.parent.id);
|
||||||
|
console.log(parent, this.buff.parent);
|
||||||
|
if (targetId === "default") {
|
||||||
|
if (this.buff.target === "others") return; //we have "Select a character" selected
|
||||||
|
targetId = this.buff.charId; //i.e. target self
|
||||||
|
}
|
||||||
|
|
||||||
|
//insert new buff
|
||||||
|
newBuffId = Buffs.insert({
|
||||||
|
charId: targetId,
|
||||||
|
name: this.buff.name,
|
||||||
|
description: this.buff.description,
|
||||||
|
lifeTime: {total: this.buff.lifeTime.total},
|
||||||
|
type: "custom",
|
||||||
|
|
||||||
|
appliedBy: this.buff.charId,
|
||||||
|
appliedByDetails: {
|
||||||
|
name: parent.name,
|
||||||
|
collection: this.buff.parent.collection,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
//insert children
|
||||||
|
Attacks.find({"parent.id": this.buff._id}).forEach(function(doc){
|
||||||
|
temp = _.clone(doc);
|
||||||
|
temp.parent.id = newBuffId;
|
||||||
|
temp.parent.collection = "Buffs";
|
||||||
|
delete temp._id;
|
||||||
|
|
||||||
|
Attacks.insert(temp);
|
||||||
|
});
|
||||||
|
Effects.find({"parent.id": this.buff._id}).forEach(function(doc){
|
||||||
|
temp = _.clone(doc);
|
||||||
|
temp.parent.id = newBuffId;
|
||||||
|
temp.parent.collection = "Buffs";
|
||||||
|
delete temp._id;
|
||||||
|
|
||||||
|
Effects.insert(temp);
|
||||||
|
});
|
||||||
|
Proficiencies.find({"parent.id": this.buff._id}).forEach(function(doc){
|
||||||
|
temp = _.clone(doc);
|
||||||
|
temp.parent.id = newBuffId;
|
||||||
|
temp.parent.collection = "Buffs";
|
||||||
|
delete temp._id;
|
||||||
|
|
||||||
|
Proficiencies.insert(temp);
|
||||||
|
});
|
||||||
|
popDialogStack();
|
||||||
|
},
|
||||||
|
"click #cancelButton": function(event, instance){
|
||||||
|
popDialogStack();
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -17,6 +17,6 @@
|
|||||||
<div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
|
<div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{> effectsViewList charId=charId parentId=_id}}
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
{{> attacksViewList charId=charId parentId=_id}}
|
|
||||||
{{> proficiencyViewList charId=charId parentId=_id}}
|
{{> proficiencyViewList charId=charId parentId=_id}}
|
||||||
|
{{> attacksViewList charId=charId parentId=_id}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ Template.buffDialog.helpers({
|
|||||||
|
|
||||||
Template.buffDialog.events({
|
Template.buffDialog.events({
|
||||||
"click #deleteButton": function(event, instance){
|
"click #deleteButton": function(event, instance){
|
||||||
Buffs.remove(instance.data.buffId);
|
Buffs.softRemoveNode(instance.data.buffId);
|
||||||
popDialogStack();
|
popDialogStack();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -29,18 +29,15 @@ Template.buffDetails.helpers({
|
|||||||
if (applierCharacter.name === myName) {
|
if (applierCharacter.name === myName) {
|
||||||
var charName = "your "
|
var charName = "your "
|
||||||
} else {
|
} else {
|
||||||
if (applierCharacter.charName[applierCharacter.charName.length -1] === 's') {
|
if (applierCharacter.name[applierCharacter.name.length - 1] === 's') {
|
||||||
var charName = applierCharacter.charName + "' ";
|
var charName = applierCharacter.name + "' ";
|
||||||
} else {
|
} else {
|
||||||
var charName = applierCharacter.charName + "'s ";
|
var charName = applierCharacter.name + "'s ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var type = typeDict[this.appliedByDetails.collection] || "";
|
var type = typeDict[this.appliedByDetails.collection] + " ";
|
||||||
var applierThing = global[this.appliedByDetails.collection]
|
var applierThing = this.appliedByDetails.name;
|
||||||
&& global[this.appliedByDetails.collection].findOne(this.appliedByDetails.id)
|
|
||||||
&& global[this.appliedByDetails.collection].findOne(this.appliedByDetails.id).name
|
|
||||||
|| "unknown ability";
|
|
||||||
|
|
||||||
return "Applied by " + charName + type + applierThing + ".";
|
return "Applied by " + charName + type + applierThing + ".";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<template name="customBuffEdit">
|
||||||
|
{{#with buff}}
|
||||||
|
{{#baseEditDialog title=name hideColor=true}}
|
||||||
|
<!--name-->
|
||||||
|
<paper-input id="buffNameInput" class="fullwidth" label="Name" value={{name}}></paper-input>
|
||||||
|
|
||||||
|
<!--description-->
|
||||||
|
<paper-textarea label="Description" id="buffDescriptionInput" value={{description}}></paper-textarea>
|
||||||
|
|
||||||
|
{{> effectsEditList parentId=_id parentCollection="Buffs" charId=charId name=name enabled=false}}
|
||||||
|
{{> attackEditList parentId=_id parentCollection="Buffs" charId=charId name=name enabled=false}}
|
||||||
|
{{> proficiencyEditList parentId=_id parentCollection="Buffs" charId=charId enabled=false}}
|
||||||
|
{{/baseEditDialog}}
|
||||||
|
{{/with}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
Template.customBuffEdit.helpers({
|
||||||
|
buff: function(){
|
||||||
|
return CustomBuffs.findOne(this.buffId);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const debounce = (f) => _.debounce(f, 300);
|
||||||
|
|
||||||
|
Template.customBuffEdit.events({
|
||||||
|
"input #buffNameInput": debounce(function(event){
|
||||||
|
const input = event.currentTarget;
|
||||||
|
var name = input.value;
|
||||||
|
if (!name){
|
||||||
|
input.invalid = true;
|
||||||
|
input.errorMessage = "Name is required";
|
||||||
|
} else {
|
||||||
|
input.invalid = false;
|
||||||
|
CustomBuffs.update(this._id, {
|
||||||
|
$set: {name: name}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
"input #buffDescriptionInput": debounce(function(event){
|
||||||
|
var description = event.currentTarget.value;
|
||||||
|
CustomBuffs.update(this._id, {
|
||||||
|
$set: {description: description}
|
||||||
|
}, {
|
||||||
|
removeEmptyStrings: false,
|
||||||
|
trimStrings: false,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
});
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<!--needs to be given charId, parentId and parentCollection-->
|
||||||
|
<template name="customBuffEditList">
|
||||||
|
{{#if buffs.count}}
|
||||||
|
<div class="buffs">
|
||||||
|
<div class="paper-font-title" style="margin-bottom: 8px;">
|
||||||
|
Buffs
|
||||||
|
</div>
|
||||||
|
<table class="wideTable" style="width: 100%;">
|
||||||
|
{{#each buff in buffs}}
|
||||||
|
{{> customBuffEditListItem buff=buff}}
|
||||||
|
{{/each}}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
<paper-button id="addBuffButton"
|
||||||
|
class="red-button"
|
||||||
|
raised>
|
||||||
|
Add Buff
|
||||||
|
</paper-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template name="customBuffEditListItem">
|
||||||
|
<tr class="buff" data-id={{buff._id}}>
|
||||||
|
{{> customBuffView buff=buff}}
|
||||||
|
<td>
|
||||||
|
<paper-icon-button class="edit-buff" icon="create">
|
||||||
|
</paper-icon-button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
Template.customBuffEditList.helpers({
|
||||||
|
buffs: function(){
|
||||||
|
var selector = {
|
||||||
|
"parent.id": this.parentId,
|
||||||
|
"charId": this.charId,
|
||||||
|
};
|
||||||
|
return CustomBuffs.find(selector);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.customBuffEditList.events({
|
||||||
|
"tap #addBuffButton": function(event, instance){
|
||||||
|
if (!_.isBoolean(this.enabled)) {
|
||||||
|
this.enabled = true;
|
||||||
|
}
|
||||||
|
const customBuffId = CustomBuffs.insert({
|
||||||
|
name: "New Buff",
|
||||||
|
charId: this.charId,
|
||||||
|
parent: {
|
||||||
|
id: this.parentId,
|
||||||
|
collection: this.parentCollection,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
pushDialogStack({
|
||||||
|
template: "customBuffEdit",
|
||||||
|
data: {id: customBuffId},
|
||||||
|
element: event.currentTarget,
|
||||||
|
returnElement: () => instance.find(`tr.buff[data-id='${customBuffId}']`),
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.customBuffEditListItem.events({
|
||||||
|
"tap .edit-buff": function(event, template){
|
||||||
|
pushDialogStack({
|
||||||
|
template: "customBuffEdit",
|
||||||
|
data: {id: this.buff._id},
|
||||||
|
element: event.currentTarget.parentElement.parentElement,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<template name="customBuffView">
|
||||||
|
<td>{{buff.name}}</td>
|
||||||
|
<td>
|
||||||
|
<paper-button class="apply-buff-button">Apply</paper-button>
|
||||||
|
</td>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Template.customBuffView.events({
|
||||||
|
"click .apply-buff-button": function(){
|
||||||
|
pushDialogStack({
|
||||||
|
template: "applyBuffDialog",
|
||||||
|
data: {buff: this.buff},
|
||||||
|
element: event.currentTarget,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<template name="customBuffViewList">
|
||||||
|
{{#if buffs.count}}
|
||||||
|
<div class="buffs">
|
||||||
|
<div class="paper-font-title" style="margin-bottom: 8px;">
|
||||||
|
Buffs
|
||||||
|
</div>
|
||||||
|
{{#each buff in buffs}}
|
||||||
|
{{> customBuffView buff=buff}}
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Template.customBuffViewList.helpers({
|
||||||
|
buffs: function(){
|
||||||
|
var selector = {
|
||||||
|
"parent.id": this.parentId,
|
||||||
|
"charId": this.charId,
|
||||||
|
};
|
||||||
|
return CustomBuffs.find(selector);
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
{{> effectsViewList charId=charId parentId=_id}}
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
{{> proficiencyViewList charId=charId parentId=_id}}
|
{{> proficiencyViewList charId=charId parentId=_id}}
|
||||||
|
{{> customBuffViewList charId=charId parentId=_id}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="featureEdit">
|
<template name="featureEdit">
|
||||||
@@ -73,4 +74,5 @@
|
|||||||
|
|
||||||
{{> effectsEditList parentId=_id parentCollection="Features" charId=charId name=name enabled=enabled}}
|
{{> effectsEditList parentId=_id parentCollection="Features" charId=charId name=name enabled=enabled}}
|
||||||
{{> proficiencyEditList parentId=_id parentCollection="Features" charId=charId enabled=enabled}}
|
{{> proficiencyEditList parentId=_id parentCollection="Features" charId=charId enabled=enabled}}
|
||||||
|
{{> customBuffEditList parentId=_id parentCollection="Features" charId=charId}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
{{> effectsViewList charId=charId parentId=_id}}
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
{{> attacksViewList charId=charId parentId=_id}}
|
{{> attacksViewList charId=charId parentId=_id}}
|
||||||
|
{{> customBuffViewList charId=charId parentId=_id}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="itemEdit">
|
<template name="itemEdit">
|
||||||
@@ -68,6 +69,8 @@
|
|||||||
{{> effectsEditList parentId=_id parentCollection="Items" charId=charId enabled=equipped name=name}}
|
{{> effectsEditList parentId=_id parentCollection="Items" charId=charId enabled=equipped name=name}}
|
||||||
<!--Attacks-->
|
<!--Attacks-->
|
||||||
{{> attackEditList parentId=_id parentCollection="Items" charId=charId enabled=equipped name=name}}
|
{{> attackEditList parentId=_id parentCollection="Items" charId=charId enabled=equipped name=name}}
|
||||||
|
<!-- Buffs -->
|
||||||
|
{{> customBuffEditList parentId=_id parentCollection="Items" charId=charId}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="containerDropdown">
|
<template name="containerDropdown">
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>{{#markdown}}{{evaluateSpellString charId parent.id description}}{{/markdown}}</div>
|
<div>{{#markdown}}{{evaluateSpellString charId parent.id description}}{{/markdown}}</div>
|
||||||
{{> attacksViewList charId=charId parentId=_id}}
|
{{> attacksViewList charId=charId parentId=_id}}
|
||||||
|
{{> customBuffViewList charId=charId parentId=_id}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="spellEdit">
|
<template name="spellEdit">
|
||||||
@@ -115,4 +116,5 @@
|
|||||||
<paper-textarea id="descriptionInput" label="Description" value="{{description}}">
|
<paper-textarea id="descriptionInput" label="Description" value="{{description}}">
|
||||||
</paper-textarea>
|
</paper-textarea>
|
||||||
{{> attackEditList parentId=_id parentCollection="Spells" charId=charId enabled=true name=name}}
|
{{> attackEditList parentId=_id parentCollection="Spells" charId=charId enabled=true name=name}}
|
||||||
|
{{> customBuffEditList parentId=_id parentCollection="Spells" charId=charId}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -57,10 +57,9 @@
|
|||||||
{{>buffListItem buff=condition}}
|
{{>buffListItem buff=condition}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
{{#if totalBuffs.count}}
|
{{#if buffs.count}}
|
||||||
<div class="layout horizontal">
|
<div class="layout horizontal">
|
||||||
<div class="paper-font-subhead flex">Buffs</div>
|
<div class="paper-font-subhead flex">Buffs</div>
|
||||||
<paper-button class="viewAllBuffsButton"> View All </paper-button>
|
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<div class="buffsList">
|
<div class="buffsList">
|
||||||
|
|||||||
Reference in New Issue
Block a user