game/_incl_data/class/User/Stats.php
2023-11-09 19:24:47 +02:00

1393 lines
52 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace User;
use Core\Config;
use Core\Db;
use Helper\Conversion;
use User;
class Stats
{
private User $u;
private array $sysNames = [];
public function __construct(User $user)
{
$this->u = $user;
$this->sysNames = Db::getColumn('select sys_name from const_stats where is_bonus = true');
$this->sysNames['hpAll'] = $this->sysNames['hpall'];
$this->sysNames['mpAll'] = $this->sysNames['mpall'];
unset($this->sysNames['hpall'], $this->sysNames['mpall']);
}
/**
* Собирает суммы всех бонусов с одетых предметов, комплектов предметов, активных эфектов.
* @param int $userId
* @return array
*/
public static function getAllBonuses(int $userId): array
{
$iData = [];
$im = ItemsModel::getWearedItems($userId);
foreach ($im as $item) {
$iData[] = $item['data'];
}
$iData[] = Db::getValue('select data from eff_users where uid = ? and `delete` = 0', [$userId]);
$params = [];
$complects = [];
foreach ($iData as $datum) {
$arr = Conversion::dataStringToArray($datum);
foreach ($arr as $k => $v) {
if ($k === 'complect') {
if (isset($complects[$v])) {
$complects[$v]++;
} else {
$complects[$v] = 1;
}
}
if (strpos($k, 'add_') === false) {
continue;
}
$k = str_replace('add_', '', $k);
self::setBonusValue($params, $k, $v);
}
}
$params = self::addComplectsBonuses($complects, $params);
return $params;
}
private static function setBonusValue(array &$array, $key, $value)
{
if (isset($array[$key])) {
$array[$key] += $value;
} else {
$array[$key] = $value;
}
}
/**
* @param array $complects
* @param array $params
* @return array
*/
private static function addComplectsBonuses(array $complects, array $params): array
{
$cdata = [];
if (!empty($complects)) {
foreach ($complects as $complectId => $wearedItemsQuantity) {
$cdata[] = Db::getValue('select data from complects where com = ? and x <= ? order by x desc limit 1', [$complectId, $wearedItemsQuantity]);
}
foreach ($cdata as $datum) {
$arr = Conversion::dataStringToArray($datum);
foreach ($arr as $k => $v) {
self::setBonusValue($params, $k, $v);
}
}
}
return $params;
}
/** Данные для отрисовки логина и полосок жизни\маны.
* @param User $u
* @return object
*/
public static function getLoginHpManaBars(User $u): object
{
$hpNow = floor($u->stats['hpNow']);
$hpAll = $u->stats['hpAll'];
$mpNow = floor($u->stats['mpNow']);
$mpAll = $u->stats['mpAll'];
//floor(120 / 100 * ($hpNow / $hpAll * 100)); // ??????
$ph = ($hpAll > 0 && $hpNow > 0) ? floor(120 / $hpNow / $hpAll) : 0;
$pm = ($mpAll > 0 && $mpNow > 0) ? floor(120 / $mpNow / $mpAll) : 0;
return (object)[
'uid' => $u->info['id'],
'login' => $u->microLogin($u->info['id']),
'hpbarwidth' => $ph,
'mpbarwidth' => $pm,
'hpbartext' => ' ' . $hpNow . '/' . $hpAll,
'mpbartext' => ' ' . $mpNow . '/' . $mpAll,
'divstyle' => $pm === 0 ? ' margin-top:13px;' : '',
'hasmana' => $mpAll > 0,
];
}
public function getStats(int|array|null $uid = null, $i1 = 0, $res = 0, $reimg = false, $btl_cache = false): array
{
if (empty($uid) || $uid == $this->u->info['id'] && $res != 1) {
//$u = $this->u->info;
$u = User::getInfo($uid);
} elseif (is_array($uid)) {
$u = $uid;
} else {
$u = User::getInfo($uid);
}
if (!isset($u['id'])) {
return [];
}
$st = array_fill_keys($this->sysNames, 0);
$s_vi = [];
$s_v = [];
$u['clanpos'] = 0;
if ($u['clan'] > 0) {
$r1 = Db::getValue('select pos from aaa_clan_reting_list where clan = ? and date = ? limit 1', [$u['clan'], date('dmY')]);
if (!empty($r1)) {
$st['clanpos'] = $r1;
}
}
$lvl = Db::getRow('select * from levels where upLevel = ?', [$u['upLevel']]);
if (isset($lvl['upLevel'])) {
$st['levels'] = $lvl;
} else {
$st['levels'] = 'undefined';
}
$st['id'] = $u['id'];
$st['login'] = $u['login'];
$st['lvl'] = $u['level'];
$st['hpNow'] = $u['hpNow'];
$st['hpAll'] = 0;
$st['mpNow'] = $u['mpNow'];
$st['mpAll'] = 0;
$st['zona'] = 1;
$st['zonb'] = 2;
$st['items'] = [];
$st['effects'] = [];
$st['reting'] = 0;
$st['vip'] = $u['vip'];
$stats = Conversion::dataStringToArray($u['stats']);
foreach ($stats as $stat => $value) {
if (isset($st[$stat]) && is_numeric($value)) {
$st[$stat] += $value;
} else {
$st[$stat] = $value;
}
}
unset($stats);
$baseStats = $st;
//Шаблонные картинки
if ($this->u->info['id'] === $u['id'] || $reimg) {
$itemsImages = Db::getRows('select * from items_img where uid = ? and img_id != 0', [$u['id']]);
foreach ($itemsImages as $itemsImage) {
$reimage = Db::getRow('select * from reimage where ((uid = ? and clan = 0) or clan = ?) and good > 0 and bad = 0 and id = ?', [$u['id'], $u['clan'], $itemsImage['img_id']]);
if (isset($reimage['id'])) {
$st['items_img'][$itemsImage['type']] = $reimage['id'] . '.' . $reimage['format'];
} else {
Db::sql('update items_img set img_id = 0 where id = ?', [$itemsImage['id']]);
}
}
}
//Характеристики от предметов //ТУТ tr_lvl
// Вся вторая строчка - спасибо Users.
$wearedItems = Db::getRows('select type, data, inOdet,
item_id, inslot, useInBattle, btl_zd, iznosNOW, iznosMAX, magic_inci, name, items_users.id, img, `2h`
from items_users left join items_main on items_main.id = item_id where inOdet != 0 and uid = ?', [$u['id']]);
$h = 0;
$hnd1 = 0;
$hnd2 = 0;
$sht1 = 0;
$reitm = [];
$coms = []; // комплекты
$dom = [];
$oza = [
1 => [0, 0],
2 => [0, 0],
3 => [0, 0],
4 => [0, 0],
]; //особенности защиты
$ozm = [
1 => [0, 0],
2 => [0, 0],
3 => [0, 0],
4 => [0, 0],
]; //особенности магии
$st['reting'] = 0;
foreach ($wearedItems as $wearedItem) {
$st['wp' . $wearedItem['inOdet'] . 'id'] = $h;
$st['items'][$h] = $wearedItem;
$h++;
if ($wearedItem['inOdet'] == 3 && (($wearedItem['type'] >= 18 && $wearedItem['type'] <= 24) || $wearedItem['type'] == 26 || $wearedItem['type'] == 27 || $wearedItem['type'] == 28)) {
$hnd1 = 1;
}
if ($wearedItem['inOdet'] == 14 && (($wearedItem['type'] >= 18 && $wearedItem['type'] <= 24) || $wearedItem['type'] == 26 || $wearedItem['type'] == 27 || $wearedItem['type'] == 28)) {
$hnd2 = 1;
} elseif ($wearedItem['inOdet'] == 14 && $wearedItem['type'] == 13) {
$sht1 = 1;
}
$sti = Conversion::dataStringToArray($wearedItem['data']);
if ($wearedItem['inOdet'] <= 18 && $wearedItem['inOdet'] > 0) {
$st['reting'] += 1;
}
$ko = 1;
while ($ko <= 4) {
if (isset($sti['add_oza' . $ko])) {
if (isset($sti['add_oza'])) {
if ($sti['add_oza'] == 1) {
//Слабая
$oza[$ko][0] += 1;
$oza[$ko][1] += 9;
} elseif ($sti['add_oza'] == 2) {
//Нормальная
$oza[$ko][0] += 20;
$oza[$ko][1] += 39;
} elseif ($sti['add_oza'] == 3) {
//Хорошая
$oza[$ko][0] += 40;
$oza[$ko][1] += 69;
} elseif ($sti['add_oza'] == 4) {
//Посредственная
$oza[$ko][0] += 10;
$oza[$ko][1] += 19;
} elseif ($sti['add_oza'] == 5) {
//Великолепная
$oza[$ko][0] += 70;
$oza[$ko][1] += 89;
}
}
if (isset($sti['add_ozm'])) {
if ($sti['add_ozm'] == 1) {
//Слабая
$ozm[$ko][0] += 1;
$ozm[$ko][1] += 9;
} elseif ($sti['add_ozm'] == 2) {
//Нормальная
$ozm[$ko][0] += 20;
$ozm[$ko][1] += 39;
} elseif ($sti['add_ozm'] == 3) {
//Хорошая
$ozm[$ko][0] += 40;
$ozm[$ko][1] += 69;
} elseif ($sti['add_ozm'] == 4) {
//Посредственная
$ozm[$ko][0] += 10;
$ozm[$ko][1] += 19;
} elseif ($sti['add_ozm'] == 5) {
//Великолепная
$ozm[$ko][0] += 70;
$ozm[$ko][1] += 89;
}
} else {
$ozm[$ko][0] += 1;
$ozm[$ko][1] += 9;
}
if ($sti['add_oza' . $ko] == 1) {
//Слабая
$oza[$ko][0] += 1;
$oza[$ko][1] += 9;
} elseif ($sti['add_oza' . $ko] == 2) {
//Нормальная
$oza[$ko][0] += 20;
$oza[$ko][1] += 39;
} elseif ($sti['add_oza' . $ko] == 3) {
//Хорошая
$oza[$ko][0] += 40;
$oza[$ko][1] += 69;
} elseif ($sti['add_oza' . $ko] == 4) {
//Посредственная
$oza[$ko][0] += 10;
$oza[$ko][1] += 19;
} elseif ($sti['add_oza' . $ko] == 5) {
//Великолепная
$oza[$ko][0] += 70;
$oza[$ko][1] += 89;
}
if (isset($sti['add_ozm' . $ko])) {
if ($sti['add_ozm' . $ko] == 1) {
//Слабая
$ozm[$ko][0] += 1;
$ozm[$ko][1] += 9;
} elseif ($sti['add_ozm' . $ko] == 2) {
//Нормальная
$ozm[$ko][0] += 20;
$ozm[$ko][1] += 39;
} elseif ($sti['add_ozm' . $ko] == 3) {
//Хорошая
$ozm[$ko][0] += 40;
$ozm[$ko][1] += 69;
} elseif ($sti['add_ozm' . $ko] == 4) {
//Посредственная
$ozm[$ko][0] += 10;
$ozm[$ko][1] += 19;
} elseif ($sti['add_ozm' . $ko] == 5) {
//Великолепная
$ozm[$ko][0] += 70;
$ozm[$ko][1] += 89;
}
} else {
$ozm[$ko][0] += 1;
$ozm[$ko][1] += 9;
}
}
$ko++;
}
if (isset($sti['art'])) {
if (!isset($st['art'])) {
$st['art'] = 0;
}
$st['art'] += $sti['art'];
}
if (isset($sti['maks_itm'])) {
if (!isset($st['maks_itm'])) {
$st['maks_itm'] = 0;
}
$st['maks_itm'] += $sti['maks_itm'];
}
if (isset($sti['complect'])) {
$coms[count($coms)]['id'] = $sti['complect'];
if (!isset($coms['com'][$sti['complect']])) {
$coms['com'][$sti['complect']] = 0;
if (!isset($coms['new'])) {
$coms['new'] = [];
}
$coms['new'][count($coms['new'])] = $sti['complect'];
}
$coms['com'][$sti['complect']]++;
}
if (isset($sti['complect2'])) {
$coms[count($coms)]['id'] = $sti['complect2'];
if (!isset($coms['com'][$sti['complect2']])) {
$coms['com'][$sti['complect2']] = 0;
if (!isset($coms['new'])) {
$coms['new'] = [];
}
$coms['new'][count($coms['new'])] = $sti['complect2'];
}
$coms['com'][$sti['complect2']]++;
}
if (isset($sti['zonb']) && $sti['zonb'] != 0) {
if (!isset($st['zonb'])) {
$st['zonb'] = 0;
}
$st['zonb'] += $sti['zonb'];
}
if (isset($sti['zona']) && $sti['zona'] != 0) {
if (!isset($st['zona'])) {
$st['zona'] = 0;
}
$st['zona'] += $sti['zona'];
}
//Добавляем статы от данного предмета
if (!isset($sti['restart_stats'])) {
$i = 0;
while ($i < count($this->sysNames)) {
//Действует на (Действует на)
if (isset($this->sysNames[$i]) && isset($sti['add_' . $this->sysNames[$i]])) {
if (!isset($st[$this->sysNames[$i]])) {
$st[$this->sysNames[$i]] = 0;
}
if ($this->sysNames[$i] != 'zmproc' && $this->sysNames[$i] != 'zaproc') {
$st[$this->sysNames[$i]] += intval($sti['add_' . $this->sysNames[$i]]);
} else {
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
$st[$this->sysNames[$i]] = $st[$this->sysNames[$i]] - $st[$this->sysNames[$i]] / 100 * intval($sti['add_' . $this->sysNames[$i]]);
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
}
}
$i++;
}
} else {
$reitm[] = $sti;
}
$i = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i]) && isset($sti['sv_' . $this->sysNames[$i]])) {
if (!isset($s_v[$this->sysNames[$i]])) {
$s_v[$this->sysNames[$i]] = 0;
$s_v['z'][$wearedItem['inOdet']][$this->sysNames[$i]] = 0;
}
$s_v[$this->sysNames[$i]] += intval($sti['sv_' . $this->sysNames[$i]]);
$s_v['z'][$wearedItem['inOdet']][$this->sysNames[$i]] += intval($sti['sv_' . $this->sysNames[$i]]);
}
$i++;
}
}
//Сохраненные хар-ки и умения
if (!empty($reitm)) {
$i39 = [0 => 0, 1 => 0, 2 => 0];
$i = 0;
while ($i < count($reitm)) {
if (isset($reitm[$i]['sm_skill']) && $i39[0] == 0) {
//умения
$i9 = 1;
$i39[0] = 1;
while ($i9 <= 7) {
$st['a' . $i9] = $st['a' . $i9] - $baseStats['a' . $i9] + $reitm[$i]['add_a' . $i9];
$st['mg' . $i9] = $st['mg' . $i9] - $baseStats['mg' . $i9] + $reitm[$i]['add_mg' . $i9];
$i9++;
}
} elseif (isset($reitm[$i]['sm_abil']) && $i39[1] == 0) {
//статы
$i9 = 1;
$i39[1] = 1;
while ($i9 <= 12) {
$st['s' . $i9] = $st['s' . $i9] - $baseStats['s' . $i9] + $reitm[$i]['add_s' . $i9];
$i9++;
}
} elseif (isset($reitm[$i]['sm_skill2']) && $i39[2] == 0) {
//навыки
$i39[2] = 1;
}
$i++;
}
}
$st = $this->addMedalsBonuses($u['id'], $st);
$noeffectbattle = false;
if ($u['battle'] > 0) {
$noeffectbattle = (bool)Db::getValue("select 1 from battle_actions where uid = ? and vars = 'noeffectbattle1' and btl = ? limit 1", [$u['id'], $u['battle']]);
}
//Характеристики от эффектов
$h = 0;
$nbs = [
4899 => 0,
4900 => 0,
4901 => 0,
4902 => 0,
4903 => 0,
4904 => 0,
4905 => 0,
4906 => 0,
4907 => 0,
4908 => 0,
4909 => 0,
];
$prsu = [];
if (!$noeffectbattle) {
$efs = mysql_query(
'SELECT
`eu`.`id`,
`eu`.`id_eff`,
`eu`.`tr_life_user`,
`eu`.`uid`,
`eu`.`name`,
`eu`.`data`,
`eu`.`overType`,
`eu`.`timeUse`,
`eu`.`timeAce`,
`eu`.`user_use`,
`eu`.`delete`,
`eu`.`v1`,
`eu`.`v2`,
`eu`.`img2`,
`eu`.`x`,
`eu`.`hod`,
`eu`.`bj`,
`eu`.`sleeptime`,
`eu`.`no_Ace`,
`em`.`id2`,`em`.`mname`,`em`.`type1`,`em`.`img`,`em`.`mdata`,`em`.`actionTime`,`em`.`type2`,`em`.`type3`,`em`.`onlyOne`,`em`.`oneType`,`em`.`noAce`,`em`.`see`,`em`.`info`,`em`.`overch`,`em`.`bp`,`em`.`noch` FROM `eff_users` AS `eu` LEFT JOIN `eff_main` AS `em` ON (`eu`.`id_eff` = `em`.`id2`) WHERE `eu`.`uid`="' . mysql_real_escape_string(
$u['id']
) . '" AND `eu`.`delete`="0" AND `eu`.`deactiveTime` < "' . time() . '" AND `eu`.`v1`!="priem" ORDER BY `eu`.`id` DESC LIMIT 50'
);
while ($e = mysql_fetch_array($efs)) {
if ($u['dnow'] == 0) {
if ($u['battle'] == 0) {
mysql_query(
'DELETE FROM `eff_users` WHERE `id_eff` = "' . $e['id_eff'] . '" AND `uid` = "' . $u['id'] . '" AND `id` != "' . $e['id'] . '" ORDER BY `id` ASC'
);
//Переводим в заряды
if ($e['v1'] != 'priem' && $e['hod'] != -1) {
mysql_query(
'UPDATE `eff_users` SET `hod` = "-1",`timeUse` = "' . (time() + ($e['hod'] * Config::get(
'effz'
)) - $e['actionTime']) . '" WHERE `id` = "' . $e['id'] . '" LIMIT 1'
);
}
} else {
if ($e['v1'] != 'priem' && Config::get('effz') > 0 && $e['hod'] == -1) {
$efzz = round(($e['timeUse'] + $e['actionTime'] + $e['timeAce']) - time());
if ($efzz > 0) {
mysql_query(
'UPDATE `eff_users` SET `hod` = "' . ($efzz / Config::get(
'effz'
)) . '" WHERE `id` = "' . $e['id'] . '" LIMIT 1'
);
}
}
}
}
if ($e['timeUse'] + $e['timeAce'] + $e['actionTime'] > time() || $e['timeUse'] == 77) {
if ($e['v1'] == 'priem') {
$prsu[$e['v2']] = 0 + $prsu['x'];
}
$st['effects'][$h] = $e;
$h++;
$sts = Conversion::dataStringToArray($e['data']);
if (isset($sts['itempl']) && $sts['itempl'] > 0) {
$nbs[$sts['itempl']] += 1;
}
if (isset($sts['puti'])) {
$st['puti'] = $sts['puti'];
}
if (isset($sts['add_silver'])) {
$st['slvtm'] = $e['timeUse'] + $e['actionTime'];
}
$i = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i])) {
if (isset($sts['add_' . $this->sysNames[$i]])) {
if (!isset($sti[$this->sysNames[$i]])) {
$sti[$this->sysNames[$i]] = 0;
}
$sti[$this->sysNames[$i]] += intval($sts['add_' . $this->sysNames[$i]]);
}
if (isset($sts['add_' . $this->sysNames[$i]])) {
if (!isset($st[$this->sysNames[$i]])) {
$st[$this->sysNames[$i]] = 0;
}
if ($this->sysNames[$i] != 'zaproc' && $this->sysNames[$i] != 'zmproc') {
$st[$this->sysNames[$i]] += intval($sts['add_' . $this->sysNames[$i]]);
} else {
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
$st[$this->sysNames[$i]] = $st[$this->sysNames[$i]] - $st[$this->sysNames[$i]] / 100 * intval(
$sts['add_' . $this->sysNames[$i]]
);
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
}
}
}
$i++;
}
$i = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i])) {
if (isset($sts['sv_' . $this->sysNames[$i]])) {
if (!isset($s_vi[$this->sysNames[$i]])) {
$s_vi[$this->sysNames[$i]] = 0;
}
$s_vi[$this->sysNames[$i]] += intval($sts['sv_' . $this->sysNames[$i]]);
}
if (isset($sts['sv_' . $this->sysNames[$i]])) {
if (!isset($s_v[$this->sysNames[$i]])) {
$s_v[$this->sysNames[$i]] = 0;
}
$s_v[$this->sysNames[$i]] += intval($sts['sv_' . $this->sysNames[$i]]);
}
}
$i++;
}
} else {
//удаляем эффект
if ($e['img2'] != 'tz.gif' || $u['id'] == $this->u->info['id']) {
if ($e['sleeptime'] == 0) {
$this->u->endEffect($e['id'], $u);
}
$st['act'] = 1;
}
}
}
} else {
$st['noeffectbattle1'] = 1;
}//Заглушки от эффектов
if ($nbs[4899] > 0) {
//Зеленый комплект
$st['items_img'][8] = 'robe_illusion4.gif';
$st['items_img'][11] = 'leg_illusion4.gif';
} elseif ($nbs[4900] > 0) {
//Золото комплект
$st['items_img'][8] = 'robe_illusion5.gif';
$st['items_img'][11] = 'leg_illusion5.gif';
} elseif ($nbs[4901] > 0) {
//Голубой комплект
$st['items_img'][8] = 'robe_illusion3.gif';
$st['items_img'][11] = 'leg_illusion3.gif';
} elseif ($nbs[4902] > 0) {
//Синий комплект
$st['items_img'][8] = 'robe_illusion6.gif';
$st['items_img'][11] = 'leg_illusion6.gif';
} elseif ($nbs[4903] > 0) {
//Желтый комплект
$st['items_img'][8] = 'robe_illusion8.gif';
$st['items_img'][11] = 'leg_illusion8.gif';
} elseif ($nbs[4904] > 0) {
//Сиреневое платье
$st['items_img'][8] = 'robe_illusion7.gif';
$st['items_img'][11] = 'leg_illusion7.gif';
} elseif ($nbs[4905] > 0) {
//Оранжевое платье
$st['items_img'][8] = 'robe_illusion9.gif';
$st['items_img'][11] = 'leg_illusion9.gif';
} elseif ($nbs[4908] > 0) {
//Набор Темной Одежды
$st['items_img'][8] = 'robe_illusion2.gif';
$st['items_img'][11] = 'leg_illusion2.gif';
$st['items_img'][10] = 'boots_illusion2.gif';
$st['items_img'][9] = 'belt_illusion2.gif';
$st['items_img'][5] = 'naruchi_illusion2.gif';
$st['items_img'][4] = 'helmet_illusion2.gif';
$st['items_img'][12] = 'perchi_illusion2.gif';
} elseif ($nbs[4906] > 0) {
//Набор Бриллиантовой Одежды
$st['items_img'][8] = 'robe_illusion1.gif';
$st['items_img'][11] = 'leg_illusion1.gif';
$st['items_img'][10] = 'boots_illusion1.gif';
$st['items_img'][9] = 'belt_illusion1.gif';
$st['items_img'][5] = 'naruchi_illusion1.gif';
$st['items_img'][4] = 'helmet_illusion1.gif';
$st['items_img'][12] = 'perchi_illusion1.gif';
}
if ($nbs[4909] > 0) {
//Набор Золотых украшений
$st['items_img'][13] = 'ring_illusion2.gif';
$st['items_img'][17] = 'ring_illusion2.gif';
$st['items_img'][18] = 'ring_illusion2.gif';
$st['items_img'][14] = 'amulet_illusion2.gif';
$st['items_img'][15] = 'earrings_illusion2.gif';
} elseif ($nbs[4907] > 0) {
//Набор Золотых украшений
$st['items_img'][13] = 'ring_illusion1.gif';
$st['items_img'][17] = 'ring_illusion1.gif';
$st['items_img'][18] = 'ring_illusion1.gif';
$st['items_img'][14] = 'amulet_illusion1.gif';
$st['items_img'][15] = 'earrings_illusion1.gif';
}
if ($u['battle'] > 0) {
//Характеристики от приемов
$efs = mysql_query(
'SELECT `eu`.`id`,
`eu`.`id_eff`,
`eu`.`uid`,
`eu`.`name`,
`eu`.`data`,
`eu`.`overType`,
`eu`.`timeUse`,
`eu`.`timeAce`,
`eu`.`user_use`,
`eu`.`tr_life_user`,
`eu`.`delete`,
`eu`.`v1`,
`eu`.`v2`,
`eu`.`img2`,
`eu`.`x`,
`eu`.`hod`,
`eu`.`bj`,
`eu`.`sleeptime`,
`eu`.`no_Ace` FROM `eff_users` AS `eu` WHERE `eu`.`uid`="' . mysql_real_escape_string(
$u['id']
) . '" AND `eu`.`delete`="0" AND `eu`.`deactiveTime` < "' . time() . '" AND `eu`.`v1` = "priem" ORDER BY `eu`.`id` ASC'
);
$st['set_pog'] = [];
$st['set_pog2'] = [];
while ($e = mysql_fetch_array($efs)) {
$e['type1'] = 14;
$e['img'] = $e['img2'];
if ($e['tr_life_user'] > 0) {
$trlu = mysql_fetch_array(
mysql_query('SELECT `hpNow` FROM `stats` WHERE `id` = "' . $e['tr_life_user'] . '" LIMIT 1')
);
if (floor($trlu['hpNow']) < 1) {
$this->u->endEffect($e['id'], $u);
$st['act'] = 1;
}
}
if ($e['timeUse'] + $e['timeAce'] + $e['actionTime'] > time() || $e['timeUse'] == 77) {
if ($e['v1'] == 'priem') {
$prsu[$e['v2']] = 0 + $prsu['x'];
}
$st['effects'][$h] = $e;
$h++;
$sts = Conversion::dataStringToArray($e['data']);
if ($e['v2'] == 217) {
$st['raztac'] = 1;
}
if (isset($sts['add_pog'])) {
$ctt = count($st['set_pog']);
$st['set_pog'][$ctt]['id'] = $h;
$st['set_pog'][$ctt]['y'] = $sts['add_pog'];
unset($ctt);
}
if (isset($sts['natoe'])) {
$st['set_natoe']['id'] = $h;
$st['set_natoe']['a'] = 0 + $sts['natoe_end'];
$st['set_natoe']['b'] = 0 + $sts['natoe'];
$st['set_natoe']['eff_id'] = $e['id'];
$st['set_natoe']['t'] = 0 + $sts['natoe_type'];
$st['set_natoe']['user_id'] = $e['tr_life_user'];
}
if (isset($sts['add_pog2'])) {
$ctt = count($st['set_pog2']);
$st['set_pog2'][$ctt]['id'] = $h;
$st['set_pog2'][$ctt]['y'] = $sts['add_pog2'];
$st['set_pog2'][$ctt]['p'] = $sts['add_pog2p'];
$st['set_pog2'][$ctt]['m'] = $sts['add_pog2mp'];
unset($ctt);
}
$i = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i]) && isset($sts['add_' . $this->sysNames[$i]])) {
if ($this->sysNames[$i] != 'zaproc' && $this->sysNames[$i] != 'zmproc') {
if (!isset($sti[$this->sysNames[$i]])) {
$sti[$this->sysNames[$i]] = 0;
}
$sti[$this->sysNames[$i]] += intval($sts['add_' . $this->sysNames[$i]]);
if (!isset($st[$this->sysNames[$i]])) {
$st[$this->sysNames[$i]] = 0;
}
$st[$this->sysNames[$i]] += intval($sts['add_' . $this->sysNames[$i]]);
} else {
$sti[$this->sysNames[$i]] = 100 - $sti[$this->sysNames[$i]];
$sti[$this->sysNames[$i]] = $sti[$this->sysNames[$i]] - $sti[$this->sysNames[$i]] / 100 * intval(
$sts['add_' . $this->sysNames[$i]]
);
$sti[$this->sysNames[$i]] = 100 - $sti[$this->sysNames[$i]];
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
$st[$this->sysNames[$i]] = $st[$this->sysNames[$i]] - $st[$this->sysNames[$i]] / 100 * intval($sts['add_' . $this->sysNames[$i]]);
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
}
}
$i++;
}
$i = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i]) && isset($sts['add_' . $this->sysNames[$i]])) {
if (!isset($s_vi[$this->sysNames[$i]])) {
$s_vi[$this->sysNames[$i]] = 0;
}
$s_vi[$this->sysNames[$i]] += intval($sts['sv_' . $this->sysNames[$i]]);
if (!isset($s_v[$this->sysNames[$i]])) {
$s_v[$this->sysNames[$i]] = 0;
}
$s_v[$this->sysNames[$i]] += intval($sts['sv_' . $this->sysNames[$i]]);
}
$i++;
}
} else {
//удаляем эффект
$this->u->endEffect($e['id'], $u);
$st['act'] = 1;
}
}
}
//Характеристики от статов
$st['hpAll'] += $st['s4'] * 5;
$st['mpAll'] += $st['s6'] * 10;
//Турнир
$st['m1'] += $st['s3'] * 5;
// мф.анти-крит = 2.5
$st['m2'] += $st['s3'] * 5;
// мф.уворот = 2.5
$st['m4'] += $st['s2'] * 5;
// мф.анти-уворот = 2.5
$st['m5'] += $st['s2'] * 5;
$st['za'] += $st['s4'] * 1.0;
$st['zm'] += $st['s4'] * 0.0;
$st['m19'] += round($st['s3'] * 0.03);
//Мощности
//Мощность против "Мощность крит. урона". Гамс
$st['antm3'] += $st['s5'] * 0.5;
//Бонусы комплектов
$i = 0;
if (!empty($coms['new']) && is_array($coms['new'])) {
while ($i <= count($coms['new'])) {
if (isset($coms['new'][$i])) {
//$coms[$i]['id'] - id комплекта, $j - кол-во предметов данного комплекта
$j = $coms['com'][$coms['new'][$i]];
$com = mysql_fetch_array(
mysql_query(
'SELECT `id`,`com`,`name`,`x`,`data` FROM `complects` WHERE `com` = "' . ((int)$coms['new'][$i]) . '" AND `x` <= ' . ((int)$j) . ' ORDER BY `x` DESC LIMIT 1'
)
);
if (isset($com['id'])) {
//добавляем действия комплекта
$ij = 0;
$sti = Conversion::dataStringToArray($com['data']);
while ($ij < count($this->sysNames)) {
if (isset($this->sysNames[$ij]) && isset($sti[$this->sysNames[$ij]])) {
$st[$this->sysNames[$ij]] += $sti[$this->sysNames[$ij]];
}
$ij++;
}
}
}
$i++;
}
}
//Замена свитков
if ($u['autospell'] != 0 && $u['battle'] == 0) {
//проверяем свитки
$splink = '';
$spi = mysql_query(
'SELECT `id`,`item_id`,`inOdet` FROM `items_users` WHERE `inOdet` >= 40 AND `inOdet` <= 50 AND `uid` = "' . $u['id'] . '" AND `delete` = 0 ORDER BY `item_id` DESC LIMIT 20'
);
while ($pli = mysql_fetch_array($spi)) {
$splink .= $pli['item_id'] . '-' . $pli['inOdet'] . ',';
}
$splink = rtrim($splink, ',');
//Запоминаем новый комплект свитков
if ($u['autospell'] == 1) {
$u['autospell'] = $splink;
mysql_query(
'UPDATE `users` SET `autospell` = "' . $splink . '" WHERE `id` = "' . $u['id'] . '" LIMIT 1'
);
}
//Выдаем нужный свиток, если он есть в инвентаре
if ($u['autospell'] != $splink) {
$spe1 = explode(',', $splink);
$spe2 = explode(',', $u['autospell']);
$i = 0;
while ($i <= 20) {
//
$spe1a = explode('-', $spe1[$i]);
$spe2a = explode('-', $spe2[$i]);
//
if (isset($spe1a[0])) {
$spe1g[$spe1a[1]] = $spe1a[0];
}
if (isset($spe2a[0])) {
$spe2g[$spe2a[1]] = $spe2a[0];
}
//
$i++;
}
for ($i = 40; $i <= 50; $i++) {
if ($spe1g[$i] == $spe2g[$i] || $spe1g[$i] != 0) {
continue;
}
Db::sql('update items_users set inOdet = ? where inOdet = 0 and `delete` = 0 and inTransfer = 0 and inShop = 0 and inGroup = 0 and item_id = ? and uid = ?',
[$i, $spe2g[$i], $u['id']]);
}
}
}
//Бонусы статов
$this->addStatBonuses($st);
//если второе оружие одето
if ($hnd2 == 1 && $hnd1 == 1) {
$st['zona']++;
}
if ($sht1 == 1) {
$st['zonb']++;
}/* Владения */
//mib1-mib4, mab1-mab4 armor??
$i = 1;
while ($i <= 7) {
if (isset($st['s5'])) {
$st['pm' . $i] += $st['s5'] * 0.5;
}
if (isset($st['m11a'])) {
$st['pm' . $i] += $st['m11a'];
}
if (isset($st['aall'])) {
$st['a' . $i] += $st['aall'];
}
if (isset($st['m2all'])) {
$st['mg' . $i] += $st['m2all'];
}
if (isset($st['zm'])) {
$st['zm' . $i] += $st['zm'];
}
if (isset($st['zma'])) {
$st['zm' . $i] += $st['zma'];
}
if ($i <= 4) {
if (isset($st['mall'])) {
$st['mg' . $i] += $st['mall'];
}
if (isset($st['m11'])) {
$st['pm' . $i] += $st['m11'];
}
if (isset($st['m10'])) {
$st['pa' . $i] += $st['m10'];
}
if (isset($st['za'])) {
$st['za' . $i] += $st['za'];
}
}
$i++;
}
//Уязвимость оружие и магиям
$i = 1;
while ($i <= 7) {
$st['yzm' . $i] += $st['yzma'];
if ($i <= 4) {
$st['yzm' . $i] += $st['yzm'];//стихийный урон только
$st['yza' . $i] += $st['yza']; //урон оружия
}
//Отнимает от защиты от урона
if (isset($st['yza' . $i]) && $i <= 4) {
$st['za' . $i] = ($st['za' . $i] / 100 * (100 + ($st['yza' . $i])));
if ($st['za' . $i] < 0) {
$st['za' . $i] = 0;
}
}
//Отнимает от защиты от магии
if (isset($st['yzm' . $i])) {
$st['zm' . $i] = ($st['zm' . $i] / 100 * (100 + ($st['yzm' . $i])));
if ($st['zm' . $i] < 0) {
$st['zm' . $i] = 0;
}
}
$i++;
}
if (isset($st['hpVinos']) && $st['hpVinos'] != 0) {
$st['hpAll'] += round($st['hpVinos'] * $st['s4']);
}
if (isset($st['mpVinos']) && $st['mpVinos'] != 0) {
$st['mpAll'] += round($st['mpVinos'] * $st['s6']);
}
if (isset($st['hpProc']) && $st['hpProc'] != 0) {
$st['hpAll'] += round($st['hpAll'] / 100 * $st['hpProc']);
}
if (isset($st['mpProc']) && $st['mpProc'] != 0) {
$st['mpAll'] += round($st['mpAll'] / 100 * $st['mpProc']);
}//Реген. - 250 ед.
//конец бонусов
if ($st['hpNow'] < 0) {
$st['hpNow'] = 0;
} elseif ($st['hpNow'] > $st['hpAll']) {
$st['hpNow'] = $st['hpAll'];
}
if ($st['mpNow'] < 0) {
$st['mpNow'] = 0;
} elseif ($st['mpNow'] > $st['mpAll']) {
$st['mpNow'] = $st['mpAll'];
}
//зоны блока и удара
if ($st['zona'] < 1) {
$st['zona'] = 1;
}
if ($st['zona'] > 5) {
$st['zona'] = 5;
}
if ($st['zonb'] < 1) {
$st['zonb'] = 1;
}
if ($st['zonb'] > 3) {
$st['zonb'] = 3;
}
$st['ozash'] = $oza;
$st['ozmsh'] = $ozm;
$st['weapon1'] = $hnd1;
$st['weapon2'] = $hnd2;
$st['sheld1'] = $sht1;
$st['sv_'] = $s_v;
$st['sv_i'] = $s_vi;
$st['dom'] = $dom;
$st['prsu'] = $prsu;
$st['x'] = $u['x'];
$st['y'] = $u['y'];
$st['s'] = $u['s'];
$this->addDungeonsBonuses($u['id'], $st);
//Добавочный подьем для игроков
$st['maxves'] += 100;
if ($u['admin'] > 0) { // ускоренная регенерация и пробег по подземелью
$st['speed_dungeon'] = 500;
$st['speedhp'] = 500;
if ($u['battle']) {
Db::sql("update stats set
tactic1 = tactic2 = tactic3 = tactic4 = tactic5 = tactic6 = tactic7 = 25,
priems_z = '0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|'
where id = ?", [$u['id']]);
}
}
if (date('H') >= 22 && date('H') <= 10) {
$st['exp'] += 25;
}
//Сохраняем рейтинг игрока
$st['reting'] = floor($st['reting']);
if (isset($st['btl_cof'], $st['prckr']) && $st['btl_cof'] != $st['prckr']) {
$st['btl_cof'] = $st['prckr'];
Db::sql('update stats set btl_cof = ? where id = ?', [$st['prckr'], $st['id']]);
}
if ($st['hpAll'] < 1) {
$st['hpAll'] = 1;
}
if ($st['mpAll'] < 0) {
$st['mpAll'] = 0;
}
if (stristr($u['login'], '(зверь ') || (stristr($u['login'], 'Каменный страж') && $u['ip'] == '0')) {
$st['this_animal'] = 1;
} else {
$st['this_animal'] = 0;
}
$rt = [];
if ($i1 == 1) {
$rt[0] = $st;
$rt[1] = $baseStats; //родные статы
} else {
$rt = $st;
}
if ($u['hpAll'] != $st['hpAll'] || $u['mpAll'] != $st['mpAll']) {
Db::sql('update stats set hpAll = ?, mpAll = ? where id = ?', [$st['hpAll'], $st['mpAll'], $u['id']]);
}
if ($btl_cache) {
$dataca = [
'st' => $st,
'st2' => $baseStats,
];
$dataca = json_encode($dataca);
Db::sql('insert into battle_cache (battle, uid, time, data) values (?,?,unix_timestamp(),?)', [$u['battle'], $u['id'], $dataca]);
}
return $rt;
}
private function addMedalsBonuses(int $uid, array &$st): array
{
//Харки от иконок
$efs = Db::getColumn('select bonus from users_ico where uid = ? and (endTime > unix_timestamp() or endTime = 0)', [$uid]);
foreach ($efs as $data) {
$sts = Conversion::dataStringToArray($data);
foreach ($sts as $paramName => $value) {
//todo убедиться, что не могут прилететь параметры, которых нет в словарей бонусов предметов
if (!str_contains(implode(',', $this->sysNames), 'add_' . $paramName)) { // есть ли параметр в разрешенных?
continue;
}
if (empty($st['add_' . $paramName])) {
$st['add_' . $paramName] = 0;
}
$st['add_' . $paramName] += (int)$value;
}
}
return $st;
}
private function addStatBonuses(array &$st): void
{
$this->addStrengthBonuses($st);
$this->addDexterityBonuses($st);
$this->addIntuitionBonuses($st);
$this->addEnduranceBonuses($st);
$this->addIntelligenceBonuses($st);
$this->addWisdomBonuses($st);
}
private function addStrengthBonuses(array &$st): void
{
if ($st['s1'] > 24 && $st['s1'] < 50) {
$st['m2'] += 15;
}
if ($st['s1'] > 49 && $st['s1'] < 75) {
$st['pa2'] += 2;
$st['m2'] += 35;
}
if ($st['s1'] > 74 && $st['s1'] < 100) {
$st['pa2'] += 5;
$st['m2'] += 50;
}
if ($st['s1'] > 99 && $st['s1'] < 125) {
$st['pa2'] += 8;
$st['m2'] += 80;
}
if ($st['s1'] > 124 && $st['s1'] < 150) {
$st['pa2'] += 12;
$st['m2'] += 105;
}
if ($st['s1'] > 149 && $st['s1'] < 175) {
$st['pa2'] += 17;
$st['m7'] += 2;
}
if ($st['s1'] > 174 && $st['s1'] < 200) {
$st['pa2'] += 23;
$st['m7'] += 5;
}
if ($st['s1'] > 199) {
$st['pa2'] += 30;
$st['m7'] += 7;
}
}
private function addDexterityBonuses(array &$st): void
{
if ($st['s2'] > 24 && $st['s2'] < 50) {
$st['pa1'] += 2;
$st['m4'] += 35;
}
if ($st['s2'] > 49 && $st['s2'] < 75) {
$st['pa1'] += 5;
$st['m2'] += 40;
$st['m4'] += 75;
}
if ($st['s2'] > 74 && $st['s2'] < 100) {
$st['pa1'] += 8;
$st['m2'] += 65;
$st['m4'] += 90;
}
if ($st['s2'] > 99 && $st['s2'] < 125) {
$st['pa1'] += 12;
$st['m2'] += 75;
$st['m4'] += 105;
}
if ($st['s2'] > 124 && $st['s2'] < 150) {
$st['pa1'] += 17;
$st['m2'] += 85;
$st['m4'] += 105;
$st['m15'] += 1;
}
if ($st['s2'] > 149 && $st['s2'] < 175) {
$st['pa1'] += 20;
$st['m2'] += 110;
$st['m4'] += 115;
$st['m15'] += 2;
}
if ($st['s2'] > 174 && $st['s2'] < 200) {
$st['pa1'] += 23;
$st['m2'] += 145;
$st['m4'] += 145;
$st['m15'] += 3;
}
if ($st['s2'] > 199) {
$st['pa1'] += 30;
$st['m2'] += 165;
$st['m4'] += 165;
$st['m15'] += 5;
}
}
private function addIntuitionBonuses(array &$st): void
{
//интуиция
if ($st['s3'] > 24 && $st['s3'] < 50) {
$st['pa4'] += 2;
$st['m3'] += 2;
$st['m1'] += 25;
}
if ($st['s3'] > 49 && $st['s3'] < 75) {
$st['pa4'] += 5;
$st['m3'] += 5;
$st['m1'] += 55;
}
if ($st['s3'] > 74 && $st['s3'] < 100) {
$st['pa4'] += 8;
$st['m3'] += 10;
$st['m1'] += 75;
$st['m5'] += 25;
}
if ($st['s3'] > 99 && $st['s3'] < 125) {
$st['pa4'] += 12;
$st['m3'] += 15;
$st['m1'] += 105;
$st['m5'] += 35;
}
if ($st['s3'] > 124 && $st['s3'] < 150) {
$st['pa4'] += 17;
$st['m3'] += 20;
$st['m1'] += 125;
$st['m5'] += 45;
$st['m14'] += 1;
}
if ($st['s3'] > 149 && $st['s3'] < 175) {
$st['pa4'] += 20;
$st['m3'] += 30;
$st['m1'] += 145;
$st['m5'] += 50;
$st['m14'] += 2;
}
if ($st['s3'] > 174 && $st['s3'] < 200) {
$st['pa4'] += 23;
$st['m3'] += 35;
$st['m1'] += 165;
$st['m5'] += 55;
$st['m14'] += 3;
}
if ($st['s3'] > 199) {
$st['pa4'] += 30;
$st['m3'] += 40;
$st['m1'] += 185;
$st['m5'] += 65;
$st['m14'] += 5;
}
}
private function addEnduranceBonuses(array &$st): void
{
//выносливость
if ($st['s4'] > 0) {
$st['hpAll'] += 30;
}
if ($st['s4'] > 24 && $st['s4'] < 50) {
$st['hpAll'] += 50;
}
if ($st['s4'] > 49 && $st['s4'] < 75) {
$st['hpAll'] += 100;
}
if ($st['s4'] > 74 && $st['s4'] < 100) {
$st['hpAll'] += 175;
$st['m19'] += 2;
}
if ($st['s4'] > 99 && $st['s4'] < 125) {
$st['hpAll'] += 250;
$st['m19'] += 4;
}
if ($st['s4'] > 124 && $st['s4'] < 150) {
$st['hpAll'] += 400;
$st['za'] += 25;
$st['zm'] += 25;
}
if ($st['s4'] > 149 && $st['s4'] < 175) {
$st['hpAll'] += 450;
$st['za'] += 50;
$st['zm'] += 50;
}
if ($st['s4'] > 174 && $st['s4'] < 200) {
$st['hpAll'] += 600;
$st['za'] += 100;
$st['zm'] += 100;
}
if ($st['s4'] > 199) {
$st['hpAll'] += 850;
$st['za'] += 125;
$st['zm'] += 125;
}
}
private function addIntelligenceBonuses(array &$st): void
{
//интелект
if ($st['s5'] > 24 && $st['s5'] < 50) {
$st['m11'] += 10;
}
if ($st['s5'] > 49 && $st['s5'] < 75) {
$st['m11'] += 15;
}
if ($st['s5'] > 74 && $st['s5'] < 100) {
$st['m11'] += 20;
}
if ($st['s5'] > 99 && $st['s5'] < 125) {
$st['m11'] += 25;
}
if ($st['s5'] > 124 && $st['s5'] < 150) {
$st['m11'] += 35;
}
if ($st['s5'] > 149 && $st['s5'] < 175) {
$st['m11'] += 50;
}
if ($st['s5'] > 174) {
$st['m11'] += 65;
$st['pzm'] += 2;
}
if ($st['s5'] > 199) {
$st['pzm'] += 5;
}
}
private function addWisdomBonuses(array &$st): void
{
//мудрость
if ($st['s6'] > 24 && $st['s6'] < 50) {
$st['mpAll'] += 150;
$st['speedmp'] += 100;
}
if ($st['s6'] > 49 && $st['s6'] < 75) {
$st['mpAll'] += 200;
$st['speedmp'] += 200;
}
if ($st['s6'] > 74 && $st['s6'] < 100) {
$st['mpAll'] += 250;
$st['speedmp'] += 350;
}
if ($st['s6'] > 99 && $st['s6'] < 125) {
$st['mpAll'] += 350;
$st['speedmp'] += 500;
}
if ($st['s6'] > 124 && $st['s6'] < 150) {
$st['mpAll'] += 500;
$st['speedmp'] += 500;
$st['pzm'] += 2;
}
if ($st['s6'] > 149 && $st['s6'] < 175) {
$st['mpAll'] += 700;
$st['speedmp'] += 600;
$st['pzm'] += 3;
}
if ($st['s6'] > 174 && $st['s6'] < 200) {
$st['mpAll'] += 900;
$st['speedmp'] += 700;
$st['pzm'] += 5;
}
if ($st['s6'] > 199) {
$st['mpAll'] += 900;
$st['speedmp'] += 700;
$st['pzm'] += 7;
}
}
private function addDungeonsBonuses(int $id, array &$st): void
{
$finishedDungeons = Db::getValue('select
if(repcapitalcity > 24999, 1, 0) +
if(repdemonscity > 24999, 1, 0) +
if(repangelscity > 24999, 1, 0) +
if(repdevilscity > 24999, 1, 0) +
if(repmooncity > 24999, 1, 0) +
if(repsuncity > 24999, 1, 0) +
if(repsandcity > 24999, 1, 0) +
if(repemeraldscity > 24999, 1, 0) +
if(repizlom > 24999, 1, 0) +
0 as finished from rep where id = ?', [$id]);
//Бонус за количество полностью вырытых пещер.
$st['m10'] += 10 * $finishedDungeons;
$st['pzm'] += $finishedDungeons;
}
}