This commit is contained in:
hujiabin 2023-12-21 17:02:53 +08:00
parent ba90c85676
commit d88a77e92f
7 changed files with 691 additions and 353 deletions

View File

@ -1693,4 +1693,49 @@ CREATE TABLE `t_avatar` (
PRIMARY KEY (`idx`),
UNIQUE KEY `hero_idx_type` (`hero_idx`, `item_type`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40101 SET character_set_client = @saved_cs_client */;
CREATE TABLE `t_unlocked_map` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id(channel + "_" + gameid + "_" + openid)',
`map_id` int(11) NOT NULL COMMENT '地图ID',
`unlockedtime` 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`),
UNIQUE KEY `account_map_id` (`account_id`, `map_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `t_exchange_code` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`exchangecode` varchar(16) NOT NULL COMMENT '兑换码',
`packageno` varchar(32) NOT NULL COMMENT '礼包id',
`codetype` int(11) NOT NULL COMMENT '兑换码类型',
`memo` varchar(40) NOT NULL DEFAULT '0' COMMENT '备注',
`channellist` varchar(255) NOT NULL DEFAULT '' COMMENT '绑定渠道列表',
`batchid` int(11) NOT NULL DEFAULT '0' COMMENT '兑换码批次号',
`usetimes` int(11) NOT NULL DEFAULT '0' COMMENT '使用次数',
`last_usetime` int(11) NOT NULL DEFAULT '0' COMMENT '最后使用时间',
`last_useuser` varchar(64) NOT NULL DEFAULT '' COMMENT '最后使用者',
`begindate` int(11) NOT NULL DEFAULT '0' COMMENT '开始时间',
`enddate` 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`),
UNIQUE KEY `exchangecode` (`exchangecode`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `t_exchange_record` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id(channel + "_" + gameid + "_" + openid)',
`exchangecode` varchar(16) NOT NULL COMMENT '兑换码',
`packageno` varchar(32) NOT NULL COMMENT '礼包id',
`codetype` int(11) NOT NULL COMMENT '兑换码类型',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`idx`),
UNIQUE KEY `exchangecode_account` (`exchangecode`,`account_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

View File

@ -0,0 +1,49 @@
begin;
CREATE TABLE `t_unlocked_map` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id(channel + "_" + gameid + "_" + openid)',
`map_id` int(11) NOT NULL COMMENT '地图ID',
`unlockedtime` 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`),
UNIQUE KEY `account_map_id` (`account_id`, `map_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `t_exchange_code` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`exchangecode` varchar(16) NOT NULL COMMENT '兑换码',
`packageno` varchar(32) NOT NULL COMMENT '礼包id',
`codetype` int(11) NOT NULL COMMENT '兑换码类型',
`memo` varchar(40) NOT NULL DEFAULT '0' COMMENT '备注',
`channellist` varchar(255) NOT NULL DEFAULT '' COMMENT '绑定渠道列表',
`batchid` int(11) NOT NULL DEFAULT '0' COMMENT '兑换码批次号',
`usetimes` int(11) NOT NULL DEFAULT '0' COMMENT '使用次数',
`last_usetime` int(11) NOT NULL DEFAULT '0' COMMENT '最后使用时间',
`last_useuser` varchar(64) NOT NULL DEFAULT '' COMMENT '最后使用者',
`begindate` int(11) NOT NULL DEFAULT '0' COMMENT '开始时间',
`enddate` 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`),
UNIQUE KEY `exchangecode` (`exchangecode`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `t_exchange_record` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id(channel + "_" + gameid + "_" + openid)',
`exchangecode` varchar(16) NOT NULL COMMENT '兑换码',
`packageno` varchar(32) NOT NULL COMMENT '礼包id',
`codetype` int(11) NOT NULL COMMENT '兑换码类型',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`idx`),
UNIQUE KEY `exchangecode_account` (`exchangecode`,`account_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
insert into version (version) values(2023092001);
commit;

View File

@ -0,0 +1,102 @@
<?php
require_once('models/ExchangeCode.php');
require_once('models/Map.php');
require_once('mt/Item.php');
require_once('services/AwardService.php');
require_once('services/PropertyChgService.php');
use models\ExchangeCode;
use models\Map;
class ActivityController extends BaseAuthedController {
public function exchangeCode(){
$code = trim(getReqVal('code', 0));
$result = ExchangeCode::find($code);
if (!$result){
myself()->_rspErr(1, 'invalid code');
return;
}
if ($result['begindate'] > myself()->_getNowTime() || $result['enddate'] < myself()->_getNowTime()){
myself()->_rspErr(1, 'invalid code');
return;
}
switch ($result['codetype']){
//一对一(一码只能兑换一次,并且该类道具一人也只能兑换一次)
case 1 :{
$recordDb = ExchangeCode::getRecordByCode($code);
if ($recordDb){
myself()->_rspErr(1, 'been used code');
return;
}
$recordDb2 = ExchangeCode::findRecordByPackage($result['packageno']);
if ($recordDb2){
myself()->_rspErr(1, 'In exchange for rewards');
return;
}
}
break;
//一对多(一码可被多人使用,仅一人一次,并且该类道具一人也只能兑换一次)
case 2 :{
$recordDb = ExchangeCode::findRecordByCode($code);
if ($recordDb){
myself()->_rspErr(1, 'been used code');
return;
}
$recordDb2 = ExchangeCode::findRecordByPackage($result['packageno']);
if ($recordDb2){
myself()->_rspErr(1, 'In exchange for rewards');
return;
}
}
break;
//多对一
case 3:{
$recordDb = ExchangeCode::getRecordByCode($code);
if ($recordDb){
myself()->_rspErr(1, 'been used code');
return;
}
}
break;
default :{
myself()->_rspErr(1, 'invalid');
return;
}
}
$itemMt = \mt\Item::get($result['packageno']);
if (!$itemMt){
myself()->_rspErr(1, "Props that don't exist");
return;
}
$items = array(
array(
'item_id' => $itemMt['id'],
'item_num' => 1
)
);
$propertyChgService = new services\PropertyChgService();
$awardService = new services\AwardService();
$this->_addItems($items, $awardService, $propertyChgService);
$fieldKv = array(
'account_id' => myself()->_getAccountId(),
'exchangecode' => $code,
'packageno' => $itemMt['id'],
'codetype' => $result['codetype'],
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
);
ExchangeCode::insetRecord($fieldKv);
ExchangeCode::updateExchangeCode($code);
$this->_rspOk();
}
public function getMap(){
$mapDb = Map::findMap();
$this->_rspData(array("data"=>$mapDb));
}
}

View File

@ -16,6 +16,7 @@ require_once('models/Parachute.php');
require_once('models/Chip.php');
require_once('models/Pass.php');
require_once('models/Avatar.php');
require_once('models/Map.php');
require_once('mt/Parameter.php');
require_once('mt/RankSeason.php');
require_once('mt/LevelUp.php');
@ -38,6 +39,7 @@ use models\UserSeasonRing;
use models\Chip;
use models\Pass;
use models\Avatar;
use models\Map;
use services\LogService;
class BaseAuthedController extends BaseController {
@ -467,7 +469,7 @@ class BaseAuthedController extends BaseController {
$headFrames = array();
foreach ($items as $item) {
//道具产出埋点
LogService::productItem($item);
// LogService::productItem($item);
if ($awardService){
$awardService->addItem($item['item_id'], $item['item_num']);
}
@ -562,6 +564,11 @@ class BaseAuthedController extends BaseController {
Avatar::addAvatar($itemMeta);
}
break;
case mt\Item::UNLOCKED_MAP_TYPE:
{
Map::upsertMap($itemMeta);
}
break;
default:
{
$this->_addLog('additems', 'invalid_item', array(

View File

@ -0,0 +1,92 @@
<?php
namespace models;
use mt;
use phpcommon\SqlHelper;
class ExchangeCode extends BaseModel
{
public static function find($code){
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_exchange_code',
array(
'exchangecode'=> $code
)
);
if (!$row){
return null;
}
return $row;
}
public static function updateExchangeCode($code){
SqlHelper::update
(myself()->_getSelfMysql(),
't_exchange_code',
array(
'exchangecode'=> $code
),
array(
'usetimes' => function(){
return "usetimes + 1";
},
"last_usetime" => myself()->_getNowTime(),
"last_useuser" => myself()->_getAccountId(),
)
);
}
public static function getRecordByCode($code){
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_exchange_record',
array(
'exchangecode'=> $code
)
);
if (!$row){
return null;
}
return $row;
}
public static function findRecordByCode($code){
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_exchange_record',
array(
'account_id'=> myself()->_getAccountId(),
'exchangecode'=> $code,
)
);
if (!$row){
return null;
}
return $row;
}
public static function findRecordByPackage($package){
$row = SqlHelper::ormSelectOne(
myself()->_getSelfMysql(),
't_exchange_record',
array(
'account_id'=> myself()->_getAccountId(),
'packageno'=> $package,
)
);
if (!$row){
return null;
}
return $row;
}
public static function insetRecord($fieldKv){
SqlHelper::insert
(myself()->_getSelfMysql(),
't_exchange_record',
$fieldKv
);
}
}

42
webapp/models/Map.php Normal file
View File

@ -0,0 +1,42 @@
<?php
namespace models;
use phpcommon\SqlHelper;
class Map extends BaseModel
{
public static function findMap(){
$rows = SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_unlocked_map',
array(
'account_id'=> myself()->_getAccountId()
)
);
return $rows;
}
public static function upsertMap($itemMeta){
SqlHelper::upsert
(myself()->_getSelfMysql(),
't_unlocked_map',
array(
'account_id' => myself()->_getAccountId(),
'map_id' => $itemMeta['param1'],
),
array(
'unlockedtime' => myself()->_getNowTime(),
),
array(
'account_id' => myself()->_getAccountId(),
'map_id' => $itemMeta['param1'],
'unlockedtime' => myself()->_getNowTime(),
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
)
);
}
}

View File

@ -1,351 +1,352 @@
<?php
namespace mt;
require_once('mt/StrHelper.php');
require_once('mt/AttrHelper.php');
use phpcommon;
class Item {
/*
0 无功能
1 不进背包道具(数值道具)
2 礼包
3 英雄
4 英雄皮肤
5 头像
6 头像框
7 枪械
8 枪械皮肤
9 功能性道具
10 材料
11 碎片
12 盲盒
13 芯片
15 碎片透明箱子
16 降落伞皮肤
19 赛季戒指
23 随机宝箱
24 Gacha
26 晶体
*/
/*
type类型为1时配置一下子类id
1.金币
2.钻石
3.角色账号经验
4.日活跃
5.周活跃
6.工会经验
7.手册经验
8.英雄熟练度
type类型为2时配置一下子类id
1.自动打开
2.手动打开
type类型为7时配置一下子类id
1.冲锋枪
2.散弹枪
3.狙击枪
4.火箭筒
5.激光枪
6.冰冻枪
7.火焰枪
type类型为9时配置一下子类id
1.改名卡
2.喇叭
3.战队改名卡
4.体力药剂
5.耐久药剂
type类型为10时配置一下子类id
1.角色材料
2.科研材料
type类型为11时配置一下子类id
1.角色碎片
2.枪械碎片
type类型为13时配置一下子类id
1.角色芯片
2.枪械芯片
type类型为15时配置一下子类id
1.角色碎片
2.枪械碎片
*/
const NONE_TYPE = 0;
const VIRTUAL_TYPE = 1;
const GIFT_PACKAGE_TYPE = 2;
const HERO_TYPE = 3;
const HERO_SKIN_TYPE = 4;
const HEAD_TYPE = 5;
const HEAD_FRAME_TYPE = 6;
const GUN_TYPE = 7;
const GUN_SKIN_TYPE = 8;
const FUNC_TYPE = 9;
const MATERIAL_TYPE = 10;
const FRAGMENT_TYPE = 11;
const BLIND_BOX_TYPE = 12;
const CHIP_TYPE = 13;
const FRAGMENT_BOX_TYPE = 15;
const PARACHUTE_TYPE = 16;
const CHIP_BOX_TYPE = 17;
const RING_TYPE = 19;
const EMOJI_TYPE = 20;
const RANDOM_BOX_TYPE = 21;
const HONOR_TYPE = 24;
const CRYSTAL_TYPE = 26;
const CHEST_BOX_TYPE = 23;
const PLANET_TYPE = 28;
const AVATAR_TYPE = 29;
const FUNC_RENAME_CARD_SUBTYPE = 1;
const FUNC_GUILD_CARD_SUBTYPE = 3;
const DRUG_TILI_SUBTYPE = 4;
const DRUG_DURABILITY_SUBTYPE = 5;
const ROLE_CHIP_SUBTYPE = 1;
const GUN_CHIP_SUBTYPE = 2;
const MATERIAL_CHIP_SUBTYPE = 3;
const HERO_FRAGMENT_SUBTYPE = 1;
const HERO_FRAGMENT_SUBTYPE_PRO = 3;
const GUN_FRAGMENT_SUBTYPE = 2;
const GUN_FRAGMENT_SUBTYPE_PRO = 4;
public static function get($id)
{
return getXVal(self::getMetaList(), $id, null);
}
public static function isType($meta, $type)
{
return $meta['type'] == $type;
}
public static function inTypes($meta, $types)
{
return in_array($meta['type'], $types);
}
public static function filter($cb)
{
foreach (self::getMetaList() as $meta) {
if (!$cb($meta)) {
return;
}
}
}
public static function getPriceInfo($meta)
{
$info = array(
'item_id' => $meta['id'],
'price_info' => array(
'cost_list' => array(),
'discount_begin_time' => phpcommon\datetimeToTimestamp($meta['discount_begin']),
'discount_end_time' => phpcommon\datetimeToTimestamp($meta['discount_end'])
)
);
$discount = splitStr1($meta['discount']);
if ($meta['gold'] > 0) {
array_push($info['price_info']['cost_list'],
array(
array(
'item_id' => V_ITEM_GOLD,
'item_num' => $meta['gold'],
'discount' => count($discount) > 0 ? (int)$discount[0] : 0
)));
}
if ($meta['diamond'] > 0) {
array_push($info['price_info']['cost_list'],
array(
array(
'item_id' => V_ITEM_DIAMOND,
'item_num' => $meta['diamond'],
'discount' => count($discount) > 1 ? (int)$discount[1] : 0
)
));
}
return $info;
}
public static function getCostItems($priceInfo, $costItemId)
{
$costGroup = null;
array_walk($priceInfo['cost_list'], function ($val) use(&$costGroup, $costItemId) {
if ($costGroup) {
return;
}
if (count($val) > 0 && $val[0]['item_id'] == $costItemId) {
$costGroup = $val;
return;
}
});
if (!$costGroup) {
return null;
}
$costItems = array();
array_walk($costGroup, function ($val) use (&$costItems, $priceInfo) {
if ($val['discount'] > 0 &&
myself()->_getNowTime() >= $priceInfo['discount_begin_time'] &&
myself()->_getNowTime() <= $priceInfo['discount_end_time']
) {
array_push($costItems, array(
'item_id' => $val['item_id'],
'item_num' => (int)($val['item_num'] * ($priceInfo['discount'] / 100)),
));
} else {
array_push($costItems, array(
'item_id' => $val['item_id'],
'item_num' => $val['item_num'],
));
}
});
return $costItems;
}
public static function getUseCostItems($itemMeta)
{
$costItems = array();
foreach (splitStr2($itemMeta['use_cost']) as $arr) {
if (count($arr) >= 2) {
array_push($costItems, array(
'item_id' => $arr[0],
'item_num' => $arr[1]
));
}
}
return $costItems;
}
public static function isRandAttrItem($itemMeta)
{
return $itemMeta['type'] == self::MATERIAL_TYPE &&
$itemMeta['sub_type'] == self::MATERIAL_CHIP_SUBTYPE;
}
public static function isRoleChipItem($itemMeta)
{
return $itemMeta['type'] == self::CHIP_TYPE &&
$itemMeta['sub_type'] == self::ROLE_CHIP_SUBTYPE;
}
public static function isGunChipItem($itemMeta)
{
return $itemMeta['type'] == self::CHIP_TYPE &&
$itemMeta['sub_type'] == self::GUN_CHIP_SUBTYPE;
}
public static function getBaseAttrs($meta)
{
$cfgAttrs = StrHelper::parseList($meta['attrs'], array('|', ':'));
$attrs = array();
foreach ($cfgAttrs as $cfgAttr) {
array_push($attrs, array(
'attr_id' => $cfgAttr[0],
'type' => $cfgAttr[1],
'val' => $cfgAttr[2],
));
}
return $attrs;
}
public static function isBagItem($type, $subType)
{
return in_array($type, array(
self::GIFT_PACKAGE_TYPE,
self::FUNC_TYPE,
self::MATERIAL_TYPE,
self::FRAGMENT_TYPE,
14,
self::FRAGMENT_BOX_TYPE,
self::CHEST_BOX_TYPE,
self::CRYSTAL_TYPE,
));
}
public static function getMetaListByType($type)
{
$metaList = array();
foreach (self::getMetaList() as $meta){
if ($meta['type'] == $type){
array_push($metaList,$meta);
}
}
return $metaList;
}
public static function isFragment($itemMeta)
{
return $itemMeta['type'] == self::FRAGMENT_TYPE;
}
public static function groupFragment($tokenIds, &$heros, &$guns, &$specHeros, &$specGuns)
{
$heroItemIds = array(
110110,
110120,
110130,
110140,
110150,
110160,
110170,
110180
);
$gunItemIds = array(
110210,
110220,
110230,
110240,
110250,
110260,
110270,
110280
);
foreach ($tokenIds as $tokenId) {
if (in_array($tokenId, $heroItemIds)) {
array_push($heros, $tokenId);
}
if (in_array($tokenId, $gunItemIds)) {
array_push($guns, $tokenId);
}
switch ($tokenId) {
case 110100:
{
array_push($specHeros, $tokenId);
}
break;
case 110200:
{
array_push($specGuns, $tokenId);
}
break;
default:
{
}
}
}
$heros = array_unique($heros);
$guns = array_unique($guns);
}
protected static function getMetaList()
{
if (!self::$metaList) {
self::$metaList = getMetaTable('item@item.php');
}
return self::$metaList;
}
protected static $metaList;
}
<?php
namespace mt;
require_once('mt/StrHelper.php');
require_once('mt/AttrHelper.php');
use phpcommon;
class Item {
/*
0 无功能
1 不进背包道具(数值道具)
2 礼包
3 英雄
4 英雄皮肤
5 头像
6 头像框
7 枪械
8 枪械皮肤
9 功能性道具
10 材料
11 碎片
12 盲盒
13 芯片
15 碎片透明箱子
16 降落伞皮肤
19 赛季戒指
23 随机宝箱
24 Gacha
26 晶体
*/
/*
type类型为1时配置一下子类id
1.金币
2.钻石
3.角色账号经验
4.日活跃
5.周活跃
6.工会经验
7.手册经验
8.英雄熟练度
type类型为2时配置一下子类id
1.自动打开
2.手动打开
type类型为7时配置一下子类id
1.冲锋枪
2.散弹枪
3.狙击枪
4.火箭筒
5.激光枪
6.冰冻枪
7.火焰枪
type类型为9时配置一下子类id
1.改名卡
2.喇叭
3.战队改名卡
4.体力药剂
5.耐久药剂
type类型为10时配置一下子类id
1.角色材料
2.科研材料
type类型为11时配置一下子类id
1.角色碎片
2.枪械碎片
type类型为13时配置一下子类id
1.角色芯片
2.枪械芯片
type类型为15时配置一下子类id
1.角色碎片
2.枪械碎片
*/
const NONE_TYPE = 0;
const VIRTUAL_TYPE = 1;
const GIFT_PACKAGE_TYPE = 2;
const HERO_TYPE = 3;
const HERO_SKIN_TYPE = 4;
const HEAD_TYPE = 5;
const HEAD_FRAME_TYPE = 6;
const GUN_TYPE = 7;
const GUN_SKIN_TYPE = 8;
const FUNC_TYPE = 9;
const MATERIAL_TYPE = 10;
const FRAGMENT_TYPE = 11;
const BLIND_BOX_TYPE = 12;
const CHIP_TYPE = 13;
const FRAGMENT_BOX_TYPE = 15;
const PARACHUTE_TYPE = 16;
const CHIP_BOX_TYPE = 17;
const RING_TYPE = 19;
const EMOJI_TYPE = 20;
const RANDOM_BOX_TYPE = 21;
const HONOR_TYPE = 24;
const CRYSTAL_TYPE = 26;
const CHEST_BOX_TYPE = 23;
const PLANET_TYPE = 28;
const AVATAR_TYPE = 29;
const UNLOCKED_MAP_TYPE = 30;
const FUNC_RENAME_CARD_SUBTYPE = 1;
const FUNC_GUILD_CARD_SUBTYPE = 3;
const DRUG_TILI_SUBTYPE = 4;
const DRUG_DURABILITY_SUBTYPE = 5;
const ROLE_CHIP_SUBTYPE = 1;
const GUN_CHIP_SUBTYPE = 2;
const MATERIAL_CHIP_SUBTYPE = 3;
const HERO_FRAGMENT_SUBTYPE = 1;
const HERO_FRAGMENT_SUBTYPE_PRO = 3;
const GUN_FRAGMENT_SUBTYPE = 2;
const GUN_FRAGMENT_SUBTYPE_PRO = 4;
public static function get($id)
{
return getXVal(self::getMetaList(), $id, null);
}
public static function isType($meta, $type)
{
return $meta['type'] == $type;
}
public static function inTypes($meta, $types)
{
return in_array($meta['type'], $types);
}
public static function filter($cb)
{
foreach (self::getMetaList() as $meta) {
if (!$cb($meta)) {
return;
}
}
}
public static function getPriceInfo($meta)
{
$info = array(
'item_id' => $meta['id'],
'price_info' => array(
'cost_list' => array(),
'discount_begin_time' => phpcommon\datetimeToTimestamp($meta['discount_begin']),
'discount_end_time' => phpcommon\datetimeToTimestamp($meta['discount_end'])
)
);
$discount = splitStr1($meta['discount']);
if ($meta['gold'] > 0) {
array_push($info['price_info']['cost_list'],
array(
array(
'item_id' => V_ITEM_GOLD,
'item_num' => $meta['gold'],
'discount' => count($discount) > 0 ? (int)$discount[0] : 0
)));
}
if ($meta['diamond'] > 0) {
array_push($info['price_info']['cost_list'],
array(
array(
'item_id' => V_ITEM_DIAMOND,
'item_num' => $meta['diamond'],
'discount' => count($discount) > 1 ? (int)$discount[1] : 0
)
));
}
return $info;
}
public static function getCostItems($priceInfo, $costItemId)
{
$costGroup = null;
array_walk($priceInfo['cost_list'], function ($val) use(&$costGroup, $costItemId) {
if ($costGroup) {
return;
}
if (count($val) > 0 && $val[0]['item_id'] == $costItemId) {
$costGroup = $val;
return;
}
});
if (!$costGroup) {
return null;
}
$costItems = array();
array_walk($costGroup, function ($val) use (&$costItems, $priceInfo) {
if ($val['discount'] > 0 &&
myself()->_getNowTime() >= $priceInfo['discount_begin_time'] &&
myself()->_getNowTime() <= $priceInfo['discount_end_time']
) {
array_push($costItems, array(
'item_id' => $val['item_id'],
'item_num' => (int)($val['item_num'] * ($priceInfo['discount'] / 100)),
));
} else {
array_push($costItems, array(
'item_id' => $val['item_id'],
'item_num' => $val['item_num'],
));
}
});
return $costItems;
}
public static function getUseCostItems($itemMeta)
{
$costItems = array();
foreach (splitStr2($itemMeta['use_cost']) as $arr) {
if (count($arr) >= 2) {
array_push($costItems, array(
'item_id' => $arr[0],
'item_num' => $arr[1]
));
}
}
return $costItems;
}
public static function isRandAttrItem($itemMeta)
{
return $itemMeta['type'] == self::MATERIAL_TYPE &&
$itemMeta['sub_type'] == self::MATERIAL_CHIP_SUBTYPE;
}
public static function isRoleChipItem($itemMeta)
{
return $itemMeta['type'] == self::CHIP_TYPE &&
$itemMeta['sub_type'] == self::ROLE_CHIP_SUBTYPE;
}
public static function isGunChipItem($itemMeta)
{
return $itemMeta['type'] == self::CHIP_TYPE &&
$itemMeta['sub_type'] == self::GUN_CHIP_SUBTYPE;
}
public static function getBaseAttrs($meta)
{
$cfgAttrs = StrHelper::parseList($meta['attrs'], array('|', ':'));
$attrs = array();
foreach ($cfgAttrs as $cfgAttr) {
array_push($attrs, array(
'attr_id' => $cfgAttr[0],
'type' => $cfgAttr[1],
'val' => $cfgAttr[2],
));
}
return $attrs;
}
public static function isBagItem($type, $subType)
{
return in_array($type, array(
self::GIFT_PACKAGE_TYPE,
self::FUNC_TYPE,
self::MATERIAL_TYPE,
self::FRAGMENT_TYPE,
14,
self::FRAGMENT_BOX_TYPE,
self::CHEST_BOX_TYPE,
self::CRYSTAL_TYPE,
));
}
public static function getMetaListByType($type)
{
$metaList = array();
foreach (self::getMetaList() as $meta){
if ($meta['type'] == $type){
array_push($metaList,$meta);
}
}
return $metaList;
}
public static function isFragment($itemMeta)
{
return $itemMeta['type'] == self::FRAGMENT_TYPE;
}
public static function groupFragment($tokenIds, &$heros, &$guns, &$specHeros, &$specGuns)
{
$heroItemIds = array(
110110,
110120,
110130,
110140,
110150,
110160,
110170,
110180
);
$gunItemIds = array(
110210,
110220,
110230,
110240,
110250,
110260,
110270,
110280
);
foreach ($tokenIds as $tokenId) {
if (in_array($tokenId, $heroItemIds)) {
array_push($heros, $tokenId);
}
if (in_array($tokenId, $gunItemIds)) {
array_push($guns, $tokenId);
}
switch ($tokenId) {
case 110100:
{
array_push($specHeros, $tokenId);
}
break;
case 110200:
{
array_push($specGuns, $tokenId);
}
break;
default:
{
}
}
}
$heros = array_unique($heros);
$guns = array_unique($guns);
}
protected static function getMetaList()
{
if (!self::$metaList) {
self::$metaList = getMetaTable('item@item.php');
}
return self::$metaList;
}
protected static $metaList;
}