Merge branch 'james_bc' of git.kingsome.cn:server/game2006api into james_bc

This commit is contained in:
hujiabin 2023-03-10 10:41:02 +08:00
commit ec8766dd01
38 changed files with 3296 additions and 2247 deletions

View File

@ -18,20 +18,6 @@ class Chip(object):
_common.RspHead(),
['!data', [_common.Chip()], '芯片列表']
]
},{
'name': 'chipOrder',
'desc': '芯片列表排序',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=chipOrder',
'params': [
_common.ReqHead(),
['type', '', '芯片类型1 英雄2 枪械'],
['order', '', 'asc 升序desc 降序'],
],
'response': [
_common.RspHead(),
['!data', [_common.Chip()], '芯片列表']
]
},{
'name': 'chipDetails',
'desc': '芯片详情',
@ -39,200 +25,39 @@ class Chip(object):
'url': 'webapp/index.php?c=Chip&a=chipDetails',
'params': [
_common.ReqHead(),
['token_id', '', '芯片token id'],
['unique_id', '', 'unique_id'],
],
'response': [
_common.RspHead(),
['!data', [_common.Chip()], '芯片信息']
]
},{
'name': 'beforeInlay',
'desc': '芯片镶嵌前置,获取可镶嵌的芯片',
'name': 'upgradeLevelPreview',
'desc': '芯片升级前置操作',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=beforeInlay',
'url': 'webapp/index.php?c=Chip&a=upgradeLevelPreview',
'params': [
_common.ReqHead(),
['type', '', '芯片类型1 英雄2 枪械'],
['unique_id', '', 'unique_id'],
],
'response': [
_common.RspHead(),
['!data', [_common.Chip()], '芯片列表']
['!data', [_common.ChipPro()], '芯片信息']
]
},{
'name': 'inlayChip',
'desc': '芯片镶嵌',
'name': 'upgradeLevel',
'desc': '芯片升级',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=inlayChip',
'url': 'webapp/index.php?c=Chip&a=upgradeLevel',
'params': [
_common.ReqHead(),
['type', '', '1 英雄2 枪械'],
['unique_id', '', '英雄或枪械的唯一id'],
['token_id', '', '芯片token id'],
],
'response': [
_common.RspHead(),
['!data', [_common.Hero()], '英雄或枪械加成信息,用英雄举例'],
['property_chg', _common.PropertyChg(), '属性变更'],
]
},{
'name': 'demountChip',
'desc': '芯片卸下',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=demountChip',
'params': [
_common.ReqHead(),
['type', '', '1 英雄2 枪械'],
['unique_id', '', '英雄或枪械的唯一id'],
['token_id', '', '芯片token id'],
],
'response': [
_common.RspHead(),
['!data', [_common.Hero()], '英雄或枪械加成信息,用英雄举例'],
['property_chg', _common.PropertyChg(), '属性变更'],
]
},{
'name': 'replaceChip',
'desc': '芯片替换',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=replaceChip',
'params': [
_common.ReqHead(),
['type', '', '1 英雄2 枪械'],
['unique_id', '', '英雄或枪械的唯一id'],
['token_id_new', '', '新芯片token id'],
['token_id_old', '', '被替换的芯片token id'],
],
'response': [
_common.RspHead(),
['!data', [_common.Hero()], '英雄或枪械加成信息,用英雄举例'],
['property_chg', _common.PropertyChg(), '属性变更'],
]
},{
'name': 'aKeyInlayChip',
'desc': '芯片一键镶嵌',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=aKeyInlayChip',
'params': [
_common.ReqHead(),
['type', '', '1 英雄2 枪械'],
['unique_id', '', '英雄或枪械的唯一id'],
],
'response': [
_common.RspHead(),
['!data', [_common.Hero()], '英雄或枪械加成信息,用英雄举例']
]
},{
'name': 'beforeSynthetic',
'desc': '芯片合成前置操作',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=beforeSynthetic',
'params': [
_common.ReqHead(),
['token_id', '', '新芯片token id'],
],
'response': [
_common.RspHead(),
['!data', [_common.ChipPro()], '芯片信息']
]
},{
'name': 'selectChip',
'desc': '选择合成材料',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=selectChip',
'params': [
_common.ReqHead(),
['token_id', '', '芯片token id参数 例参数1源芯片 参数2材料芯片'],
],
'response': [
_common.RspHead(),
['data', '', '材料芯片的累计价值']
]
},{
'name': 'syntheticChip',
'desc': '芯片合成',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=syntheticChip',
'params': [
_common.ReqHead(),
['token_id_main', '', '源芯片token id'],
['token_id_param', '', '材料芯片token id 例参数1 参数2 参数3'],
['unique_id_main', '', '源芯片token id'],
['unique_id_param', '', '材料芯片token id 例参数1 参数2 参数3'],
],
'response': [
_common.RspHead(),
['!data', [_common.Chip()], '芯片信息'],
['state', 0, '1 成功,0 失败'],
['property_chg', _common.PropertyChg(), '属性变更'],
]
},{
'name': 'isNeedLucky',
'desc': '选择需要幸运值',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=isNeedLucky',
'params': [
_common.ReqHead(),
['token_id', '', '源芯片token id'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},{
'name': 'isNotNeedLucky',
'desc': '放弃幸运值',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=isNotNeedLucky',
'params': [
_common.ReqHead(),
['token_id', '', '源芯片token id'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},{
'name': 'waitingLucky',
'desc': '幸运值未做选择-待定阶段',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=waitingLucky',
'params': [
_common.ReqHead(),
['token_id', '', '源芯片token id'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},{
'name': 'aKeySynthetic',
'desc': '芯片合成一键添加',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=aKeySynthetic',
'params': [
_common.ReqHead(),
['token_id', '', '源芯片token id'],
],
'response': [
_common.RspHead(),
['data', [
['cost', '', '所添加芯片的总累计价值'],
['token_ids', '', '芯片token id 例如token_id1 token_id2 token_id3'],
], '芯片信息']
]
},{
'name': 'lockChip',
'desc': '芯片加锁',
'group': 'Chip',
'url': 'webapp/index.php?c=Chip&a=lockChip',
'params': [
_common.ReqHead(),
['token_id', '', '芯片token id'],
['state', '', '1 加锁 0 释放锁'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},
]

101
doc/ChipPage.py Normal file
View File

@ -0,0 +1,101 @@
# -*- coding: utf-8 -*-
import _common
class ChipPage(object):
def __init__(self):
self.apis = [
{
'name': 'chipPageList',
'desc': '铭文页列表',
'group': 'ChipPage',
'url': 'webapp/index.php?c=ChipPage&a=chipPageList',
'params': [
_common.ReqHead(),
],
'response': [
_common.RspHead(),
['!data', [_common.ChipPageList()], '页列表']
]
},{
'name': 'showPageInfo',
'desc': '铭文页信息',
'group': 'ChipPage',
'url': 'webapp/index.php?c=ChipPage&a=showPageInfo',
'params': [
_common.ReqHead(),
['page', '', '页id'],
],
'response': [
_common.RspHead(),
['!data', [_common.ChipPage()], '页信息']
]
},{
'name': 'addChipPage',
'desc': '添加铭文页',
'group': 'ChipPage',
'url': 'webapp/index.php?c=ChipPage&a=addChipPage',
'params': [
_common.ReqHead(),
],
'response': [
_common.RspHead(),
]
},{
'name': 'rename',
'desc': '修改页名',
'group': 'ChipPage',
'url': 'webapp/index.php?c=ChipPage&a=rename',
'params': [
_common.ReqHead(),
['page', '', '页id'],
],
'response': [
_common.RspHead(),
['!data', [_common.ChipPage()], '页信息']
]
},{
'name': 'useChip',
'desc': '使用芯片(镶嵌)',
'group': 'ChipPage',
'url': 'webapp/index.php?c=ChipPage&a=useChip',
'params': [
_common.ReqHead(),
['page', '', '页id'],
['slot_id', '', '卡槽id'],
['unique_id', '', '芯片idx'],
],
'response': [
_common.RspHead(),
['!data', [_common.ChipPage()], '页信息']
]
},{
'name': 'removeChipOne',
'desc': '芯片移除',
'group': 'ChipPage',
'url': 'webapp/index.php?c=ChipPage&a=removeChipOne',
'params': [
_common.ReqHead(),
['page', '', '页id'],
['slot_id', '', '卡槽id'],
],
'response': [
_common.RspHead(),
['!data', [_common.ChipPage()], '页信息']
]
},{
'name': 'removeChipAll',
'desc': '芯片移除(一键移除)',
'group': 'ChipPage',
'url': 'webapp/index.php?c=ChipPage&a=removeChipAll',
'params': [
_common.ReqHead(),
['page', '', '页id'],
],
'response': [
_common.RspHead(),
['!data', [_common.ChipPage()], '页信息']
]
},
]

45
doc/Emoji.py Normal file
View File

@ -0,0 +1,45 @@
import _common
class Emoji(object):
def __init__(self):
self.apis = [
{
'name': 'getEmojiList',
'desc': '表情列表',
'group': 'Emoji',
'url': 'webapp/index.php?c=Emoji&a=getEmojiList',
'params': [
_common.ReqHead(),
],
'response': [
_common.RspHead(),
['!data', [_common.Emoji()], '表情列表'],
['use_emoji', [], '已选择的表情列表'],
]
},{
'name': 'setEmoji',
'desc': '设置表情',
'group': 'Emoji',
'url': 'webapp/index.php?c=Emoji&a=setEmoji',
'params': [
_common.ReqHead(),
['item_id', '0', 'item_id'],
],
'response': [
_common.RspHead(),
]
},{
'name': 'cancel',
'desc': '取消设置',
'group': 'Emoji',
'url': 'webapp/index.php?c=Emoji&a=cancel',
'params': [
_common.ReqHead(),
['item_id', '0', 'item_id'],
],
'response': [
_common.RspHead(),
]
},
]

View File

@ -59,21 +59,7 @@ class Gun(object):
['!gun_list', [_common.Gun()], '枪械列表']
]
},
{
'name': 'upgradeLevel',
'desc': '升等级',
'group': 'Gun',
'url': 'webapp/index.php?c=Gun&a=upgradeLevel',
'params': [
_common.ReqHead(),
['gun_uniid', 0, '枪械唯一id'],
['slot_id', 0, '槽id(0-1)'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},
{
'name': 'upgradeLevelPreview',
'desc': '升等级',
@ -87,87 +73,7 @@ class Gun(object):
_common.RspHead(),
['old_gun', _common.Gun(), '枪械-老'],
['new_gun', _common.Gun(), '枪械-新'],
['cost', _common.Cost(), '所需费用'],
]
},
{
'name': 'upgradeQualityOld',
'desc': '升阶',
'group': 'Gun',
'url': 'webapp/index.php?c=Gun&a=upgradeQualityOld',
'params': [
_common.ReqHead(),
['gun_uniid', 0, '枪械唯一id'],
['cost_hero_uniid', 0, '耗材英雄唯一id'],
['slot_id', 0, '槽id(0-1)'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},
{
'name': 'upgradeQuality',
'desc': '升阶',
'group': 'Gun',
'url': 'webapp/index.php?c=Gun&a=upgradeQuality',
'params': [
_common.ReqHead(),
['trans_id', 0, 'transId'],
['token_id1', 0, '枪械token'],
['token_id2', 0, '耗材枪械token'],
],
'response': [
_common.RspHead(),
]
},
{
'name': 'upgradeQualityPreview',
'desc': '升阶',
'group': 'Gun',
'url': 'webapp/index.php?c=Gun&a=upgradeQualityPreview',
'params': [
_common.ReqHead(),
['gun_uniid', 0, '枪械唯一id'],
['cost_gun_uniid', 0, '耗材枪械唯一id'],
],
'response': [
_common.RspHead(),
['old_gun', _common.Gun(), '枪械-老'],
['new_gun', _common.Gun(), '枪械-新'],
['cost', _common.Cost(), '所需费用'],
]
},
{
'name': 'receiveUpgradeQuality',
'desc': '获取升阶后的武器',
'group': 'Gun',
'url': 'webapp/index.php?c=Gun&a=receiveUpgradeQuality',
'params': [
_common.ReqHead(),
['trans_id', 0, 'transId'],
['token_id', 0, '枪械token'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},
{
'name': 'receive',
'desc': '获取升级、升阶后的武器',
'group': 'Gun',
'url': 'webapp/index.php?c=Gun&a=receive',
'params': [
_common.ReqHead(),
['type', 0, '1:领取升级 2:领取升阶'],
['gun_uniid', 0, '枪械唯一id'],
],
'response': [
_common.RspHead(),
['state', 0, '0:失败 1:成功'],
['old_hero', _common.Gun(), '枪械-老'],
['new_hero', _common.Gun(), '枪械-新'],
['!cost', [_common.AwardItem()], '所需费用'],
]
},
{
@ -185,16 +91,20 @@ class Gun(object):
]
},
{
'name': 'getUpgradeQualityList',
'desc': '获取升阶中的枪械列表',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=getUpgradeQualityList',
'name': 'upgradeLv',
'desc': '升等级',
'group': 'Gun',
'url': 'webapp/index.php?c=Gun&a=upgradeLv',
'params': [
_common.ReqHead(),
['gun_uniid', 0, '枪械唯一id'],
['cost_gun_uniid', 0, '材料武器id'],
],
'response': [
_common.RspHead(),
['!infos', [_common.QualityingGun()], '升阶中的枪械列表'],
['property_chg', _common.PropertyChg(), '属性变更'],
['old_gun', _common.Gun(), '枪械-老'],
['new_gun', _common.Gun(), '枪械-新'],
]
},
]

View File

@ -26,6 +26,7 @@ class Hero(object):
'url': 'webapp/index.php?c=Hero&a=skinList',
'params': [
_common.ReqHead(),
['hero_id', 0, '英雄itemId'],
],
'response': [
_common.RspHead(),
@ -46,37 +47,6 @@ class Hero(object):
_common.RspHead(),
]
},
{
'name': 'upgradeSkill',
'desc': '升技能',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=upgradeSkill',
'params': [
_common.ReqHead(),
['hero_uniid', 0, '英雄唯一id'],
['skill_uniid', 0, '技能唯一id'],
['skill_idx', 0, '技能idx 0主动技能1被动技能'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},
{
'name': 'upgradeLevel',
'desc': '升等级',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=upgradeLevel',
'params': [
_common.ReqHead(),
['hero_uniid', 0, '英雄唯一id'],
['slot_id', 0, '槽id(0-1)'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},
{
'name': 'upgradeLevelPreview',
'desc': '升等级',
@ -93,112 +63,6 @@ class Hero(object):
['cost', _common.Cost(), '所需费用'],
]
},
{
'name': 'getUpgradeLevelList',
'desc': '获取升级中的英雄列表',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=getUpgradeLevelList',
'params': [
_common.ReqHead(),
],
'response': [
_common.RspHead(),
['!infos', [_common.LevelingHero()], '升级中的英雄列表'],
]
},
{
'name': 'upgradeQuality',
'desc': '升阶',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=upgradeQuality',
'params': [
_common.ReqHead(),
['trans_id', 0, 'transId'],
['token_id1', 0, '英雄token'],
['token_id2', 0, '耗材英雄token'],
],
'response': [
_common.RspHead(),
]
},
{
'name': 'receiveUpgradeQuality',
'desc': '领取升阶',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=receiveUpgradeQuality',
'params': [
_common.ReqHead(),
['trans_id', 0, 'transId'],
['token_id', 0, '英雄token'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},
{
'name': 'upgradeQualityOld',
'desc': '升阶',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=upgradeQualityOld',
'params': [
_common.ReqHead(),
['hero_uniid', 0, '英雄唯一id'],
['slot_id', 0, '槽id(0-1)'],
['cost_hero_uniid', 0, '耗材英雄唯一id'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
]
},
{
'name': 'upgradeQualityPreview',
'desc': '升阶',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=upgradeQualityPreview',
'params': [
_common.ReqHead(),
['hero_uniid', 0, '英雄唯一id'],
['cost_hero_uniid', 0, '耗材英雄唯一id'],
],
'response': [
_common.RspHead(),
['old_hero', _common.Hero(), '英雄-老'],
['new_hero', _common.Hero(), '英雄-新'],
['cost', _common.Cost(), '所需费用'],
]
},
{
'name': 'getUpgradeQualityList',
'desc': '获取升阶中的英雄列表',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=getUpgradeQualityList',
'params': [
_common.ReqHead(),
],
'response': [
_common.RspHead(),
['!infos', [_common.QualityingHero()], '升阶中的英雄列表'],
]
},
{
'name': 'receive',
'desc': '领取升级/升阶英雄',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=receive',
'params': [
_common.ReqHead(),
['type', 0, '1:领取升级 2:领取升阶'],
['hero_uniid', 0, '英雄唯一id'],
],
'response': [
_common.RspHead(),
['state', 0, '0:失败 1:成功'],
['old_hero', _common.Hero(), '英雄-老'],
['new_hero', _common.Hero(), '英雄-新'],
]
},
{
'name': 'heroDetails',
'desc': '英雄详情',
@ -214,18 +78,49 @@ class Hero(object):
]
},
{
'name': 'upgradeSkillCommon',
'desc': '通用技能升级',
'name': 'upgradeLv',
'desc': '升级',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=upgradeSkillCommon',
'url': 'webapp/index.php?c=Hero&a=upgradeLv',
'params': [
_common.ReqHead(),
['hero_uniid', 0, '英雄唯一id'],
['skill_index', 0, '通用技能下标'],
['cost_hero_uniid', 0, '材料英雄id(非必选参数--4|9|14等级必选)'],
],
'response': [
_common.RspHead(),
['property_chg', _common.PropertyChg(), '属性变更'],
['old_hero', _common.Hero(), '英雄-老'],
['new_hero', _common.Hero(), '英雄-新'],
]
},{
'name': 'presetHero',
'desc': '英雄预设',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=presetHero',
'params': [
_common.ReqHead(),
['hero_uid', 0, '英雄唯一id'],
],
'response': [
_common.RspHead(),
['data', _common.HeroPreset(), '预设信息']
]
},{
'name': 'applyHero',
'desc': '应用',
'group': 'Hero',
'url': 'webapp/index.php?c=Hero&a=applyHero',
'params': [
_common.ReqHead(),
['hero_uid', 0, '英雄唯一id'],
['skill_id', 0, '技能itemId'],
['weapon_uid1', 0, '武器1唯一id'],
['weapon_uid2', 0, '武器2唯一id'],
['chip_page', 0, '芯片页id'],
],
'response': [
_common.RspHead(),
]
},

22
doc/HeroSkill.py Normal file
View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
import _common
class HeroSkill(object):
def __init__(self):
self.apis = [
{
'name': 'getSkillList',
'desc': '技能列表',
'group': 'HeroSkill',
'url': 'webapp/index.php?c=HeroSkill&a=getSkillList',
'params': [
_common.ReqHead(),
],
'response': [
_common.RspHead(),
['data', [], '技能itemId']
]
}
]

View File

@ -9,6 +9,7 @@ class NftIntro(object):
['idx', 0, 'idx'],
['token_id', '', 'token_id'],
['token_type', 0, 'nft类型 1:英雄 2:枪支 3:芯片'],
['amount', 0, '堆叠数量'],
['createtime', 0, '创建时间(上架时间)'],
['modifytime', 0, '修改时间(更新价格等)'],
['s_price', 0, '出售价格-暂定'],
@ -16,8 +17,32 @@ class NftIntro(object):
['c_job', 0, '缓存-职业'],
['c_lv', 0, '缓存-级别'],
['c_id', 0, '缓存-idx'],
['selling', 0, '正在售卖的个数'],
['o_link', '', '关联的售卖单号'],
['details', _common.NftDetail(), 'nft列表'],
]
class CurrencyType(object):
def __init__(self):
self.fields = [
['name', '', '货币名称'],
['address', '', '货币地址'],
]
class TransactionRecord(object):
def __init__(self):
self.fields = [
['idx', '', 'idx'],
['createtime', 0, '交易成功时间'],
['orderid', 0, 'market订单id'],
['o_link', '', '合约订单id'],
['seller', '', '卖家'],
['buyer', '', '买家'],
['tokenid', '', 'tokenid'],
['amount', 0, '商品数量'],
['name', '', '商品名称'],
['type', 0, '商品类型'],
]
class Market(object):
def __init__(self):
@ -368,6 +393,7 @@ class Market(object):
['token', '', 'token'],
['nft_token', '', 'nft_token'],
['s_price', '', '出售价格USDT'],
['amount', 0, '出售数量'],
['payment_token_address', '', 'payment_token_address'],
['nonce', '', 'nonce'],
['signature', '', '签名soliditySha3(type, payment_token_address, price, nonce), 签名的replace客户端做处理'],
@ -395,4 +421,37 @@ class Market(object):
_common.RspHead()
]
},
{
'name': 'getSupportedCurrencyTypes',
'desc': '获取支持的货币类型',
'group': 'Market',
'url': 'webapp/index.php?c=Market&a=getSupportedCurrencyTypes',
'params': [
['account', '', '账号id'],
],
'response': [
_common.RspHead(),
['!list', [CurrencyType()], '货币类型列表'],
]
},
{
'name': 'getTransactionRecord',
'desc': '获取交易记录',
'group': 'Market',
'url': 'webapp/index.php?c=Market&a=getTransactionRecord',
'params': [
['account', '', '账号id'],
['type', 0, '物品类型 0:所有 1:英雄 2:武器 3:芯片 5:碎片'],
['start', 0, '分页开始偏移'],
['page_size', 0, '分页大小'],
],
'response': [
_common.RspHead(),
['total', 0, '交易记录总数'],
['start', 0, '有效的分页偏移'],
['page_size', 0, '有效的分页大小'],
['!list', [TransactionRecord()], '交易记录列表'],
]
}
]

View File

@ -77,6 +77,8 @@ class User(object):
['guild_id', 0, '跟新工会id(可选参数,不传就不更新)'],
['guild_job', 0, '跟新工会职位(可选参数,不传就不更新)'],
['guild_name', 0, '跟新工会名称(可选参数,不传就不更新)'],
['parachute', 0, '跟新降落伞(可选参数,不传就不更新)'],
['ring_id', 0, '跟新戒指(可选参数,不传就不更新)'],
],
'response': [
_common.RspHead(),

View File

@ -78,15 +78,13 @@ class Gun(object):
['token_id', '', 'token id'],
['gun_uniid', 0, '枪唯一id'],
['gun_id', 0, '枪id'],
['state', 0, '0已购买 1体验中'],
['state', 0, '0已购买 1免费GIFT标签'],
['gun_lv', 0, '枪等级'],
['quality', 0, '品阶'],
['durability', 0, '耐久'],
['durability_max', 0, '最大耐久'],
['ceg_uplimit', 0, 'ceg今天获取上限'],
['!attr_base', [Attr()], '枪械基础属性'],
['!attr_pro', [Attr()], '枪械升级升阶加成属性'],
['!attr_chip', [Attr()], '枪械芯片加成属性'],
['try_count', 0, '剩余体验次数 当state=1时才有意义'],
['lock_type', 0, '0:无锁 1:升级 2:升阶 3:派遣中'],
['unlock_time', 0, '使用解锁utc时间(升级或者升阶触发),锁定期间不可战斗和做其他操作,配合lock_type使用'],
@ -96,11 +94,8 @@ class Gun(object):
['current_pve_get_ceg', 0, '当前pve获取的ceg数量'],
['last_pvp_get_ceg_time', 0, '最后一次获取pvp获取ceg时间'],
['last_pve_get_ceg_time', 0, '最后一次获取pve获取ceg时间'],
['chip_ids', '', '镶嵌的芯片主键id组'],
['!chip_core', [ChipCore()], '芯片核心加成'],
['pvp_ceg_uplimit', 0, 'pvp获取的ceg的上限'],
['pve_ceg_uplimit', 0, 'pve获取的ceg的上限'],
['offer_reward_state', 0, '是否悬赏中'],
['tags', '', '1Gen状态'],
]
class GunSkin(object):
@ -149,6 +144,10 @@ class UserInfo(object):
['guild_id', '', '工会id'],
['guild_job', 0, '工会职位'],
['guild_name', '', '工会名称'],
['parachute', '', '当前使用的降落伞id'],
['!parachute_list', [0], '拥有的降落伞列表'],
['ring_id', 0, '勋章戒指ID'],
['!ring_list', [0], '勋章(戒指)列表'],
]
class UserSimple(object):
@ -235,34 +234,24 @@ class Hero(object):
['hero_id', 0, '英雄id'],
['hero_lv', 0, '英雄等级'],
['hero_tili', 0, '英雄体力'],
['hero_tili_max', 0, '英雄最大体力'],
['state', 0, '0已购买 1体验中'],
['state', 0, '0已购买 1免费GIFT标签'],
['skin_id', 0, '英雄皮肤id'],
['quality', 0, '品阶'],
['skill_lv1', 0, '主动技能等级'],
['skill_lv2', 0, '被动技能等级'],
['!attr_base', [Attr()], '英雄基础属性'],
['!attr_pro', [Attr()], '英雄升级升阶提升属性'],
['!attr_skill', [Attr()], '英雄技能提升属性'],
['!attr_chip', [Attr()], '英雄芯片提升属性'],
['try_count', 0, '剩余体验次数 当state=1时才有意义'],
['lock_type', 0, '0:无锁 1:升级 2:升阶 3:派遣中'],
['unlock_lefttime', 0, '解锁剩余时间(单位秒)'],
['unlock_time', 0, '使用解锁utc时间(升级或者升阶触发),锁定期间不可战斗和做其他操作,配合lock_type使用'],
['current_pvp_get_ceg', 0, '当前pvp获取的ceg数量'],
['current_pve_get_ceg', 0, '当前pve获取的ceg数量'],
['last_pvp_get_ceg_time', 0, '最后一次获取pvp获取ceg时间'],
['last_pve_get_ceg_time', 0, '最后一次获取pve获取ceg时间'],
['current_get_gold', 0, '当前获取的gold数量'],
['last_get_gold_time', 0, '最后一次获取gold时间'],
['gold_uplimit', 0, '每天gold上限'],
['unlock_trade_time', 0, '出售解锁utc时间(升级或者升阶完成后触发),只锁交易其他的操作仍可进行和lock_type无关是独立的锁!!!'],
['advanced_count', 0, '进阶次数'],
['lukcy', 0, '幸运'],
['chip_ids', '', '镶嵌的芯片主键id组'],
['skill_points', '', '技能点'],
['!chip_core', [ChipCore()], '芯片核心加成'],
['!skill_common', [], '通用属性'],
['pvp_ceg_uplimit', 0, 'pvp获取的ceg的上限'],
['pve_ceg_uplimit', 0, 'pve获取的ceg的上限'],
['offer_reward_state', 0, '是否悬赏中'],
['tags', '', '1Gen状态'],
]
@ -299,8 +288,8 @@ class HeroSkin(object):
def __init__(self):
self.fields = [
['skin_id', 0, '英雄皮肤id'],
['skin_state', 0, '英雄皮肤状态 0=已经购1 = 试用状态'],
['try_expire_at', 0, '试用到期时间(utc时间)'],
['is_have', 0, '是否拥有 1拥有 0未拥有'],
['use_state', 0, '选中状态 1选中 0未选中'],
]
class Item(object):
@ -782,23 +771,7 @@ class ChipAttr(object):
def __init__(self):
self.fields = [
['attr_id', 0, '属性id'],
['type', 0, '1: 绝对值 2百分比 ---弃用字段'],
['val', 0, '综合属性值'],
['chip_type', 0, '1英雄芯片 2枪械芯片'],
['attr_num', 0, '成长属性值'],
['attr_pool_num', 0, '固定属性值'],
]
class ChipCore(object):
def __init__(self):
self.fields = [
['chip_core_id', 0, '核心id'],
['chip_core_type', 0, '1英雄芯片核心 2枪械芯片核心'],
['chip_core_lv', 0, '核心等级'],
['attr_id', 0, '芯片属性id'],
['attr_number', 0, '属性加成'],
['attr_add_type', 0, '加成类型1 绝对值2 百分比 ---弃用字段'],
]
class Chip(object):
@ -811,41 +784,31 @@ class Chip(object):
['item_id', 0, '道具id'],
['item_num', 0, '道具数量'],
['chip_grade', 0, '芯片等级'],
['chip_type', 0, '芯片类型1 英雄2 枪械'],
['state', 0, '芯片添加状态:0 正常;1 选择;-1 锁定'],
['supper_state', 0, '是否锁定0 正常;1 锁住'],
['inlay_state', 0, '镶嵌状态0 未镶嵌;1 镶嵌了'],
['chip_type', 0, '芯片类型1 攻击2 防御3 辅助'],
['state', 0, '0已购买 1免费GIFT标签'],
['supper_state', 0, '是否锁定0 正常;1 锁住 ---弃用字段'],
['inlay_state', 0, '镶嵌状态0 未镶嵌;1 镶嵌了 ---弃用字段'],
['!rand_attr', [ChipAttr()], '属性'],
['lucky_temporary', '', '升级成功后的幸运值'],
['lucky_final', '', '最终幸运值'],
['strength_max', '', '最大体力值'],
['strength', '', '前一天体力值'],
['strength_temporary', '', '升级成功所得出的总体力值'],
['mint', '', '所需mint费'],
['belong_to_item_id', '', '所镶嵌的英雄或枪械的item id'],
['tags', '', '1Gen状态'],
]
class ChipPro(object):
def __init__(self):
self.fields = [
['idx', 0, '主键id'],
['idx', 0, '主键id'],
['token_id', '', 'token id'],
['account_id', '', '账号id'],
['item_id', 0, '道具id'],
['item_num', 0, '道具数量'],
['chip_grade', 0, '芯片等级'],
['chip_type', 0, '芯片类型1 英雄2 枪械'],
['state', 0, '芯片添加状态:0 正常;1 选择;-1 锁定'],
['supper_state', 0, '是否锁定0 正常;1 锁住'],
['inlay_state', 0, '镶嵌状态0 未镶嵌;1 镶嵌了'],
['chip_type', 0, '芯片类型1 攻击2 防御3 辅助'],
['state', 0, '状态:0 免费;1 常规'],
['supper_state', 0, '是否锁定0 正常;1 锁住 ---弃用字段'],
['inlay_state', 0, '镶嵌状态0 未镶嵌;1 镶嵌了 ---弃用字段'],
['!rand_attr', [ChipAttr()], '属性'],
['lucky_temporary', '', '临时幸运值'],
['lucky_final', '', '最终幸运值'],
['strength', '', '体力值'],
['!rand_attr_after', [ChipAttr()], '芯片升级后的属性'],
['upgrade_cost', '', '芯片升级所需价值'],
['cost',[],'升级所需gold消耗']
]
class BattleMember(object):
@ -938,6 +901,7 @@ class BattleReward(object):
['weapon1', BattleCegReward(), '武器1奖励'],
['weapon2', BattleCegReward(), '武器2奖励'],
['!items', [BattleItemReward()], '碎片奖励'],
['lvInfo', [['oldLv',0,'老等级'],['newLv',0,'新等级']], '等级信息'],
]
class BattleRankScore(object):
@ -1012,4 +976,55 @@ class Currency(object):
['symbol', '', '符号'],
['precision', 0, '精度'],
['type', 0, '1:ERC721 2:ERC1155 3:ERC20'],
]
class Emoji(object):
def __init__(self):
self.fields = [
['item_id', 0, 'item_id'],
['state', 0, '1:使用 0未使用'],
]
class ChipPageList(object):
def __init__(self):
self.fields = [
['idx', 0, 'idx'],
['account_id', 0, 'account_id'],
['page_id', 0, '页id'],
['page_name', '', '页名'],
['createtime', 0, '创建时间'],
]
class ChipPage(object):
def __init__(self):
self.fields = [
['idx', 0, 'idx'],
['page_id', 0, '页id'],
['page_name', '', '页名'],
['!data', [ChipPageSlot()], '卡槽信息'],
['!attr', [Attr()], '属性信息'],
]
class ChipPageSlot(object):
def __init__(self):
self.fields = [
['slot_id', 0, '卡槽id'],
['state', 0, '0未解锁 1已解锁'],
['chip_id', '', '芯片idx'],
]
class HeroPreset(object):
def __init__(self):
self.fields = [
['skill_id', 0, '技能item id'],
['weapon_uid1', 0, '武器1唯一id'],
['weapon_uid2', 0, '武器2唯一id'],
['gun_id1', 0, '武器1 item id'],
['gun_id2', 0, '武器2 item id'],
['chip_page', 0, '芯片页id'],
]

View File

@ -65,6 +65,8 @@ CREATE TABLE `t_user` (
`guild_id` varchar(60) NOT NULL DEFAULT '' COMMENT '工会id',
`guild_job` int(11) NOT NULL DEFAULT '0' COMMENT '工会职位',
`guild_name` varchar(255) NOT NULL DEFAULT '' COMMENT '工会名称',
`parachute` int(11) NOT NULL DEFAULT '0' COMMENT '降落伞ID',
`ring_id` int(11) NOT NULL DEFAULT '0' COMMENT '戒指id',
PRIMARY KEY (`idx`),
UNIQUE KEY `account_id` (`account_id`),
KEY `channel` (`channel`)
@ -162,10 +164,6 @@ CREATE TABLE `t_hero` (
`last_mission_get_ceg_time` bigint NOT NULL DEFAULT '0' COMMENT '最后悬赏任务获取金币的时间',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
`chip_ids` varchar(100) NOT NULL DEFAULT '' COMMENT '已镶嵌的芯片idx组',
`skill_common` varchar(255) NOT NULL DEFAULT '100100|100120|100140|100160|100180|100200|100220|100240|100260|100280' COMMENT '通用技能',
`skill_points` int(11) NOT NULL DEFAULT '0' COMMENT '技能点',
`labour` int(11) NOT NULL DEFAULT '0' COMMENT '劳力值',
`active_token_id` varchar(60) NOT NULL DEFAULT '' COMMENT 'active_token_id',
`active_count` int(11) NOT NULL DEFAULT '0' COMMENT 'active_count',
`activate` int(11) NOT NULL DEFAULT '0' COMMENT '是否激活 1已初始激活',
@ -186,6 +184,7 @@ CREATE TABLE `t_hero_skin` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) CHARACTER SET utf8 NOT NULL COMMENT 'account_id',
`skin_id` int(11) NOT NULL DEFAULT '0' COMMENT '英雄皮肤id',
`hero_id` int(11) NOT NULL DEFAULT '0' COMMENT '英雄id',
`skin_state` int(11) NOT NULL DEFAULT '0' COMMENT '英雄皮肤状态 0=已经购1 = 试用状态',
`get_from` int(11) NOT NULL DEFAULT '0' COMMENT '获得方式 0 = 系统赠送 1 = 金币购买',
`consume_num` int(11) NOT NULL DEFAULT '0' COMMENT '消耗货币的具体数量',
@ -240,22 +239,13 @@ CREATE TABLE `t_chip` (
`item_id` int(11) NOT NULL DEFAULT '0' COMMENT '道具id',
`item_num` int(11) NOT NULL DEFAULT '1' COMMENT '数量',
`chip_grade` int(11) NOT NULL DEFAULT '1' COMMENT '芯片等级',
`chip_type` int(11) NOT NULL DEFAULT '1' COMMENT '1:角色芯片 2:武器芯片',
`state` int(11) NOT NULL DEFAULT '0' COMMENT '芯片添加状态:0 正常;1 选择;-1 锁定',
`supper_state` int(11) NOT NULL DEFAULT '0' COMMENT '是否锁定0 正常;1 锁住',
`inlay_state` int(11) NOT NULL DEFAULT '0' COMMENT '镶嵌状态0 未镶嵌;1 镶嵌了',
`chip_type` int(11) NOT NULL DEFAULT '1' COMMENT '1 攻击2 防御3 辅助',
`state` int(11) NOT NULL DEFAULT '0' COMMENT '0已购买 1免费GIFT标签',
`inlay_state` varchar(60) COMMENT '所镶嵌的芯片页id1|2|3',
`rand_attr` mediumblob COMMENT '随机属性',
`today_get_gold` bigint NOT NULL DEFAULT '0' COMMENT '金币',
`last_get_gold_time` int(11) NOT NULL DEFAULT '0' COMMENT '最后获取金币的时间',
`lucky_temporary` varchar(10) NOT NULL DEFAULT '0' COMMENT '临时幸运值',
`lucky_final` varchar(10) NOT NULL DEFAULT '0' COMMENT '最终幸运值',
`strength_max` varchar(10) NOT NULL DEFAULT '0' COMMENT '最大体力值',
`strength` varchar(10) NOT NULL DEFAULT '0' COMMENT '前一天体力值',
`upgrade_mint` double NOT NULL DEFAULT '0' COMMENT 'mint费用',
`activate` int(11) NOT NULL DEFAULT '0' COMMENT '是否激活 1已初始激活',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
`labour` int(11) NOT NULL DEFAULT '0' COMMENT '劳力值',
PRIMARY KEY (`idx`),
UNIQUE KEY `token_id` (`token_id`),
KEY `item_id` (`item_id`),
@ -292,8 +282,6 @@ CREATE TABLE `t_gun` (
`last_mission_get_ceg_time` bigint NOT NULL DEFAULT '0' COMMENT '最后悬赏任务获取金币的时间',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
`chip_ids` varchar(100) NOT NULL DEFAULT '' COMMENT '已镶嵌的芯片idx组',
`labour` int(11) NOT NULL DEFAULT '0' COMMENT '劳力值',
`active_token_id` varchar(60) NOT NULL DEFAULT '' COMMENT 'active_token_id',
`active_count` int(11) NOT NULL DEFAULT '0' COMMENT 'active_count',
`activate` int(11) NOT NULL DEFAULT '0' COMMENT '是否激活 1已初始激活',
@ -634,6 +622,25 @@ CREATE TABLE `t_fragment_pool` (
) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `t_fragment_record`
--
DROP TABLE IF EXISTS `t_fragment_record`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t_fragment_record` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id',
`param` int(11) NOT NULL DEFAULT '0' COMMENT 'param',
`value` int(11) NOT NULL DEFAULT '0' COMMENT '有效场次',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`idx`),
KEY `account_param` (`account_id`, `param`)
) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `t_realtime_data`
--
@ -918,4 +925,81 @@ CREATE TABLE `t_user_currency` (
PRIMARY KEY (`idx`),
UNIQUE KEY `account_net_address` (`account_id`, `net_id`, `address`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `t_emoji`
--
DROP TABLE IF EXISTS `t_emoji`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t_emoji` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id',
`item_id` int(11) NOT NULL DEFAULT '0' COMMENT 'itemID',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`idx`),
UNIQUE KEY `account_item_id` (`account_id`, `item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `t_user_use_emoji`
--
DROP TABLE IF EXISTS `t_user_use_emoji`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t_user_use_emoji` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id',
`value` varchar(255) NOT NULL DEFAULT '' COMMENT '选中表情itemID',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `t_chip_page`
--
DROP TABLE IF EXISTS `t_chip_page`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t_chip_page` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id',
`page_name` varchar(50) NOT NULL DEFAULT '' COMMENT '页名',
`page_id` int(11) NOT NULL DEFAULT '0' COMMENT '页id',
`data` mediumblob COMMENT 'data',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`idx`),
UNIQUE KEY `account_page_id` (`account_id`, `page_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `t_hero_preset`
--
DROP TABLE IF EXISTS `t_hero_preset`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t_hero_preset` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id',
`hero_uid` int(11) NOT NULL DEFAULT 0 COMMENT 'hero uniid',
`skill_id` int(11) NOT NULL DEFAULT 0 COMMENT '技能 item_id',
`weapon_uid1` int(11) NOT NULL DEFAULT 0 COMMENT 'gun uniid1',
`weapon_uid2` int(11) NOT NULL DEFAULT 0 COMMENT 'gun uniid2',
`chip_page` int(11) NOT NULL DEFAULT 0 COMMENT '芯片页id',
`createtime` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;

149
uml/market.drawio Normal file
View File

@ -0,0 +1,149 @@
<mxfile host="65bd71144e">
<diagram id="RhfSRgj28ZWy9lpzOC5h" name="Page-1">
<mxGraphModel dx="946" dy="807" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="45" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="41" target="44">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="80" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="41" target="79">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="41" value="User" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1">
<mxGeometry x="40" y="200" width="30" height="60" as="geometry"/>
</mxCell>
<mxCell id="55" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="42" target="54">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="42" value="User" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1">
<mxGeometry x="40" y="550" width="30" height="60" as="geometry"/>
</mxCell>
<mxCell id="49" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="44" target="48">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="44" value="调用上架合约" style="whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="200" y="200" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="51" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="48" target="50">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="48" value="修改NFT Owner" style="whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="400" y="200" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="53" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="50" target="52">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="50" value="同步NFT中心化数据 Owner" style="whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="600" y="200" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="76" value="增加一个订单" style="edgeStyle=none;html=1;" edge="1" parent="1" source="52" target="63">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="52" value="同步中心化货架信息" style="whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="800" y="200" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="70" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="54" target="69">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="54" value="购买NFT" style="whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="200" y="550" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="60" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="56" target="59">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="56" value="User" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1">
<mxGeometry x="40" y="380" width="30" height="60" as="geometry"/>
</mxCell>
<mxCell id="59" value="检索上架NFT" style="whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="200" y="430" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="77" style="edgeStyle=none;html=1;entryX=1;entryY=0;entryDx=0;entryDy=15;entryPerimeter=0;" edge="1" parent="1" source="61" target="63">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="78" value="为检索缓存NFT数据" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="77">
<mxGeometry x="0.0816" y="-1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="61" value="NFTs 721" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="830" y="780" width="60" height="80" as="geometry"/>
</mxCell>
<mxCell id="75" value="同步中心化NFT Owner" style="edgeStyle=none;html=1;" edge="1" parent="1" source="62" target="61">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="62" value="链上NFTs" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="590" y="780" width="60" height="80" as="geometry"/>
</mxCell>
<mxCell id="65" value="" style="edgeStyle=none;html=1;entryX=1;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="63" target="59">
<mxGeometry relative="1" as="geometry">
<mxPoint x="520" y="665" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="66" value="直接从货架表检索已上架的NFTs" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=30;" vertex="1" connectable="0" parent="65">
<mxGeometry x="-0.2491" y="4" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="86" style="edgeStyle=none;html=1;exitX=0.855;exitY=1;exitDx=0;exitDy=-4.35;exitPerimeter=0;" edge="1" parent="1" source="63" target="85">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="690" y="890"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="87" value="特殊性多个上架指向同一token" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="86">
<mxGeometry x="0.4509" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="63" value="Market货架" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="590" y="620" width="80" height="90" as="geometry"/>
</mxCell>
<mxCell id="71" style="edgeStyle=none;html=1;entryX=0;entryY=0;entryDx=0;entryDy=15;entryPerimeter=0;" edge="1" parent="1" source="69" target="62">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="72" value="成功后修改Owner" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=15;" vertex="1" connectable="0" parent="71">
<mxGeometry x="-0.3761" y="-2" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="73" style="edgeStyle=none;html=1;" edge="1" parent="1" source="69" target="63">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="74" value="成功后删除货架上的订单" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=-5;" vertex="1" connectable="0" parent="73">
<mxGeometry x="-0.0746" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="69" value="调用购买合约" style="whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="200" y="690" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="81" style="edgeStyle=none;html=1;" edge="1" parent="1" source="79" target="62">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="82" value="成功后修改上架价格信息" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=60;" vertex="1" connectable="0" parent="81">
<mxGeometry x="-0.5924" y="-1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="83" style="edgeStyle=none;html=1;" edge="1" parent="1" source="62" target="63">
<mxGeometry relative="1" as="geometry">
<mxPoint x="520" y="480" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="84" value="同步货架售价" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="83">
<mxGeometry x="0.0058" y="-3" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="79" value="调用更新价格合约" style="whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="200" y="280" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="85" value="NFTs 1155" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="830" y="880" width="60" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -41,6 +41,8 @@ define('TN_DAILY_PVP_GET_FRAGMENT_NUM', 9009);
define('TN_DAILY_PVE_LAST_GET_FRAGMENT_BATTLE', 9010);
define('TN_DAILY_RANK_BATTLE_TIMES', 9011);
define('TN_DAILY_END', 9011);
define('TN_DAILY_PVE_GET_HERO_FRAGMENT_NUM', 9012);
define('TN_DAILY_PVE_GET_GUN_FRAGMENT_NUM', 9013);
define('TN_WEEKLY_BEGIN', 10001);
define('TN_WEEKLY_ACTIVE', 10002);
@ -95,3 +97,4 @@ const kWantedLockType = 3;
const kMaxHeroUpLevelNum = 2;
const kMaxHeroUpQualityNum = 2;
const kMaxEmojiNum = 6;

View File

@ -12,6 +12,7 @@ require_once('models/User.php');
require_once('models/Nft.php');
require_once('models/UserSeasonRing.php');
require_once('models/Parachute.php');
require_once('models/Chip.php');
require_once('mt/Parameter.php');
require_once('mt/RankSeason.php');
@ -26,6 +27,7 @@ use models\User;
use models\Nft;
use models\Parachute;
use models\UserSeasonRing;
use models\Chip;
class BaseAuthedController extends BaseController {
@ -252,6 +254,15 @@ class BaseAuthedController extends BaseController {
));
}
break;
case V_ITEM_EXP:
{
$this->_updateUserInfo(array(
'exp' => function () use($itemNum) {
return "exp + ${itemNum}";
}
));
}
break;
case V_ITEM_ACTIVE:
{
return;
@ -375,6 +386,12 @@ class BaseAuthedController extends BaseController {
$propertyService->addUserChg();
}
break;
case mt\Item::CHIP_TYPE:
{
Chip::addChip($itemMeta);
$propertyService->addChip();
}
break;
default:
{
$this->_addLog('additems', 'invalid_item', array(

View File

@ -1,23 +1,29 @@
<?php
require_once('models/Hero.php');
require_once('models/HeroSkin.php');
require_once('models/Gun.php');
require_once('models/Chip.php');
require_once('models/Bag.php');
require_once('models/DynData.php');
require_once('models/BattleSettlement.php');
require_once('models/BattleHistory.php');
require_once('models/User.php');
require_once('models/Parachute.php');
require_once('services/BattleDataService.php');
require_once('services/FormulaService.php');
require_once('mt/RankSeason.php');
use phpcommon\SqlHelper;
use models\Hero;
use models\HeroSkin;
use models\Gun;
use models\Bag;
use models\DynData;
use models\BattleHistory;
use models\BattleSettlement;
use models\User;
use models\Parachute;
class BattleController extends BaseAuthedController {
@ -130,6 +136,7 @@ class BattleController extends BaseAuthedController {
error_log(json_encode($_REQUEST));
error_log(json_encode($members));
foreach ($members as $member) {
$user = User::find($member['account_id']);
$info = array(
'account_id' => $member['account_id'],
'session_id' => $member['session_id'],
@ -140,6 +147,7 @@ class BattleController extends BaseAuthedController {
'hero_dto' => '',
'weapon_dto1' => '',
'weapon_dto2' => '',
'level' =>$user['level'],
'is_valid_battle' => 0,
'payload' => json_encode($member['cmjoin']),
@ -156,6 +164,12 @@ class BattleController extends BaseAuthedController {
if ($heroDb) {
$info['is_valid_battle'] = 1;
$info['hero_dto'] = Hero::toDto($heroDb);
{//选用皮肤id
$skinDb = HeroSkin::findBx($heroDb['hero_id']);
if ($skinDb){
$info['hero_dto']['skin_id'] = $skinDb['skin_id'];
}
}
} else {
$info['errcode'] = 51;
$info['errmsg'] = 'paramater error';
@ -186,6 +200,7 @@ class BattleController extends BaseAuthedController {
);
$currSeason = mt\RankSeason::getCurrentSeason();
foreach ($members as $member) {
$userDb = User::find($member['account_id']);
$info = array(
'account_id' => $member['account_id'],
'session_id' => $member['session_id'],
@ -193,6 +208,7 @@ class BattleController extends BaseAuthedController {
'weapon_uuid1' => $member['weapon_uuid1'],
'weapon_uuid2' => $member['weapon_uuid2'],
'battle_uuid' => $member['battle_uuid'],
'parachute' => $userDb['parachute']?$userDb['parachute']:Parachute::$parachute,
'hero_dto' => '',
'weapon_dto1' => '',
'weapon_dto2' => '',

View File

@ -335,7 +335,7 @@ class CallbackController extends BaseController {
myself()->_rspOk();
}
public function chipUpgradeGrade(){
public function chipUpgradeGrade(){return;
$transId = getReqVal('trans_id', '0');
$tokenId = getReqVal('token_id', '0');
if (!$transId || !$tokenId){

View File

@ -14,6 +14,7 @@ require_once('services/LogService.php');
use models\Chip;
use models\Hero;
use models\Gun;
@ -26,838 +27,198 @@ class ChipController extends BaseAuthedController
{
public function chipList()
{
// $type = getReqVal('type','');
// if (! $type){
// $this->_rspErr(1,'Please enter instructions');
// return ;
// }
// $chipList = Chip::all($type);
// $chipDtoList = array();
// foreach ($chipList as $item) {
// array_push($chipDtoList, Chip::toDto($item));
// }
$chipList = array();
Chip::getChipList(function ($row) use(&$chipList){
array_push($chipList, Chip::toDto($row));
// if ($row['inlay_state'] != 1){
array_push($chipList, Chip::toDto($row));
// }
});
$this->_rspData(array(
'data' => $chipList,
));
}
public function chipOrder(){
$type = getReqVal('type','');
if (! $type){
$this->_rspErr(1,'Please enter instructions');
return ;
}
$order = getReqVal('order','asc');
$chipList = Chip::all($type);
$chipDtoList = array();
foreach ($chipList as $item) {
array_push($chipDtoList, Chip::toDto($item));
}
$data = $this->_orderByChip($chipDtoList,$order);
$this->_rspData(array(
'data' => $data,
));
}
public function chipDetails(){
$token_id = getReqVal('token_id','');
if (! $token_id){
$this->_rspErr(1,'Please enter instructions');
$unique_id = trim(getReqVal('unique_id', 0));
if (! $unique_id){
$this->_rspErr(1, 'Please enter parameter unique_id');
return ;
}
$chip = Chip::getChipByTokenId($token_id);
if ($chip['supper_state'] == 1){
$chip['strength_temporary'] = \services\FormulaService::Hero_Chip_NFT_Maximum_Physical_Strength($chip['chip_grade'],$chip['lucky_temporary']);
$chip['mint'] = strval(\services\FormulaService::Chip_Need_Mint_Cost($chip['chip_grade'])-$chip['upgrade_mint']);
$chipDb = Chip::find($unique_id);
if (! $chipDb){
$this->_rspErr(1, "You don't have the chip yet");
return;
}
// if ($chip['inlay_state'] == 1){
$tili = $chip['strength_max']-$chip['strength'];
$chip['mint'] = \services\FormulaService::Chip_Demount_Mint($tili);
// }
$chip = Chip::toDto($chip);
$chip = Chip::toDto($chipDb);
$this->_rspData(array(
'data' => $chip,
));
}
public function beforeInlay(){
$type = getReqVal('type','');
if (! $type){
$this->_rspErr(1,'Please enter instructions');
return ;
public function upgradeLevelPreview(){
$unique_id = trim(getReqVal('unique_id', 0));
if (! $unique_id) {
$this->_rspErr(1, 'Please enter parameter unique_id');
return;
}
$chipList = Chip::all($type);
$chipDtoList = array();
foreach ($chipList as $item) {
if ($item['supper_state']==0 && $item['inlay_state']==0){
array_push($chipDtoList, Chip::toDto($item));
$chipDb = Chip::find($unique_id);
if (!$chipDb){
$this->_rspErr(1,'unique_id parameter error');
return;
}
if ($chipDb['chip_grade'] == Chip::CHIP_LV_MAX){
$this->_rspErr(1,' Level upper limit');
return;
}
$chip = Chip::toDto($chipDb);
$rand_attr = emptyReplace(json_decode($chipDb['rand_attr'], true), array());
$chipMeta = mt\ChipAttr::getAttrByItemId($chipDb['item_id']);
if ($chipMeta){
array_unshift($rand_attr,array(
'attr_id'=>$chipMeta['attr_id'],
'val' => $chipMeta['lv'.($chipDb['chip_grade']+1)]
));
}
$chip['rand_attr_after'] = $rand_attr;
$paramMeta = mt\Parameter::getByName('chip_upgrade_cost');
$gold = 0;
if ($paramMeta){
$paramValue = explode('|',$paramMeta['param_value']);
switch ($chipDb['chip_grade']){
case 1: {
$gold = $paramValue[0];
};break;
case 2: {
$gold = $paramValue[1];
};break;
}
}
$chip['cost'] = array(
'item_id' => V_ITEM_GOLD,
'item_num' => $gold
);
$this->_rspData(array(
'data' => $chipDtoList,
'data' => $chip
));
}
public function inlayChip(){
$type = trim(getReqVal('type', 0));
$unique_id = trim(getReqVal('unique_id', 0));
$token_id = trim(getReqVal('token_id', 0));
if (!$type || ! $token_id || ! $unique_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addChip();
if ($type == 1){
if (! $this->_doInlayHero($unique_id,$token_id)){
return;
}
$hero = Hero::toDto(Hero::find($unique_id));
$propertyChgService->addHeroChg();
$this->_rspData([
'data'=>$hero,
'property_chg' => $propertyChgService->toDto(),
]);
}else{
if (! $this->_doInlayGun($unique_id,$token_id)){
return;
}
$gun = Gun::toDto(Gun::find($unique_id));
$propertyChgService->addGunChg();
$this->_rspData([
'data'=>$gun,
'property_chg' => $propertyChgService->toDto(),
]);
}
}
public function demountChip(){
$type = trim(getReqVal('type', 0));
$unique_id = trim(getReqVal('unique_id', 0));
$token_id = trim(getReqVal('token_id', 0));
if (!$type || ! $token_id || ! $unique_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addChip();
if ($type == 1){
if (!$this->_doDemount($unique_id,$token_id)){
return;
}
$hero = Hero::toDto(Hero::find($unique_id));
$propertyChgService->addHeroChg();
$this->_rspData([
'data'=>$hero,
'property_chg' => $propertyChgService->toDto(),
]);
}else{
if (! $this->_doDemountGun($unique_id,$token_id)){
return;
}
$gun = Gun::toDto(Gun::find($unique_id));
$propertyChgService->addGunChg();
$this->_rspData([
'data'=>$gun,
'property_chg' => $propertyChgService->toDto(),
]);
}
}
public function replaceChip(){
$type = trim(getReqVal('type', 0));
$unique_id = trim(getReqVal('unique_id', 0));
$token_id_new = trim(getReqVal('token_id_new', 0));
$token_id_old = trim(getReqVal('token_id_old', 0));
if (! $token_id_new ||! $token_id_old || ! $unique_id || !$type) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addChip();
if ($type == 1){
if (! $this->_doDemount($unique_id,$token_id_old)){
return;
}
if (! $this->_doInlayHero($unique_id,$token_id_new)){
return;
}
$hero = Hero::toDto(Hero::find($unique_id));
$propertyChgService->addHeroChg();
$this->_rspData([
'data'=>$hero,
'property_chg' => $propertyChgService->toDto(),
]);
}else{
if (! $this->_doDemountGun($unique_id,$token_id_old)){
return;
}
if (! $this->_doInlayGun($unique_id,$token_id_new)){
return;
}
$gun = Gun::toDto(Gun::find($unique_id));
$propertyChgService->addGunChg();
$this->_rspData([
'data'=>$gun,
'property_chg' => $propertyChgService->toDto(),
]);
}
}
public function aKeyInlayChip(){
$type = trim(getReqVal('type', 0));
$unique_id = trim(getReqVal('unique_id', 0));
if ( ! $type || ! $unique_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
if ($type == 1){
$hero_or_gun = Hero::find($unique_id);
}else{
$hero_or_gun = Gun::find($unique_id);
}
if (! $hero_or_gun){
$this->_rspErr(1, 'Not enough hero or gun');
return;
}
$limit = 0;
if (! $hero_or_gun['chip_ids'] ){
$limit = 4;
}
if ($hero_or_gun['chip_ids'] && !strpos($hero_or_gun['chip_ids'], '|')){
$limit = 3;
}
if ($hero_or_gun['chip_ids'] && strpos($hero_or_gun['chip_ids'], '|')){
$chipIdsArr = explode('|',$hero_or_gun['chip_ids']);
$limit = 4-count($chipIdsArr);
}
$chipList = Chip::all($type);
if (! $chipList){
$this->_rspErr(1, 'Not enough chip');
return;
}
$usable = array();
foreach ($chipList as $item) {
if ($item['supper_state']==0 && $item['inlay_state']==0){
array_push($usable, $item);
}
}
$res = $this->_getHignGradeLimit($usable,$limit);
if (! $res){
$this->_rspErr(1, 'The chip slot is full');
return;
}
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addChip();
if ($type == 1){
foreach ($res as $val){
$this->_doInlayHero($unique_id,$val['token_id']);
}
$hero_new = Hero::toDto(Hero::find($unique_id));
$propertyChgService->addHeroChg();
$this->_rspData([
'data'=>$hero_new,
'property_chg' => $propertyChgService->toDto(),
]);
}else{
foreach ($res as $val){
$this->_doInlayGun($unique_id,$val['token_id']);
}
$gun_new = Gun::toDto(Gun::find($unique_id));
$propertyChgService->addGunChg();
$this->_rspData([
'data'=>$gun_new,
'property_chg' => $propertyChgService->toDto(),
]);
}
}
public function beforeSynthetic(){
$token_id = trim(getReqVal('token_id', 0));
if (! $token_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip = Chip::getChipByTokenId($token_id);
if ($chip['supper_state'] == 1 || $chip['inlay_state'] == 1 || $chip['state'] == -1){
$this->_rspErr(1, "The chip can't synthetic");
return;
}
if ($chip['chip_grade'] == 15){
$this->_rspErr(1, "Chip Lv upper limit");
return;
}
$chip = Chip::toDto($chip);
foreach ($chip['rand_attr'] as $k=>$val){
$attr = \mt\ChipAttr::getAttrById($val['attr_id'],$val['chip_type']);
$chip['rand_attr_after'][$k] =[
'attr_id'=>$val['attr_id'],
'type'=>$val['type'],
'val'=>$attr['lv'.($chip['chip_grade']+1)]*$val['attr_pool_num'],
'chip_type'=>$val['chip_type']
];
}
$chip['upgrade_cost']=\services\FormulaService::getChipUpgradeCost($chip['chip_grade']+1);
$this->_rspData(['data'=>$chip]);
}
public function selectChip(){
$token_id = trim(getReqVal('token_id', 0));
$token_ids = explode(' ',$token_id);
if (count($token_ids)<0){
$unique_id = trim(getReqVal('unique_id', 0));
$idxArr = explode(' ',$unique_id);
if (count($idxArr)<0){
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip_main = Chip::getChipByTokenId($token_ids[0]);
$chip_param = Chip::getChipByTokenId($token_ids[1]);
if ($chip_param['supper_state'] == 1 || $chip_param['inlay_state'] == 1 || $chip_param['state'] == -1){
$this->_rspErr(1, "The chip can't select");
$chipDbMain = Chip::find($idxArr[0]);
$chipDbParam = Chip::find($idxArr[1]);
if (!$chipDbMain || !$chipDbParam){
$this->_rspErr(1,'unique_id parameter error');
return;
}
if ($chip_param['chip_grade']>$chip_main['chip_grade']){
if ($chipDbParam['token_id']) {
$this->_rspErr(1, "Unable to use nft chip");
return;
}
if (!$chipDbParam['state']) {
$this->_rspErr(1, "Unable to use free chip");
return;
}
if ($chipDbParam['chip_grade']>$chipDbMain['chip_grade']){
$this->_rspErr(1, "The selected material is too high grade");
return;
}
$cost = \services\FormulaService::getChipCumulativeCost($chip_param['chip_grade']);
$this->_rspData(['data'=>$cost]);
$cost = \services\FormulaService::getChipCumulativeCost($chipDbParam['chip_grade']);
$this->_rspData(['cost'=>$cost]);
}
public function syntheticChip(){
$this->_rspOk();return;
$token_id_main = trim(getReqVal('token_id_main', 0));
$token_id_param = array_filter(explode(' ',getReqVal('token_id_param', 0)));
if (! $token_id_main || count($token_id_param)<=0 ) {
$this->_rspErr(1, 'Please enter instructions token_id_param');
public function upgradeLevel(){
$idxMain = trim(getReqVal('unique_id_main', 0));
$idxParam = trim(getReqVal('unique_id_param', 0));
if (!$idxMain || !$idxParam) {
$this->_rspErr(1, 'Please enter parameter');
return;
}
$chip_main = Chip::getChipByTokenId($token_id_main);
$upgrade_cost = \services\FormulaService::getChipUpgradeCost($chip_main['chip_grade']+1);
if ($upgrade_cost==0){
$this->_rspErr(1, 'Error in calculation formula');
$chipDbMain = Chip::find($idxMain);
if (!$chipDbMain){
$this->_rspErr(1,'unique_id_main parameter error');
return;
}
$cumulative_cost = 0;
$params = array();
foreach ($token_id_param as $val){
$chip_param = Chip::getChipByTokenId($val);
array_push($params,array(
'unique_id'=>$chip_param['idx'],
'token_id'=>$chip_param['token_id'],
));
$cumulative_cost += \services\FormulaService::getChipCumulativeCost($chip_param['chip_grade']);
// Chip::deleteChip(['token_id'=>$val]);
if ($chipDbMain['chip_grade'] == Chip::CHIP_LV_MAX){
$this->_rspErr(1,' Level upper limit');
return;
}
{
//埋点
$event = [
'name' => LogService::CHIP_SYNTH_MATERIAL,
];
LogService::ConsumableMaterial($event,$params);
$chipDbParam = Chip::find($idxParam);
if (!$chipDbParam){
$this->_rspErr(1,"unique_id_param parameter error");
return;
}
$num = round(round(($cumulative_cost/$upgrade_cost),5)*10000);
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addChip();
if ($num<rand(1,10000)){
//合成失败
$this->_rspData([
'state' => 0,
'property_chg' => $propertyChgService->toDto(),
]);
}else{
//合成成功
$this->_upgraded($chip_main);
$chip_new = Chip::toDto(Chip::getChipByTokenId($token_id_main));
$chip_new['strength_temporary'] = \services\FormulaService::Hero_Chip_NFT_Maximum_Physical_Strength($chip_new['chip_grade'],$chip_new['lucky_temporary']);
$chip_new['mint'] = \services\FormulaService::Chip_Need_Mint_Cost($chip_new['chip_grade'])-$chip_new['upgrade_mint'];
$this->_rspData([
'data'=>$chip_new,
'state' => 1,
'property_chg' => $propertyChgService->toDto(),
]);
if ($chipDbParam['token_id']) {
$this->_rspErr(1, "Unable to use nft chip");
return;
}
if ($chipDbParam['state'] == Chip::FREE_STATE) {
$this->_rspErr(1, "Unable to use free chip");
return;
}
if (count(array_filter(explode("|",$chipDbParam['inlay_state']))) > 0){
$this->_rspErr(1, "The used chip");
return;
}
if ($chipDbParam['chip_grade'] != $chipDbMain['chip_grade']){
$this->_rspErr(1, "Material chip grade does not meet");
return;
}
$paramMeta = mt\Parameter::getByName('chip_upgrade_cost');
$gold = 0;
if ($paramMeta){
$paramValue = explode('|',$paramMeta['param_value']);
switch ($chipDbMain['chip_grade']){
case 1: {
$gold = $paramValue[0];
};break;
case 2: {
$gold = $paramValue[1];
};break;
}
}
$costItems = array(
array(
'item_id' => V_ITEM_GOLD,
'item_num' => $gold
),
);
$lackItem = null;
if (!$this->_hasEnoughItems($costItems, $lackItem)) {
$this->_rspErr(3, $this->_getLackItemErrMsg($lackItem));
return;
}
}
public function isNeedLucky(){
$token_id = trim(getReqVal('token_id', 0));
if (! $token_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip = Chip::getChipByTokenId($token_id);
$strength_max = \services\FormulaService::Hero_Chip_NFT_Maximum_Physical_Strength($chip['chip_grade'],$chip['lucky_temporary']);
$mint_cost = \services\FormulaService::Chip_Need_Mint_Cost($chip['chip_grade'])-$chip['upgrade_mint'];
$fieldsKv = [
'supper_state' => 0,
'lucky_final'=>$chip['lucky_temporary'],
'lucky_temporary'=>0,
'strength_max' => $strength_max,
'strength' => $strength_max,
'upgrade_mint' => $mint_cost,
'labour' => 0
];
$userObj = new User();
$user=$userObj->find(myself()->_getAccountId());
if ($mint_cost>$user['gold']){
$this->_rspErr(2, 'Be short of gold coins');
return;
}
User::update(['gold'=>$user['gold']-$mint_cost]);
Chip::update($chip['token_id'],$fieldsKv);
$old_chip = Chip::toDto($chip);
$new_chip = Chip::toDto(Chip::getChipByTokenId($token_id));
{
//埋点
$event = [
'name' => LogService::CHIP_LUCKY,
'val' => $mint_cost
];
$old_chip['level'] = $old_chip['chip_grade'];
$new_chip['level'] = $new_chip['chip_grade'];
LogService::consumeCEG($event,$old_chip,$new_chip);
}
$this->_decItems($costItems);
Chip::update2($idxParam,
array(
'account_id' => myself()->_getAccountId() . '!!!',
)
);
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addUserChg();
$propertyChgService->addChip();
$this->_rspData(array(
'property_chg' => $propertyChgService->toDto(),
$rand_attr = emptyReplace(json_decode($chipDbMain['rand_attr'], true), array());
$attrProMeta = \mt\ChipAttr::getAttrPool($chipDbMain);
array_push($rand_attr,array(
'attr_id'=>$attrProMeta['attr_id'],
'val'=>$attrProMeta['val'],
));
}
public function isNotNeedLucky(){
$token_id = trim(getReqVal('token_id', 0));
if (! $token_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip = Chip::getChipByTokenId($token_id);
$fieldsKv = [
'supper_state' => 0,
'lucky_temporary'=>0,
];
Chip::update($chip['token_id'],$fieldsKv);
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addChip();
$this->_rspData(array(
'property_chg' => $propertyChgService->toDto(),
));
}
public function waitingLucky(){
$token_id = trim(getReqVal('token_id', 0));
if (! $token_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip = Chip::getChipByTokenId($token_id);
$fieldsKv = [
'supper_state'=>1,
];
Chip::update($chip['token_id'],$fieldsKv);
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addChip();
Chip::update2($idxMain,
array(
'chip_grade' => $chipDbMain['chip_grade']+1,
'state' => Chip::GETED_STATE,
'rand_attr' => json_encode($rand_attr),
)
);
$chipDbNew = Chip::toDto(Chip::find($idxMain));
$this->_rspData([
'data'=>$chipDbNew,
'property_chg' => $propertyChgService->toDto(),
]);
}
public function aKeySynthetic(){
$token_id = trim(getReqVal('token_id', 0));
if (! $token_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip = Chip::getChipByTokenId($token_id);
$upgrade_cost =\services\FormulaService::getChipUpgradeCost($chip['chip_grade']+1); //芯片升星价值
$chipList = Chip::all($chip['chip_type']);
$chipDtoList = array();
foreach ($chipList as $item) {
if ($item['supper_state']==0 && $item['inlay_state']==0 && $item['state']!=-1 && $item['token_id'] != $token_id && $item['chip_grade'] <= $chip['chip_grade']){
array_push($chipDtoList, $item);
}
};
$data = $this->_orderByChip($chipDtoList,'asc');
$chip_param = [];
$chip_param_out = [];
if (count($data) > 20) {
$cost = 0;
for ($i=0;$i<count($data);$i++){
$data[$i]['cost'] = \services\FormulaService::getChipCumulativeCost($data[$i]['chip_grade']);
if ($i<20){
$cost += $data[$i]['cost'];
array_push($chip_param,$data[$i]);
}else{
array_push($chip_param_out,$data[$i]);
}
}
if ($cost>$upgrade_cost){
$diff_cost = $cost - $upgrade_cost;
foreach ($chip_param as $k=>$value){
if ($diff_cost>$value['cost']){
$diff_cost -= $value['cost'];
unset($chip_param[$k]);
}
}
}else{
$chip_param = $this->_bestFun($upgrade_cost,$chip_param,$chip_param_out);
}
}else{
$cost = 0;
foreach ($data as $k=>$val){
$data[$k]['cost'] = \services\FormulaService::getChipCumulativeCost($data[$k]['chip_grade']);
$cost += $data[$k]['cost'];
}
if ($cost > $upgrade_cost){
$diff_cost = $cost - $upgrade_cost;
foreach ($data as $k=>$value){
if ($diff_cost>$value['cost']){
$diff_cost -= $value['cost'];
unset($data[$k]);
}
}
}
$chip_param = $data;
}
$cumulative_cost = [];
$token_id_arr = [];
foreach ($chip_param as $value){
array_push($cumulative_cost,$value['cost']);
array_push($token_id_arr,$value['token_id']);
}
$this->_rspData(['data'=>['cost'=>$cumulative_cost,'token_ids'=>$token_id_arr]]);
}
public function lockChip(){
$token_id = trim(getReqVal('token_id', 0));
$state = trim(getReqVal('state', 0));
if (! $token_id){
$this->_rspErr(1, 'Please enter instructions');
return;
}
if ($state == 1){
Chip::update($token_id,['state'=>-1]);
}else{
Chip::update($token_id,['state'=>0]);
}
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addChip();
$this->_rspData([
'property_chg' => $propertyChgService->toDto(),
]);
}
private function _doInlayHero($hero_id,$token_id){
$chip = Chip::getChipByTokenId($token_id);
$hero = Hero::find($hero_id);
if (! $chip || ! $hero){
$this->_rspErr(1, 'Not enough chip or hero');
return false;
}
if (! $hero['chip_ids']){
$fieldsKv = ['chip_ids'=>$chip['idx']];
}
if ($hero['chip_ids'] && !strpos($hero['chip_ids'], '|')){
$chipIdsArr = [$hero['chip_ids']];
array_push($chipIdsArr,$chip['idx']);
$fieldsKv = ['chip_ids'=>implode('|',$chipIdsArr)];
}
if ($hero['chip_ids'] && strpos($hero['chip_ids'], '|')){
$chipIdsArr = explode('|',$hero['chip_ids']);
array_push($chipIdsArr,$chip['idx']);
$fieldsKv = ['chip_ids'=>implode('|',$chipIdsArr)];
}
Hero::update($hero_id,$fieldsKv);
Chip::updateChipInlayState($token_id,1);
return true;
}
private function _doInlayGun($gun_id,$token_id){
$chip = Chip::getChipByTokenId($token_id);
$gun = Gun::find($gun_id);
if (! $chip || ! $gun){
$this->_rspErr(1, 'Not enough chip or gun');
return false;
}
if (! $gun['chip_ids']){
$fieldsKv = ['chip_ids'=>$chip['idx']];
}
if ($gun['chip_ids'] && !strpos($gun['chip_ids'], '|')){
$chipIdsArr = [$gun['chip_ids']];
array_push($chipIdsArr,$chip['idx']);
$fieldsKv = ['chip_ids'=>implode('|',$chipIdsArr)];
}
if ($gun['chip_ids'] && strpos($gun['chip_ids'], '|')){
$chipIdsArr = explode('|',$gun['chip_ids']);
array_push($chipIdsArr,$chip['idx']);
$fieldsKv = ['chip_ids'=>implode('|',$chipIdsArr)];
}
Gun::update($gun_id,$fieldsKv);
Chip::updateChipInlayState($token_id,1);
return true;
}
private function _doDemount($unique_id,$token_id){
$chip = Chip::getChipByTokenId($token_id);
$hero = Hero::find($unique_id);
if (! $chip || ! $hero){
$this->_rspErr(1, 'Not enough chip or hero');
return false;
}
$chipIdsArr = explode('|',$hero['chip_ids']);
$k = array_search($chip['idx'],$chipIdsArr);
unset($chipIdsArr[$k]);
$fieldsKv = ['chip_ids'=>implode('|',$chipIdsArr)];
$tili = $chip['strength_max']-$chip['strength'];
if ($tili){
$mint = \services\FormulaService::Chip_Demount_Mint($tili);
$userObj = new User();
$user=$userObj->find(myself()->_getAccountId());
if ($mint>$user['gold']){
$this->_rspErr(2, 'Be short of gold coins');
return false;
}
User::update(['gold'=>$user['gold']-$mint]);
$chipDto = Chip::toDto($chip);
{
//埋点
$event = [
'name' => LogService::CHIP_DEMOUNT,
'val' => $mint
];
$chipDto['level'] = $chipDto['chip_grade'];
LogService::consumeCEG($event,$chipDto,$chipDto);
}
}
$where = ['inlay_state'=>0,'strength'=>$chip['strength_max']];
Hero::update($unique_id,$fieldsKv);
Chip::update($token_id,$where);
return true;
}
private function _doDemountGun($unique_id,$token_id){
$chip = Chip::getChipByTokenId($token_id);
$gun = Gun::find($unique_id);
if (! $chip || ! $gun){
$this->_rspErr(1, 'Not enough chip or gun');
return false;
}
$chipIdsArr = explode('|',$gun['chip_ids']);
$k = array_search($chip['idx'],$chipIdsArr);
unset($chipIdsArr[$k]);
$fieldsKv = ['chip_ids'=>implode('|',$chipIdsArr)];
$tili = $chip['strength_max']-$chip['strength'];
if ($tili){
$mint = \services\FormulaService::Chip_Demount_Mint($tili);
$userObj = new User();
$user=$userObj->find(myself()->_getAccountId());
if ($mint>$user['gold']){
$this->_rspErr(2, 'Be short of gold coins');
return false;
}
User::update(['gold'=>$user['gold']-$mint]);
$chipDto = Chip::toDto($chip);
{
//埋点
$event = [
'name' => LogService::CHIP_DEMOUNT,
'val' => $mint
];
$chipDto['level'] = $chipDto['chip_grade'];
LogService::consumeCEG($event,$chipDto,$chipDto);
}
}
$where = ['inlay_state'=>0,'strength'=>$chip['strength_max']];
Gun::update($unique_id,$fieldsKv);
Chip::update($token_id,$where);
return true;
}
private function _inLayNewAttr($hero_id){
$heroDb = Hero::find($hero_id);
$hero = Hero::toDto($heroDb);
$chipAttr = [];
if (! $hero['chip_ids'] ){
return $hero;
}
if ($hero['chip_ids'] && !strpos($hero['chip_ids'], '|')){
$chip =Chip::toDto(Chip::getChipByIdx($hero['chip_ids']));
foreach ($chip['rand_attr'] as $val){
array_push($chipAttr,$val);
}
}
if ($hero['chip_ids'] && strpos($hero['chip_ids'], '|')){
$chipIdsArr = explode('|',$hero['chip_ids']);
foreach ($chipIdsArr as $val){
$chip = Chip::toDto(Chip::getChipByIdx($val));
foreach ($chip['rand_attr'] as $v){
array_push($chipAttr,$v);
}
}
}
$item = [];
foreach ($chipAttr as $k=>$v){
if (!isset($item[$v['attr_id']])){
$item[$v['attr_id']] = $v;
}else{
$item[$v['attr_id']]['val']+= $v['val'];
}
}
$hero['attr_chip'] = $item;//芯片属性
return $hero;
}
private function _inLayNewAttrGun($gun_id){
$gunDb = Gun::find($gun_id);
$gun = Gun::toDto($gunDb);
$chipAttr = [];
if (! $gun['chip_ids'] ){
return $gun;
}
if ($gun['chip_ids'] && !strpos($gun['chip_ids'], '|')){
$chip =Chip::toDto(Chip::getChipByIdx($gun['chip_ids']));
foreach ($chip['rand_attr'] as $val){
array_push($chipAttr,$val);
}
}
if ($gun['chip_ids'] && strpos($gun['chip_ids'], '|')){
$chipIdsArr = explode('|',$gun['chip_ids']);
foreach ($chipIdsArr as $val){
$chip = Chip::toDto(Chip::getChipByIdx($val));
foreach ($chip['rand_attr'] as $v){
array_push($chipAttr,$v);
}
}
}
$item = [];
foreach ($chipAttr as $k=>$v){
if (!isset($item[$v['attr_id']])){
$item[$v['attr_id']] = $v;
}else{
$item[$v['attr_id']]['val']+= $v['val'];
}
}
$gun['attr_chip'] = $item;//芯片属性
return $gun;
}
private function _chipCore($unique_id,$type){
$chipCore = [];
if ($type==1){
$hero = Hero::find($unique_id);
}else{
$hero = Gun::find($unique_id);
}
if ($hero['chip_ids'] && strpos($hero['chip_ids'], '|')){
$chipIdsArr = explode('|',$hero['chip_ids']);
if (count($chipIdsArr) == 4){
$min = 15;
foreach ($chipIdsArr as $val){
$chip = Chip::getChipByIdx($val);
if ($chip['chip_grade']<$min){
$min = $chip['chip_grade'];
}
}
$chipCoreList = getMetaTable('chipCore@chipCore.php');
foreach ($chipCoreList as $val){
if ($val['chip_core_type']==$type && $val['chip_core_lv']<=$min){
array_push($chipCore,$val);
}
}
return $chipCore;
}else{
return [];
}
}else{
return [];
}
}
private function _getHignGradeLimit($data,$limit){
$len = count($data);
if ($len<=1 || $len<=$limit){
return $data;
}
for ($i = 0; $i < $len - 1; $i++) {
for ($j = $i + 1; $j < $len; $j++) {
if ($data[$i]['chip_grade'] < $data[$j]['chip_grade']) {
$tmp = $data[$i];
$data[$i] = $data[$j];
$data[$j] = $tmp;
}
}
}
return array_slice($data,0,$limit);
}
private function _orderByChip($data,$order){
$len = count($data);
if ($len<=1){
return $data;
}
if ($order == 'desc'){
for ($i = 0; $i < $len - 1; $i++) {
for ($j = $i + 1; $j < $len; $j++) {
if ($data[$i]['chip_grade'] < $data[$j]['chip_grade']) {
$tmp = $data[$i];
$data[$i] = $data[$j];
$data[$j] = $tmp;
}
}
}
}else{
for ($i = 0; $i < $len - 1; $i++) {
for ($j = $i + 1; $j < $len; $j++) {
if ($data[$i]['chip_grade'] > $data[$j]['chip_grade']) {
$tmp = $data[$i];
$data[$i] = $data[$j];
$data[$j] = $tmp;
}
}
}
}
return $data;
}
private function _upgraded($chip){
$new_grade = $chip['chip_grade']+1;
if ($new_grade == 3 || $new_grade == 5){
Chip::updateRandAttr(myself()->_getAccountId(),$chip);
}
$lucky = ltrim(\services\FormulaService::getChipLuckyValue($new_grade),'-') ;
if ($new_grade>=5){
$where = ['lucky_temporary'=>$lucky, 'chip_grade'=>$new_grade,'supper_state'=>1,'modifytime' => $this->_getNowTime()];
}else{
$where = ['lucky_temporary'=>$lucky, 'chip_grade'=>$new_grade,'modifytime' => $this->_getNowTime()];
}
Chip::update($chip['token_id'],$where);
}
private function _bestFun($upgrade_cost,$chip_param,$chip_param_out){
$cost = 0;
foreach ($chip_param as $v){
$cost += $v['cost'];
};
if ($cost>$upgrade_cost){
return $chip_param;
}else{
array_shift($chip_param);
array_push($chip_param,array_shift($chip_param_out));
return $this->_bestFun($upgrade_cost,$chip_param,$chip_param_out);
}
}
}

View File

@ -0,0 +1,183 @@
<?php
require_once('models/Chip.php');
require_once('models/ChipPage.php');
require_once('services/ChipPageService.php');
use models\Chip;
use models\ChipPage;
use services\ChipPageService;
use phpcommon\SqlHelper;
class ChipPageController extends BaseAuthedController
{
public function chipPageList(){
$obj = new services\ChipPageService();
$obj->initChipPage();
$list =array();
ChipPage::getList(function ($row) use(&$list){
array_push($list, ChipPage::toDto($row));
});
$this->_rspData(array(
'data' => $list,
));
}
public function showPageInfo(){
$page = getReqVal('page',1);
$chipPageDb = ChipPage::find($page);
if (!$chipPageDb){
$this->_rspErr(1,'page parameter error');
return ;
}
$chipPageDto = ChipPage::toDtoInfo($chipPageDb);
$this->_rspData(array(
'data' => $chipPageDto,
));
}
public function addChipPage(){
ChipPage::addChipPage();
$this->_rspOk();
}
public function rename(){
$page = getReqVal('page',0);
$chipPageDb = ChipPage::find($page);
if (! $chipPageDb ){
$this->_rspErr(1,'page parameter error');
return ;
}
$name = getReqVal('name','');
if (mb_strlen($name) < 3) {
$this->_rspErr(1,'Parameter error name length must not be less than 3');
return;
}
if (mb_strlen($name, 'utf8') > 12) {
$this->_rspErr(1,'Parameter error name length must not be greater than 12');
return;
}
ChipPage::update($page,array(
'page_name' => $name
));
$chipPageDto = ChipPage::toDtoInfo($chipPageDb);
$this->_rspData(array(
'data' => $chipPageDto,
));
}
public function useChip(){
$page = getReqVal('page',0);
$slotId = getReqVal('slot_id',0);
$uniqueId = getReqVal('unique_id',0);
if (!$page || !$slotId || !$uniqueId){
$this->_rspErr(1, 'Missing parameter');
return ;
}
$chipPageDb = ChipPage::find($page);
if (!$chipPageDb){
$this->_rspErr(1,'page parameter error');
return ;
}
if ($slotId > ChipPageService::MAX_CHIP_SLOT_NUM || $slotId < 0 ){
$this->_rspErr(1,'No card slot exists');
return ;
}
$data = emptyReplace(json_decode($chipPageDb['data'], true), array());
if ( $data[$slotId-1]['state'] != 1){
$this->_rspErr(1,'Unlocked state');
return ;
}
$chipDb = Chip::find($uniqueId);
if (! $chipDb){
$this->_rspErr(1, "You don't have the chip yet");
return;
}
if (in_array($page,array_filter(explode("|",$chipDb['inlay_state'])))){
$this->_rspErr(1, "The used chip");
return;
}
switch ($slotId%3){
case 1 : $type = 1;break;
case 2 : $type = 2;break;
case 0 : $type = 3;break;
default:$type = 0;
}
if ($chipDb['chip_type'] != $type){
$this->_rspErr(1, "Type mismatch");
return;
}
if ( $data[$slotId-1]['chip_id'] ){
Chip::updateInlayState($data[$slotId-1]['chip_id'],$page);
}
$data[$slotId-1]['chip_id'] = $uniqueId;
Chip::updateInlayState($uniqueId,$page);
ChipPage::update($page,array(
'data' => json_encode($data)
));
$newChipPageDb = ChipPage::find($page);
$chipPageDto = ChipPage::toDtoInfo($newChipPageDb);
$this->_rspData(array(
'data' => $chipPageDto,
));
}
public function removeChipOne(){
$page = getReqVal('page',0);
$slotId = getReqVal('slot_id',0);
if (!$page || !$slotId){
$this->_rspErr(1, 'Missing parameter');
return ;
}
$chipPageDb = ChipPage::find($page);
if (!$chipPageDb){
$this->_rspErr(1,'page parameter error');
return ;
}
$data = emptyReplace(json_decode($chipPageDb['data'], true), array());
foreach ($data as &$value){
if ($value['slot_id'] == $slotId){
Chip::updateInlayState($value['chip_id'],$page);
$value['chip_id'] = 0;
}
}
ChipPage::update($page,array(
'data' => json_encode($data)
));
$newChipPageDb = ChipPage::find($page);
$chipPageDto = ChipPage::toDtoInfo($newChipPageDb);
$this->_rspData(array(
'data' => $chipPageDto,
));
}
public function removeChipAll(){
$page = getReqVal('page',0);
$chipPageDb = ChipPage::find($page);
if (!$chipPageDb){
$this->_rspErr(1,'page parameter error');
return ;
}
$data = emptyReplace(json_decode($chipPageDb['data'], true), array());
foreach ($data as &$value){
if ($value['chip_id']){
Chip::updateInlayState($value['chip_id'],$page);
$value['chip_id'] = 0;
}
}
ChipPage::update($page,array(
'data' => json_encode($data)
));
$newChipPageDb = ChipPage::find($page);
$chipPageDto = ChipPage::toDtoInfo($newChipPageDb);
$this->_rspData(array(
'data' => $chipPageDto,
));
}
}

View File

@ -0,0 +1,73 @@
<?php
require_once('models/Emoji.php');
use models\Emoji;
class EmojiController extends BaseAuthedController
{
public function getEmojiList(){
$list = Emoji::emojiList();
$uses = Emoji::getUseEmoji();
$data = array();
foreach ($list as $val){
if(in_array($val,$uses)){
array_push($data,
array(
'item_id'=>$val,
'state'=>1,
)
);
}else{
array_push($data,
array(
'item_id'=>$val,
'state'=>0,
)
);
}
}
$this->_rspData(array(
'data' => $data,
'use_emoji' => $uses
));
}
public function setEmoji(){
$itemId = getReqVal('item_id', '');
if(! in_array($itemId,Emoji::emojiList())){
$this->_rspErr(1, 'item_id parameter error');
return;
}
$uses = Emoji::getUseEmoji();
if(in_array($itemId,$uses)){
$this->_rspErr(1, 'The emoji has been used');
return;
}
if(count($uses) >= kMaxEmojiNum){
$this->_rspErr(1, 'To maximize');
return;
}
array_push($uses,$itemId);
Emoji::updateEmoji( implode('|',$uses) );
$this->_rspOk();
}
public function cancel(){
$itemId = getReqVal('item_id', '');
if(! in_array($itemId,Emoji::emojiList())){
$this->_rspErr(1, 'item_id parameter error');
return;
}
$uses = Emoji::getUseEmoji();
if(! in_array($itemId,$uses)){
$this->_rspErr(1, 'The emoji is not used');
return;
}
foreach ($uses as $k=>$v){
if ($itemId == $v){
unset($uses[$k]);
}
}
Emoji::updateEmoji(implode('|',$uses));
$this->_rspOk();
}
}

View File

@ -11,6 +11,7 @@ require_once('models/User.php');
require_once('models/Gun.php');
require_once('models/Bag.php');
require_once('models/Chip.php');
require_once('models/Nft.php');
require_once('models/NftUpReceive.php');
require_once('models/Transaction.php');
@ -26,6 +27,7 @@ use models\User;
use models\Gun;
use models\Bag;
use models\Chip;
use models\Nft;
use models\NftUpReceive;
use models\Transaction;
use services\LogService;
@ -61,6 +63,11 @@ class GunController extends BaseAuthedController {
$this->_rspErr(1, "You don't have the gun yet");
return;
}
$gunDb['tags'] = '';
if ($gunDb['token_id']){
$nftDb = Nft::getNft($gunDb['token_id']);
$gunDb['tags'] = $nftDb['tags'];
}
$gun = Gun::toDto($gunDb);
$this->_rspData(array(
@ -255,19 +262,29 @@ class GunController extends BaseAuthedController {
return;
}
$costItems = array(
array(
'item_id' => V_ITEM_GOLD,
'item_num' => $nextLevelMeta['gold']
),
array(
'item_id' => V_ITEM_DIAMOND,
'item_num' => $nextLevelMeta['diamond']
),
);
$newGunDb = $gunDb;
$newGunDb['gun_lv'] += 1;
$attrs = mt\GunLevel::addRandAttrNew($gunDb,0);
$newGunDb['rand_attr'] = json_encode($attrs);
$cost['CEG'] = \services\FormulaService::Weapon_Upgrade_CEG_Expend( $newGunDb['gun_lv']);
$cost['CEC'] = \services\FormulaService::Weapon_Upgrade_CEC_Expend( $newGunDb['gun_lv']);
$gunDto = Gun::toDto($gunDb);
$newGunDto = Gun::toDto($newGunDb);
$this->_rspData(array(
'old_gun' => $gunDto,
'new_gun' => $newGunDto,
'cost' => $cost
'cost' => $costItems
));
}
@ -816,4 +833,79 @@ class GunController extends BaseAuthedController {
));
}
public function upgradeLv(){
$gunUniId = getReqVal('gun_uniid', 0);
$costGunUniId = getReqVal('cost_gun_uniid', 0);
$gunDb = Gun::find($gunUniId);
$oldGun = Gun::toDto($gunDb);
$costGunDb = Gun::findEx($costGunUniId);
if (!$gunDb || !$costGunDb) {
$this->_rspErr(100, 'param error or null');
return;
}
if ($costGunDb['token_id']){
$this->_rspErr(100, 'NFT cannot be a material');
return;
}
if ($costGunDb['state'] == Gun::FREE_STATE){
$this->_rspErr(100, 'Unable to use free gun');
return;
}
if ($gunDb['gun_lv'] != $costGunDb['gun_lv']){
$this->_rspErr(100, 'You need the same level to do it');
return;
}
$itemMeta = mt\Item::get($gunDb['gun_id']);
if (!$itemMeta) {
$this->_rspErr(100, 'server internal error');
return;
}
$nextLevelMeta = mt\GunLevel::getByLevel($gunDb['gun_lv'] +1);
if (!$nextLevelMeta) {
$this->_rspErr(5, "It's already the highest level");
return;
}
//升级所需消耗
$costItems = array(
array(
'item_id' => V_ITEM_GOLD,
'item_num' => $nextLevelMeta['gold']
),
array(
'item_id' => V_ITEM_DIAMOND,
'item_num' => $nextLevelMeta['diamond']
),
);
$lackItem = null;
if (!$this->_hasEnoughItems($costItems, $lackItem)) {
$this->_rspErr(3, $this->_getLackItemErrMsg($lackItem));
return;
}
$this->_decItems($costItems);
$attrs = mt\GunLevel::addRandAttrNew($gunDb,1);
Gun::update($gunUniId,
array(
'gun_lv' => $gunDb['gun_lv'] + 1,
'state' => Gun::GETED_STATE,
'rand_attr' => json_encode($attrs),
));
Gun::update($costGunUniId,
array(
'account_id' => myself()->_getAccountId() . '!!!',
)
);
$newGun = Gun::toDto(Gun::find($gunUniId));
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addGunChg();
$propertyChgService->addUserChg();
$this->_rspData(array(
'property_chg' => $propertyChgService->toDto(),
'old_gun' => $oldGun,
'new_gun' => $newGun,
));
}
}

View File

@ -14,9 +14,11 @@ require_once('mt/Skill.php');
require_once('models/Hero.php');
require_once('models/Bag.php');
require_once('models/HeroSkin.php');
require_once('models/Chip.php');
require_once('models/Nft.php');
require_once('models/NftUpReceive.php');
require_once('models/Transaction.php');
require_once('models/ChipPage.php');
require_once('models/Gun.php');
require_once('services/AwardService.php');
require_once('services/PropertyChgService.php');
@ -29,7 +31,9 @@ use phpcommon\SqlHelper;
use models\Hero;
use models\Bag;
use models\HeroSkin;
use models\Chip;
use models\ChipPage;
use models\Gun;
use models\Nft;
use models\NftUpReceive;
use models\Transaction;
use services\LogService;
@ -59,6 +63,11 @@ class HeroController extends BaseAuthedController {
$this->_rspErr(1, "You don't have the hero yet");
return;
}
$heroDb['tags'] = '';
if ($heroDb['token_id']){
$nftDb = Nft::getNft($heroDb['token_id']);
$heroDb['tags'] = $nftDb['tags'];
}
$hero = Hero::toDto($heroDb);
$this->_rspData(array(
@ -66,6 +75,312 @@ class HeroController extends BaseAuthedController {
));
}
public function skinList()
{
$heroId = getReqVal('hero_id',0);
if (!$heroId){
$this->_rspErr(1, "param null");
return;
}
$itemMeta = \mt\Item::get($heroId);
if (!$itemMeta || $itemMeta['type']!=\mt\Item::HERO_TYPE){
$this->_rspErr(1, "param error");
return;
}
$skinList = array();
$skinMeta = \mt\Item::getMetaListByType(\mt\Item::HERO_SKIN_TYPE);
if ($skinMeta){
foreach ($skinMeta as $value){
if ($value['playerid'] == $heroId){
array_push($skinList,HeroSkin::toDto($value));
}
}
}
$this->_rspData(array(
'skin_list' => $skinList
));
}
public function takeonSkin()
{
$heroUniId = getReqVal('hero_uniid', 0);
$skinId = getReqVal('skin_id', 0);
$heroDb = Hero::find($heroUniId);
$heroSkinDb = HeroSkin::find($skinId);
if (!$heroDb) {
$this->_rspErr(1, "You don't have the hero yet");
return;
}
if (!$heroSkinDb) {
$this->_rspErr(2, "You don't have the skin yet");
return;
}
HeroSkin::takeonSkin( $skinId,$heroDb['hero_id']);
$this->_rspOk();
}
public function upgradeLevelPreview(){
$heroUniId = getReqVal('hero_uniid', 0);
$heroDb = Hero::find($heroUniId);
if (!$heroDb) {
$this->_rspErr(1, 'hero does not exist');
return;
}
$heroMeta = mt\Hero::get($heroDb['hero_id']);
if (!$heroMeta) {
$this->_rspErr(100, 'server internal error');
return;
}
$nextLevelMeta = mt\HeroLevelAttr::getByLevel($heroDb['hero_lv'] + 1);
if (!$nextLevelMeta) {
$this->_rspErr(5, "It's already the highest level");
return;
}
$meta = mt\HeroLevel::get($heroDb['hero_lv'] + 1);
$costItems = array(
array(
'item_id' => V_ITEM_GOLD,
'item_num' => $meta['gold']
),
array(
'item_id' => V_ITEM_DIAMOND,
'item_num' => $meta['diamond']
)
);
$newHeroDb = $heroDb;
$newHeroDb['hero_lv'] += 1;
$attrs = mt\HeroLevelAttr::addRandAttrNew($heroDb,0);
$newHeroDb['rand_attr'] = json_encode($attrs);
$heroDto = Hero::toDto($heroDb);
$newHeroDto = Hero::toDto($newHeroDb);
$this->_rspData(array(
'old_hero' => $heroDto,
'new_hero' => $newHeroDto,
'cost' => $costItems
));
}
public function upgradeLv()
{
$heroUniId = getReqVal('hero_uniid', 0);
$costHeroUniId = getReqVal('cost_hero_uniid', 0);
$heroDb = Hero::find($heroUniId);
$oldHero = Hero::toDto($heroDb);
$costHeroDb = Hero::findEx($costHeroUniId);
if (!$heroDb) {
$this->_rspErr(100, 'param error or null');
return;
}
if ($heroDb['hero_lv'] == Hero::LV_1 ||
$heroDb['hero_lv'] == Hero::LV_2 ||
$heroDb['hero_lv'] == Hero::LV_3 ){
if (! $costHeroDb){
$this->_rspErr(100, 'material param error or null');
return;
}
if ($costHeroDb['token_id']){
$this->_rspErr(100, 'NFT cannot be a material');
return;
}
if ($costHeroDb['state'] == Hero::FREE_STATE){
$this->_rspErr(100, 'Unable to use free hero');
return;
}
switch ($heroDb['hero_lv']){
case Hero::LV_1:{
if ($heroDb['hero_lv'] < $costHeroDb['hero_lv']){
$this->_rspErr(100, 'Grade discrepancy');
return;
}
};break;
case Hero::LV_2:{
if ($heroDb['hero_lv'] < $costHeroDb['hero_lv'] && $costHeroDb['hero_lv'] <= Hero::LV_1){
$this->_rspErr(100, 'Grade discrepancy');
return;
}
};break;
case Hero::LV_3:{
if ($heroDb['hero_lv'] < $costHeroDb['hero_lv'] && $costHeroDb['hero_lv'] <= Hero::LV_2){
$this->_rspErr(100, 'Grade discrepancy');
return;
}
}
}
}
$heroMeta = mt\Hero::get($heroDb['hero_id']);
if (!$heroMeta) {
$this->_rspErr(100, 'server internal error');
return;
}
$nextLevelMeta = mt\HeroLevelAttr::getByLevel($heroDb['hero_lv'] + 1);
if (!$nextLevelMeta) {
$this->_rspErr(5, "It's already the highest level");
return;
}
//升级所需消耗
$meta = mt\HeroLevel::get($heroDb['hero_lv'] + 1);
$costItems = array(
array(
'item_id' => V_ITEM_GOLD,
'item_num' => $meta['gold']
),
array(
'item_id' => V_ITEM_DIAMOND,
'item_num' => $meta['diamond']
)
);
$lackItem = null;
if (!$this->_hasEnoughItems($costItems, $lackItem)) {
$this->_rspErr(3, $this->_getLackItemErrMsg($lackItem));
return;
}
$this->_decItems($costItems);
$attrs = mt\HeroLevelAttr::addRandAttrNew($heroDb,1);
Hero::update($heroUniId, array(
'hero_lv' => $heroDb['hero_lv'] + 1,
'rand_attr' => json_encode($attrs),
'state' => Hero::GETED_STATE,
));
if ($costHeroDb){
Hero::update($costHeroUniId, array(
'account_id' => myself()->_getAccountId() . '!!!',
));
}
if ($heroDb['hero_lv'] + 1 > myself()->_getV(TN_HERO_MAX_LEVEL, 0)) {
myself()->_setV(TN_HERO_MAX_LEVEL, 0, $heroDb['hero_lv'] + 1);
}
$newHero = Hero::toDto(Hero::find($heroUniId));
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addHeroChg();
$propertyChgService->addUserChg();
$this->_rspData(array(
'property_chg' => $propertyChgService->toDto(),
'old_hero' => $oldHero,
'new_hero' => $newHero,
));
}
public function presetHero(){
$heroId = getReqVal('hero_uid',0);
$heroDb = Hero::find($heroId);
if (! $heroDb){
$this->_rspErr(1, "You don't have the hero yet");
return;
}
$row = SqlHelper::ormSelectOne(
$this->_getSelfMysql(),
't_hero_preset',
array(
'account_id' => $this->_getAccountId(),
'hero_uid' => $heroId,
)
);
if ($row){
$data = array(
'skill_id' => $row['skill_id'],
'weapon_uid1' => $row['weapon_uid1'],
'weapon_uid2' => $row['weapon_uid2'],
'chip_page' => $row['chip_page'],
'gun_id1'=>0,
'gun_id2'=>0,
);
$gunDb1 = Gun::find($row['weapon_uid1']);
$gunDb2 = Gun::find($row['weapon_uid2']);
if ($gunDb1){
$data['gun_id1'] = $gunDb1['gun_id'];
}
if ($gunDb1){
$data['gun_id2'] = $gunDb2['gun_id'];
}
}else{
$data = array(
'skill_id' => \mt\Skill::DEFAULT_SKILL,
'weapon_uid1' => 0,
'weapon_uid2' => 0,
'gun_id1'=>0,
'gun_id2'=>0,
'chip_page' => 1,
);
}
$this->_rspData(array(
'data' => $data,
));
}
public function applyHero(){
$heroId = getReqVal('hero_uid',0);
$chipPageId = getReqVal('chip_page',0);
$weaponUid1 = getReqVal('weapon_uid1',0);
$weaponUid2 = getReqVal('weapon_uid2',0);
$skillId = getReqVal('skill_id',0);
$heroDb = Hero::find($heroId);
if (! $heroDb){
$this->_rspErr(1, "You don't have the hero yet");
return;
}
$chipPageDb = ChipPage::find($chipPageId);
if (! $chipPageDb){
$this->_rspErr(1, "You don't have the chip page");
return;
}
if ($weaponUid1){
$gunDb1 = Gun::find($weaponUid1);
if (!$gunDb1){
$this->_rspErr(1, "You don't have the gun1 yet");
return;
}
}
if ($weaponUid2){
$gunDb2 = Gun::find($weaponUid2);
if (!$gunDb2){
$this->_rspErr(1, "You don't have the gun2 yet");
return;
}
}
$skillMeta = \mt\Skill::get($skillId);
if (! $skillMeta){
$this->_rspErr(1,'skill_id parameter error');
return ;
}
SqlHelper::upsert
($this->_getSelfMysql(),
't_hero_preset',
array(
'account_id' => $this->_getAccountId(),
'hero_uid' => $heroId,
),
array(
'skill_id' => $skillId,
'weapon_uid1' => $weaponUid1,
'weapon_uid2' => $weaponUid2,
'chip_page' => $chipPageId,
'modifytime' => $this->_getNowTime(),
),
array(
'account_id' => $this->_getAccountId(),
'hero_uid' => $heroId,
'skill_id' => $skillId,
'weapon_uid1' => $weaponUid1,
'weapon_uid2' => $weaponUid2,
'chip_page' => $chipPageId,
'createtime' => $this->_getNowTime(),
'modifytime' => $this->_getNowTime(),
)
);
$this->_rspOk();
}
public function upgradeSkillCommon(){
$heroUniId = getReqVal('hero_uniid', 0);
$skillIndex = getReqVal('skill_index', 0);
@ -148,42 +463,6 @@ class HeroController extends BaseAuthedController {
));
}
public function skinList()
{
$skinList = array();
SqlHelper::ormSelect(
$this->_getSelfMysql(),
't_hero_skin',
array(
'account_id' => $this->_getAccountId()
),
function ($row) use(&$skinList) {
array_push($skinList, HeroSkin::toDto($row));
}
);
$this->_rspData(array(
'skin_list' => $skinList
));
}
public function takeonSkin()
{
$heroUniId = getReqVal('hero_uniid', 0);
$skinId = getReqVal('skin_id', 0);
$heroDb = Hero::find($heroUniId);
$heroSkinDb = HeroSkin::find($skinId);
if (!$heroDb) {
$this->_rspErr(1, "You don't have the hero yet");
return;
}
if (!$heroSkinDb) {
$this->_rspErr(2, "You don't have the skin yet");
return;
}
Hero::takeonSkin($heroUniId, $skinId);
$this->_rspOk();
}
public function getUpgradeLevelList()
{
$infos = array();
@ -228,9 +507,9 @@ class HeroController extends BaseAuthedController {
// $this->_rspData(array(
// 'infos' => $infos
// ));
$list = NftUpReceive::all(myself()->_getAccountId(),1);
$infos = array();
foreach ($list as $value){
$list = NftUpReceive::all(myself()->_getAccountId(),1);
$infos = array();
foreach ($list as $value){
if ($this->_getNowTime() - $value['createtime'] < 24*3600 && !$value['from_data'] || $value['from_data'] ){
$hero = Hero::findByTokenId2($value['token_id1']);
$costHero = Hero::findByTokenId2($value['token_id2']);
@ -254,7 +533,7 @@ class HeroController extends BaseAuthedController {
);
array_push($infos,$info);
}
}
}
$this->_rspData(array(
'infos' => $infos
));
@ -279,40 +558,40 @@ class HeroController extends BaseAuthedController {
$oldHero = $heroDto;
$newHero = $heroDto;
switch ($type) {
case 1:
{
$idx = 0;
$found = false;
for ($i = 0; $i < kMaxHeroUpLevelNum; ++$i) {
$upHeroUniId = $this->_getV(TN_HERO_LEVEL_UP, $i);
if ($upHeroUniId == $heroUniId) {
$idx = $i;
$found = true;
break;
}
}
case 1:
{
$idx = 0;
$found = false;
for ($i = 0; $i < kMaxHeroUpLevelNum; ++$i) {
$upHeroUniId = $this->_getV(TN_HERO_LEVEL_UP, $i);
if ($upHeroUniId == $heroUniId) {
$idx = $i;
$found = true;
break;
}
}
if (!$found) {
$this->_rspErr(1, 'hero does not exist2');
return;
}
$this->_setV(TN_HERO_LEVEL_UP, $idx, 0);
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addHeroChg();
$propertyChgService->addBagChg();
$propertyChgService->addUserChg();
$nextLevelMeta = null;
$nextLevelMeta = mt\HeroLevelAttr::getByLevel($heroDb['hero_lv'] + 1);
if ($nextLevelMeta) {
$attrs = mt\HeroLevelAttr::addRandAttrNew($heroDb,1);
$where = array(
'hero_lv' => $heroDb['hero_lv'] + 1,
'rand_attr' => json_encode($attrs),
'lock_type' => 0,
'unlock_time' => 0,
'skill_points' => $heroDb['skill_points']+$nextLevelMeta['skill_point']
);
//免费英雄到底15级后生成NFT
if (!$found) {
$this->_rspErr(1, 'hero does not exist2');
return;
}
$this->_setV(TN_HERO_LEVEL_UP, $idx, 0);
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addHeroChg();
$propertyChgService->addBagChg();
$propertyChgService->addUserChg();
$nextLevelMeta = null;
$nextLevelMeta = mt\HeroLevelAttr::getByLevel($heroDb['hero_lv'] + 1);
if ($nextLevelMeta) {
$attrs = mt\HeroLevelAttr::addRandAttrNew($heroDb,1);
$where = array(
'hero_lv' => $heroDb['hero_lv'] + 1,
'rand_attr' => json_encode($attrs),
'lock_type' => 0,
'unlock_time' => 0,
'skill_points' => $heroDb['skill_points']+$nextLevelMeta['skill_point']
);
//免费英雄到底15级后生成NFT
// if ($heroDb['hero_lv'] + 1 == 15 && !$heroDb['token_id']){
// $token_id = myself()->_getNowTime();
// if(!\services\NftService::addNft($heroDb['hero_id'],$token_id)){
@ -327,181 +606,181 @@ class HeroController extends BaseAuthedController {
// 'skill_points' => $heroDb['skill_points']+$nextLevelMeta['skill_point']
// );
// }
Hero::update($heroUniId, $where);
if ($heroDb['hero_lv'] + 1 > myself()->_getV(TN_HERO_MAX_LEVEL, 0)) {
myself()->_setV(TN_HERO_MAX_LEVEL, 0, $heroDb['hero_lv'] + 1);
Hero::update($heroUniId, $where);
if ($heroDb['hero_lv'] + 1 > myself()->_getV(TN_HERO_MAX_LEVEL, 0)) {
myself()->_setV(TN_HERO_MAX_LEVEL, 0, $heroDb['hero_lv'] + 1);
}
$newHeroDb = Hero::find($heroUniId);
$newHero = Hero::toDto($newHeroDb);
}
$newHeroDb = Hero::find($heroUniId);
$newHero = Hero::toDto($newHeroDb);
{
//埋点
$event = [
'name' => LogService::HERO_LEVEL_UP,
];
$oldHero['level'] = $oldHero['hero_lv'];
$oldHero['item_id'] = $oldHero['hero_id'];
$newHero['level'] = $newHero['hero_lv'];
$newHero['item_id'] = $newHero['hero_id'];
LogService::LevelUpOrQualityUp($event,$oldHero,$newHero);
}
$this->_rspData(array(
'property_chg' => $propertyChgService->toDto(),
'old_hero' => $oldHero,
'new_hero' => $newHero,
));
}
{
//埋点
$event = [
'name' => LogService::HERO_LEVEL_UP,
];
$oldHero['level'] = $oldHero['hero_lv'];
$oldHero['item_id'] = $oldHero['hero_id'];
$newHero['level'] = $newHero['hero_lv'];
$newHero['item_id'] = $newHero['hero_id'];
LogService::LevelUpOrQualityUp($event,$oldHero,$newHero);
}
$this->_rspData(array(
'property_chg' => $propertyChgService->toDto(),
'old_hero' => $oldHero,
'new_hero' => $newHero,
));
}
break;
case 2:
{
$this->_rspOk();return;
$idx = 0;
$found = false;
for ($i = 0; $i < kMaxHeroUpQualityNum; ++$i) {
$upHeroUniId = $this->_getV(TN_HERO_QUALITY_UP, $i);
if ($upHeroUniId == $heroUniId) {
$idx = $i;
$found = true;
break;
}
}
if (!$found) {
$this->_rspErr(1, 'hero does not exist');
return;
}
$costHeroUniId = $this->_getV(TN_HERO_QUALITY_UP, (int)$idx + 1000);
$this->_setV(TN_HERO_QUALITY_UP, $idx, 0);
$this->_setV(TN_HERO_QUALITY_UP, (int)$idx + 1000, 0);
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addHeroChg();
$propertyChgService->addBagChg();
$propertyChgService->addUserChg();
$nextQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality'] + 1);
if ($nextQualityMeta) {
$costHeroDb = Hero::find($costHeroUniId);
if ($costHeroDb['token_id']){
break;
case 2:
{
$this->_rspOk();return;
$idx = 0;
$found = false;
for ($i = 0; $i < kMaxHeroUpQualityNum; ++$i) {
$upHeroUniId = $this->_getV(TN_HERO_QUALITY_UP, $i);
if ($upHeroUniId == $heroUniId) {
$idx = $i;
$found = true;
break;
}
}
if (!$found) {
$this->_rspErr(1, 'hero does not exist');
return;
}
$costHeroUniId = $this->_getV(TN_HERO_QUALITY_UP, (int)$idx + 1000);
$this->_setV(TN_HERO_QUALITY_UP, $idx, 0);
$this->_setV(TN_HERO_QUALITY_UP, (int)$idx + 1000, 0);
$propertyChgService = new services\PropertyChgService();
$propertyChgService->addHeroChg();
$propertyChgService->addBagChg();
$propertyChgService->addUserChg();
$nextQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality'] + 1);
if ($nextQualityMeta) {
$costHeroDb = Hero::find($costHeroUniId);
if ($costHeroDb['token_id']){
// SqlHelper::update(
// myself()->_getMarketMysql(),
// 't_nft',
// ['token_id'=>$costHeroDb['token_id']],
// ['deleted'=>1]
// );
}else{
}else{
Hero::update($costHeroUniId,
array(
'account_id' => myself()->_getAccountId() . '!!!',
)
);
}
Hero::update($costHeroUniId,
array(
'account_id' => myself()->_getAccountId() . '!!!',
'lock_type' => 0,
'unlock_time' => 0,
)
);
}
Hero::update($costHeroUniId,
array(
'lock_type' => 0,
'unlock_time' => 0,
)
);
{
//埋点
$event = [
'name' => LogService::HERO_QUALITY_UP_MATERIAL,
];
$params = array(
array(
'unique_id'=>$costHeroDb['idx'],
'token_id'=>$costHeroDb['token_id'],
)
);
LogService::ConsumableMaterial($event,$params);
}
$rnd = rand(1, 100);
$probability = \services\FormulaService::Hero_Advanced_Probability($heroDb['quality'] + 1)*100;
if ($rnd > $probability) {
Hero::update($heroUniId,
array(
'advanced_count' => $heroDb['advanced_count'] + 1,
'lock_type' => 0,
'unlock_time' => 0,
)
);
$oldHero['advanced_count'] += 1;
$newHero['advanced_count'] += 1;
{
//埋点
$event = [
'name' => LogService::HERO_QUALITY_UP,
'name' => LogService::HERO_QUALITY_UP_MATERIAL,
];
$oldHero['level'] = $oldHero['hero_lv'];
$oldHero['item_id'] = $oldHero['hero_id'];
$newHero['level'] = $newHero['hero_lv'];
$newHero['item_id'] = $newHero['hero_id'];
LogService::LevelUpOrQualityUp($event,$oldHero,$newHero);
$params = array(
array(
'unique_id'=>$costHeroDb['idx'],
'token_id'=>$costHeroDb['token_id'],
)
);
LogService::ConsumableMaterial($event,$params);
}
$this->_rspRawData(array(
'errcode' => 0,
'errmsg' => '',
'state' => 0,
'old_hero' => $oldHero,
'new_hero' => $newHero,
//'errmsg' => 'advance failed',
'property_chg' => $propertyChgService->toDto(),
));
$rnd = rand(1, 100);
$probability = \services\FormulaService::Hero_Advanced_Probability($heroDb['quality'] + 1)*100;
if ($rnd > $probability) {
Hero::update($heroUniId,
array(
'advanced_count' => $heroDb['advanced_count'] + 1,
'lock_type' => 0,
'unlock_time' => 0,
)
);
$oldHero['advanced_count'] += 1;
$newHero['advanced_count'] += 1;
{
//埋点
$event = [
'name' => LogService::HERO_QUALITY_UP,
];
$oldHero['level'] = $oldHero['hero_lv'];
$oldHero['item_id'] = $oldHero['hero_id'];
$newHero['level'] = $newHero['hero_lv'];
$newHero['item_id'] = $newHero['hero_id'];
LogService::LevelUpOrQualityUp($event,$oldHero,$newHero);
}
$this->_rspRawData(array(
'errcode' => 0,
'errmsg' => '',
'state' => 0,
'old_hero' => $oldHero,
'new_hero' => $newHero,
//'errmsg' => 'advance failed',
'property_chg' => $propertyChgService->toDto(),
));
return;
}
$heroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($heroDb['quality']);
$nextHeroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($heroDb['quality'] + 1);
$heroTili = \services\FormulaService::Hero_NFT_Maximum_Physical_Strength($heroDb['quality'],$heroLucky);
$nextHeroTili = \services\FormulaService::Hero_NFT_Maximum_Physical_Strength($heroDb['quality'] + 1,$nextHeroLucky);
Hero::update($heroUniId,
array(
'hero_tili' => $heroDb['hero_tili']+($nextHeroTili-$heroTili),
'skill_points' => $heroDb['skill_points'] + $nextQualityMeta['skill_point'],
'quality' => $heroDb['quality'] + 1,
'advanced_count' => $heroDb['advanced_count'] + 1,
'lock_type' => 0,
'unlock_time' => 0,
'labour' => 0,
)
);
if ($heroDb['quality'] + 1 > myself()->_getV(TN_HERO_MAX_QUALITY, 0)) {
myself()->_setV(TN_HERO_MAX_QUALITY, 0, $heroDb['quality'] + 1);
}
$newHeroDb = Hero::find($heroUniId);
$newHero = Hero::toDto($newHeroDb);
error_log(json_encode(array(
'costHeroUniId' => $costHeroUniId,
'heroUniId' => $heroUniId
)));
$rankActivityService = new services\RankActivityService();
$rankActivityService->heroUpgradeQuality($heroDb['quality'] + 1);
}
if (!$nextQualityMeta) {
$this->_rspErr(1, 'quality is full');
return;
}
$heroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($heroDb['quality']);
$nextHeroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($heroDb['quality'] + 1);
$heroTili = \services\FormulaService::Hero_NFT_Maximum_Physical_Strength($heroDb['quality'],$heroLucky);
$nextHeroTili = \services\FormulaService::Hero_NFT_Maximum_Physical_Strength($heroDb['quality'] + 1,$nextHeroLucky);
Hero::update($heroUniId,
array(
'hero_tili' => $heroDb['hero_tili']+($nextHeroTili-$heroTili),
'skill_points' => $heroDb['skill_points'] + $nextQualityMeta['skill_point'],
'quality' => $heroDb['quality'] + 1,
'advanced_count' => $heroDb['advanced_count'] + 1,
'lock_type' => 0,
'unlock_time' => 0,
'labour' => 0,
)
);
if ($heroDb['quality'] + 1 > myself()->_getV(TN_HERO_MAX_QUALITY, 0)) {
myself()->_setV(TN_HERO_MAX_QUALITY, 0, $heroDb['quality'] + 1);
{
//埋点
$event = [
'name' => LogService::HERO_QUALITY_UP,
];
$oldHero['level'] = $oldHero['hero_lv'];
$oldHero['item_id'] = $oldHero['hero_id'];
$newHero['level'] = $newHero['hero_lv'];
$newHero['item_id'] = $newHero['hero_id'];
LogService::LevelUpOrQualityUp($event,$oldHero,$newHero);
}
$newHeroDb = Hero::find($heroUniId);
$newHero = Hero::toDto($newHeroDb);
error_log(json_encode(array(
'costHeroUniId' => $costHeroUniId,
'heroUniId' => $heroUniId
)));
$rankActivityService = new services\RankActivityService();
$rankActivityService->heroUpgradeQuality($heroDb['quality'] + 1);
$this->_rspData(array(
'state' => 1,
'property_chg' => $propertyChgService->toDto(),
'old_hero' => $oldHero,
'new_hero' => $newHero,
));
}
if (!$nextQualityMeta) {
$this->_rspErr(1, 'quality is full');
return;
}
{
//埋点
$event = [
'name' => LogService::HERO_QUALITY_UP,
];
$oldHero['level'] = $oldHero['hero_lv'];
$oldHero['item_id'] = $oldHero['hero_id'];
$newHero['level'] = $newHero['hero_lv'];
$newHero['item_id'] = $newHero['hero_id'];
LogService::LevelUpOrQualityUp($event,$oldHero,$newHero);
}
$this->_rspData(array(
'state' => 1,
'property_chg' => $propertyChgService->toDto(),
'old_hero' => $oldHero,
'new_hero' => $newHero,
));
}
break;
default:
{
$this->_rspErr(1, 'type parameter error');
return;
}
break;
break;
default:
{
$this->_rspErr(1, 'type parameter error');
return;
}
break;
}
}
@ -616,39 +895,6 @@ class HeroController extends BaseAuthedController {
));
}
public function upgradeLevelPreview(){
$heroUniId = getReqVal('hero_uniid', 0);
$heroDb = Hero::find($heroUniId);
if (!$heroDb) {
$this->_rspErr(1, 'hero does not exist');
return;
}
$heroMeta = mt\Hero::get($heroDb['hero_id']);
if (!$heroMeta) {
$this->_rspErr(100, 'server internal error');
return;
}
$nextLevelMeta = mt\HeroLevelAttr::getByLevel($heroDb['hero_lv'] + 1);
if (!$nextLevelMeta) {
$this->_rspErr(5, "It's already the highest level");
return;
}
$newHeroDb = $heroDb;
$newHeroDb['hero_lv'] += 1;
$attrs = mt\HeroLevelAttr::addRandAttrNew($heroDb,0);
$newHeroDb['rand_attr'] = json_encode($attrs);
$cost['CEG'] = \services\FormulaService::Hero_Upgrade_CEG_Expend($newHeroDb['hero_lv']);
$cost['CEC'] = \services\FormulaService::Hero_Upgrade_CEC_Expend($newHeroDb['hero_lv']);
$heroDto = Hero::toDto($heroDb);
$newHeroDto = Hero::toDto($newHeroDb);
$this->_rspData(array(
'old_hero' => $heroDto,
'new_hero' => $newHeroDto,
'cost' => $cost
));
}
public function upgradeQualityOld()
{
$costHeroUniId = getReqVal('cost_hero_uniid', 0);
@ -758,16 +1004,16 @@ class HeroController extends BaseAuthedController {
$this->_decItems($costItems);
Hero::update($heroUniId,
array(
'lock_type' => Hero::QUALITY_LOCK,
'unlock_time' => $this->_getNowTime() + $nextQualityMeta['time'],
)
array(
'lock_type' => Hero::QUALITY_LOCK,
'unlock_time' => $this->_getNowTime() + $nextQualityMeta['time'],
)
);
Hero::update($costHeroUniId,
array(
'lock_type' => Hero::COST_LOCK,
'unlock_time' => $this->_getNowTime() + $nextQualityMeta['time'],
)
array(
'lock_type' => Hero::COST_LOCK,
'unlock_time' => $this->_getNowTime() + $nextQualityMeta['time'],
)
);
$this->_setV(TN_HERO_QUALITY_UP, (int)$slotId, (int)$heroDb['idx']);
$this->_setV(TN_HERO_QUALITY_UP, (int)$slotId + 1000, (int)$costHeroDb['idx']);

View File

@ -0,0 +1,114 @@
<?php
require_once('mt/Skill.php');
require_once('mt/Hero.php');
require_once('models/Hero.php');
use models\Hero;
use phpcommon\SqlHelper;
class HeroSkillController extends BaseAuthedController
{
public function getSkillList(){
$skillList = \mt\Skill::getPresetSkill();
$list = array();
foreach ($skillList as $skill){
$list[] = $skill['skill_id'];
}
$this->_rspData(array(
'data' => $list,
));
}
public function presetHero(){
$skillId = getReqVal('skill_id',0);
$skillMeta = \mt\Skill::get($skillId);
if (! $skillMeta){
$this->_rspErr(1,'skill_id parameter error');
return ;
}
$heroList = array();
Hero::getHeroList(function ($row) use(&$heroList) {
array_push($heroList, $row);
});
$list = array_unique(array_column($heroList,'hero_id'));
$data = array();
if (count($list) > 0){
foreach ($list as $value){
$data[$value] = array(
'item_id' => $value,
'state' => 0
);
}
}
$rows = SqlHelper::ormSelect(
$this->_getSelfMysql(),
't_hero_skill',
array(
'account_id' => $this->_getAccountId(),
'skill_id' => $skillId,
)
);
if ($rows){
foreach ($rows as $row){
$heroDb = Hero::find($row['hero_uid']);
$data[$heroDb['hero_id']]['state'] = 1;
}
}
$this->_rspData(array(
'data' => $data,
));
}
public function applyHero(){
$skillId = getReqVal('skill_id',0);
$heroIds = getReqVal('hero_ids','');
$heroIdArr = explode('|',$heroIds);
if (!$skillId || count($heroIdArr)<0){
$this->_rspErr(1,' parameter error');
return ;
}
$skillMeta = \mt\Skill::get($skillId);
if (! $skillMeta){
$this->_rspErr(1,'skill_id parameter error');
return ;
}
foreach ($heroIdArr as $heroId){
$heroMeta = \mt\Hero::get($heroId);
if (! $heroMeta){
$this->_rspErr(1,'hero_id parameter error');
return ;
}
}
foreach ($heroIdArr as $heroId){
$heroList = Hero::getHeroByItemId($heroId);
if ($heroList){
foreach ($heroList as $hero){
SqlHelper::upsert
($this->_getSelfMysql(),
't_hero_skill',
array(
'account_id' => $this->_getAccountId(),
'hero_uid' => $hero['idx'],
),
array(
'skill_id' => $skillId,
'modifytime' => $this->_getNowTime(),
),
array(
'account_id' => $this->_getAccountId(),
'hero_uid' => $hero['idx'],
'skill_id' => $skillId,
'createtime' => $this->_getNowTime(),
'modifytime' => $this->_getNowTime(),
)
);
}
}
}
$this->_rspOk();
}
}

View File

@ -22,6 +22,7 @@ require_once('services/ActivateNftService.php');
require_once('phpcommon/bchelper.php');
// use phpcommon as phpcommon;
use phpcommon\SqlHelper;
use models\BoxOrder;
use models\Nft;
@ -571,8 +572,12 @@ class MarketController extends BaseController {
switch ($type) {
case Nft::HERO_TYPE: {
$rows = Nft::getNftListByType($account, $type);
$rows = array_merge($rows, $this->listMySelledNfts($account, $type));
foreach ($rows as &$row) {
$nftDb = Nft::findNftByOwner($account, $row['token_id']);
if (empty($nftDb)) {
$nftDb = Nft::getNft($row['token_id']);
}
$row['info'] = Nft::toDto($nftDb);
$row['detail'] = Hero::toDtoInfo(Hero::findByTokenId2($row['token_id']));
if (in_array($row['info']['info']['job'], $job)==false) continue;
@ -601,8 +606,12 @@ class MarketController extends BaseController {
break;
case Nft::EQUIP_TYPE: {
$rows = Nft::getNftListByType($account, $type);
$rows = array_merge($rows, $this->listMySelledNfts($account, $type));
foreach ($rows as &$row) {
$nftDb = Nft::findNftByOwner($account, $row['token_id']);
if (empty($nftDb)) {
$nftDb = Nft::getNft($row['token_id']);
}
$row['info'] = Nft::toDto($nftDb);
$row['detail'] = Gun::toDtoInfo(Gun::findByTokenId2($row['token_id']));
if ($row['detail']['gun_lv']<$lv) continue;
@ -630,6 +639,7 @@ class MarketController extends BaseController {
break;
case Nft::CHIP_TYPE: {
$rows = Nft::getNft1155List($account, $type);
$rows = array_merge($rows, $this->listMySelledNfts($account, $type));
foreach ($rows as &$row) {
$row['detail'] = Chip::toDto(Chip::getChipByTokenId($row['token_id']));
if (!in_array($row['detail']['chip_type'], $job))
@ -653,8 +663,12 @@ class MarketController extends BaseController {
break;
case Nft::FRAGMENT_TYPE: {
$rows = Nft::getNft1155List($account, $type);
$rows = array_merge($rows, $this->listMySelledNfts($account, $type));
foreach ($rows as &$row) {
$nftDb = Nft::findNftByOwner($account, $row['token_id']);
if (empty($nftDb)) {
$nftDb = Nft::getNft($row['token_id']);
}
$row['detail'] = $this->getNftGameData($nftDb);
if (!in_array($row['detail']['type'], $job))
continue;
@ -676,7 +690,7 @@ class MarketController extends BaseController {
public function listSellNfts()
{
$account = getReqVal('account', '');
$account = strtolower(getReqVal('account', ''));
$token = getReqVal('token', '');
$start = getReqVal('start', 0);
$page_size = getReqVal('page_size', 10);
@ -770,7 +784,7 @@ class MarketController extends BaseController {
$counts = $conn->execQuery(
'SELECT count(*) as count FROM t_market_store '.
'WHERE token_type=:token_type '.
'WHERE token_type=:token_type AND status=0 '.
$job_filter_fn($job_filter_array).
$lv_filter_fn($lv_filter).
$quality_filter_fn($quality_filter).
@ -794,7 +808,7 @@ class MarketController extends BaseController {
$rows = $conn->execQuery(
'SELECT * FROM t_market_store '.
'WHERE token_type=:token_type '.
'WHERE token_type=:token_type AND status=0 '.
$job_filter_fn($job_filter_array).
$lv_filter_fn($lv_filter).
$quality_filter_fn($quality_filter).
@ -812,10 +826,17 @@ class MarketController extends BaseController {
for ($x = $start; $x < $page_end; $x++) {
$row = $rows[$x%$page_size];
$nftDb = Nft::findNftByOwner($row['owner_address'], $row['token_id']);
$nftDb = Nft::getNft($row['token_id']);
if (!$nftDb) {
myself()->_rspErr(1, 'nft not exists');
return;
$nftDb = Nft::findNftByOwner($account, $row['token_id']);
// 0x768b5faed6dc69816f33377d214ffaf00dcdd0cf
if (!$nftDb) {
$nftDb = Nft::findNftByOwner('0xfc628dd79137395f3c9744e33b1c5de554d94882', $row['token_id']);
if (!$nftDb) {
myself()->_rspErr(1, 'nft not exists');
return;
}
}
}
$nft = Nft::toDto($nftDb);
$row['info'] = $nft;
@ -867,6 +888,7 @@ class MarketController extends BaseController {
$nfts = array();
for ($x = $start; $x < $page_end; $x++) {
$row = $rows[$x];
// $this->attach_market_selling($row);
array_push($nfts, $row);
}
@ -884,6 +906,7 @@ class MarketController extends BaseController {
$token = getReqVal('token', '');
$nft_token = getReqVal('nft_token', '');
$s_price = getReqVal('s_price', '');
$amount = getReqVal('amount', 1);
$payment_token_address = getReqVal('payment_token_address', '');
$nonce = getReqVal('nonce', '');
$signature = getReqVal('signature', '');
@ -901,6 +924,7 @@ class MarketController extends BaseController {
'token_id' => $nft_token,
'owner_address' => $nftDetail['owner_address'],
'token_type' => $nftDetail['type'],
'amount' => $amount,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
's_price' => $s_price,
@ -934,6 +958,317 @@ class MarketController extends BaseController {
$this->_rspOk();
}
public function getSupportedCurrencyTypes() {
$types = array();
if (SERVER_ENV == _ONLINE) {
array_push($types, array(
'name' => 'USDT',
'address' => '0xc22Ffa318051d8aF4E5f2E2732d7049486fcE093',
));
} else {
array_push($types, array(
'name' => 'USDT',
'address' => '0xc22Ffa318051d8aF4E5f2E2732d7049486fcE093',
));
}
$this->_rspData(array(
'list' => $types,
));
}
public function getTransactionRecord() {
$account = strtolower(getReqVal('account', ''));
$type = getReqVal('type', 0);
$start = getReqVal('start', 0);
$page_size = getReqVal('page_size', 10);
$conn = myself()->_getMysql('');
$type_filter_fn = function ($f) {
if ($f==0) {
return '';
}
else {
return 'AND type=' . $f;
}
};
$counts = $conn->execQuery(
'SELECT count(*) as count FROM t_market_transaction_record '.
'WHERE (seller=:account OR buyer=:account) '.
$type_filter_fn($type).
' ORDER BY createtime DESC',
array(
':account' => $account,
)
);
$total = $counts[0]['count'];
$page_end = $start + $page_size;
if ($page_end > $total) {
$page_end = $total;
$start = $total-1;
$start = intval($start / $page_size) * $page_size;
if ($start<0) $start = 0;
}
$rows = $conn->execQuery(
'SELECT * FROM t_market_transaction_record '.
'WHERE (seller=:account OR buyer=:account) '.
$type_filter_fn($type).
' ORDER BY createtime DESC '.
'LIMIT '.$start.','.$page_size,
array(
':account' => $account,
)
);
$this->_rspData(array(
"total" => $total,
"start" => $start,
"page_size" => $page_size,
'nfts' => $rows,
));
}
private function addTransactionRecord($record) {
$conn = myself()->_getMysql('');
$r = SqlHelper::insert(
$conn,
't_market_transaction_record',
$record
);
if (!$r) {
$this->_rspErr(2, 'unknown error, orderId='.$record['orderid']);
}
}
public function eventSellOrder() {
$tokenId = getReqVal('tokenId', '');
$owner = strtolower(getReqVal('owner', ''));
$nftToken = getReqVal('nftToken', '');
$amount = getReqVal('amount', 0);
$orderId = getReqVal('orderId', '');
$currency = getReqVal('currency', '');
$price = getReqVal('price', '');
error_log("eventSellOrder:" . json_encode(
array(
'tokenId' => $tokenId,
'owner' => $owner,
'nftToken' => $nftToken,
'amount' => $amount,
'orderId' => $orderId,
'currency' => $currency,
'price' => $price,
),
JSON_PRETTY_PRINT
)
);
$conn = myself()->_getMysql('');
// 1. check order status
$chk = SqlHelper::selectOne($conn, 't_market_store', array('status'), array('o_link' => $orderId));
if (!empty($chk)) {
$this->_rspErr(1, 'repeat sell order, orderId='.$orderId);
return;
}
// 2. insert sell order to t_market_store
$nftDb = Nft::findNftByOwner($owner, $tokenId);
if (empty($nftDb)) {
$nftDb = Nft::getNft($tokenId);
}
$nftDetail = Nft::toDto($nftDb);
$detail = $this->getNftGameData($nftDb);
$r = SqlHelper::insert(
$conn,
't_market_store',
array(
'token_id' => $tokenId,
'o_link' => $orderId,
'nft_token' => $nftToken,
'status' => 0,
'owner_address' => $owner,
'token_type' => $nftDetail['type'],
'amount' => $amount,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
's_currency' => $currency,
's_price' => $price,
'c_name' => $nftDetail['info']['name'],
'c_job' => isset($nftDetail['info']['job']) ? $nftDetail['info']['job']
: (isset($detail['chip_type']) ? $detail['chip_type']
: (isset($detail['type'])?$detail['type']
:0)),
'c_lv' => @$detail['gun_lv'] | @$detail['hero_lv'] | @$detail['chip_grade'],
'c_quality' => isset($nftDetail['info']['quality']) ? $nftDetail['info']['quality'] : 0,
'c_durability' => isset($nftDetail['info']['durability']) ? $nftDetail['info']['durability'] : (isset($detail['hero_tili']) ? $detail['hero_tili'] : 0),
'c_type' => isset($detail['type']) ? $detail['type'] : 0,
'c_id' => $nftDetail['item_id'],
)
);
if (!$r) {
$this->_rspErr(2, 'unknown error, orderId='.$orderId);
}
$this->_rspOk();
}
public function eventBuyOrder() {
$tokenId = getReqVal('tokenId', '');
$orderId = getReqVal('orderId', '');
$nftToken = getReqVal('nftToken', '');
$amount = getReqVal('amount', 0);
$seller = strtolower(getReqVal('seller', ''));
$buyer = strtolower(getReqVal('buyer', ''));
$erc20 = getReqVal('erc20', '');
$price = getReqVal('price', '');
error_log("eventBuyOrder:" . json_encode(
array(
'tokenId' => $tokenId,
'orderId' => $orderId,
'nftToken' => $nftToken,
'amount' => $amount,
'seller' => $seller,
'buyer' => $buyer,
'erc20' => $erc20,
'price' => $price,
),
JSON_PRETTY_PRINT
)
);
$conn = myself()->_getMysql('');
// 1. check order status
$chk = SqlHelper::selectOne($conn, 't_market_store', array('status','idx', 'c_name', 'token_type'), array('o_link' => $orderId));
if (empty($chk)) {
$this->_rspErr(1, 'not found order, orderId='.$orderId);
return;
}
if ($chk['status']== '0') {
$r = SqlHelper::update(
$conn,
't_market_store',
array(
'o_link' => $orderId,
),
array(
'status' => 2,
)
);
if ($r) {
// 增加交易记录
$record = array(
'createtime' => myself()->_getNowTime(),
'orderid' => $chk['idx'],
'o_link' => $orderId,
'seller' => $seller,
'buyer' => $buyer,
'tokenid' => $tokenId,
'amount' => $amount,
'name' => $chk['c_name'],
'type' => $chk['token_type'],
);
$this->addTransactionRecord($record);
$this->_rspOk();
return;
}
}
$this->_rspErr(1, 'order status error, order='.$orderId);
}
public function eventCancelOrder() {
$orderId = getReqVal('orderId', '');
$nftToken = getReqVal('nftToken', '');
$tokenId = getReqVal('tokenId', '');
error_log("eventCancelOrder:" . json_encode(
array(
'orderId' => $orderId,
'nftToken' => $nftToken,
'tokenId' => $tokenId,
),
JSON_PRETTY_PRINT
)
);
$conn = myself()->_getMysql('');
// 1. check order status
$chk = SqlHelper::selectOne($conn, 't_market_store', array('status'), array('o_link' => $orderId));
if (empty($chk)) {
$this->_rspErr(1, 'not found order, orderId='.$orderId);
return;
}
if ($chk['status']== '0') {
$r = SqlHelper::update(
$conn,
't_market_store',
array(
'o_link' => $orderId,
),
array(
'status' => 1,
)
);
if ($r) {
$this->_rspOk();
return;
}
}
$this->_rspErr(1, 'order status error, order='.$orderId);
}
public function eventPriceUpdateOrder() {
$orderId = getReqVal('orderId', '');;
$nftToken = getReqVal('nftToken', '');
$tokenId = getReqVal('tokenId', '');
$priceOld = getReqVal('priceOld', '');
$price = getReqVal('price', '');
error_log("eventPriceUpdateOrder:" . json_encode(
array(
'orderId' => $orderId,
'nftToken' => $nftToken,
'tokenId' => $tokenId,
'priceOld' => $priceOld,
'price' => $price,
),
JSON_PRETTY_PRINT
)
);
$conn = myself()->_getMysql('');
// 1. check order status
$chk = SqlHelper::selectOne($conn, 't_market_store', array('status'), array('o_link' => $orderId));
if (empty($chk)) {
$this->_rspErr(1, 'not found order, orderId='.$orderId);
return;
}
if ($chk['status']== '0') {
$r = SqlHelper::update(
$conn,
't_market_store',
array(
'o_link' => $orderId,
),
array(
's_price' => $price,
)
);
if ($r) {
$this->_rspOk();
return;
}
}
$this->_rspErr(1, 'price update failed, orderId='.$orderId);
}
private function getNftGameData($nftRowInfo) {
$t = $nftRowInfo['token_type'];
@ -957,7 +1292,6 @@ class MarketController extends BaseController {
return array('unknown' => 'unknown game data type, cannot find data');
}
private function appendChipsInfo($detail) {
$detail['chips_info'] = array();
if (!empty($detail['chip_ids'])) {
@ -972,4 +1306,44 @@ class MarketController extends BaseController {
}
return $detail;
}
private function attach_market_selling(&$row) {
$conn = myself()->_getMysql('');
$rows = $conn->execQuery(
'SELECT * FROM t_market_store '.
'WHERE token_id=:token_id AND owner_address=:owner_address AND status=:status',
array(
':token_id' => $row['token_id'],
':owner_address' => $row['owner_address'],
':status' => 0,
)
);
$count = 0;
$link_array = array();
foreach ($rows as $r) {
$count += $r['amount'];
array_push($link_array, $r['o_link']);
}
$row['o_link'] = implode('|', $link_array);
$row['selling'] = $count;
}
private function listMySelledNfts($account, $type)
{
$conn = myself()->_getMysql('');
$rows = $conn->execQuery(
'SELECT * FROM t_market_store '.
'WHERE owner_address=:account AND token_type=:token_type AND status=0 ',
array(
':account' => $account,
':token_type' => $type,
)
);
return $rows;
}
}

View File

@ -125,24 +125,24 @@ class UserController extends BaseAuthedController {
}
private function _addFreeItem(){
// foreach (mt\Parameter::getListValue('creator_hero_id') as $heroId) {
// $heroMeta = mt\Item::get($heroId);
// if ($heroMeta) {
// Hero::addHero($heroMeta);
// User::upsertHeadList($heroMeta);
// }
// }
// $addItems =array();
// foreach (mt\Parameter::getListValue('creator_present_items') as $itemsStr) {
// list($itemId, $itemNum) = explode(':', $itemsStr);
// if ($itemNum > 0) {
// array_push($addItems,
// array(
// 'item_id' => $itemId,
// 'item_num' => $itemNum
// ));
// }
// }
foreach (mt\Parameter::getListValue('creator_hero_id') as $heroId) {
$heroMeta = mt\Item::get($heroId);
if ($heroMeta) {
Hero::addHero($heroMeta);
User::upsertHeadList($heroMeta);
}
}
$addItems =array();
foreach (mt\Parameter::getListValue('creator_present_items') as $itemsStr) {
list($itemId, $itemNum) = explode(':', $itemsStr);
if ($itemNum > 0) {
array_push($addItems,
array(
'item_id' => $itemId,
'item_num' => $itemNum
));
}
}
$items = array(
array(
'item_id' => V_ITEM_GOLD,
@ -486,6 +486,36 @@ class UserController extends BaseAuthedController {
'valid_func' => function ($val, &$errCode, &$errMsg) {
return true;
}
),
'parachute' => array(
'field_name' => 'parachute',
'val_func' => function ($val) {
return $val;
},
'valid_func' => function ($val, &$errCode, &$errMsg) {
if (User::isValidParachute($val)) {
return true;
} else {
$errCode = 1;
$errMsg = 'parachute parameter error';
return false;
}
}
),
'ring_id' => array(
'field_name' => 'ring_id',
'val_func' => function ($val) {
return $val;
},
'valid_func' => function ($val, &$errCode, &$errMsg) {
if (User::isValidRing($val)) {
return true;
} else {
$errCode = 1;
$errMsg = 'ring_id parameter error';
return false;
}
}
)
);
$fieldsKv = array();
@ -699,8 +729,8 @@ class UserController extends BaseAuthedController {
if ($heroMeta['normal_gift'] && !in_array($heroMeta['normal_gift'],$headList)){
array_push($headList,$heroMeta['normal_gift']);
}
Hero::addHero($heroMeta);
Gun::addGun($gunMeta);
Hero::addFreeHero($heroMeta);
Gun::addFreeGun($gunMeta);
$fields = array(
'hero_id' => $temp ? $temp[1] : 0,
'head_id' => $temp ? $temp[0] : 0,

View File

@ -11,21 +11,49 @@ require_once('mt/ChipAttr.php');
use mt;
use mt\ChipAttr;
use phpcommon\SqlHelper;
use services\NftService;
use services\FormulaService;
class Chip extends BaseModel
{
public static function all($type)
const GETED_STATE = 0;
const FREE_STATE = 1;
const CHIP_LV_MAX = 3;
public static function find($chipUniId)
{
$chipList = array();
self::getChipList(function ($row) use(&$chipList,$type) {
if ($row['item_num'] > 0 && $row['chip_type'] == $type) {
array_push($chipList, $row);
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_chip',
array(
'idx' => $chipUniId,
)
);
if ($row) {
if ($row['account_id'] != myself()->_getAccountId()) {
if (NftService::getChipBlance(myself()->_getOpenId(), $row['token_id']) <= 0) {
$row = null;
}
}
});
return $chipList;
}
return $row;
}
public static function update2($chipUniId, $fieldsKv){
if (self::find($chipUniId)) {
SqlHelper::update
(myself()->_getSelfMysql(),
't_chip',
array(
'idx' => $chipUniId,
),
$fieldsKv
);
}
}
public static function findByTokenId($tokenId)
@ -48,6 +76,16 @@ class Chip extends BaseModel
public static function getChipList($cb)
{
SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_chip',
array(
'account_id' => myself()->_getAccountId()
),
function ($row) use($cb) {
$cb($row);
}
);
$sql = "select * from t_nft1155 where owner_address=:owner_address and token_id>10000000 and balance>0";
$whereKv =array(
'owner_address' => myself()->_getOpenId(),
@ -60,6 +98,19 @@ class Chip extends BaseModel
'token_id' => $nftDb['token_id'],
)
);
if (!$row) {
$itemMeta = mt\Item::get($nftDb['item_id']);
if ($itemMeta) {
self::addNftChip($itemMeta, $nftDb['token_id']);
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_chip',
array(
'token_id' => $nftDb['token_id'],
)
);
}
}
if ($row){
if (! $row['activate']){
self::activateChip($row);
@ -78,201 +129,135 @@ class Chip extends BaseModel
}
private static function activateChip($row){
if ($row['item_num'] <= 0) {
return;
}
$itemMeta = mt\Item::get($row['item_id']);
if (!$itemMeta) {
return;
}
$randAttr = array();
if (mt\Item::isRoleChipItem($itemMeta)) {
$randAttr = mt\ChipAttr::generateAttrRandom($itemMeta,$row['chip_grade']);
}
if (mt\Item::isGunChipItem($itemMeta)) {
$randAttr = mt\ChipAttr::generateAttrRandom($itemMeta,$row['chip_grade']);
}
if ($row['chip_grade'] >= 5){
$lucky = ltrim(\services\FormulaService::getChipLuckyValue($row['chip_grade']),'-') ;
$fieldsKv = array(
'supper_state'=>1,
'lucky_temporary'=>$lucky,
'chip_type' => $itemMeta['sub_type'],
'rand_attr' => json_encode($randAttr),
'activate' => 1,
'modifytime' => myself()->_getNowTime()
);
}else{
$fieldsKv = array(
'chip_type' => $itemMeta['sub_type'],
'rand_attr' => json_encode($randAttr),
'activate' => 1,
'modifytime' => myself()->_getNowTime()
);
}
$fieldsKv = array(
'item_id' => $itemMeta['id'],
'item_num' => 1,
'state' => self::GETED_STATE,
'rand_attr' => json_encode($randAttr),
'chip_grade' => 1,
'chip_type' => $itemMeta['sub_type'],
'activate' => 1,
'modifytime' => myself()->_getNowTime()
);
self::update($row['token_id'],$fieldsKv);
}
public static function toDto($row)
{
$todayGetGold = $row['today_get_gold'];
$lastGetGoldTime = $row['last_get_gold_time'];
if (myself()->_getDaySeconds($lastGetGoldTime) > myself()->_getNowDaySeconds()) {
$todayGetGold = 0;
// $todayGetGold = $row['today_get_gold'];
// $lastGetGoldTime = $row['last_get_gold_time'];
// if (myself()->_getDaySeconds($lastGetGoldTime) > myself()->_getNowDaySeconds()) {
// $todayGetGold = 0;
// }
$rand_attr = emptyReplace(json_decode($row['rand_attr'], true), array());
$chipMeta = mt\ChipAttr::getAttrByItemId($row['item_id']);
if ($chipMeta){
array_unshift($rand_attr,array(
'attr_id'=>$chipMeta['attr_id'],
'val' => $chipMeta['lv'.$row['chip_grade']]
));
}
$attr_pool = emptyReplace(json_decode($row['rand_attr'], true), array());
$attrs = array();
foreach ($attr_pool as $key=>$val){
if ($val){
$attr = mt\ChipAttr::getAttrById($val['attr_id'],$val['attr_type']);
$newAttr = [
'attr_id' => $attr['attr_id'],
'type' => 2,
'val' => strval($attr['lv'.$row['chip_grade']]*$val['attr_pool_number']),
// 'chip_name' => $attr['chip_name'],
'chip_type' => $attr['chip_type'],
'attr_num' => $attr['lv'.$row['chip_grade']],
'attr_pool_num' => $val['attr_pool_number'],
];
array_push($attrs,$newAttr);
}
}
$row['rand_attr'] = $attrs;
$row['today_get_gold'] = $todayGetGold;
$row['last_get_gold_time'] = $lastGetGoldTime;
$row['chip_name'] = mt\Item::get($row['item_id'])?mt\Item::get($row['item_id'])['name']:'XXX';
// $row['belong_to_item_id'] = self::belongsToWhereOld($row);
$dto = array(
'idx'=> $row['idx'],
'token_id'=> $row['token_id'],
'item_id'=> $row['item_id'],
'chip_grade'=> $row['chip_grade'],
'chip_type'=> $row['chip_type'],
'state'=> $row['state'],
'inlay_state'=> $row['inlay_state'],
'rand_attr'=> $rand_attr,
);
$dto['chip_name'] = mt\Item::get($row['item_id'])?mt\Item::get($row['item_id'])['name']:'XXX';
$nft_address = '';
if ($row['token_id']){
if ($dto['token_id']){
$nft_address = SERVER_ENV == _ONLINE ? '0x73482411443E87CAC124C12A10B34e9Aaa2De168' : '0x26b4AFb60d6C903165150C6F0AA14F8016bE4aec';
}
$row['nft_address'] = $nft_address;
return $row;
$dto['nft_address'] = $nft_address;
$dto['tags'] = '';
return $dto;
}
public static function belongsToWhere($row){
$tokenId = $row['token_id'];
$sql = "select * from t_chip_plugin where chip1=:tokenId or chip2=:tokenId or chip3=:tokenId or chip4=:tokenId limit 1";
$whereKv =array(
'tokenId' => $tokenId
);
$ChipPluginDb = myself()->_getMarketMysql()->execQuery($sql,$whereKv);
if (!$ChipPluginDb){
return 0;
}
switch ($row['chip_type']){
case 1:{
$heroDb = Hero::findByTokenId2($ChipPluginDb['token_id']);
if($heroDb){
return $heroDb['hero_id'];
}else{
return 0;
}
}
break;
case 2:{
$gunDb = Gun::findByTokenId2($ChipPluginDb['token_id']);
if($gunDb){
return $gunDb['gun_id'];
}else{
return 0;
}
}
break;
default:{
return 0;
}
}
}
public static function belongsToWhereOld($row){
switch ($row['chip_type']){
case 1:{
$heroDb = array();
Hero::getHeroList(function ($hero) use ($row,&$heroDb) {
if ($hero['chip_ids'] && strstr($hero['chip_ids']."|",strval($row['idx']."|")) ){
$heroDb = $hero;
}
});
if($heroDb){
return $heroDb['hero_id'];
}else{
return 0;
}
}
break;
case 2:{
$gunDb = array();
Gun::getGunList(function ($gun) use($row,&$gunDb) {
if ($gun['chip_ids'] && strstr($gun['chip_ids']."|",strval($row['idx']."|")) ){
$gunDb = $gun;
}
});
if($gunDb){
return $gunDb['gun_id'];
}else{
return 0;
}
}
break;
default:{
return 0;
}
}
}
public static function addChip($itemId, $tokenId)
public static function addFreeChip($itemMeta)
{
return self::internalAddItem(
myself()->_getSelfMysql(),
$itemMeta,
myself()->_getAccountId(),
null,
self::FREE_STATE);
}
public static function addChip($itemMeta)
{
return self::internalAddItem(
myself()->_getSelfMysql(),
$itemMeta,
myself()->_getAccountId(),
null,
self::GETED_STATE);
}
public static function addNftChip($itemMeta,$tokenId)
{
return self::internalAddItem(
myself()->_getMysql($tokenId),
$itemId,
1,
$itemMeta,
null,
$tokenId);
$tokenId,
self::GETED_STATE);
}
public static function internalAddItem($conn, $itemId, $itemNum, $accountId, $tokenId)
public static function internalAddItem($conn, $itemMeta, $accountId, $tokenId,$state)
{
$grade = rand(1,4);//随机一个等级
if (myself()->_isVirtualItem($itemId)) {
return;
}
if ($itemNum <= 0) {
return;
}
$itemMeta = mt\Item::get($itemId);
if (!$itemMeta) {
return;
}
$randAttr = array();
if (mt\Item::isRoleChipItem($itemMeta)) {
$randAttr = mt\ChipAttr::generateAttrRandom($itemMeta,$grade);
}
if (mt\Item::isGunChipItem($itemMeta)) {
$randAttr = mt\ChipAttr::generateAttrRandom($itemMeta,$grade);
}
$fieldsKv = array(
'item_id' => $itemId,
'item_num' => 1,
'rand_attr' => json_encode($randAttr),
'chip_grade' => $grade,
'chip_type' => $itemMeta['sub_type'],
'labour' => 0,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
);
if ($accountId) {
$fieldsKv['account_id'] = $accountId;
}
if ($tokenId) {
$fieldsKv['token_id'] = $tokenId;
}
if (myself()->_isVirtualItem($itemMeta['id'])) {
return;
}
$chipMeta = ChipAttr::getAttrByItemId($itemMeta['id']);
if (!$chipMeta){
return;
}
// $randAttr = array();
// if (mt\Item::isRoleChipItem($itemMeta)) {
// $randAttr = mt\ChipAttr::generateAttrRandom($itemMeta,$grade);
// }
// if (mt\Item::isGunChipItem($itemMeta)) {
// $randAttr = mt\ChipAttr::generateAttrRandom($itemMeta,$grade);
// }
$randAttr = array();
$fieldsKv = array(
'item_id' => $itemMeta['id'],
'item_num' => 1,
'state' => $state,
'rand_attr' => json_encode($randAttr),
'chip_grade' => 1,
'chip_type' => $itemMeta['sub_type'],
'activate' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
);
if ($accountId) {
$fieldsKv['account_id'] = $accountId;
}
if ($tokenId) {
$fieldsKv['token_id'] = $tokenId;
}
SqlHelper::insert
($conn,
't_chip',
$fieldsKv
);
SqlHelper::insert
($conn,
't_chip',
$fieldsKv
);
}
public static function getChipByTokenId($token_ids){
@ -308,53 +293,40 @@ class Chip extends BaseModel
);
}
public static function updateChipInlayState($token_id,$state){
return SqlHelper::update(
myself()->_getSelfMysql(),
't_chip',
['token_id' => $token_id],
['inlay_state'=>$state]
);
public static function updateInlayState($idx,$page){
$row = self::find($idx);
if ($row){
$inlayState = array_filter (explode("|",$row['inlay_state']) );
if (in_array($page,$inlayState)){
unset($inlayState[array_search($page,$inlayState)]);
}else{
array_push($inlayState,$page);
}
self::update2($idx,array(
'inlay_state' => implode('|',$inlayState)
));
}
}
public static function getChipInlay($type){
return SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_chip',
array(
'chip_type' => $type,
'supper_state' => 0,
'inlay_state' => 0,
)
);
}
// public static function deleteChip($whereKv){
// public static function updateRandAttr($accountId,$chip){
// $attr_pool = mt\ChipAttr::generateOneAttr($chip['chip_type']);
// $rand_attr = emptyReplace(json_decode($chip['rand_attr'], true), array());
// array_push($rand_attr,$attr_pool);
// $fieldsKv = [
// 'rand_attr'=>json_encode($rand_attr)
// ];
// SqlHelper::update(
// myself()->_getMarketMysql(),
// 't_nft',
// $whereKv,
// ['deleted'=>1]
// myself()->_getMysql($accountId),
// 't_chip',
// array(
// 'token_id' => $chip['token_id'],
// ),
// $fieldsKv
// );
// }
public static function updateRandAttr($accountId,$chip){
$attr_pool = mt\ChipAttr::generateOneAttr($chip['chip_type']);
$rand_attr = emptyReplace(json_decode($chip['rand_attr'], true), array());
array_push($rand_attr,$attr_pool);
$fieldsKv = [
'rand_attr'=>json_encode($rand_attr)
];
SqlHelper::update(
myself()->_getMysql($accountId),
't_chip',
array(
'token_id' => $chip['token_id'],
),
$fieldsKv
);
}
public static function getChipAttr($chip_ids){
$data = ['attr_chip'=>[],'chip_core'=>[]];
if (! $chip_ids) {

184
webapp/models/ChipPage.php Normal file
View File

@ -0,0 +1,184 @@
<?php
namespace models;
require_once('models/Chip.php');
require_once('mt/ChipAttr.php');
require_once('services/ChipPageService.php');
use mt\ChipAttr;
use phpcommon\SqlHelper;
use services\ChipPageService;
class ChipPage extends BaseModel
{
public static function find($page){
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_chip_page',
array(
'account_id'=> myself()->_getAccountId(),
'page_id' => $page
)
);
if (!$row){
return null;
}
return $row;
}
public static function getList($cb){
SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_chip_page',
array(
'account_id'=> myself()->_getAccountId(),
),
function ($row) use($cb) {
$cb($row);
}
);
}
public static function toDto($row){
return array(
'idx' => $row['idx'],
'account_id' => $row['account_id'],
'page_name' => $row['page_name'],
'page_id' => $row['page_id'],
'createtime' => $row['createtime'],
);
}
public static function toDtoInfo($row){
$data = emptyReplace(json_decode($row['data'], true), array());
foreach ($data as &$value){
$chipDb = Chip::find($value['chip_id']);
if ( !$chipDb ) {
$value['chip_id'] = 0;
}
}
self::update($row['page_id'],array(
'data' => json_encode($data)
));
$newRow = self::find($row['page_id']);
$newData = emptyReplace(json_decode($newRow['data'], true), array());
$attrs = array();
foreach ($newData as $key=>$value){
$newData[$key]['item_id'] = 0;
if ($value['chip_id']){
$chipDb = Chip::find($value['chip_id']);
$newData[$key]['item_id'] = $chipDb['item_id'];
$chipAttrMeta = ChipAttr::getAttrByItemId($chipDb['item_id']);
$rand_attr = emptyReplace(json_decode($chipDb['rand_attr'], true), array());
array_push($attrs,array(
'attr_id'=>$chipAttrMeta['attr_id'],
'val'=>$chipAttrMeta['lv'.$chipDb['chip_grade']],
));
foreach ($rand_attr as $val){
array_push($attrs,$val);
}
}
}
$item = [];
foreach ($attrs as $k=>$v){
if (!isset($item[$v['attr_id']])){
$item[$v['attr_id']] = $v;
}else{
$item[$v['attr_id']]['val']+= $v['val'];
}
}
$info = array(
'idx' => $newRow['idx'],
'page_id' => $newRow['page_id'],
'page_name' => $newRow['page_name'],
'data' => $newData,
'attr' => $item
);
return $info;
}
public static function updatePage($page,$slot_id,$chip_id){
$row = self::find($page);
$data = emptyReplace(json_decode($row['data'], true), array());
foreach ($data as &$value){
if ($value['slot_id'] == $slot_id){
$value['chip_id'] = $chip_id;
}
}
SqlHelper::update
(myself()->_getSelfMysql(),
't_chip_page',
array(
'account_id'=> myself()->_getAccountId(),
'page_id' => $page
),
array(
'data'=> json_encode($data)
)
);
}
public static function update($page,$fieldsKv){
SqlHelper::update
(myself()->_getSelfMysql(),
't_chip_page',
array(
'account_id'=> myself()->_getAccountId(),
'page_id' => $page
),
$fieldsKv
);
}
public static function addChipPage(){
$data = array();
$userInfo = myself()->_getOrmUserInfo();
for ($i=1;$i <= ChipPageService::MAX_CHIP_SLOT_NUM;$i++){
if ($i <= $userInfo['level']){
array_push(
$data,
array(
'slot_id'=>$i,
'state'=>1,
'chip_id'=>0,
)
);
}else{
array_push(
$data,
array(
'slot_id'=>$i,
'state'=>0,
'chip_id'=>0,
)
);
}
}
$rows = SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_chip_page',
array(
'account_id'=> myself()->_getAccountId()
)
);
$page_id = 1;
if ($rows){
$page_id = count($rows)+1;
}
$info = array(
'account_id' => myself()->_getAccountId(),
'page_name' => 'page'.$page_id,
'page_id' => $page_id,
'data' => json_encode($data),
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
);
SqlHelper::insert(
myself()->_getSelfMysql(),
't_chip_page',
$info
);
}
}

61
webapp/models/Emoji.php Normal file
View File

@ -0,0 +1,61 @@
<?php
namespace models;
use mt;
use phpcommon\SqlHelper;
class Emoji extends BaseModel
{
private static function defaultEmoji(){
$default = array();
$meta = mt\Parameter::getByName('emoji_default');
if ($meta){
$default = explode('|',$meta['param_value']) ;
}
return $default;
}
public static function emojiList(){
$data = self::DefaultEmoji();
//查询用户新获得的表情t_emoji 表)
return $data;
}
public static function getUseEmoji(){
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_user_use_emoji',
array(
'account_id'=> myself()->_getAccountId()
)
);
$value = array();
if ($row && $row['value']){
$value = explode('|',$row['value']) ;
}
return $value;
}
public static function updateEmoji($fields){
SqlHelper::upsert
(myself()->_getSelfMysql(),
't_user_use_emoji',
array(
'account_id' => myself()->_getAccountId(),
),
array(
'value' => $fields,
'modifytime' => myself()->_getNowTime(),
),
array(
'account_id' => myself()->_getAccountId(),
'value' => $fields,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
)
);
}
}

View File

@ -0,0 +1,53 @@
<?php
namespace models;
use mt;
use phpcommon\SqlHelper;
class FragmentRecord extends BaseModel {
const HERO_FRAGMENT = 1111;
const GUN_FRAGMENT = 2222;
public static function getGamesNum($param)
{
$row = SqlHelper::ormSelectOne
(myself()->_getSelfMysql(),
't_fragment_record',
array(
'account_id' => myself()->_getAccountId(),
'param' => $param,
)
);
$num = 0;
if ($row) {
$num = $row['value'];
}
return $num;
}
public static function upsertGamesNum($param,$value){
SqlHelper::upsert
(myself()->_getSelfMysql(),
't_fragment_record',
array(
'account_id' => myself()->_getAccountId(),
'param' => $param
),
array(
'value' => $value,
'modifytime' => myself()->_getNowDaySeconds()
),
array(
'account_id' => myself()->_getAccountId(),
'param' => $param,
'value' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowDaySeconds()
)
);
}
}

View File

@ -20,7 +20,7 @@ use models\ChipPlugin;
class Gun extends BaseModel {
const GETED_STATE = 0;
const TRY_STATE = 1;
const FREE_STATE = 1;
const NO_LOCK = 0;
const LEVEL_LOCK = 1;
@ -57,6 +57,11 @@ class Gun extends BaseModel {
'idx' => $gunUniId,
)
);
if ($row) {
if ($row['account_id'] != myself()->_getAccountId()) {
$row = null;
}
}
return $row;
}
@ -151,6 +156,7 @@ class Gun extends BaseModel {
'account_id' => myself()->_getAccountId()
),
function ($row) use($cb) {
$row['tags'] = '';
$cb($row);
}
);
@ -163,6 +169,22 @@ class Gun extends BaseModel {
'token_id' => $nftDb['token_id'],
)
);
//将NFT表的数据同步到中心化英雄表 (以后可能删除)
if (!$row) {
$itemMeta = mt\Item::get($nftDb['item_id']);
if ($itemMeta) {
self::addNftGun($itemMeta, $nftDb['token_id']);
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_gun',
array(
'token_id' => $nftDb['token_id'],
)
);
}
}
if ($row){
if ( ! $row['activate']){
self::activateGun($row);
@ -174,6 +196,7 @@ class Gun extends BaseModel {
)
);
}
$row['tags'] = $nftDb['tags'];
$cb($row);
}
}
@ -201,7 +224,6 @@ class Gun extends BaseModel {
'lock_type' => self::NO_LOCK,
'unlock_time' => 0,
'unlock_trade_time' => 0,
'labour' => 0,
'activate' => 1,
'modifytime' => myself()->_getNowTime()
);
@ -250,7 +272,6 @@ class Gun extends BaseModel {
$todayMissionGetCeg = 0;
}
$gunLucky = \services\FormulaService::Weapon_Advanced_Lucky_Value($row['quality']);
$chipIds = ChipPlugin::getInlayChip($row['token_id']);
$dto = array(
'idx' => $row['idx'],
'token_id' => $row['token_id'],
@ -259,15 +280,12 @@ class Gun extends BaseModel {
'gun_lv' => $row['gun_lv'],
'state' => $row['state'],
'quality' => $row['quality'],
'lucky' => strval($gunLucky),
'durability' => $row['durability'],
'ceg_uplimit' => 0,
'pve_ceg_uplimit' => 0,
'raw_pve_ceg_uplimit' => 0,
'attr_base' => $baseAttr,
'attr_pro' => $attrPro,
'attr_chip' => Chip::getChipAttr($chipIds)['attr_chip'],
'chip_core' => Chip::getChipAttr($chipIds)['chip_core'],
'try_count' => $row['try_count'],
'current_pvp_get_ceg' => $todayGetGold / 100,
'last_pvp_get_ceg_time' => $lastGetGoldTime,
@ -280,10 +298,12 @@ class Gun extends BaseModel {
'unlock_lefttime' => max(0,
$unlockTime - myself()->_getNowTime()),
'unlock_trade_time' => $row['unlock_trade_time'],
'chip_ids' => $chipIds,
'chip_strength_sum' => strval(Chip::getChipMaxStrength($row['chip_ids'],2)), //计算ceg上限所需参数
'offer_reward_state' => 0,
'labour' => $row['labour'],
'tags' => isset($row['tags'])?$row['tags']:'',
'lucky' => strval($gunLucky),
'chip_strength_sum' => 0,
'labour' => 0,
);
$dto['durability_max'] = strval(round(FormulaService::Weapon_NFT_Maximum_Durability($dto['quality'],$dto['lucky']),3));
$dto['pvp_ceg_uplimit'] = strval( round(FormulaService::getWeaponPvpDailyCegUpLimit($dto),2) );
@ -298,25 +318,37 @@ class Gun extends BaseModel {
return $dto;
}
public static function addFreeGun($gunMeta)
{
return self::internalAddGun(
myself()->_getSelfMysql(),
$gunMeta,
myself()->_getAccountId(),
null,
self::FREE_STATE);
}
public static function addGun($gunMeta)
{
return self::internalAddGun(
myself()->_getSelfMysql(),
$gunMeta,
myself()->_getAccountId(),
null);
null,
self::GETED_STATE);
}
// public static function addNftGun($gunMeta, $tokenId)
// {
// return self::internalAddGun(
// myself()->_getMysql($tokenId),
// $gunMeta,
// null,
// $tokenId);
// }
public static function addNftGun($gunMeta, $tokenId)
{
return self::internalAddGun(
myself()->_getMysql($tokenId),
$gunMeta,
null,
$tokenId,
self::GETED_STATE);
}
private static function internalAddGun($conn, $gunMeta, $accountId, $tokenId)
private static function internalAddGun($conn, $gunMeta, $accountId, $tokenId,$state)
{
$randAttr = array();
{
@ -329,13 +361,12 @@ class Gun extends BaseModel {
'gun_id' => $gunMeta['id'],
'gun_lv' => 1,
'quality' => 1,
'state' => self::GETED_STATE,
'state' => $state,
'durability' => FormulaService::Weapon_NFT_Maximum_Durability(1,FormulaService::Weapon_Advanced_Lucky_Value(1)),
'rand_attr' => json_encode($randAttr),
'lock_type' => self::NO_LOCK,
'unlock_time' => 0,
'unlock_trade_time' => 0,
'labour' => 0,
'activate' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
@ -377,7 +408,7 @@ class Gun extends BaseModel {
'gun_id' => $gunMeta['id'],
'gun_lv' => 1,
'quality' => 1,
'state' => self::TRY_STATE,
'state' => self::FREE_STATE,
'try_count' => $tryCount,
'durability' => $gunMeta['init_durability'],
'rand_attr' => json_encode($randAttr),
@ -667,9 +698,7 @@ class Gun extends BaseModel {
$todayPveGetCeg = 0;
}
$gunLucky = \services\FormulaService::Weapon_Advanced_Lucky_Value($row['quality']);
$chipIds = ChipPlugin::getInlayChip($row['token_id']);
$attr_chip= Chip::getChipAttr($chipIds)['attr_chip'];
$chip_core= Chip::getChipAttr($chipIds)['chip_core'];
$rand_attr = $baseAttr;
if ($attrPro){
@ -681,20 +710,7 @@ class Gun extends BaseModel {
}
}
}
if ($attr_chip){
$rand_attr = self::_mergeArr(array_merge($rand_attr,$attr_chip));
}
if ($chip_core){
$coreAttr = array();
foreach ($chip_core as $value){
array_push($coreAttr,array(
'attr_id'=>$value['attr_id'],
'type'=>$value['attr_add_type'],
'val'=>$value['attr_number'],
));
}
$rand_attr = self::_mergeArr(array_merge($rand_attr,$coreAttr));
}
$info = array(
'idx' => $row['idx'],
'token_id' => $row['token_id'],
@ -707,10 +723,9 @@ class Gun extends BaseModel {
'lucky' => strval($gunLucky),
'durability' => $row['durability'],
'rand_attr' => array_values($rand_attr),
'chip_core' => $chip_core ? $coreAttr : $chip_core,
'current_pvp_get_ceg' => $todayGetGold / 100,
'current_pve_get_ceg' => $todayPveGetCeg / 100,
'chip_ids' => $chipIds,
'chip_ids' => $row['chip_ids'],
'chip_strength_sum' => strval(Chip::getChipMaxStrength($row['chip_ids'],2)), //计算ceg上限所需参数
'labour' => $row['labour'],
);

View File

@ -5,6 +5,7 @@ namespace models;
require_once('mt/Hero.php');
require_once('mt/HeroLevelAttr.php');
require_once('mt/HeroQuality.php');
require_once('mt/HeroLevel.php');
require_once('mt/AttrHelper.php');
require_once('mt/Item.php');
require_once('mt/SkillCommon.php');
@ -27,13 +28,17 @@ use models\ChipPlugin;
class Hero extends BaseModel {
const GETED_STATE = 0;
const TRY_STATE = 1;
const FREE_STATE = 1;
const NO_LOCK = 0;
const LEVEL_LOCK = 1;
const QUALITY_LOCK = 2;
const SEND_LOCK = 3;
const COST_LOCK = 4;
//需要材料所需等级
const LV_1 = 4;
const LV_2 = 9;
const LV_3 = 14;
public static function find($heroUniId)
{
@ -48,6 +53,11 @@ class Hero extends BaseModel {
'idx' => $heroUniId,
)
);
if ($row) {
if ($row['account_id'] != myself()->_getAccountId()) {
$row = null;
}
}
return $row;
}
@ -137,6 +147,7 @@ class Hero extends BaseModel {
'account_id' => myself()->_getAccountId()
),
function ($row) use($cb) {
$row['tags'] = '';
$cb($row);
}
);
@ -149,6 +160,22 @@ class Hero extends BaseModel {
'token_id' => $nftDb['token_id'],
)
);
//将NFT表的数据同步到中心化英雄表 (以后可能删除)
if (!$row) {
$itemMeta = mt\Item::get($nftDb['item_id']);
if ($itemMeta) {
self::addNftHero($itemMeta, $nftDb['token_id']);
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_hero',
array(
'token_id' => $nftDb['token_id'],
)
);
}
}
if ($row) {
if (!$row['activate']) {
self::activateHero($row);
@ -160,6 +187,7 @@ class Hero extends BaseModel {
)
);
}
$row['tags'] = $nftDb['tags'];
$cb($row);
}
}
@ -183,8 +211,6 @@ class Hero extends BaseModel {
'lock_type' => self::NO_LOCK,
'unlock_time' => 0,
'unlock_trade_time' => 0,
'skill_points' => 0,
'labour' => 0,
'activate' => 1,
'modifytime' => myself()->_getNowTime()
);
@ -206,24 +232,30 @@ class Hero extends BaseModel {
$unlockTime = $row['unlock_time'];
}
$qualityMeta = mt\HeroQuality::getByQuality($row['quality']);
$levelMeta = mt\HeroLevel::getByLevel($row['hero_lv']);
$todayGetGold = $row['today_get_gold'];
$lastGetGoldTime = $row['last_get_gold_time'];
if (myself()->_getDaySeconds($lastGetGoldTime) <
myself()->_getNowDaySeconds()) {
$todayGetGold = 0;
}
$todayPveGetCeg = $row['today_pve_get_ceg'];
$lastPveGetCegTime = $row['last_pve_get_ceg_time'];
if (myself()->_getDaySeconds($lastPveGetCegTime) <
myself()->_getNowDaySeconds()) {
$todayPveGetCeg = 0;
}
$todayMissionGetCeg = $row['today_mission_get_ceg'];
$lastMissionGetCegTime = $row['last_mission_get_ceg_time'];
if (myself()->_getDaySeconds($lastMissionGetCegTime) < myself()->_getNowDaySeconds()) {
$todayMissionGetCeg = 0;
{
$todayPveGetCeg = $row['today_pve_get_ceg'];
$lastPveGetCegTime = $row['last_pve_get_ceg_time'];
if (myself()->_getDaySeconds($lastPveGetCegTime) <
myself()->_getNowDaySeconds()) {
$todayPveGetCeg = 0;
}
$todayMissionGetCeg = $row['today_mission_get_ceg'];
$lastMissionGetCegTime = $row['last_mission_get_ceg_time'];
if (myself()->_getDaySeconds($lastMissionGetCegTime) < myself()->_getNowDaySeconds()) {
$todayMissionGetCeg = 0;
}
}
$baseAttr=[];
$attrPro=[];
$heroMeta = mt\Hero::get($row['hero_id']);
@ -239,15 +271,6 @@ class Hero extends BaseModel {
}
$attrPro = self::mergeAttrPro($baseAttr,$attrPro1,$attrPro2);
}
$skill_common = explode("|",$row['skill_common']);
$attr_skill = [];
foreach ($skill_common as $val){
$item = mt\SkillCommon::getAttrBySkillCommon($val);
if ($item){
array_push($attr_skill,$item);
}
}
$chipIds = ChipPlugin::getInlayChip($row['token_id']);
$heroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($row['quality']);
$dto = array(
'idx' => $row['idx'],
@ -263,29 +286,30 @@ class Hero extends BaseModel {
'skill_lv2' => $row['skill_lv2'],
'attr_base' => $baseAttr,
'attr_pro' => $attrPro,
'attr_skill' => $attr_skill,
'attr_chip' => Chip::getChipAttr($chipIds)['attr_chip'],
'chip_core' => Chip::getChipAttr($chipIds)['chip_core'],
'try_count' => $row['try_count'],
'lock_type' => $lockType,
'unlock_time' => $unlockTime,
'unlock_lefttime' => max(0,
$unlockTime - myself()->_getNowTime()),
'current_get_gold' => $todayGetGold / 100,
'last_get_gold_time' => $lastGetGoldTime,
'gold_uplimit' => $levelMeta['gold_limit'],
'unlock_trade_time' => $row['unlock_trade_time'],
'advanced_count' => $row['advanced_count'],
'offer_reward_state' => 0,
'tags' => isset($row['tags'])?$row['tags']:'',
//暂留(以下弃用字段)
'current_pvp_get_ceg' => $todayGetGold / 100,
'last_pvp_get_ceg_time' => $lastGetGoldTime,
'current_pve_get_ceg' => $todayPveGetCeg / 100,
'last_pve_get_ceg_time' => $lastPveGetCegTime,
'current_mission_get_ceg' => $todayMissionGetCeg / 100,
'last_mission_get_ceg_time' => $lastMissionGetCegTime,
'unlock_trade_time' => $row['unlock_trade_time'],
'advanced_count' => $row['advanced_count'],
'lucky' => $heroLucky,
'chip_ids' => $chipIds,
'chip_strength_sum' => strval(Chip::getChipMaxStrength($row['chip_ids'],1)), //计算ceg上限所需参数
'skill_common' => $skill_common,
'skill_points' => $row['skill_points'],
'offer_reward_state' => 0,
'labour' => $row['labour'],
'chip_strength_sum' => 0,
'labour' => 0,
);
$dto['hero_tili_max'] = strval(round(FormulaService::Hero_NFT_Maximum_Physical_Strength($dto['quality'],$dto['lucky']),3));
$dto['pvp_ceg_uplimit'] =strval( round(FormulaService::getHeroPvpDailyCegUpLimit($dto),2) );
@ -300,26 +324,46 @@ class Hero extends BaseModel {
return $dto;
}
public static function addFreeHero($heroMeta)
{
return self::internalAddHero(
myself()->_getSelfMysql(),
$heroMeta,
myself()->_getAccountId(),
null,
self::FREE_STATE);
}
public static function addHero($heroMeta)
{
return self::internalAddHero(
myself()->_getSelfMysql(),
$heroMeta,
myself()->_getAccountId(),
null);
null,
self::GETED_STATE);
}
// public static function addNftHero($heroMeta, $tokenId)
// {
// return self::internalAddHero(
// myself()->_getMysql($tokenId),
// $heroMeta,
// null,
// $tokenId);
// }
public static function internalAddHero($conn, $heroMeta, $accountId, $tokenId)
public static function addNftHero($heroMeta, $tokenId)
{
return self::internalAddHero(
myself()->_getMysql($tokenId),
$heroMeta,
null,
$tokenId,
self::GETED_STATE);
}
public static function internalAddHero($conn, $heroMeta, $accountId, $tokenId,$state)
{
$skinItemMeta = \mt\Item::getMetaListByType(\mt\Item::HERO_SKIN_TYPE);
if ($skinItemMeta){
foreach ($skinItemMeta as $value){
if ($value['playerid'] == $heroMeta['id'] && $value['isdefaultskin'] ==1){
HeroSkin::addSkin($value);
}
}
}
$realHeroMeta = mt\Hero::get($heroMeta['id']);
$randAttr = array();
$fieldsKv = array(
@ -327,15 +371,13 @@ class Hero extends BaseModel {
'hero_lv' => 1,
'quality' => 1,
'hero_tili' => FormulaService::Hero_NFT_Maximum_Physical_Strength(1,FormulaService::Hero_Advanced_Lucky_Value(1)),
'state' => self::GETED_STATE,
'state' => $state,
'skill_lv1' => 1,
'skill_lv2' => 1,
'rand_attr' => json_encode($randAttr),
'lock_type' => self::NO_LOCK,
'unlock_time' => 0,
'unlock_trade_time' => 0,
'skill_points' => 0,
'labour' => 0,
'activate' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
@ -354,69 +396,6 @@ class Hero extends BaseModel {
);
}
public static function addTryHero($heroMeta, $tryCount)
{
$realHeroMeta = mt\Hero::get($heroMeta['id']);
$randAttr = array();
{
$initQualityMeta = mt\HeroQuality::getByQuality(1);
if ($initQualityMeta) {
$randAttr = mt\HeroQuality::getRandAttr($initQualityMeta);
}
}
SqlHelper::upsert(
myself()->_getSelfMysql(),
't_hero',
array(
'account_id' => myself()->_getAccountId(),
'hero_id' => $heroMeta['id']
),
array(
),
array(
'account_id' => myself()->_getAccountId(),
'hero_id' => $heroMeta['id'],
'hero_lv' => 1,
'quality' => 1,
'hero_tili' => $realHeroMeta ? $realHeroMeta['tili'] : 0,
'state' => self::TRY_STATE,
'try_count' => $tryCount,
'skill_lv1' => 1,
'skill_lv2' => 1,
'rand_attr' => json_encode($randAttr),
'lock_type' => self::NO_LOCK,
'unlock_time' => 0,
'unlock_trade_time' => 0,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
)
);
}
public static function takeonSkin($heroUniId, $skinId)
{
self::update($heroUniId, array(
'skin_id' => $skinId,
'modifytime' => myself()->_getNowTime()
));
}
public static function upgradeSkill($heroUniId, $skillIdx,$skill_points)
{
if (!in_array($skillIdx, array(0, 1))) {
return;
}
$fieldName = 'skill_lv' . ($skillIdx + 1);
self::update($heroUniId, array(
$fieldName => function () use($fieldName) {
return "${fieldName} + 1";
},
'skill_points' => function() use ($skill_points){
return "GREATEST(0, skill_points - ${skill_points})";
},
'modifytime' => myself()->_getNowTime()
));
}
public static function update($heroUniId, $fieldsKv)
{
@ -611,13 +590,6 @@ class Hero extends BaseModel {
foreach ($baseAttr as $val){
foreach ($attr as $v){
$coef_level = mt\HeroLevelAttr::getByCoefficient($coefficient_level,$val['attr_id']);
// if ($val['attr_id'] == $v['attr_id'] && $val['attr_id'] == kHAT_Atk){ //18 //18.941564456287 //20.847692307692
// array_push($attrPro1,[
// 'attr_id' => $val['attr_id'],
// 'type'=> $val['type'],
// 'val' => strval($val['val']*$v['val']+$v['val']/$coef_level['val']*100-100/$coef_level['val']),
// ]);
// }
//&& $val['attr_id'] != kHAT_Atk
if ( $val['attr_id'] == $v['attr_id'] ){
array_push($attrPro1,[
@ -638,20 +610,6 @@ class Hero extends BaseModel {
foreach ($baseAttr as $val){
$coef_quality = mt\HeroQuality::getByCoefficient($coefficient_quality,$val['attr_id']);
if ($coef_quality){
// if ($val['attr_id'] == kHAT_Atk){
// array_push($attrPro2,[
// 'attr_id' => $val['attr_id'],
// 'type'=> $val['type'],
// 'val' => strval($val['val']*$qualityMeta['promote_val']+$qualityMeta['promote_val']/$coef_quality['val']*100-100/$coef_quality['val']),
// ]);
// }
// if ($val['attr_id'] != kHAT_Atk) {
// array_push($attrPro2, [
// 'attr_id' => $val['attr_id'],
// 'type' => $val['type'],
// 'val' => strval($val['val'] * pow($qualityMeta['promote_val'], $coef_quality['val'])),
// ]);
// }
array_push($attrPro2, [
'attr_id' => $val['attr_id'],
'type' => $val['type'],
@ -711,9 +669,6 @@ class Hero extends BaseModel {
array_push($attr_skill,$item);
}
}
$chipIds = ChipPlugin::getInlayChip($row['token_id']);
$attr_chip= Chip::getChipAttr($chipIds)['attr_chip'];
$chip_core= Chip::getChipAttr($chipIds)['chip_core'];
$rand_attr = $baseAttr;
if ($attrPro){
@ -728,20 +683,7 @@ class Hero extends BaseModel {
if ($attr_skill){
$rand_attr = self::_mergeArr(array_merge($rand_attr,$attr_skill));
}
if ($attr_chip){
$rand_attr = self::_mergeArr(array_merge($rand_attr,$attr_chip));
}
if ($chip_core){
$coreAttr = array();
foreach ($chip_core as $value){
array_push($coreAttr,array(
'attr_id'=>$value['attr_id'],
'type'=>$value['attr_add_type'],
'val'=>$value['attr_number'],
));
}
$rand_attr = self::_mergeArr(array_merge($rand_attr,$coreAttr));
}
$heroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($row['quality']);
$info = array(
'idx' => $row['idx'],
@ -753,18 +695,15 @@ class Hero extends BaseModel {
'hero_tili' => $row['hero_tili'],
'quality' => $row['quality'],
'rand_attr' => array_values($rand_attr),
'chip_core' => $chip_core ? $coreAttr : $chip_core,
// 'attr_base' => $baseAttr,
// 'attr_pro' => $attrPro,
// 'attr_skill' => $attr_skill,
// 'attr_chip' => Chip::getChipAttr($chipIds)['attr_chip'],
// 'chip_core' => Chip::getChipAttr($chipIds)['chip_core'],
'current_pvp_get_ceg' => $todayGetGold / 100,
'current_pve_get_ceg' => $todayPveGetCeg / 100,
'advanced_count' => $row['advanced_count'],
'lucky' => strval($heroLucky),
'chip_ids' => $chipIds,
'chip_strength_sum' => strval(Chip::getChipMaxStrength($chipIds,1)), //计算ceg上限所需参数
'chip_ids' => $row['chip_ids'],
'chip_strength_sum' => strval(Chip::getChipMaxStrength($row['chip_ids'],1)), //计算ceg上限所需参数
'skill_points' => $row['skill_points'],
'labour' => $row['labour'],
);
@ -793,4 +732,14 @@ class Hero extends BaseModel {
}
}
public static function getHeroByItemId($itemId){
$hero = array();
self::getHeroList(function ($row) use (&$hero,$itemId) {
if ($row['hero_id'] == $itemId) {
array_push($hero,$row);
}
});
return $hero;
}
}

View File

@ -25,13 +25,69 @@ class HeroSkin extends BaseModel {
return $row;
}
public static function toDto($row)
public static function findBx($heroId)
{
return array(
'skin_id' => $row['skin_id'],
'skin_state' => $row['skin_state'],
'try_expire_at' => $row['try_expire_at'],
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_hero_skin',
array(
'account_id' => myself()->_getAccountId(),
'hero_id' => $heroId
)
);
return $row;
}
public static function takeonSkin($skinId,$heroId){
$row = self::findBx($heroId);
SqlHelper::update(
myself()->_getSelfMysql(),
't_hero_skin',
array(
'account_id' => myself()->_getAccountId(),
'skin_id' => $row['skin_id']
),
array(
'hero_id'=>0
)
);
SqlHelper::update(
myself()->_getSelfMysql(),
't_hero_skin',
array(
'account_id' => myself()->_getAccountId(),
'skin_id' => $skinId
),
array(
'hero_id'=>$heroId
)
);
}
public static function getSkinList($cb){
SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_hero_skin',
array(
'account_id' => myself()->_getAccountId()
),
function ($row) use($cb) {
$cb($row);
}
);
}
public static function toDto($meta)
{
$row = self::find($meta['id']);
$array = array(
'skin_id'=>$meta['id'],
'is_have' => $row?1:0,
'use_state' => $row['hero_id']?1:0,
);
return $array;
}
public static function addSkin($itemMeta)
@ -43,10 +99,7 @@ class HeroSkin extends BaseModel {
'account_id' => myself()->_getAccountId(),
'skin_id' => $itemMeta['id']
),
array(
'skin_state' => 3,
'modifytime' => myself()->_getNowTime()
),
array(),
array(
'account_id' => myself()->_getAccountId(),
'skin_id' => $itemMeta['id'],
@ -54,6 +107,7 @@ class HeroSkin extends BaseModel {
'get_from' => 0,
'consume_num' => 0,
'try_expire_at' => 0,
'hero_id' => 0,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
)

View File

@ -8,14 +8,25 @@ use mt;
use phpcommon\SqlHelper;
class Parachute extends BaseModel
{
public static $parachute = '170001'; //默认降落伞
public static function getMyParachute(){
return SqlHelper::ormSelect(
$list = array(
self::$parachute
);
$rows = SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_parachute',
array(
'account_id' => myself()->_getAccountId(),
)
);
if ($rows){
foreach ($rows as $row){
array_push($list, $row['item_id']);
}
}
return $list;
}
public static function addParachute($itemMeta){
if ($itemMeta){

View File

@ -3,12 +3,15 @@
namespace models;
require_once('mt/Item.php');
require_once('mt/LevelUp.php');
require_once('models/UserSeasonRing.php');
require_once('models/Parachute.php');
use mt;
use phpcommon;
use phpcommon\SqlHelper;
use models\UserSeasonRing;
use models\Parachute;
class User extends BaseModel {
@ -38,6 +41,7 @@ class User extends BaseModel {
public static function show($row)
{
mt\LevelUp::getExpByLv($row['level'],$row['exp']);
return array(
'activated' => $row['activated'],
'rename_count' => $row['rename_count'],
@ -48,7 +52,6 @@ class User extends BaseModel {
'head_frame' => $row['head_frame'],
'level' => $row['level'],
'exp' => $row['exp'],
'max_exp' => $row['exp'] + 1000,
'rank' => $row['rank'],
'history_best_rank' => $row['history_best_rank'],
'score' => $row['score'],
@ -69,11 +72,16 @@ class User extends BaseModel {
'guild_id' => $row['guild_id'],
'guild_job' => $row['guild_job'],
'guild_name' => $row['guild_name'],
'parachute' => $row['parachute'] ? $row['parachute'] : Parachute::$parachute,
'parachute_list' => Parachute::getMyParachute(),
'ring_id' => $row['ring_id'],
'ring_list' => UserSeasonRing::ringList($row['account_id']),
);
}
public static function info($row)
{
mt\LevelUp::getExpByLv($row['level'],$row['exp']);
return array(
'activated' => $row['activated'],
'rename_count' => $row['rename_count'],
@ -84,7 +92,6 @@ class User extends BaseModel {
'head_frame' => $row['head_frame'],
'level' => $row['level'],
'exp' => $row['exp'],
'max_exp' => $row['exp'] + 1000,
'rank' => $row['rank'],
'history_best_rank' => $row['history_best_rank'],
'score' => $row['score'],
@ -106,7 +113,10 @@ class User extends BaseModel {
'guild_id' => $row['guild_id'],
'guild_job' => $row['guild_job'],
'guild_name' => $row['guild_name'],
'ring_list' => UserSeasonRing::ringList($row['account_id'])
'ring_id' => $row['ring_id'],
'ring_list' => UserSeasonRing::ringList($row['account_id']),
'parachute' => $row['parachute'] ? $row['parachute'] : Parachute::$parachute,
'parachute_list' => Parachute::getMyParachute(),
);
}
@ -150,6 +160,16 @@ class User extends BaseModel {
return in_array($headFrame, $headFrameList);
}
public static function isValidParachute($parachute){
$parachuteList = Parachute::getMyParachute();
return in_array($parachute, $parachuteList);
}
public static function isValidRing($parachute){
$ringList = UserSeasonRing::ringList(myself()->_getAccountId());
return in_array($parachute, $ringList);
}
private static function getHeadList($userInfo)
{
$headList = emptyReplace(json_decode($userInfo['head_list'], true), array());

View File

@ -30,120 +30,85 @@ class ChipAttr {
return self::$attrPoolList;
}
public static function getAttrPool($attr){
$attr_pool = array();
public static function getAttrPool($chip){
$temp = array();
$attrWeight = 0;
foreach (self::getAttrPoolList() as $item){
if ($item['attr_id'] == $attr['attr_id'] && $item['attr_type'] == $attr['chip_type'] ){
$attr_pool = $item;
if ($item['chip_type'] == $chip['chip_type']){
$attrWeight += $item['attr_weight'];
for ($i = 0; $i < $item['attr_weight']; $i++) {
$temp[] = $item;
}
}
}
$attr_pool = $temp[rand(0, $attrWeight -1)];
if ($attr_pool){
$attr_pool['weight'] = explode('|',$attr_pool['weight']);
foreach ($attr_pool['weight'] as $key =>$item){
$attr_pool['weight'][$key] = explode(':',$item);
$attr_pool['num_weight'] = explode('|',$attr_pool['num_weight']);
foreach ($attr_pool['num_weight'] as $key =>$item){
$attr_pool['num_weight'][$key] = explode(':',$item);
}
$weight = 0;
$tempData = array ();
foreach ($attr_pool['weight'] as $one) {
foreach ($attr_pool['num_weight'] as $one) {
$weight += $one[1];
for ($i = 0; $i < $one[1]; $i++) {
$tempData[] = $one;
}
}
$k = rand(0, $weight -1);
$attr_pool['attr_pool_number'] = $tempData[$k][0];
unset($attr_pool['weight']);
$attr_pool['val'] = $tempData[$k][0];
unset($attr_pool['num_weight']);
}
return $attr_pool;
}
public static function generateAttrRandom($itemMeta,$chip_grade){
if ($itemMeta['sub_type'] == self::ROLE_CHIP_SUBTYPE){
$chip = self::getNodeChip();
return self::_randomNum($itemMeta,$chip_grade,$chip);
}
if ($itemMeta['sub_type'] == self::GUN_CHIP_SUBTYPE){
$chip = self::getGunChip();
return self::_randomNum($itemMeta,$chip_grade,$chip);
}
return array();
}
public static function getAttrById($attr_id,$attr_type){
if($attr_type == self::ROLE_CHIP_SUBTYPE){
$chip = self::getNodeChip();
}
if($attr_type == self::GUN_CHIP_SUBTYPE){
$chip = self::getGunChip();
}
foreach ($chip as $item) {
if ($item['attr_id'] == $attr_id && $item['chip_type'] == $attr_type){
return $item;
}
}
}
public static function generateOneAttr($type){
// $itemMeta = Item::get($item_id);
// return self::getAttrPool(self::getAttrByItemId($itemMeta['id']));
// public static function generateOneAttr($type){
//// $itemMeta = Item::get($item_id);
//// return self::getAttrPool(self::getAttrByItemId($itemMeta['id']));
//
//// $attr_pool = self::getAttrPool(self::getAttrByItemId($itemMeta['id']));
//// $attr = emptyReplace(json_decode($chip['rand_attr'], true), array());
//// array_push($attr,$attr_pool);
//// return $attr;
// if ($type == self::ROLE_CHIP_SUBTYPE){
// $chip = self::getNodeChip();
// $attr = $chip[ array_rand($chip)];
// return self::getAttrPool($attr);
// }
// if ($type == self::GUN_CHIP_SUBTYPE){
// $chip = self::getGunChip();
// $attr = $chip[ array_rand($chip)];
// return self::getAttrPool($attr);
// }
// return array();
// }
//
//
//
// private static function getNodeChip(){
// $node_chip = array();
// foreach (self::getMetaList() as $item){
// if ($item['chip_type'] == self::ROLE_CHIP_SUBTYPE){
// array_push($node_chip,$item);
// }
// }
// return $node_chip;
// }
//
// private static function getGunChip(){
// $gun_chip = array();
// foreach (self::getMetaList() as $item){
// if ($item['chip_type'] == self::GUN_CHIP_SUBTYPE){
// array_push($gun_chip,$item);
// }
// }
// return $gun_chip;
// }
// $attr_pool = self::getAttrPool(self::getAttrByItemId($itemMeta['id']));
// $attr = emptyReplace(json_decode($chip['rand_attr'], true), array());
// array_push($attr,$attr_pool);
// return $attr;
if ($type == self::ROLE_CHIP_SUBTYPE){
$chip = self::getNodeChip();
$attr = $chip[ array_rand($chip)];
return self::getAttrPool($attr);
}
if ($type == self::GUN_CHIP_SUBTYPE){
$chip = self::getGunChip();
$attr = $chip[ array_rand($chip)];
return self::getAttrPool($attr);
}
return array();
}
private static function _randomNum($itemMeta,$chip_grade,$chipList){
$attr_pool = array();
array_push($attr_pool,self::getAttrPool(self::getAttrByItemId($itemMeta['id'])));
if ($chip_grade>=3){
if ($chip_grade<5){
$num = 1;
}
if ($chip_grade>=5){
$num = 2;
}
for ($i=1;$i<=$num;$i++){
$attr = $chipList[ array_rand($chipList)];
array_push($attr_pool,self::getAttrPool($attr));
}
}
return $attr_pool ;
}
private static function getNodeChip(){
$node_chip = array();
foreach (self::getMetaList() as $item){
if ($item['chip_type'] == self::ROLE_CHIP_SUBTYPE){
array_push($node_chip,$item);
}
}
return $node_chip;
}
private static function getGunChip(){
$gun_chip = array();
foreach (self::getMetaList() as $item){
if ($item['chip_type'] == self::GUN_CHIP_SUBTYPE){
array_push($gun_chip,$item);
}
}
return $gun_chip;
}
private static function getAttrByItemId($item_id){
public static function getAttrByItemId($item_id){
foreach (self::getMetaList() as $item){
if ($item['item_id'] == $item_id){
return $item;

37
webapp/mt/LevelUp.php Normal file
View File

@ -0,0 +1,37 @@
<?php
namespace mt;
class LevelUp
{
public static function getExpByLv(&$lv,&$exp){
$meta = self::getMetaList();
if ($exp > 0){
for ($i=1;$i<=count($meta);$i++){
if ($exp > $meta[count($meta)]['total_exp']){
$exp = min($exp, $meta[count($meta)]['total_exp']);
$lv = $meta[count($meta)]['id'];
}else{
if ($exp >= $meta[$i]['total_exp'] &&
$exp < $meta[$i+1]['total_exp'])
{
$lv = $meta[$i]['id'];
}
}
}
}
}
protected static function getMetaList()
{
if (!self::$metaList) {
self::$metaList = getMetaTable('levelup@levelup.php');
}
return self::$metaList;
}
protected static $metaList;
}

View File

@ -6,11 +6,23 @@ use phpcommon;
class Skill {
const DEFAULT_SKILL = 10101;
public static function get($id)
{
return getXVal(self::getMetaList(), $id);
}
public static function getPresetSkill()
{
$list = array();
foreach (self::getMetaList() as $value){
if ($value['skill_id'] < 20000){
array_push($list,$value);
}
}
return $list;
}
protected static function getMetaList()
{
if (!self::$metaList) {

View File

@ -15,6 +15,7 @@ require_once('mt/AttrHelper.php');
require_once('mt/PveGemini.php');
require_once('mt/PveGeminiMode.php');
require_once('mt/RankSeason.php');
require_once('mt/LevelUp.php');
require_once('models/Season.php');
require_once('models/Battle.php');
@ -27,6 +28,7 @@ require_once('models/FragmentPool.php');
require_once('models/RealtimeData.php');
require_once('models/BattleHistory.php');
require_once('models/NftActive.php');
require_once('models/FragmentRecord.php');
require_once('services/RankActivityService.php');
require_once('services/FormulaService.php');
@ -36,6 +38,7 @@ require_once('services/LogService.php');
use models\Chip;
use models\FragmentRecord;
use models\Nft;
use models\NftActive;
use models\User;
@ -78,19 +81,9 @@ class BattleDataService extends BaseService {
'obtain_ceg' => 0,
'curr_ceg' => 0,
),
'weapon1' => array(
'gun_uniid' => '',
'ceg_uplimit' => 0,
'obtain_ceg' => 0,
),
'weapon2' => array(
'gun_uniid' => '',
'ceg_uplimit' => 0,
'obtain_ceg' => 0,
'curr_ceg' => 0,
),
'total_ceg' => 0,
'items' => array()
'items' => array(),
'lvInfo' => array()
);
private $rankActivityService = null;
private $pveGeminiMeta = null;
@ -124,32 +117,7 @@ class BattleDataService extends BaseService {
$this->reward['hero']['ceg_uplimit'] = $matchMode == self::MATCH_MODE_PVE ?
$this->heroDto['pve_ceg_uplimit'] : $this->heroDto['pvp_ceg_uplimit'];
}
{
$weaponUuid1 = getReqVal('weapon_uuid1', '');
if ($weaponUuid1) {
$weaponDb = Gun::find($weaponUuid1);
if (!$weaponDb) {
return false;
}
$this->weapon1Dto = Gun::toDto($weaponDb);
$this->reward['weapon1']['gun_uniid'] = $this->weapon1Dto['gun_uniid'];
$this->reward['weapon1']['ceg_uplimit'] = $matchMode == self::MATCH_MODE_PVE ?
$this->weapon1Dto['pve_ceg_uplimit'] : $this->weapon1Dto['pvp_ceg_uplimit'];
}
}
{
$weaponUuid2 = getReqVal('weapon_uuid2', '');
if ($weaponUuid2) {
$weaponDb = Gun::find($weaponUuid2);
if (!$weaponDb) {
return false;
}
$this->weapon2Dto = Gun::toDto($weaponDb);
$this->reward['weapon2']['gun_uniid'] = $this->weapon2Dto['gun_uniid'];
$this->reward['weapon2']['ceg_uplimit'] = $matchMode == self::MATCH_MODE_PVE ?
$this->weapon2Dto['pve_ceg_uplimit'] : $this->weapon2Dto['pvp_ceg_uplimit'];
}
}
//录入战斗记录
$this->saveBattleHistory();
@ -160,7 +128,6 @@ class BattleDataService extends BaseService {
//匹配赛模式
$this->updatePvpData();
$this->rewardCegPvp();
$this->rewardFragmentPvp();
myself()->_incDailyV(TN_DAILY_PVP_BATTLE_TIMES, 0, 1);
}
break;
@ -177,7 +144,6 @@ class BattleDataService extends BaseService {
$this->updatePveData();
if ($this->pveGeminiMeta &&
$this->pveGeminiModeMeta) {
$this->rewardCegPve();
$this->rewardFragmentPve();
}
myself()->_incDailyV(TN_DAILY_PVE_BATTLE_TIMES, 0, 1);
@ -191,6 +157,32 @@ class BattleDataService extends BaseService {
}
public function rewardExpPvp(){
$expNum = 222;
if ($expNum>0){
array_push($this->reward['items'],
array(
'item_id' => V_ITEM_EXP,
'item_num' => $expNum
));
$userInfo = myself()->_getOrmUserInfo();
$newExp = $userInfo['exp']+$expNum;
$newLv = $userInfo['level'];
mt\LevelUp::getExpByLv($newLv,$newExp);
$this->reward['lvInfo'] = array(
'oldLv' => $userInfo['level'],
'newLv' => $newLv
);
if ( $newExp != $userInfo['exp'] ) {
myself()->_updateUserInfo(array(
'level' => $newLv,
'exp' => $newExp,
));
}
}
}
private function saveBattleHistory(){
$user = myself()->_getOrmUserInfo();
$newRank = $user['rank'];
@ -781,54 +773,151 @@ class BattleDataService extends BaseService {
private function rewardFragmentPve()
{
if ($this->instanceRank < 1) {
$bossReward = getReqVal('pve_kill_boss', 0) ? 1 : 0;
if ($this->instanceRank < 1 || !$bossReward) {
return;
}
$todayPveBattleTimes = myself()->_getDailyV(TN_DAILY_PVE_BATTLE_TIMES, 0);
$todayPveLastGetFragmentBattle = myself()->_getDailyV(TN_DAILY_PVE_LAST_GET_FRAGMENT_BATTLE, 0);
$todayPveGetFragmentNum = myself()->_getDailyV(TN_DAILY_PVE_GET_FRAGMENT_NUM, 0);
$todayPvpGetFragmentNum = myself()->_getDailyV(TN_DAILY_PVP_GET_FRAGMENT_NUM, 0);
$dropRate = $this->pveGeminiMeta['drop_rate'];
$todayPveGetHeroFragmentNum = myself()->_getDailyV(TN_DAILY_PVE_GET_HERO_FRAGMENT_NUM, 0);
$todayPveGetGunFragmentNum = myself()->_getDailyV(TN_DAILY_PVE_GET_GUN_FRAGMENT_NUM, 0);
if ($todayPveGetHeroFragmentNum < self::MAX_DROP_NUM) {
$gamesNum = FragmentRecord::getGamesNum(FragmentRecord::HERO_FRAGMENT);
$rate = $dropRate*($gamesNum+1);
if (rand(1,100) < $rate*100){
$dropHeroFragmentId = $this->randWeight2(1);
$this->drop($dropHeroFragmentId,1);
FragmentRecord::upsertGamesNum(FragmentRecord::HERO_FRAGMENT,0);
}else{
FragmentRecord::upsertGamesNum(FragmentRecord::HERO_FRAGMENT,$gamesNum+1);
}
if ($todayPveGetFragmentNum + $todayPvpGetFragmentNum < self::MAX_DROP_NUM) {
$onlineNum = RealtimeData::getOnline();
$heroFragmentNum = FragmentPool::getHeroNum(1);
$gunFragmentNum = FragmentPool::getGunNum(1);
$instanceLevel = $this->pveGeminiMeta['gemini_lv'];
$instanceRank = $this->instanceRank;
$instanceRankRate = $this->getInstanceRankRate();
$bossReward = getReqVal('pve_kill_boss', 0) ? 1 : 0;
$heroQuality = $this->heroDto['quality'];
$heroProbability = FormulaService::calcHeroFragmentProbabilityPve
(
$heroQuality,
$onlineNum,
$heroFragmentNum,
$todayPveBattleTimes,
$instanceLevel,
$instanceRank,
$instanceRankRate,
$bossReward,
$todayPveLastGetFragmentBattle
);
$gunProbability = FormulaService::calcWeaponFragmentProbabilityPve
(
$heroQuality,
$onlineNum,
$gunFragmentNum,
$todayPveBattleTimes,
$instanceLevel,
$instanceRank,
$instanceRankRate,
$bossReward,
$todayPveLastGetFragmentBattle
);
$emptyProbability = max(1 - $heroProbability - $gunProbability, 0);
$dropIdx = $this->randWeight(array($heroProbability, $gunProbability, $emptyProbability));
$this->procDrop($dropIdx);
}
if ($todayPveGetGunFragmentNum < self::MAX_DROP_NUM) {
$gamesNum = FragmentRecord::getGamesNum(FragmentRecord::GUN_FRAGMENT);
$rate = $dropRate*($gamesNum+1);
if (rand(1,100) < $rate*100){
$dropGunFragmentId = $this->randWeight2(2);
$this->drop($dropGunFragmentId,2);
FragmentRecord::upsertGamesNum(FragmentRecord::GUN_FRAGMENT,0);
}else{
FragmentRecord::upsertGamesNum(FragmentRecord::GUN_FRAGMENT,$gamesNum+1);
}
}
// $todayPveBattleTimes = myself()->_getDailyV(TN_DAILY_PVE_BATTLE_TIMES, 0);
// $todayPveLastGetFragmentBattle = myself()->_getDailyV(TN_DAILY_PVE_LAST_GET_FRAGMENT_BATTLE, 0);
// $todayPveGetFragmentNum = myself()->_getDailyV(TN_DAILY_PVE_GET_FRAGMENT_NUM, 0);
// $todayPvpGetFragmentNum = myself()->_getDailyV(TN_DAILY_PVP_GET_FRAGMENT_NUM, 0);
//
// if ($todayPveGetFragmentNum + $todayPvpGetFragmentNum < self::MAX_DROP_NUM) {
// $onlineNum = RealtimeData::getOnline();
// $heroFragmentNum = FragmentPool::getHeroNum(1);
// $gunFragmentNum = FragmentPool::getGunNum(1);
//
// $instanceLevel = $this->pveGeminiMeta['gemini_lv'];
// $instanceRank = $this->instanceRank;
// $instanceRankRate = $this->getInstanceRankRate();
// $bossReward = getReqVal('pve_kill_boss', 0) ? 1 : 0;
// $heroQuality = $this->heroDto['quality'];
//
// $heroProbability = FormulaService::calcHeroFragmentProbabilityPve
// (
// $heroQuality,
// $onlineNum,
// $heroFragmentNum,
// $todayPveBattleTimes,
// $instanceLevel,
// $instanceRank,
// $instanceRankRate,
// $bossReward,
// $todayPveLastGetFragmentBattle
// );
// $gunProbability = FormulaService::calcWeaponFragmentProbabilityPve
// (
// $heroQuality,
// $onlineNum,
// $gunFragmentNum,
// $todayPveBattleTimes,
// $instanceLevel,
// $instanceRank,
// $instanceRankRate,
// $bossReward,
// $todayPveLastGetFragmentBattle
// );
// $emptyProbability = max(1 - $heroProbability - $gunProbability, 0);
//
// $dropIdx = $this->randWeight(array($heroProbability, $gunProbability, $emptyProbability));
// $this->procDrop($dropIdx);
// }
}
private function randWeight2($type){
$itemMeta = mt\Item::getMetaListByType(mt\Item::FRAGMENT_TYPE);
$heroFragment = array();
$gunFragment = array();
foreach ($itemMeta as $meta){
if ($meta['sub_type'] == 3 || $meta['sub_type'] == 1){
array_push($heroFragment,$meta['id']);
}
if ($meta['sub_type'] == 4 || $meta['sub_type'] == 2){
array_push($gunFragment,$meta['id']);
}
}
$weightRate = array(
array(0,4),
array(1,12),
array(2,12),
array(3,12),
array(4,12),
array(5,12),
array(6,12),
array(7,12),
array(8,12),
);
$weight = 0;
$tempData = array ();
foreach ($weightRate as $one) {
$weight += $one[1];
for ($i = 0; $i < $one[1]; $i++) {
$tempData[] = $one;
}
}
$key = $tempData[rand(0, $weight -1)][0];
switch ($type){
case 1:return $heroFragment[$key];
case 2:return $gunFragment[$key];
default:return null;
}
}
private function drop($itemId,$type){
$itemMeta = mt\Item::get($itemId);
if ($itemMeta){
$propertyChgService = new services\PropertyChgService();
$awardService = new services\AwardService();
array_push($this->reward['items'],
array(
'item_id' => $itemId,
'item_num' => 1
));
myself()->_addItems(
array(
array(
'item_id' => $itemId,
'item_num' => 1
)),
$awardService,
$propertyChgService
);
switch ($type){
case 1:myself()->_incDailyV(TN_DAILY_PVE_GET_HERO_FRAGMENT_NUM, 0, 1);break;
case 2:myself()->_incDailyV(TN_DAILY_PVE_GET_GUN_FRAGMENT_NUM, 0, 1);break;
}
}
}
private function rewardCegPvp()
@ -850,22 +939,11 @@ class BattleDataService extends BaseService {
}
}
$heroPvpCeg = FormulaService::calcHeroPvpCeg($this->heroDto, $_REQUEST);
$weaponPvpCeg1 = 0;
$weaponPvpCeg2 = 0;
if ($this->weapon1Dto) {
$weaponPvpCeg1 = FormulaService::calcWeaponPvpCeg($this->weapon1Dto, $_REQUEST);
}
if ($this->weapon2Dto) {
$weaponPvpCeg2 = FormulaService::calcWeaponPvpCeg($this->weapon2Dto, $_REQUEST);
}
error_log(json_encode(array(
'heroPvpCeg' => $heroPvpCeg,
'weaponPvpCeg1' => $weaponPvpCeg1,
'weaponPvpCeg2' => $weaponPvpCeg2,
)));
if ($heroPvpCeg > 0) {
$heroPvpCeg = Hero::gainGoldPvp($this->heroDto, $heroPvpCeg);
{
//埋点
$event = [
@ -879,56 +957,14 @@ class BattleDataService extends BaseService {
$this->reward['hero']['obtain_ceg'] = '' . ($this->heroDto['current_pvp_get_ceg'] + $heroPvpCeg);
$this->reward['total_ceg'] += $heroPvpCeg;
}
if ($weaponPvpCeg1 > 0) {
$weaponPvpCeg1 = Gun::gainGoldPvp($this->weapon1Dto, $weaponPvpCeg1);
{
//埋点
$event = [
'name' => LogService::BATTLE_AWARD_PVP,
'val' => $weaponPvpCeg1
];
LogService::productCEG($event,$this->weapon1Dto,$log_param);
}
$this->reward['weapon1']['curr_ceg'] = '' . ($this->weapon1Dto['current_pvp_get_ceg'] + $weaponPvpCeg1);
$this->reward['weapon1']['obtain_ceg'] = '' . ($this->weapon1Dto['current_pvp_get_ceg'] + $weaponPvpCeg1);
$this->reward['total_ceg'] += $weaponPvpCeg1;
}
if ($weaponPvpCeg2 > 0) {
$weaponPvpCeg2 = Gun::gainGoldPvp($this->weapon2Dto, $weaponPvpCeg2);
{
//埋点
$event = [
'name' => LogService::BATTLE_AWARD_PVP,
'val' => $weaponPvpCeg2
];
LogService::productCEG($event,$this->weapon2Dto,$log_param);
}
$this->reward['weapon2']['curr_ceg'] = '' . ($this->weapon2Dto['current_pvp_get_ceg'] + $weaponPvpCeg2);
$this->reward['weapon2']['obtain_ceg'] = '' . ($this->weapon2Dto['current_pvp_get_ceg'] + $weaponPvpCeg2);
$this->reward['total_ceg'] += $weaponPvpCeg2;
}
$this->reward['total_ceg'] .= '';
error_log(json_encode(array(
'new_heroPvpCeg' => $heroPvpCeg,
'new_weaponPvpCeg1' => $weaponPvpCeg1,
'new_weaponPvpCeg2' => $weaponPvpCeg2,
)));
$gold = $heroPvpCeg + $weaponPvpCeg1 + $weaponPvpCeg2;
$gold = $heroPvpCeg;
error_log('updateBattleData1');
$this->rankActivityService->updateBattleData($gold);
if ($heroPvpCeg>0){
NftService::addNftActive($this->heroDto,1);
}
if ($weaponPvpCeg1>0){
NftService::addNftActive($this->weapon1Dto,2);
}
if ($weaponPvpCeg2>0){
NftService::addNftActive($this->weapon2Dto,2);
}
if ($gold > 0) {
myself()->_addVirtualItem(V_ITEM_GOLD, $gold);
}

View File

@ -0,0 +1,57 @@
<?php
namespace services;
require_once('models/ChipPage.php');
use models\ChipPage;
use phpcommon\SqlHelper;
class ChipPageService extends BaseService
{
const MAX_CHIP_SLOT_NUM = 30;
const INIT_CHIP_PAGE_NUM = 3;
public function initChipPage(){
$rows = SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_chip_page',
array(
'account_id'=> myself()->_getAccountId()
)
);
if (!$rows){
for ($i=0;$i<self::INIT_CHIP_PAGE_NUM;$i++){
ChipPage::addChipPage();
}
}
if ($rows){
foreach ($rows as $row){
$this->refreshSlotState($row);
}
}
}
private function refreshSlotState($row){
$data = emptyReplace(json_decode($row['data'], true), array());
$userInfo = myself()->_getOrmUserInfo();
foreach ($data as &$val){
if ($userInfo['level'] < $val['slot_id'] && $val['state'] == 0){
$val['state'] = 0;
}else{
$val['state'] = 1;
}
}
SqlHelper::update(
myself()->_getSelfMysql(),
't_chip_page',
array(
'idx' => $row['idx']
),
array(
'data' => json_encode($data),
)
);
}
}

View File

@ -17,10 +17,17 @@ use mt;
class FormulaService extends BaseService {
public static function calcHeroPvpGold($heroDto, $params)
{
// GOLD = Min(英雄每天gold上限*10%,标准值) * f队伍排名 + g队伍击杀数
// f(队伍排名) = round1-(队伍排名-1/10 1
// g队伍击杀数= Min队伍击杀数*0.1 2
}
public static function calcHeroPvpCeg($heroDto, $params)
{
//每局实际收益=10%PVP收益*5*(50%*[每局排名TopX%对应比例]+25%*[每局PK人数排名TopX%对应比例]+15%*[每局英雄属性排名TopX%对应比例]+5%*[每局武器属性排名TopX%对应比例]+5%*[每局存活时间排名TopX%对应比例])
$upLimit = $heroDto['pvp_ceg_uplimit'];
$upLimit = $heroDto['gold_uplimit'];
$ranked = getXVal($params, 'ranked');
$kills = getXVal($params, 'kills');
$aliveTime = getXVal($params, 'alive_time');