From a0acaa39b377191d04e9e434181e5d9942c99fac Mon Sep 17 00:00:00 2001 From: Michael F Date: Mon, 16 Sep 2013 21:36:30 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=20api=20=D1=82=D0=B5=D0=B3=D0=BE=D0=B2=20?= =?UTF-8?q?=D1=81=D0=BA=D0=BB=D0=B0=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handlers/Play/Api/V1/Servers/index.coffee | 26 ++++++++++++++++--- source/node/index.coffee | 3 ++- .../node/models/Server/{Store => }/Tag.coffee | 2 +- 3 files changed, 25 insertions(+), 6 deletions(-) rename source/node/models/Server/{Store => }/Tag.coffee (97%) diff --git a/source/node/handlers/Play/Api/V1/Servers/index.coffee b/source/node/handlers/Play/Api/V1/Servers/index.coffee index 6524810..5a188fb 100644 --- a/source/node/handlers/Play/Api/V1/Servers/index.coffee +++ b/source/node/handlers/Play/Api/V1/Servers/index.coffee @@ -51,7 +51,9 @@ app.on 'mount', (parent) -> , loadServerStorageItems( maria.Server.Storage.Item ) - + , loadServerStorageTags( + maria.Server.Tag + ) , (req, res) -> res.json 200, req.storage @@ -80,7 +82,7 @@ app.on 'mount', (parent) -> maria.Server.Store.Item.Enchantment ) , loadServerStoreTags( - maria.Server.Store.Tag + maria.Server.Tag ) , (req, res) -> @@ -183,6 +185,22 @@ loadServerStorageItems= (ServerStorageItem) -> console.log 'load server storage:', req.storage next err +loadServerStorageTags= (ServerTag) -> + (req, res, next) -> + serverId= req.storage.serverId + + console.log 'load server `%s` storage tags...', serverId + + ServerTag.query serverId, req.maria, (err, tags) -> + req.storage.tags= tags + + if not tags and not err + res.status 404 + err= 'server storage tags not found' + + console.log 'load server storage:', req.storage + next err + loadServerStore= (param, ServerStore) -> (req, res, next) -> req.store= null @@ -268,13 +286,13 @@ loadServerStoreItemsEnchantments= (ServerStoreItemEnchantment) -> console.log 'load server store:', req.store next err -loadServerStoreTags= (ServerStoreTag) -> +loadServerStoreTags= (ServerTag) -> (req, res, next) -> serverId= req.store.serverId console.log 'load server `%s` store tags...', serverId - ServerStoreTag.query serverId, req.maria, (err, tags) -> + ServerTag.query serverId, req.maria, (err, tags) -> req.store.tags= tags if not tags and not err diff --git a/source/node/index.coffee b/source/node/index.coffee index 1a3d58d..093fff1 100644 --- a/source/node/index.coffee +++ b/source/node/index.coffee @@ -114,6 +114,8 @@ module.exports= (cfg, log, done) -> maria.Player.Message= require './models/Player/Message' maria.Server= require './models/Server' + maria.Server.Tag= require './models/Server/Tag' + maria.Server.Storage= require './models/Server/Storage' maria.Server.Storage.Item= require './models/Server/Storage/Item' @@ -121,7 +123,6 @@ module.exports= (cfg, log, done) -> maria.Server.Store.Enchantment= require './models/Server/Store/Enchantment' maria.Server.Store.Item= require './models/Server/Store/Item' maria.Server.Store.Item.Enchantment= require './models/Server/Store/Item/Enchantment' - maria.Server.Store.Tag= require './models/Server/Store/Tag' app.use (req, res, next) -> req.db= app.db diff --git a/source/node/models/Server/Store/Tag.coffee b/source/node/models/Server/Tag.coffee similarity index 97% rename from source/node/models/Server/Store/Tag.coffee rename to source/node/models/Server/Tag.coffee index 498de1c..21794bf 100644 --- a/source/node/models/Server/Store/Tag.coffee +++ b/source/node/models/Server/Tag.coffee @@ -1,4 +1,4 @@ -module.exports= class ServerStoreTag +module.exports= class ServerTag @table= 'server_tag' @tableTag= 'tag' @tableTagTags= 'tag_tags' From 628653496d68dcd5efe8e9bfafe050741ff1ed0e Mon Sep 17 00:00:00 2001 From: Michael F Date: Mon, 16 Sep 2013 22:13:22 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/node/models/Server/Storage/Item.coffee | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/source/node/models/Server/Storage/Item.coffee b/source/node/models/Server/Storage/Item.coffee index ef28cfa..60617ba 100644 --- a/source/node/models/Server/Storage/Item.coffee +++ b/source/node/models/Server/Storage/Item.coffee @@ -1,6 +1,8 @@ module.exports= class ServerStorageItem @table= 'player_item' + @tableMaterial= 'bukkit_material' + @tableItemTag= 'item_tag' constructor: (data) -> @id= data.id @@ -16,6 +18,8 @@ module.exports= class ServerStorageItem @material= data.material @enchantability= data.enchantability + @tags= data.tags or null + @createdAt= data.createdAt @query: (serverId, maria, done) -> @@ -39,19 +43,30 @@ module.exports= class ServerStorageItem Material.id as material, Material.enchantability as enchantability, + GROUP_CONCAT(ItemTag.tagId) as tags, + PlayerItem.createdAt - FROM + + FROM ?? as PlayerItem - JOIN + JOIN ?? as Material ON Material.id= PlayerItem.material - WHERE + LEFT OUTER JOIN + ?? as ItemTag + ON ItemTag.itemId= PlayerItem.id + + WHERE PlayerItem.serverId = ? - ORDER BY + + GROUP BY + PlayerItem.id + + ORDER BY PlayerItem.createdAt DESC, material, CAST(material AS SIGNED) " - , [@table, @tableMaterial, serverId] + , [@table, @tableMaterial, @tableItemTag, serverId] , (err, rows) => items= null From 4904edd768effcb4b59f9125e3c00ccc0bb0fc0c Mon Sep 17 00:00:00 2001 From: Michael F Date: Mon, 16 Sep 2013 22:14:06 +0300 Subject: [PATCH 3/5] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=20=D1=82=D0=B5=D0=B3=D0=BE=D0=B2=20=D1=81=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/templates/Play/includes/Play.coffee | 31 +++++++++++++++++-- .../Play/partials/storage/server/index.jade | 13 +++++++- .../Play/partials/store/server/index.jade | 2 +- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/source/node/views/templates/Play/includes/Play.coffee b/source/node/views/templates/Play/includes/Play.coffee index b7b1c30..24a7c70 100644 --- a/source/node/views/templates/Play/includes/Play.coffee +++ b/source/node/views/templates/Play/includes/Play.coffee @@ -24,12 +24,16 @@ app= angular.module 'app', ['ngRoute', 'ngResource', 'ngAnimate'], ($routeProvid $routeProvider.when '/store/:server/:tag', templateUrl: 'partials/store/server/', controller: 'StoreServerCtrl' + $routeProvider.when '/storage', templateUrl: 'partials/storage/', controller: 'StorageCtrl' $routeProvider.when '/storage/:server', templateUrl: 'partials/storage/server/', controller: 'StorageServerCtrl' + $routeProvider.when '/storage/:server/:tag', + templateUrl: 'partials/storage/server/', controller: 'StorageServerCtrl' + app.factory 'Player', ($resource) -> $resource '/api/v1/player/:action', {}, @@ -635,7 +639,7 @@ app.controller 'StorageCtrl', ($scope, $rootScope, $q, $log) -> -app.controller 'StorageServerCtrl', ($scope, $rootScope, $q, $routeParams, ServerStorage, $log) -> +app.controller 'StorageServerCtrl', ($scope, $rootScope, $q, $routeParams, ServerStorage, $log, $thesaurus, $location) -> $rootScope.route= 'storage' $scope.storage= null @@ -651,6 +655,27 @@ app.controller 'StorageServerCtrl', ($scope, $rootScope, $q, $routeParams, Serve serverId: server.id , (storage) -> $scope.storage= $rootScope.server.storage= storage + + # link tags + $scope.nodes= $thesaurus.linkTags $scope.storage.tags + + # link items tags + $scope.items= $thesaurus.linkTagsItems $scope.storage.tags, $scope.storage.items + + # select tag + for tag in $scope.storage.tags + if tag.name == $routeParams.tag + $scope.tag= tag + tag.selected= true + tag.expanded= true if tag.nodes and tag.nodes.length + if tag.tags and tag.tags.length + for t in tag.tags + t.expanded= true + + $scope.items= tag.items + + $scope.search.q= tag.titleRuSingular + $scope.state= 'ready' , (err) -> $scope.state= 'error' @@ -664,6 +689,8 @@ app.controller 'StorageServerCtrl', ($scope, $rootScope, $q, $routeParams, Serve q: '' $scope.searchClear= () -> $scope.search.q= '' + if $routeParams.tag + $location.path "/storage/#{$routeParams.server}" @@ -905,7 +932,7 @@ app.directive 'navTag', ($parse, $compile) -> scope: false transclude: true template: """ - {{node.titleRuPlural}} + {{node.titleRuPlural}} """ controller: ($scope) -> diff --git a/source/node/views/templates/Play/partials/storage/server/index.jade b/source/node/views/templates/Play/partials/storage/server/index.jade index ab8becd..0fbfc00 100644 --- a/source/node/views/templates/Play/partials/storage/server/index.jade +++ b/source/node/views/templates/Play/partials/storage/server/index.jade @@ -2,6 +2,18 @@ extends ../layout +append section--side + + ul.nav.nav-list + li(ng-class="{active:!search.q}", ng-click="searchClear()"): a(ng-href="#/storage/{{server.name}}") Все предметы + li.nav-list--sep + + ul.nav.nav-list.nav-tags(ng-repeat="node in nodes", nav-tags="node.nodes", deep="'tags'==node.name", ng-init="href='#/storage'") + li.nav-list--header(ng-if="'types'==node.name") Предметы по типам + li.nav-list--header(ng-if="'tags'==node.name") Предметы по тегам + + + append section--main .storage--server @@ -10,7 +22,6 @@ append section--main input.input(placeholder='Поиск предметов', ng-model="search.q", required) a.input-action(ng-show="!!search.q", ng-click="searchClear()"): i.icon-remove - .server--items .item(ng-repeat='item in storage.items | filter:search.q', ng-controller='StoreServerItemCtrl'): .row .col-12.col-sm-8.col-lg-8 diff --git a/source/node/views/templates/Play/partials/store/server/index.jade b/source/node/views/templates/Play/partials/store/server/index.jade index 63a0e37..56041af 100644 --- a/source/node/views/templates/Play/partials/store/server/index.jade +++ b/source/node/views/templates/Play/partials/store/server/index.jade @@ -8,7 +8,7 @@ append section--side li(ng-class="{active:!search.q}", ng-click="searchClear()"): a(ng-href="#/store/{{server.name}}") Предметы в продаже li.nav-list--sep - ul.nav.nav-list.nav-tags(ng-repeat="node in nodes", nav-tags="node.nodes", deep="'tags'==node.name") + ul.nav.nav-list.nav-tags(ng-repeat="node in nodes", nav-tags="node.nodes", deep="'tags'==node.name", ng-init="href='#/store'") li.nav-list--header(ng-if="'types'==node.name") Предметы по типам li.nav-list--header(ng-if="'tags'==node.name") Предметы по тегам From 1bfac33aeac65462a6652f66e62e6bd4f643deb8 Mon Sep 17 00:00:00 2001 From: Michael F Date: Thu, 19 Sep 2013 20:15:03 +0300 Subject: [PATCH 4/5] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BB=20api=20=D0=BF=D0=BE=D0=BA=D1=83=D0=BF=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handlers/Play/Api/V1/Servers/index.coffee | 152 ++++++++++-------- source/node/handlers/index.coffee | 7 +- source/node/index.coffee | 7 + source/node/models/Item.coffee | 2 + source/node/models/Player/Balance.coffee | 27 ++++ source/node/models/Player/Item.coffee | 35 ++++ .../models/Player/Item/Enchantment.coffee | 21 +++ source/node/models/Server/Storage/Item.coffee | 40 +++-- source/node/models/Server/Store.coffee | 49 ++++++ source/node/models/Server/Store/Item.coffee | 80 +++++++-- .../Server/Store/Item/Enchantment.coffee | 12 +- 11 files changed, 327 insertions(+), 105 deletions(-) create mode 100644 source/node/models/Item.coffee create mode 100644 source/node/models/Player/Balance.coffee create mode 100644 source/node/models/Player/Item.coffee create mode 100644 source/node/models/Player/Item/Enchantment.coffee diff --git a/source/node/handlers/Play/Api/V1/Servers/index.coffee b/source/node/handlers/Play/Api/V1/Servers/index.coffee index 5a188fb..69f95d0 100644 --- a/source/node/handlers/Play/Api/V1/Servers/index.coffee +++ b/source/node/handlers/Play/Api/V1/Servers/index.coffee @@ -92,9 +92,16 @@ app.on 'mount', (parent) -> ### - Отдает предмет из магазина сервера аутентифицированному игроку. + Покупает предмет сервера аутентифицированному игроку. + + Перед покупкой следующие условия должны быть удовлетворены: + — Покупаемое кол-во предметов делится без остатка на продаваемое кол-во + + Стоимость предмета хранится в базе данных. + + Стоимость зачарованного предмета ### - app.get '/:serverId(\\d+)/store/items/:itemId' + app.post '/:serverId(\\d+)/store/items/:itemId(\\d+)/order' , access @@ -103,19 +110,63 @@ app.on 'mount', (parent) -> , loadServerStore('serverId', maria.Server.Store ) - , loadServerStoreEnchantments( - maria.Server.Store.Enchantment - ) - , loadServerStoreItem('itemId', - maria.Server.Store.Item - ) - , loadServerStoreItemEnchantments( - maria.Server.Store.Item.Enchantment - ) - , (req, res) -> - - res.json 200, req.store.item + # Загружает чары в магазин. + # Загруженные чары являются экземплярами класса `Server.Store.Enchantment`. + , (req, res, next) -> + serverId= req.store.serverId + maria.Server.Store.Enchantment.query serverId, req.maria, (err, enchantments) -> + if not err + req.store.setEnchantments enchantments + next err + + # Загружает указанный предмет в магазин. + # Загруженный предмет является экземпляром класса `Server.Store.Item` + , (req, res, next) -> + itemId= req.param 'itemId' + maria.Server.Store.Item.get itemId, req.maria, (err, item) -> + if not err + item= req.store.addItem item + if item.enchantability and item.enchantments + enchantments= [] + for enchantment in item.enchantments + enchantments.push req.store.factoryItemEnchantment enchantment + item.enchantments= enchantments + next err + + , maria.transaction() + + # Списывает стоимость предмета со счета игрока. + , (req, res, next) -> + playerId= req.user.id + orig= req.store.getItem req.body.item + item= req.item= req.store.factoryItem req.body.item + xp= item.calcXp() - orig.calcXp() + price= Math.round( ((xp * 0.03) + orig.price) * 100 ) / 100 + price= price * (item.amount / orig.amount) + maria.Player.Balance.dec playerId, price, req.maria, (err) -> + next err + + # Сохраняет предмет игроку. + , (req, res, next) -> + playerId= req.user.id + serverId= req.store.serverId + maria.Player.Item.create playerId, serverId, req.item, req.maria, (err, item) -> + item.enchantments= req.item.enchantments + req.item= item + next err + + # Сохраняет чары предмета игроку. + , (req, res, next) -> + return do next if not req.item.enchantments + maria.Player.Item.Enchantment.saveItemEnchantments req.item, req.maria, (err, item) -> + req.item= item + next err + + , maria.transaction.commit() + + , (req, res, next) -> + res.json 201, req.item @@ -171,18 +222,26 @@ loadServerStorageEnchantments= (ServerStorageEnchantment) -> loadServerStorageItems= (ServerStorageItem) -> (req, res, next) -> + playerId= req.user.id serverId= req.storage.serverId - - console.log 'load server `%s` storage items...', serverId - - ServerStorageItem.query serverId, req.maria, (err, items) -> + ServerStorageItem.query playerId, serverId, req.maria, (err, items) -> req.storage.items= items - if not items and not err res.status 404 err= 'server storage items not found' - - console.log 'load server storage:', req.storage + if not err + idx= {} + items= [] + for item, i in req.storage.items + if not item.name and not item.enchantability + if not itm= idx[item.itemId] + itm= idx[item.itemId]= item + items.push itm + else + itm.amount= itm.amount + item.amount + else + items.push item + req.storage.items= items next err loadServerStorageTags= (ServerTag) -> @@ -201,6 +260,9 @@ loadServerStorageTags= (ServerTag) -> console.log 'load server storage:', req.storage next err + + + loadServerStore= (param, ServerStore) -> (req, res, next) -> req.store= null @@ -260,6 +322,7 @@ loadServerStoreItemsEnchantments= (ServerStoreItemEnchantment) -> for item in req.store.items if not item.enchantability continue + item.enchantments= [] if not idx[item.id] idx[item.id]= item ids.push item.id @@ -301,50 +364,3 @@ loadServerStoreTags= (ServerTag) -> console.log 'load server store:', req.store next err - -loadServerStoreItem= (param, ServerStoreItem) -> - (req, res, next) -> - req.store.item= null - - itemId= req.param param - - console.log 'load server store item `%d`...', itemId - ServerStoreItem.get itemId, req.maria, (err, item) -> - req.store.item= item - if not item and not err - res.status 404 - err= 'server store item not found' - - console.log 'load server store:', req.store - next err - -loadServerStoreItemEnchantments= (ServerStoreItemEnchantment) -> - (req, res, next) -> - - if not req.store.item.enchantability - req.store.item.enchantments= null - return next null - - itemId= req.store.item.id - - req.store.enchantmentsIdx= {} - for enchantment in req.store.enchantments - if not req.store.enchantmentsIdx[enchantment.id] - req.store.enchantmentsIdx[enchantment.id]= enchantment - - console.log 'load server store item `%d` enchantments...', itemId - ServerStoreItemEnchantment.query [itemId], req.maria, (err, enchantments) -> - req.store.item.enchantments= [] - - if not enchantments and not err - err= 'cannot load store item enchantments' - - if not err - ench= null - for ench in enchantments - if enchantment= req.store.enchantmentsIdx[ench.enchantmentId] - req.store.item.enchantments.push extend {}, enchantment, - level: ench.level - - console.log 'load server store:', req.store - next err diff --git a/source/node/handlers/index.coffee b/source/node/handlers/index.coffee index 26d22b7..7eae6c5 100644 --- a/source/node/handlers/index.coffee +++ b/source/node/handlers/index.coffee @@ -62,12 +62,6 @@ app.on 'mount', (parent) -> app.use '/api/v1/player/subscriptions' , require './Play/Api/V1/Player/Subscriptions' - ### - Методы API для работы игрока с магазином. - ### - app.use '/api/v1/store' - , require './Play/Api/V1/Store' - ### Методы API для работы с серверами. ### @@ -92,6 +86,7 @@ app.on 'mount', (parent) -> Обрабатывает ошибку ### app.use (err, req, res, next) -> + console.log 'ERROR!', err res.status 500 res.json name: err.name diff --git a/source/node/index.coffee b/source/node/index.coffee index 093fff1..5947082 100644 --- a/source/node/index.coffee +++ b/source/node/index.coffee @@ -101,6 +101,10 @@ module.exports= (cfg, log, done) -> return next err if err req.maria.query 'START TRANSACTION', (err) -> req.maria.transaction= true if not err + + req.on 'end', -> + console.log 'запрос завершен. завершить транзакцию', req.status() + return next err maria.transaction.commit= () -> @@ -110,9 +114,12 @@ module.exports= (cfg, log, done) -> return next err maria.Player= require './models/Player' + maria.Player.Balance= require './models/Player/Balance' maria.Player.Pex= require './models/Player/Pex' maria.Player.Message= require './models/Player/Message' + maria.Player.Item= require './models/Player/Item' + maria.Server= require './models/Server' maria.Server.Tag= require './models/Server/Tag' diff --git a/source/node/models/Item.coffee b/source/node/models/Item.coffee new file mode 100644 index 0000000..26f7d05 --- /dev/null +++ b/source/node/models/Item.coffee @@ -0,0 +1,2 @@ +module.exports= class Item + @table= 'item' diff --git a/source/node/models/Player/Balance.coffee b/source/node/models/Player/Balance.coffee new file mode 100644 index 0000000..7e4feea --- /dev/null +++ b/source/node/models/Player/Balance.coffee @@ -0,0 +1,27 @@ +module.exports= class PlayerBalance + @table: 'player_balance' + + @dec: (playerId, amount, maria, done) -> + + if not amount + err= new Error 'PlayerBalance#amount cannot be NULL' + + if err + return done err + + maria.query " + UPDATE + ?? as PlayerBalance + SET + PlayerBalance.amount = PlayerBalance.amount - ? + WHERE + PlayerBalance.amount >= ? AND + PlayerBalance.playerId = ? + " + , [@table, amount, amount, playerId] + , (err, res) => + + if not err and res.affectedRows != 1 + err= 'not enough money' + + done err diff --git a/source/node/models/Player/Item.coffee b/source/node/models/Player/Item.coffee new file mode 100644 index 0000000..d4f3189 --- /dev/null +++ b/source/node/models/Player/Item.coffee @@ -0,0 +1,35 @@ +Item= require '../Item' + +module.exports= class PlayerItem extends Item + @table: 'player_server_item' + + + + constructor: (data) -> + @id= data.id + @playerId= data.playerId + @serverId= data.serverId + @itemId= data.itemId + @amount= data.amount + + + + @Enchantment= require './Item/Enchantment' + + @create: (playerId, serverId, data, maria, done) -> + item= new @ + playerId: playerId + serverId: serverId + itemId: data.id + amount: data.amount + maria.query " + INSERT INTO + ?? + SET + ? + " + , [@table, item] + , (err, res) -> + if not err + item.id= res.insertId + done err, item diff --git a/source/node/models/Player/Item/Enchantment.coffee b/source/node/models/Player/Item/Enchantment.coffee new file mode 100644 index 0000000..7febcc4 --- /dev/null +++ b/source/node/models/Player/Item/Enchantment.coffee @@ -0,0 +1,21 @@ +module.exports= class PlayerItemEnchantment + @table: 'player_server_item_enchantment' + + @saveItemEnchantments: (item, maria, done) -> + bulk= [] + for ench, i in item.enchantments + bulk.push [item.id, ench.id, ench.level, i] + maria.query " + INSERT INTO + ?? + ( + `itemId`, `enchantmentId`, `level`, `order` + ) + VALUES + ? + " + , [@table, bulk] + , (err, res) -> + if not err and res.affectedRows != item.enchantments.length + err= 'error insert player item enchantments' + done err, item diff --git a/source/node/models/Server/Storage/Item.coffee b/source/node/models/Server/Storage/Item.coffee index 60617ba..c9d742e 100644 --- a/source/node/models/Server/Storage/Item.coffee +++ b/source/node/models/Server/Storage/Item.coffee @@ -1,11 +1,15 @@ module.exports= class ServerStorageItem - @table= 'player_item' + @table= 'player_server_item' - @tableMaterial= 'bukkit_material' + @tableItem= 'item' + @tableItemMaterial= 'bukkit_material' + @tableItemEnchantment= 'player_server_item_enchantment' @tableItemTag= 'item_tag' constructor: (data) -> @id= data.id + @itemId= data.itemId + @amount= data.amount @name= data.name @@ -22,51 +26,65 @@ module.exports= class ServerStorageItem @createdAt= data.createdAt - @query: (serverId, maria, done) -> + @query: (playerId, serverId, maria, done) -> maria.query " SELECT PlayerItem.id, + PlayerItem.itemId, + PlayerItem.amount, PlayerItem.name, - PlayerItem.titleRu as itemTitleRu, + Item.titleRu as itemTitleRu, Material.titleRu as materialTitleRu, - PlayerItem.titleEn as itemTitleEn, + Item.titleEn as itemTitleEn, Material.titleEn as materialTitleEn, - PlayerItem.imageUrl as itemImageUrl, + Item.imageUrl as itemImageUrl, Material.imageUrl as materialImageUrl, Material.id as material, Material.enchantability as enchantability, + GROUP_CONCAT(DISTINCT CONCAT(ItemEnchantment.enchantmentId, ':', ItemEnchantment.level) + ORDER BY ItemEnchantment.order + ) as enchantments, + GROUP_CONCAT(ItemTag.tagId) as tags, - PlayerItem.createdAt + PlayerItem.updatedAt FROM ?? as PlayerItem + JOIN + ?? as Item + ON Item.id= PlayerItem.itemId JOIN ?? as Material - ON Material.id= PlayerItem.material + ON Material.id= Item.material + LEFT OUTER JOIN + ?? as ItemEnchantment + ON ItemEnchantment.itemId= PlayerItem.id LEFT OUTER JOIN ?? as ItemTag - ON ItemTag.itemId= PlayerItem.id + ON ItemTag.itemId= Item.id WHERE + PlayerItem.playerId = ? + AND PlayerItem.serverId = ? GROUP BY PlayerItem.id ORDER BY - PlayerItem.createdAt DESC, + PlayerItem.updatedAt DESC, material, CAST(material AS SIGNED) " - , [@table, @tableMaterial, @tableItemTag, serverId] + , [@table, @tableItem, @tableItemMaterial, @tableItemEnchantment, @tableItemTag, playerId, serverId] , (err, rows) => items= null diff --git a/source/node/models/Server/Store.coffee b/source/node/models/Server/Store.coffee index 4771a2c..f64da9f 100644 --- a/source/node/models/Server/Store.coffee +++ b/source/node/models/Server/Store.coffee @@ -2,11 +2,60 @@ module.exports= class ServerStore @table= 'server_store' + + + @Item= require './Store/Item' + @ItemEnchantment= require './Store/Item/Enchantment' + + + constructor: (data) -> @serverId= data.serverId @enchantments= [] + Object.defineProperty @, 'enchantmentsIdx', + value: {} + @items= [] + Object.defineProperty @, 'itemsIdx', + value: {} + + addItem: (item) -> + if not @itemsIdx[item.id] + @items.push @itemsIdx[item.id]= item + item + + getItem: (item) -> + item= @itemsIdx[item.id] + item + + setEnchantments: (enchantments) -> + @enchantments= [] + for enchantment in enchantments + @enchantments.push @enchantmentsIdx[enchantment.id]= enchantment + @ + + getEnchantment: (enchantment) -> + enchantment= @enchantmentsIdx[enchantment.id] + enchantment + + factoryItem: (data) -> + item= @getItem data + item= new @constructor.Item item + if data.enchantments + item.enchantments= [] + for data in data.enchantments + if ench= @factoryItemEnchantment data + item.enchantments.push ench + item + + factoryItemEnchantment: (data) -> + ench= @getEnchantment data + ench= new @constructor.ItemEnchantment ench + ench.level= data.level |0 + ench + + @get: (serverId, maria, done) -> done null, new @ diff --git a/source/node/models/Server/Store/Item.coffee b/source/node/models/Server/Store/Item.coffee index 48ff332..35e900c 100644 --- a/source/node/models/Server/Store/Item.coffee +++ b/source/node/models/Server/Store/Item.coffee @@ -1,29 +1,47 @@ module.exports= class ServerStoreItem - @table= 'server_item' - @tableItem= 'item' - @tableMaterial= 'bukkit_material' + @Enchantment= require './Item/Enchantment' + - @tableItemTag= 'item_tag' constructor: (data) -> @id= data.id @amount= data.amount @price= data.price - @name= data.name - @titleRu= data.itemTitleRu or data.materialTitleRu @titleEn= data.itemTitleEn or data.materialTitleEn - @imageUrl= data.itemImageUrl or data.materialImageUrl - @material= data.material @enchantability= data.enchantability + @enchantments= data.enchantments or null + @tags= data.tags or null + + addEnchantment: (data) -> + if not @enchantability + return + if not @enchantments or not @enchantments.length + @enchantments= [] + @enchantments.push enchantment= new @constructor.Enchantment data + enchantment.id= data.id + enchantment + + calcXp: () -> + xp= 0 + if @enchantments and @enchantments.length + for enchantment in @enchantments + xp= xp + calcXpForEnchantment enchantment.level, @enchantability + xp + + + + @table= 'server_item' + @tableItem= 'item' + @tableMaterial= 'bukkit_material' + @tableItemEnchantment= 'item_enchantment' + @tableItemTag= 'item_tag' - @enchantments= [] if @enchantability - @tags= data.tags or null @query: (serverId, maria, done) -> items= null @@ -99,25 +117,55 @@ module.exports= class ServerStoreItem Material.imageUrl as materialImageUrl, Material.id as material, - Material.enchantability as enchantability + Material.enchantability as enchantability, + + GROUP_CONCAT(DISTINCT CONCAT(ItemEnchantment.enchantmentId, ':', ItemEnchantment.level) + ORDER BY ItemEnchantment.order + ) as enchantments - FROM + FROM ?? as ServerItem - JOIN + JOIN ?? as Item ON Item.id= ServerItem.itemId - JOIN + JOIN ?? as Material ON Material.id= Item.material - WHERE + LEFT OUTER JOIN + ?? as ItemEnchantment + ON ItemEnchantment.itemId= Item.id + + WHERE ServerItem.itemId = ? " - , [@table, @tableItem, @tableMaterial, itemId] + , [@table, @tableItem, @tableMaterial, @tableItemEnchantment, itemId] , (err, rows) => if not err row= null if row= do rows.shift item= new @ row + if item.enchantability + enchantments= [] + for data in item.enchantments.split ',' + data= data.split ':' + enchantments.push new @Enchantment + id: data[0] + level: data[1] + item.enchantments= enchantments done err, item + + + +calcXpForLevel= (pLevel) -> + if 17 > pLevel + return 17 * pLevel + if 16 < pLevel and 32 > pLevel + return (1.5 * (pLevel * pLevel)) - (29.5 * pLevel) + 360 + if 31 < pLevel + return (3.5 * (pLevel * pLevel)) - (151.5 * pLevel) + 2220 + +calcXpForEnchantment= (eLevel, enchantability) -> + pLevel= Math.floor eLevel - (1 + (enchantability / 2)) + return calcXpForLevel Math.max 1, pLevel diff --git a/source/node/models/Server/Store/Item/Enchantment.coffee b/source/node/models/Server/Store/Item/Enchantment.coffee index 8fd53ea..7831b3f 100644 --- a/source/node/models/Server/Store/Item/Enchantment.coffee +++ b/source/node/models/Server/Store/Item/Enchantment.coffee @@ -2,18 +2,22 @@ module.exports= class ServerStoreItemEnchantment @table= 'item_enchantment' constructor: (data) -> - + @id= data.id + @titleRu= data.titleRu + @titleEn= data.titleEn + @levelMin= data.levelMin + @levelMax= data.levelMax + @level= data.level + @itemId= data.itemId @enchantmentId= data.enchantmentId - - @level= data.level @query: (ids, maria, done) -> enchantments= null maria.query " SELECT - + ItemEnchantment.itemId, ItemEnchantment.enchantmentId, From 1183915ce53041d39737717f15c35385ca1d6fb0 Mon Sep 17 00:00:00 2001 From: Michael F Date: Thu, 19 Sep 2013 20:15:18 +0300 Subject: [PATCH 5/5] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/node/views/templates/Play/includes/Play.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/node/views/templates/Play/includes/Play.coffee b/source/node/views/templates/Play/includes/Play.coffee index 24a7c70..b67bddc 100644 --- a/source/node/views/templates/Play/includes/Play.coffee +++ b/source/node/views/templates/Play/includes/Play.coffee @@ -173,7 +173,7 @@ app.factory 'ServerStore', ($resource) -> get: {method:'GET', cache:true, params:{serverId:'@id'}} app.factory 'ServerStoreItem', ($resource) -> - $resource '/api/v1/store/servers/:serverId/items/:itemId/:action' + $resource '/api/v1/servers/:serverId/store/items/:itemId/:action' , {serverId:'@serverId', itemId:'@itemId'} , order: {method:'POST', params:{action:'order'}}