diff --git a/public/js/filters/filters.js b/public/js/filters/filters.js index 9d2255d9e2..f2ba025772 100644 --- a/public/js/filters/filters.js +++ b/public/js/filters/filters.js @@ -8,4 +8,9 @@ angular.module('habitrpg') return function (gp) { return Math.floor((gp - Math.floor(gp))*100); } + }) + .filter('htmlDecode',function(){ + return function(html){ + return $('
').html(html).text(); + } }) \ No newline at end of file diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 53d0a6f040..cafd53dff7 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -539,7 +539,9 @@ api.questAccept = function(req, res) { // If ?key=xxx is provided, we're starting a new quest and inviting the party. Otherwise, we're a party member accepting the invitation if (key) { - if (!shared.content.quests[key]) return res.json(404,{err:'Quest ' + key + ' not found'}); + var quest = shared.content.quests[key]; + if (!quest) return res.json(404,{err:'Quest ' + key + ' not found'}); + if (quest.lvl && user.stats.lvl < quest.lvl) return res.json(400, {err: "You must be level "+quest.lvl+" to being this quest."}); if (group.quest.key) return res.json(400, {err: 'Party already on a quest (and only have one quest at a time)'}); if (!user.items.quests[key]) return res.json(401, {err: "You don't own that quest scroll"}); group.quest.key = key; diff --git a/views/options/inventory/inventory.jade b/views/options/inventory/inventory.jade index 66bc97c7f1..6a4d85a2e4 100644 --- a/views/options/inventory/inventory.jade +++ b/views/options/inventory/inventory.jade @@ -47,7 +47,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') p.muted(ng-show='questCount < 1')=env.t('noScrolls') p.muted!=env.t('scrollsText1') + ' ' + env.t('scrollsText2') + '' div(ng-repeat='(quest_key,points) in ownedItems(user.items.quests)', ng-init='quest = Content.quests[quest_key]') - button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='showQuest(quest_key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}') + button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes | htmlDecode}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='showQuest(quest_key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}') .badge.badge-info.stack-count {{points}} li.customize-menu @@ -110,7 +110,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') menu.pets-menu(label=env.t('quests')) p.muted!=env.t('scrollsText1') + ' ' + env.t('scrollsText2') + '' div(ng-repeat='quest in Content.quests') - button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='buyQuest(quest.key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}') + button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes | htmlDecode}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='buyQuest(quest.key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}') p | {{quest.value}} span.Pet_Currency_Gem1x.inline-gems diff --git a/views/options/social/group.jade b/views/options/social/group.jade index ca7359a5f2..3235cea7a9 100644 --- a/views/options/social/group.jade +++ b/views/options/social/group.jade @@ -47,11 +47,12 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title=env.t('guild table.table.table-striped tr(ng-repeat='(k,v) in group.quest.progress.collect', class='quest_collected_{{v >= Content.quests[group.quest.key].collect[k].count}}') td - div(class='quest_{{group.quest.key}}_{{k}}') {{Content.quests[group.quest.key].collect[k].text}} + div.pull-left(class='quest_{{group.quest.key}}_{{k}}') + | {{Content.quests[group.quest.key].collect[k].text}} td {{v}} / {{Content.quests[group.quest.key].collect[k].count}} - p {{Content.quests[group.quest.key].notes}} + div(ng-bind-html='Content.quests[group.quest.key].notes') hr h5=env.t('participants') table.table.table-striped diff --git a/views/shared/modals/quests.jade b/views/shared/modals/quests.jade index 2849d230f2..2950fab26e 100644 --- a/views/shared/modals/quests.jade +++ b/views/shared/modals/quests.jade @@ -26,7 +26,7 @@ div(modal='modals.showQuest', ng-controller='InventoryCtrl') h3 {{selectedQuest.text}} .modal-body .pull-right(class='quest_{{selectedQuest.key}}') - p {{selectedQuest.notes}} + div(ng-bind-html='selectedQuest.notes') quest-rewards(key='{{selectedQuest.key}}') hr div(style='clear:left;clear:right') @@ -41,7 +41,7 @@ div(modal='modals.buyQuest', ng-controller='InventoryCtrl') h3 {{selectedQuest.text}} .modal-body .pull-right(class='quest_{{selectedQuest.key}}') - p {{selectedQuest.notes}} + div(ng-bind-html='selectedQuest.notes') quest-rewards(key='{{selectedQuest.key}}') .modal-footer button.btn.btn-large.cancel(ng-click='closeQuest()')=env.t('neverMind') @@ -52,7 +52,7 @@ div(modal='party.quest.key && !party.quest.active && !questHold && party.quest.m h3=env.t('questInvitation') | {{Content.quests[party.quest.key].text}} .modal-body - p {{Content.quests[party.quest.key].notes}} + div(ng-bind-html='Content.quests[party.quest.key].notes') quest-rewards(key='{{party.quest.key}}') .modal-footer button.btn.btn-default.btn-small.btn-cancel(ng-click='questHold = true')=env.t('askLater')