Compare commits

..

No commits in common. "dev-battle-fighterclass" and "dev" have entirely different histories.

479 changed files with 20993 additions and 19452 deletions

130
.htaccess
View File

@ -1,86 +1,96 @@
DefaultLanguage ru
<IfModule mod_headers.c>
Header always set X-Content-Type-Options nosniff
</IfModule>
<IfModule mod_rewrite.c>
Options -Indexes
Options -MultiViews
RewriteEngine On
RewriteCond %{HTTP:VIA} !^$ [OR]
RewriteCond %{HTTP:FORWARDED} !^$ [OR]
RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR]
RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$
RewriteRule (.+) https://new-combats.tech/proxy/
Options -Indexes
Options -MultiViews
RewriteEngine On
RewriteCond %{HTTP:VIA} !^$ [OR]
RewriteCond %{HTTP:FORWARDED} !^$ [OR]
RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR]
RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$
RewriteRule (.+) https://new-combats.tech/proxy/
RewriteBase /
RewriteCond %{ENV:REDIRECT} !^yes$
RewriteRule ruletka.pl ruletka.php [L]
RewriteRule bandit.pl bandit.php [L]
RewriteRule blackjack.pl blackjack.php [L]
RewriteRule casino/SWFP.pl casino/SWFP.php [L]
RewriteCond %{ENV:REDIRECT} !^yes$
RewriteRule ^r([0-9]+)/?$ /register.php?ref=$1 [L]
RewriteBase /
RewriteCond %{ENV:REDIRECT} !^yes$
RewriteRule ruletka.pl ruletka.php [L]
RewriteRule bandit.pl bandit.php [L]
RewriteRule blackjack.pl blackjack.php [L]
RewriteRule casino/SWFP.pl casino/SWFP.php [L]
RewriteCond %{ENV:REDIRECT} !^yes$
RewriteRule ^r([0-9]+)/?$ /register.php?ref=$1 [L]
RewriteRule ^settings/?$ /settings.php [L]
RewriteRule ^adminion/([a-zA-Z0-9]+)/?$ /adminion/index.php?mod=$1 [L]
RewriteRule ^adminion/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/?$ /adminion/index.php?mod=$1 [L]
RewriteRule ^adminion/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/?$ /adminion/index.php?mod=$1 [L]
RewriteRule ^info/(.*)/?$ /inf.php?$1 [L]
RewriteRule ^settings/?$ /settings.php [L]
RewriteRule ^rating_pers/?$ /reting_pers.php [L]
RewriteRule ^rating_pers/(.*)/?$ /reting_pers.php?$1 [L]
RewriteRule ^info/(.*)/?$ /inf.php?$1 [L]
RewriteRule ^rating_clans/?$ /reting_clans.php [L]
RewriteRule ^rating_clans/(.*)/?$ /reting_clans.php?$1 [L]
RewriteRule ^rating_pers/?$ /reting_pers.php [L]
RewriteRule ^rating_pers/(.*)/?$ /reting_pers.php?$1 [L]
RewriteRule ^clan/(.*)/?$ /clans_inf.php?$1 [L]
RewriteRule ^clan/?$ /clans_inf.php [L]
RewriteRule ^rating_clans/?$ /reting_clans.php [L]
RewriteRule ^rating_clans/(.*)/?$ /reting_clans.php?$1 [L]
RewriteRule ^news/(.*)/?$ /n/$1 [R=301,L]
RewriteRule ^news/?$ /n [R=301,L]
RewriteRule ^clan/(.*)/?$ /clans_inf.php?$1 [L]
RewriteRule ^clan/?$ /clans_inf.php [L]
RewriteRule ^n/(.*)/?$ /news_script/index.php?$1 [L]
RewriteRule ^n/?$ /news_script/index.php [L]
RewriteRule ^ruins/(.*)/?$ /ruins.php?$1 [L]
RewriteRule ^ruins/?$ /ruins.php [L]
RewriteRule ^forum/(.*)/?$ /forum_script/index.php?$1 [L]
RewriteRule ^forum/?$ /forum_script/index.php [L]
RewriteRule ^exp/(.*)/?$ /exp.php?$1 [L]
RewriteRule ^exp/?$ /exp.php [L]
RewriteRule ^shadow/(.*)/?$ /obraz.php?$1 [L]
RewriteRule ^shadow/?$ /obraz.php [L]
RewriteRule ^news/(.*)/?$ /n/$1 [R=301,L]
RewriteRule ^news/?$ /n [R=301,L]
RewriteRule ^dress/(.*)/?$ /dress.php?$1 [L]
RewriteRule ^dress/?$ /dress.php [L]
RewriteRule ^n/(.*)/?$ /news_script/index.php?$1 [L]
RewriteRule ^n/?$ /news_script/index.php [L]
RewriteRule ^monitoring/(.*)/?$ /hmonitor.php?$1 [L]
RewriteRule ^monitoring/?$ /hmonitor.php [L]
RewriteRule ^forum/(.*)/?$ /forum_script/index.php?$1 [L]
RewriteRule ^forum/?$ /forum_script/index.php [L]
RewriteRule ^rating/(.*)/?$ /rating_script/index.php?$1 [L]
RewriteRule ^rating/?$ /rating_script/index.php [L]
RewriteRule ^shadow/(.*)/?$ /obraz.php?$1 [L]
RewriteRule ^shadow/?$ /obraz.php [L]
RewriteRule ^item/(.*)/?$ /items_info.php?$1 [L]
RewriteRule ^item/?$ /items_info.php [L]
RewriteRule ^repass/?$ /repass.php [L]
RewriteRule ^dress/(.*)/?$ /dress.php?$1 [L]
RewriteRule ^dress/?$ /dress.php [L]
RewriteRule ^mail/(.*)/?$ /mailconf.php?$1 [L]
RewriteRule ^monitoring/(.*)/?$ /hmonitor.php?$1 [L]
RewriteRule ^monitoring/?$ /hmonitor.php [L]
RewriteRule ^register/?$ /register.php [L]
RewriteRule ^rating/(.*)/?$ /rating_script/index.php?$1 [L]
RewriteRule ^rating/?$ /rating_script/index.php [L]
RewriteRule ^reg/?$ /register.php [L]
RewriteRule ^item/(.*)/?$ /items_info.php?$1 [L]
RewriteRule ^item/?$ /items_info.php [L]
RewriteRule ^repass/?$ /repass.php [L]
RewriteRule ^enter/?$ /enter.php [L]
RewriteRule ^mail/(.*)/?$ /mailconf.php?$1 [L]
RewriteRule ^bk/?$ /buttons.php [L]
RewriteRule ^register/?$ /register.php [L]
RewriteRule ^mobile/?$ /main_mobile.php [L]
RewriteRule ^reg/?$ /register.php [L]
RewriteRule ^btl([0-9]+)/?$ /jx/battle/refresh$1.php [L]
RewriteRule ^/n/?$ /news_script/index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteRule ^enter/?$ /enter.php [L]
RewriteRule ^bk/?$ /buttons.php [L]
RewriteRule ^mobile/?$ /main_mobile.php [L]
RewriteRule ^btl([0-9]+)/?$ /jx/battle/refresh$1.php [L]
RewriteRule ^/n/?$ /news_script/index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Order Allow,Deny
Allow from all

12
.idea/dataSources.xml generated
View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="@sokol" uuid="c5a52191-dffb-4c22-9257-bd5d9e5d5f29">
<driver-ref>mariadb</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mariadb://85.209.45.159:54001/game_production</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

379
AI.php
View File

@ -15,9 +15,12 @@ if (!defined('GAME_VERSION')) {
require_once '_incl_data/autoload.php';
}
//const GAME = true;
$user = User::start();
//var_dump($user->info['testStats'], $user->info['testStats2']);
//exit();
$im = Db::getColumn("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'items_main'");
$iu = Db::getColumn("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'items_users'");
@ -60,28 +63,21 @@ var_dump((new ShopOtdel())->getGroups());
<?php
$rr = 1;
foreach ($user->stats as $k => $v) {
if ($k === 'items_o') {
continue;
}
if (isset($user->is[$k])) {
$k .= " <span style='background-color: lightcyan;'>[{$user->is[$k]}]";
} else {
$k = "<span>$k";
}
$vv = is_array($v) ? 'array' : $v;
echo "$rr. $k</span> = $vv<br>";
echo "$rr. $k</span> = $v<br>";
$rr++;
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
$vv2 = is_array($v2) ? 'array' : $v2;
echo "<span style='background-color: #99FFCC; margin-left: 5px;'>$k2 = $vv2</span><br>";
echo "<span style='background-color: #99FFCC; margin-left: 5px;'>$k2 = $v2</span><br>";
if (is_array($v2)) {
foreach ($v2 as $k3 => $v3) {
$vv3 = is_array($v2) ? 'array' : $v3;
echo "<span style='background-color: aliceblue; margin-left: 10px;'>$k3 = $vv3</span><br>";
echo "<span style='background-color: aliceblue; margin-left: 10px;'>$k3 = $v3</span><br>";
if ($k3 === 'data' && $v3 !== '[]') {
$v3 .= '|add_mib2=43';
$itemData = Conversion::dataStringToArray($v3);
@ -105,7 +101,26 @@ var_dump((new ShopOtdel())->getGroups());
?>
</div>
</div>
<hr>
Совпадения по параметрам $user->info и $user->stats. Возможно, это ничего не значит, а может и дублирование.<br><br>
<?php
$i = 1;
$i2 = 1;
foreach ($user->info as $a => $b) {
if (isset($user->stats[$a])) {
echo "$i. info = stats: $a = $b<br>";
$i++;
}
}
echo '<br>';
foreach ($user->stats as $a2 => $b2) {
if (isset($user->info[$a2])) {
echo "$i2. stats = info: $a2 = $b2<br>";
$i2++;
}
}
?>
<br>
<div style="display: grid; grid-template-columns: auto auto;">
<div> Поля в базе users
@ -146,9 +161,315 @@ var_dump((new ShopOtdel())->getGroups());
</div>
</div>
<hr> Все возможные поля в $user->stats. Некоторые имена полей генерируются динамически на лету, поэтому соответствия имени нет. А каких-то, возможно просто не существует.<br><br>
<?php
$st['clanpos'] = 0;
$st['levels'] = 0;
$st['levels'] = 0;
$st['id'] = 0;
$st['login'] = 0;
$st['lvl'] = 0;
$st['hpNow'] = 0;
$st['hpAll'] = 0;
$st['mpNow'] = 0;
$st['mpAll'] = 0;
$st['zona'] = 0;
$st['zonb'] = 0;
$st['items'] = 0;
$st['effects'] = 0;
$st['reting'] = 0;
$st['vip'] = 0;
$st['items_img'] = 0;
$st['reting'] = 0;
$st['wp'] = 0;
$st['items'] = 0;
$st['reting'] = 0;
$st['art'] = 0;
$st['maks_itm'] = 0;
$st['zonb'] = 0;
$st['zona'] = 0;
$st['a'] = 0;
$st['mg'] = 0;
$st['s'] = 0;
$st['effects'] = 0;
$st['puti'] = 0;
$st['slvtm'] = 0;
$st['act'] = 0;
$st['noeffectbattle1'] = 0;
$st['items_img'] = 0;
$st['set_pog'] = 0;
$st['set_pog2'] = 0;
$st['act'] = 0;
$st['effects'] = 0;
$st['raztac'] = 0;
$st['set_natoe'] = 0;
$st['act'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['mpAll'] = 0;
$st['m1'] = 0;
$st['s3'] = 0;
$st['m2'] = 0;
$st['s6'] = 0;
$st['s3'] = 0;
$st['m4'] = 0;
$st['s2'] = 0;
$st['m5'] = 0;
$st['za'] = 0;
$st['s4'] = 0;
$st['zm'] = 0;
$st['zaproc'] = 0;
$st['s5'] = 0;
$st['m19'] = 0;
$st['s3'] = 0;
$st['antm3'] = 0;
$st['s5'] = 0;
$st['m10'] = 0;
$st['m11'] = 0;
$st['m11a'] = 0;
$st['m8'] = 0;
$st['zona'] = 0;
$st['zonb'] = 0;
$st['pm'] = 0;
$st['a'] = 0;
$st['mg'] = 0;
$st['zm'] = 0;
$st['s5'] = 0;
$st['pm'] = 0;
$st['s5'] = 0;
$st['m11a'] = 0;
$st['pm'] = 0;
$st['a'] = 0;
$st['aall'] = 0;
$st['m2all'] = 0;
$st['mg'] = 0;
$st['m2all'] = 0;
$st['zm'] = 0;
$st['zma'] = 0;
$st['mib'] = 0;
$st['mab'] = 0;
$st['mg'] = 0;
$st['pm'] = 0;
$st['pa'] = 0;
$st['za'] = 0;
$st['mall'] = 0;
$st['mg'] = 0;
$st['mall'] = 0;
$st['m11'] = 0;
$st['pm'] = 0;
$st['m11'] = 0;
$st['m10'] = 0;
$st['pa'] = 0;
$st['m10'] = 0;
$st['za'] = 0;
$st['za'] = 0;
$st['za'] = 0;
$st['yzm'] = 0;
$st['yzma'] = 0;
$st['yza'] = 0;
$st['za'] = 0;
$st['hpVinos'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['mpAll'] = 0;
$st['mpVinos'] = 0;
$st['s6'] = 0;
$st['hpProc'] = 0;
$st['hpAll'] = 0;
$st['mpProc'] = 0;
$st['hpNow'] = 0;
$st['hpAll'] = 0;
$st['hpNow'] = 0;
$st['hpAll'] = 0;
$st['mpNow'] = 0;
$st['mpAll'] = 0;
$st['mpNow'] = 0;
$st['mpAll'] = 0;
$st['zona'] = 0;
$st['zonb'] = 0;
$st['ozash'] = 0;
$st['ozmsh'] = 0;
$st['weapon1'] = 0;
$st['weapon2'] = 0;
$st['sheld1'] = 0;
$st['sv_'] = 0;
$st['sv_i'] = 0;
$st['dom'] = 0;
$st['prsu'] = 0;
$st['x'] = 0;
$st['y'] = 0;
$st['s'] = 0;
$st['reting'] = 0;
$st['reting'] = 0;
$st['maxves'] = 0;
$st['speed_dungeon'] = 0;
$st['speedhp'] = 0;
$st['exp'] = 0;
$st['reting'] = 0;
$st['reting'] = 0;
$st['btl_cof'] = 0;
$st['prckr'] = 0;
$st['btl_cof'] = 0;
$st['prckr'] = 0;
$st['btl_cof'] = 0;
$st['prckr'] = 0;
$st['prckr'] = 0;
$st['id'] = 0;
$st['hpAll'] = 0;
$st['hpAll'] = 0;
$st['mpAll'] = 0;
$st['mpAll'] = 0;
$st['this_animal'] = 0;
$st['this_animal'] = 0;
$st['hpAll'] = 0;
$st['mpAll'] = 0;
$st['hpAll'] = 0;
$st['mpAll'] = 0;
$st['add_'] = 0;
$st['add_'] = 0;
$st['add_'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['m2'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m2'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m2'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m7'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m7'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m7'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m4'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['m15'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['m15'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['m15'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['m15'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['m5'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['m5'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['m5'] = 0;
$st['m14'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['m5'] = 0;
$st['m14'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['m19'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['m19'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['za'] = 0;
$st['zm'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['za'] = 0;
$st['zm'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['za'] = 0;
$st['zm'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['za'] = 0;
$st['zm'] = 0;
$st['s5'] = 0;
$st['m11'] = 0;
$st['pzm'] = 0;
$st['s6'] = 0;
$st['mpAll'] = 0;
$st['speedmp'] = 0;
$st['s6'] = 0;
$st['pzm'] = 0;
$st['m10'] = 0;
$stnames = [];
foreach ($st as $k => $v) {
if (isset($user->is[$k])) {
$v = $user->is[$k];
}
$stnames[$k] = $v;
}
var_dump($stnames);
echo "<h5>Текущая таблица параметров</h5>";
foreach ($p as $prow) {
echo "{$prow['sys_name']}{$prow['name']}";
@ -162,36 +483,4 @@ foreach ($p as $prow) {
echo " <span style='background-color: lightgreen;'>[даёт]</span> ";
}
echo "<br>";
}
$stats = Db::getRows('select id, stats from stats');
$sarr = [];
foreach ($stats as $stat) {
$data = Conversion::dataStringToArray($stat['stats']);
$arr = [
'uid' => $stat['id'],
's1' => $data['s1'] ?? 0,
's2' => $data['s2'] ?? 0,
's3' => $data['s3'] ?? 0,
's4' => $data['s4'] ?? 0,
's5' => $data['s5'] ?? 0,
's6' => $data['s6'] ?? 0,
's7' => $data['s7'] ?? 0,
'a1' => $data['a1'] ?? 0,
'a2' => $data['a2'] ?? 0,
'a3' => $data['a3'] ?? 0,
'a4' => $data['a4'] ?? 0,
'mg1' => $data['mg1'] ?? 0,
'mg2' => $data['mg2'] ?? 0,
'mg3' => $data['mg3'] ?? 0,
'mg4' => $data['mg4'] ?? 0,
];
unset($data['s1'], $data['s2'], $data['s3'], $data['s4'], $data['s5'], $data['s6'], $data['s7'],
$data['a1'], $data['a2'], $data['a3'], $data['a4'],
$data['mg1'], $data['mg2'], $data['mg3'], $data['mg4']);
$arr['tails'] = Conversion::arrayToDataString($data);
$arr['tails_json'] = json_encode($data);
$sarr[] = $arr;
}
var_dump($sarr);
}

6
Array Normal file
View File

@ -0,0 +1,6 @@
# Netscape HTTP Cookie File
# https://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.
new-combats.com FALSE / FALSE 0 PHPSESSID vt7d2f0tttjoneil7bqsc7org0
new-combats.com FALSE /jx/battle/ FALSE 1517571089 btl 0

View File

@ -10,18 +10,13 @@ require_once 'mysql_override.php';
spl_autoload_register(function (string $className) {
$rootdir = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . '_incl_data' . DIRECTORY_SEPARATOR;
$addsrc = function ($class) {
$c = explode('\\', $class);
array_splice($c, 1, 0, 'src');
return implode(DIRECTORY_SEPARATOR, $c);
};
# 1 with namespaces
# 2 without
$fileName = [
$rootdir . 'class' . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $className . '.php'),
$rootdir . 'class' . DIRECTORY_SEPARATOR . $className . '.php',
$rootdir . 'function' . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $className . '.php'),
$rootdir . 'vendor' . DIRECTORY_SEPARATOR . $addsrc($className) . '.php',
$rootdir . 'vendor' . DIRECTORY_SEPARATOR . $className . '.php',
];
foreach ($fileName as $file) {
if (file_exists($file)) {

View File

@ -1,39 +0,0 @@
<?php
use Core\Db;
class Actions
{
public static function addDungeon(
int $dungeonid,
int $userid,
int $x,
int $y,
string $vars = '',
string $vals = '',
): void {
Db::sql(
'insert into dungeon_actions (dn, x, y, time, uid, vars, vals) values (?,?,?,unix_timestamp(),?,?,?)',
[
$dungeonid,
$x,
$y,
$userid,
$vars,
$vals,
]
);
}
public static function countDungeon(int $dungeonid, int $userid, string $vars = ''): int
{
return Db::getValue(
'select count(id) from dungeon_actions where dn = ? and uid = ? and vars = ?',
[
$dungeonid,
$userid,
$vars,
]
);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,62 +0,0 @@
<?php
namespace Battle;
use Core\Config;
use Helper\Conversion;
use User;
class BattleHTML
{
/**
* Генерирует HTML, который будет вставляться в javascript в файлах refresh{X}.php
*
* @return string
*/
public static function printMagicScrolls(): string
{
$sv = array_fill(1, 12, '<img class="nopriemuse" title="Пустой слот магия" src="' . Config::img() . '/i/items/w/w101.gif" alt="">');
foreach (User::start()->stats['items'] as $stat) {
if (!in_array($stat['inslot'], [40, 51])) {
continue;
}
if (empty($stat['useInBattle']) || $stat['btl_zd'] > 0 || $stat['iznosNOW'] >= $stat['iznosMAX'] || empty($stat['magic_inci'])) {
$vl = 'class="nopriemuse"';
} else {
$po = Conversion::dataStringToArray($stat['data']);
if ($po['useOnLogin'] == 1) {
$jsvars = "'{$stat['name']}','{$stat['id']}','{$stat['img']}',1,1,'','{$stat['useInBattle']}'";
} else {
$jsvars = "'{$stat['name']}','{$stat['id']}','{$stat['img']}',1,2";
}
$vl = 'style="cursor:pointer" onclick="top.useMagicBattle(' . $jsvars . ')"';
}
$iznos = "Долговечность: {$stat['iznosNOW']} / {$stat['iznosMAX']}";
$img = Config::img() . '/i/items/' . $stat['img'];
$sv[$stat['inOdet'] - 39] = '<img ' . $vl . ' title="' . $iznos . '" src="' . $img . '" alt="">';
}
return <<<HTML
<table style="border: 0; border-collapse: collapse; border-spacing: 0;">
<tr>
<td>$sv[1]</td>
<td>$sv[2]</td>
<td>$sv[3]</td>
<td>$sv[4]</td>
<td>$sv[5]</td>
<td>$sv[6]</td>
<td>$sv[7]</td>
<td>$sv[8]</td>
<td>$sv[9]</td>
<td>$sv[10]</td>
<td>$sv[11]</td>
<td>$sv[12]</td>
</tr>
</table>
HTML;
//Если сломается, применить str_replace('"', '\"', $r);
}
}

View File

@ -1,633 +0,0 @@
<?php
namespace Battle;
use Helper\Math;
use User;
class Fighter
{
private string $obraz;
private string $login;
private int $level;
private int $life;
private int $mana;
private int $maxlife;
private int $maxmana;
private int $damage;
private int $damageMultiplier;
private int $critChance;
private int $critMultiplier;
private int $evadeChance;
private int $counterstrikeChance;
private int $parryChance;
private int $shieldblockChance;
private int $ignoreArmorChance;
private int $anticritChance;
private int $antievadeChance;
private int $defence;
private int $airdefence;
private int $waterdefence;
private int $firedefence;
private int $earthdefence;
private int $armor;
private int $team;
public function __construct(private readonly int $id)
{
$u = User::start($id, true);
$this->obraz = $u->info['sex'] . DIRECTORY_SEPARATOR . $u->info['obraz'];
$this->login = $u->info['login'];
$this->level = $u->info['level'];
$this->life = $u->stats['hpNow'];
$this->mana = $u->stats['mpNow'];
$this->maxlife = $u->stats['hpAll'];
$this->maxmana = $u->stats['mpAll'];
$this->damage = mt_rand(0, 100);
$this->armor = mt_rand(0, 5);
$this->damageMultiplier = $u->stats['m10'];
$this->critChance = $u->stats['m1'];
$this->critMultiplier = $u->stats['m3'];
$this->evadeChance = $u->stats['m4'];
$this->counterstrikeChance = $u->stats['m6'];
$this->parryChance = $u->stats['m7'];
$this->shieldblockChance = $u->stats['m8'];
$this->ignoreArmorChance = $u->stats['m9'];
$this->anticritChance = $u->stats['m2'];
$this->antievadeChance = $u->stats['m5'];
$this->defence = $u->stats['za']; // ой не та это защита, ой не та. ещё ж броня должна быть.
$this->airdefence = $u->stats['zm2'];
$this->waterdefence = $u->stats['zm3'];
$this->firedefence = $u->stats['zm1'];
$this->earthdefence = $u->stats['zm4'];
$this->team = $u->info['team'];
unset($u);
}
public function get(): object
{
return (object)[
'damage' => $this->damage,
'armor' => $this->armor + $this->defence,
'health' => $this->life,
'name' => $this->login,
'crit' => $this->critChance,
'evade' => $this->evadeChance,
];
}
public function __toString(): string
{
$dmg = Math::addPercent($this->damage, $this->damageMultiplier);
return <<<RETURN
$this->login [$this->level] <a href="/info/$this->id" target="_blank">id:$this->id</a> <br>
Здоровье: $this->life / $this->maxlife <br>
Мана: $this->mana / $this->maxmana <br><hr>
<!-- <img src="https://img.new-combats.tech/i/obraz/$this->obraz" alt=""><br>-->
Урон: $this->damage + $this->damageMultiplier% = $dmg <br>
Броня: $this->armor <br><hr>
Крит: $this->critChance% <br>
Антикрит $this->anticritChance% <br>
Мощность крита $this->critMultiplier% <br>
Уровот $this->evadeChance% <br>
Антиуворот $this->antievadeChance% <br>
Контрудар $this->counterstrikeChance% <br>
<!-- Парирование $this->parryChance% <br>-->
<!-- Блок щитом $this->shieldblockChance% <br>-->
<!-- Игнор брони $this->ignoreArmorChance% <br>-->
Защита от урона $this->defence <br>
Зашита от огня $this->firedefence <br>
Защита от воды $this->waterdefence <br>
Защита от воздуха $this->airdefence <br>
Защита от земли $this->earthdefence <br><hr>
Сражается за команду: $this->team
RETURN;
}
}
/*
/app/_incl_data/class/Battle.php:471:
array (size=126)
'zag' => string '' (length=0)
'id' => int 27205347
'login' => string 'Merlin' (length=6)
'login2' => string '' (length=0)
'online' => int 1704494746
'admin' => int 1
'city' => string 'capitalcity' (length=11)
'cityreg' => string 'capitalcity' (length=11)
'align' => string '1.99' (length=4)
'align_lvl' => int 0
'align_exp' => int 0
'clan' => int 0
'level' => int 8
'money' => float 62531.5
'money3' => float 30
'money2' => float 15
'money4' => float 40
'battle' => int 466011
'sex' => int 0
'obraz' => string '78.gif' (length=6)
'win' => int 0
'win_t' => int 0
'lose' => int 4
'lose_t' => int 0
'nich' => int 16
'timeMain' => int 1704494746
'invis' => int 0
'bot_id' => int 0
'animal' => int 0
'type_pers' => int 0
'notrhod' => int -1
'bot_room' => int 0
'inUser' => int 0
'inTurnir' => int 0
'inTurnirnew' => int 0
'stopexp' => int 0
'real' => int 1
'stats' => string 's1=3|s2=3|s3=3|s4=250|rinv=40|m9=5|m6=10|s7="0"|a1=0|a2=0|a3=0|a4=0|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0' (length=175)
'hpNow' => int 1132
'mpNow' => int 0
'enNow' => int 0
'hpAll' => int 2130
'mpAll' => int 0
'regHP' => int 1704492966
'regMP' => int 1704492966
'showmenu' => string '1|1|1|1|1|1|1|1' (length=15)
'prmenu' => string '0|1|2|3|4|5|6|7' (length=15)
'ability' => int 78
'skills' => int 9
'sskills' => int 0
'nskills' => int 0
'exp' => int 250
'minHP' => int 15
'minMP' => int 8
'zv' => int 0
'dn' => int 0
'dnow' => int 0
'team' => int 1
'battle_yron' => int 0
'battle_exp' => int 0
'enemy' => int 27319397
'last_a' => int 0
'last_b' => int 0
'battle_text' => string '' (length=0)
'upLevel' => int 57
'wipe' => int 0
'bagStats' => string '0' (length=1)
'timeGo' => int 1704297684
'timeGoL' => int 1704297679
'nextAct' => string '64e9f79e15fca80055d7eabb26f390a4' (length=32)
'active' => string '' (length=0)
'bot' => int 0
'lastAlign' => string '' (length=0)
'tactic1' => int 0
'tactic2' => int 0
'tactic3' => int 0
'tactic4' => int 7
'tactic5' => int 0
'tactic6' => float 0
'tactic7' => float 20
'x' => int 3
'y' => int 4
's' => int 1
'battleEnd' => int 0
'priemslot' => int 10
'priems' => string '0|2|3|0|0|138|235|213|140|4|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' (length=87)
'priems_z' => string '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|0' (length=101)
'bet' => int 0
'clone' => int 0
'atack' => int 0
'bbexp' => int 0
'ref_data' => string '' (length=0)
'res_x' => int 0
'res_y' => int 0
'res_s' => int 1
'bn_capitalcity' => int 0
'bn_demonscity' => int 0
'smena' => int 3
'last_hp' => int -20
'last_pr' => int 0
'transfers' => int 65000
'btl_cof' => int 381
'dieline' => int 0
'lider' => int 462716
'old_battle' => int 10
'alog' => int 0
'mlog' => int 0
'seff' => null
'upexpdate' => int 1671486569
'expstopu' => int 0
'repexp' => int 35
/app/_incl_data/class/Battle.php:471:
array (size=102)
'a1' => int 0
'a2' => int 0
'a3' => int 0
'a4' => int 0
'a5' => int 0
'aall' => int 0
'm1' => int 15
'm10' => int 90
'm11' => int 0
'm14' => int 0
'm15' => int 0
'm18' => int 0
'm19' => int 0
'm2' => int 15
'm3' => int 0
'm4' => int 15
'm5' => int 15
'm6' => int 10
'm7' => int 0
'm8' => int 0
'm9' => int 5
'mall' => int 0
'mg1' => int 0
'mg2' => int 0
'mg3' => int 0
'mg4' => int 0
'mg7' => int 0
'pa1' => int 0
'pa2' => int 0
'pa3' => int 0
'pa4' => int 0
'pm1' => int 0
'pm2' => int 0
'pm3' => int 0
'pm4' => int 0
'pm7' => int 0
's1' => int 3
's2' => int 3
's3' => int 3
's4' => int 250
's5' => int 0
's6' => int 0
's7' => int 0
'za' => int 375
'za1' => int 375
'za2' => int 375
'za3' => int 375
'za4' => int 375
'zm' => int 125
'zm1' => int 125
'zm2' => int 125
'zm3' => int 125
'zm4' => int 125
'zona' => int 2
'zonb' => int 2
'levels' =>
array (size=17)
'upLevel' => int 57
'nextLevel' => int 8
'exp' => int 200000
'money' => int 0
'money_bonus1' => int 0
'money_bonus2' => int 0
'ability' => int 0
'skills' => int 0
'nskills' => int 0
'sskills' => int 0
'expBtlMax' => int 5000
'bprice' => int 2300
'hpRegen' => int 250
'mpRegen' => int 250
'money2' => float 0.5
'duh' => int 0
'vinos' => int 0
'id' => int 27205347
'login' => string 'Merlin' (length=6)
'hpNow' => int 1132
'mpNow' => int 0
'items' =>
array (size=5)
0 =>
array (size=14)
'type' => int 1
'data' => string '' (length=0)
'inOdet' => int 1
'item_id' => int 391
'inslot' => int 1
'useInBattle' => int 0
'btl_zd' => int 0
'iznosNOW' => float 0.7
'iznosMAX' => float 30
'magic_inci' => string '' (length=0)
'name' => string 'Серый Шлем' (length=19)
'id' => int 75917766
'img' => string 'helmet77.gif' (length=12)
'2h' => int 0
1 =>
array (size=14)
'type' => int 26
'data' => string 'tr_lvl=4|sv_yron_min=5|sv_yron_max=10|tya1=20|tya3=80' (length=53)
'inOdet' => int 3
'item_id' => int 631
'inslot' => int 3
'useInBattle' => int 0
'btl_zd' => int 0
'iznosNOW' => float 0.55
'iznosMAX' => float 110
'magic_inci' => string '' (length=0)
'name' => string 'Укрепленный Костыль ' (length=38)
'id' => int 75917784
'img' => string 'kostyl2.gif' (length=11)
'2h' => int 0
2 =>
array (size=14)
'type' => int 29
'data' => string '' (length=0)
'inOdet' => int 54
'item_id' => int 1032
'inslot' => int 53
'useInBattle' => int 1
'btl_zd' => int 0
'iznosNOW' => float 0
'iznosMAX' => float 3
'magic_inci' => string '446' (length=3)
'name' => string 'Живая Вода' (length=19)
'id' => int 75917747
'img' => string 'invoke_kar3_lifew.gif' (length=21)
'2h' => int 0
3 =>
array (size=14)
'type' => int 29
'data' => string '' (length=0)
'inOdet' => int 53
'item_id' => int 1034
'inslot' => int 53
'useInBattle' => int 1
'btl_zd' => int 0
'iznosNOW' => float 0
'iznosMAX' => float 3
'magic_inci' => string '449' (length=3)
'name' => string 'Сушеный Мухомор' (length=29)
'id' => int 75917742
'img' => string 'invoke_kar3_mush.gif' (length=20)
'2h' => int 0
4 =>
array (size=14)
'type' => int 18
'data' => string 'tr_lvl=8|tr_s2=30|tr_s3=30|tr_s1=15|tr_s4=30|tr_a1=9|add_m4=40|add_s2=1|add_s3=2|sv_yron_min=5|sv_yron_max=15|add_m5=30|add_m1=30|add_m9=15|complect=106|tya1=75|tya3=25||fromshop=1' (length=180)
'inOdet' => int 14
'item_id' => int 6473
'inslot' => int 3
'useInBattle' => int 0
'btl_zd' => int 0
'iznosNOW' => float 0.7
'iznosMAX' => float 25
'magic_inci' => string '' (length=0)
'name' => string 'Кинжал Злодеяний [8]' (length=35)
'id' => int 75917776
'img' => string 'knife76.gif' (length=11)
'2h' => int 0
'effects' =>
array (size=1)
0 =>
array (size=41)
'id' => int 106916938
'id_eff' => int 31
'uid' => int 27205347
'name' => string 'Касание Хаоса' (length=25)
'data' => string 'nofastfinisheff=1' (length=17)
'overType' => int 0
'timeUse' => int 1704492685
'timeAce' => int 0
'user_use' => string '' (length=0)
'delete' => int 0
'v1' => string '0' (length=1)
'v2' => int 0
'img2' => string '' (length=0)
'x' => int 1
'hod' => int -1
'bj' => string '0' (length=1)
'sleeptime' => int 0
'no_Ace' => int 0
'file_finish' => string '' (length=0)
'tr_life_user' => int 0
'deactiveTime' => int 0
'deactiveLast' => int 0
'mark' => int 0
'bs' => int 0
'id2' => int 31
'mname' => string 'Касание Хаоса' (length=25)
'type1' => int 21
'img' => string 'survival_timeout.gif' (length=20)
'mdata' => string 'nofastfinisheff=1' (length=17)
'actionTime' => int 86400
'type2' => int 6
'type3' => int 6
'onlyOne' => int 1
'oneType' => int 0
'noAce' => int 0
'see' => int 1
'info' => string 'Вы слишком близко приблизились к центру Излома Хаоса' (length=97)
'overch' => int 0
'bp' => int 1
'noch' => int 0
'minfo' => string '' (length=0)
'vip' => null
'rinv' => int 40
'mg5' => int 0
'mg6' => int 0
'a6' => int 0
's8' => int 0
's9' => int 0
's10' => int 0
's11' => int 0
's12' => int 0
's13' => int 0
's14' => int 0
's15' => int 0
'wp1id' => int 0
'reting' => int 3
'wp3id' => int 1
'wp54id' => int 2
'wp53id' => int 3
'wp14id' => int 4
'set_pog' =>
array (size=0)
empty
'set_pog2' =>
array (size=0)
empty
'ozash' =>
array (size=4)
1 =>
array (size=2)
0 => int 0
1 => int 0
2 =>
array (size=2)
0 => int 0
1 => int 0
3 =>
array (size=2)
0 => int 0
1 => int 0
4 =>
array (size=2)
0 => int 0
1 => int 0
'ozmsh' =>
array (size=4)
1 =>
array (size=2)
0 => int 0
1 => int 0
2 =>
array (size=2)
0 => int 0
1 => int 0
3 =>
array (size=2)
0 => int 0
1 => int 0
4 =>
array (size=2)
0 => int 0
1 => int 0
'weapon1' => int 1
'weapon2' => int 1
'sheld1' => int 0
'sv_' =>
array (size=57)
'a1' => int 0
'a2' => int 0
'a3' => int 0
'a4' => int 0
'a5' => int 0
'aall' => int 0
'hpall' => int 0
'm1' => int 0
'm10' => int 0
'm11' => int 0
'm14' => int 0
'm15' => int 0
'm18' => int 0
'm19' => int 0
'm2' => int 0
'm3' => int 0
'm4' => int 0
'm5' => int 0
'm6' => int 0
'm7' => int 0
'm8' => int 0
'm9' => int 0
'mall' => int 0
'mg1' => int 0
'mg2' => int 0
'mg3' => int 0
'mg4' => int 0
'mg7' => int 0
'mpall' => int 0
'pa1' => int 0
'pa2' => int 0
'pa3' => int 0
'pa4' => int 0
'pm1' => int 0
'pm2' => int 0
'pm3' => int 0
'pm4' => int 0
'pm7' => int 0
's1' => int 0
's2' => int 0
's3' => int 0
's4' => int 0
's5' => int 0
's6' => int 0
's7' => int 0
'za' => int 0
'za1' => int 0
'za2' => int 0
'za3' => int 0
'za4' => int 0
'zm' => int 0
'zm1' => int 0
'zm2' => int 0
'zm3' => int 0
'zm4' => int 0
'zona' => int 0
'zonb' => int 0
'sv_i' =>
array (size=57)
'a1' => int 0
'a2' => int 0
'a3' => int 0
'a4' => int 0
'a5' => int 0
'aall' => int 0
'hpall' => int 0
'm1' => int 0
'm10' => int 0
'm11' => int 0
'm14' => int 0
'm15' => int 0
'm18' => int 0
'm19' => int 0
'm2' => int 0
'm3' => int 0
'm4' => int 0
'm5' => int 0
'm6' => int 0
'm7' => int 0
'm8' => int 0
'm9' => int 0
'mall' => int 0
'mg1' => int 0
'mg2' => int 0
'mg3' => int 0
'mg4' => int 0
'mg7' => int 0
'mpall' => int 0
'pa1' => int 0
'pa2' => int 0
'pa3' => int 0
'pa4' => int 0
'pm1' => int 0
'pm2' => int 0
'pm3' => int 0
'pm4' => int 0
'pm7' => int 0
's1' => int 0
's2' => int 0
's3' => int 0
's4' => int 0
's5' => int 0
's6' => int 0
's7' => int 0
'za' => int 0
'za1' => int 0
'za2' => int 0
'za3' => int 0
'za4' => int 0
'zm' => int 0
'zm1' => int 0
'zm2' => int 0
'zm3' => int 0
'zm4' => int 0
'zona' => int 0
'zonb' => int 0
'dom' =>
array (size=0)
empty
'prsu' =>
array (size=0)
empty
'x' => int 3
'y' => int 4
's' => int 1
'maxves' => int 100
'speed_dungeon' => int 500
'speedhp' => int 500
'this_animal' => int 0
'lvl' => int 8
'hpAll' => int 2130
'mpAll' => int 0
*/

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +0,0 @@
<?php
namespace Battle;
class Helper
{
public static function getChanse(int $percent): bool
{
return mt_rand(0, 100) <= $percent;
}
}

View File

@ -1,208 +0,0 @@
<?php
namespace Battle;
use Core\Db;
class Info
{
public readonly int $id;
public readonly string $city;
public readonly int $timeStart;
public readonly int $testFinish;
public readonly string $players;
public readonly int $timeout;
public readonly int $type;
public readonly int $status;
public readonly int $kulak;
public readonly int $invis;
public readonly int $noinc;
public readonly int $travmchance;
public readonly int $typebattle;
private float $addexp;
public readonly float $money;
public readonly float $money3;
public readonly int $timeover;
private int $teamwin;
public readonly string $dungeon;
public readonly int $razdel;
public readonly int $dnId;
public readonly int $x;
public readonly int $y;
public readonly string $fdate;
public readonly int $izlom;
public readonly int $izlomlvl;
private int $izlomround;
private int $start1;
private int $start2;
public readonly int $izlomroundsee;
public readonly int $izlomobr;
public readonly int $izlomobrnow;
public readonly int $turnir;
public readonly int $inturnir;
public readonly int $clone;
private int $playersC;
private int $playersCC;
private int $playersCC2;
public readonly int $fastfight;
public readonly ?int $nobot;
public readonly ?int $kingfight;
public readonly ?int $arand;
public readonly ?int $noatack;
public readonly ?int $noeff;
public readonly ?int $smert;
public readonly ?int $noart;
public readonly int $zarad;
public readonly int $priz;
public readonly int $otmorozok;
public readonly int $otmorozokUse;
public readonly int $hod;
public readonly int $clan1;
public readonly int $clan2;
public function getAddexp(): float
{
return $this->addexp;
}
public function getTeamwin(): int
{
return $this->teamwin;
}
public function getIzlomround(): int
{
return $this->izlomround;
}
public function getStart1(): int
{
return $this->start1;
}
public function getStart2(): int
{
return $this->start2;
}
public function getPlayersC(): int
{
return $this->playersC;
}
public function getPlayersCC(): int
{
return $this->playersCC;
}
public function getPlayersCC2(): int
{
return $this->playersCC2;
}
/**
* Иноформация о поединке.
* @param int $battleId
*/
public function __construct(int $battleId)
{
$b = Db::getRow('select * from battle where id = ?', [$battleId]);
if (!$b) {
return;
}
$this->id = $b['id'];
$this->city = $b['city'];
$this->timeStart = $b['time_start'];
$this->testFinish = $b['testfinish'];
$this->players = $b['players'];
$this->timeout = $b['timeout'];
$this->type = $b['type'];
$this->status = $b['status'];
$this->kulak = $b['kulak'];
$this->invis = $b['invis'];
$this->noinc = $b['noinc'];
$this->travmchance = $b['travmChance'];
$this->typebattle = $b['typeBattle'];
$this->addexp = $b['addExp'];
$this->money = $b['money'];
$this->money3 = $b['money3'];
$this->timeover = $b['time_over'];
$this->teamwin = $b['team_win'];
$this->dungeon = $b['dungeon'];
$this->razdel = $b['razdel'];
$this->dnId = $b['dn_id'];
$this->x = $b['x'];
$this->y = $b['y'];
$this->fdate = $b['fDate'];
$this->izlom = $b['izlom'];
$this->izlomlvl = $b['izlomLvl'];
$this->izlomround = $b['izlomRound'];
$this->start1 = $b['start1'];
$this->start2 = $b['start2'];
$this->izlomroundsee = $b['izlomRoundSee'];
$this->izlomobr = $b['izlomObr'];
$this->izlomobrnow = $b['izlomObrNow'];
$this->turnir = $b['turnir'];
$this->inturnir = $b['inTurnir'];
$this->clone = $b['clone'];
$this->playersC = $b['players_c'];
$this->fastfight = $b['fastfight'];
$this->nobot = $b['nobot'];
$this->kingfight = $b['kingfight'];
$this->arand = $b['arand'];
$this->noatack = $b['noatack'];
$this->noeff = $b['noeff'];
$this->smert = $b['smert'];
$this->noart = $b['noart'];
$this->zarad = $b['zarad'];
$this->priz = $b['priz'];
$this->otmorozok = $b['otmorozok'];
$this->otmorozokUse = $b['otmorozok_use'];
$this->hod = $b['hod'];
$this->clan1 = $b['clan1'];
$this->clan2 = $b['clan2'];
}
/**
* Ничья
* @return void
*/
public function setDraw(): void
{
$this->playersCC = 0;
$this->playersCC2 = 0;
}
public function setTeamWin(int $team = 0): void
{
$this->teamwin = $team;
}
public function modifyAddExp(int $value): void
{
$this->addexp += $value;
}
public function setStart1(): void
{
$this->start1 = time();
}
public function setStart2(): void
{
$this->start2 = time();
}
public function setIzlomround(int $izlomround): void
{
$this->izlomround = $izlomround;
}
public function setPlayerC(): void
{
$this->playersC =
Db::getValue("select count(id) from users where login not like '%(зверь%' and battle = ?", [$this->id]);
}
}

View File

@ -1,679 +0,0 @@
<?php
namespace Battle;
use Core\Db;
class Log
{
/**
* @param array $data [text,battle,id_hod,vars,type]
* @return void
*/
public static function add(array $data): void
{
if (
empty($data['text']) ||
empty($data['battle']) ||
empty($data['id_hod']) ||
!isset($data['vars']) ||
!isset($data['type'])
) {
return;
}
if (empty($data['type'])) {
$data['type'] = 0;
}
Db::sql(
"insert into battle_logs (time, battle, id_hod, text, vars, type, zona1, zona2, zonb1, zonb2)
values (unix_timestamp(),?,?,?,?,?,'','','','')",
[
$data['battle'],
$data['id_hod'],
$data['text'],
$data['vars'],
$data['type'],
]
);
if (Helper::getChanse(12)) {
self::addComment($data['battle'], $data['id_hod']);
}
}
private static function addComment(int $battleId, int $hodId): void
{
$comments = [
'А танцуешь ты лучше.',
'А мы что, в прятки тут играем?',
'А вы разве пингвинов никогда не видели?',
'А, ведь когда-то, вы были красивыми… А теперь? Ну и рожи! Жуть!',
'А потом еще труп пинать будут.',
'А я вчера ночью за соседями подглядывал. Они точно так же кувыркались',
'А ведь вы живых людей дубасите...',
'А вот я вчера в зоопарке был...',
'А вы в стройбате не служили?',
'А вы видели, чтобы так на улице делали!?',
'А вы знали что ёжики размножаются в интернете?',
'А жить-то, как хочется:',
'А из-за чего вы собственно дерётесь?',
'А чего ржёте, вы ещё остальных не видели',
'А что произойдёт если ты испугаешся до полусмерти дважды?!',
'Больше так не делай. Ты же не садист?',
'Без комментариев...',
'Больно ведь!',
'Быстро ты за монитор спрятался!',
'Все хотят попасть в рай, но никто не хочет умирать!',
'Вчера с такой девчонкой познакомился.',
'Всего 5 минут знакомы, а дерутся, словно супруги с 20-ти летним стажем...',
'Все. Я так больше не могу.',
'В конце концов, кто-то победит?',
'Вы чего, с дерева упали?',
'Возятся как сонные мухи... давайте я вам лучше анекдот расскажу: ...',
'Вот видишь, как полезно чистить зубы на ночь?',
'Вот вы все руками махаете, а за вами уже очередь',
'Вот попадёте вы в плен и вас там будут долго бить. Но вы ничего не расскажете... и не потому, что вы такой стойкий, просто вы ничего не знаете',
'Вы бы лучше пошли потренировались!',
'Вы все еще разминаетесь? Позовите, когда кости в муку друг другу разминать будете.',
'Вы же бойцы! Имейте совесть!',
'Гаси недоумка!',
'Да, если бы я смог это остановить, то получил бы нобелевскую премию `За мир` ',
'Да куда они бьют?!',
'Давайте быстрее! За вами уже очередь образовалась.',
'Давайте обойдемся сегодня таймаутом. А? А то мне уже кошмары скоро будут сниться.',
'Дерутся как девчонки!',
'Дети, посмотрите налево... Ой!.. Нет, туда лучше не смотреть.',
'Если так будет продолжаться, то скоро мы заснем!',
'Если бы у меня было кресло-качалка, я бы в нём качался...',
'Если вы что-то сказать хотите, то лучше молчите :)',
'Жестокость не порок.',
'Жизнь вне нашего клуба - это пустая трата кислорода!!!',
'Жми! Дави! Кусай! Царапай!',
'За такие бои надо в хаос отправлять!',
'Знаете откуда в комиссионном магазине столько вещей? Это я после ваших гулянок собираю и сдаю туда. Иногда вместе с частями тела, застрявшими в них.',
'Здесь люди так близки друг к другу. Просто иначе ударить нельзя.',
'И пролитая кровь еще пульсирует...',
'Инвалидов развелось...',
'Какой бой!!!',
'Кто!? Кто здесь?!',
'Кто вас этому научил?',
'Кузнечик, блин...',
'Куплю импортный проигрыватель грампластинок.',
'Лошадью ходи!',
'Лучше враг, чем друг - враг.',
'Ладно, вы тут пока друг друга за волосы таскайте, а я пойду, пообедаю.',
'Мне ваш балет уже надоел!',
'Может, начнется-таки настоящий бой???',
'Мысли лезут в голову изнутри, а удары снаружи.',
'Ну и где ваши коронные удары? Где живописные падения я спрашиваю!',
'Ну, нельзя же так наотмашь лупить!',
'Надо раньше было думать, теперь смертельно поздно...',
'На такое зрелище билеты продавать можно. Народ ухохочется!',
'Нет! Не надо драки! А... ладно деритесь, все равно не умеете.',
'Нет, ну должен быть повод, должен же быть повод?',
'Нет, я отказываюсь это комментировать!',
'Не таких обламывали!',
'Ну выпили вы рюмку, ну две... ну литр, ну два... так зачем же после этого драку затевать?!',
'Ну и кто за этот погром платить будет?',
'Ну и оскал у вас. Из вашей улыбки кастеты делать можно.',
'Ну, что же ты..? Не печалься. Выше голову, так по ней удобней попасть.',
'Ничего... Блок тоже удар.',
'Обернись!!!.... Поздно...',
'Ого! Научите меня так не делать.',
'Осторожно! Сделаешь дырочку, уже не запломбируешь!',
'Оно вам надо???',
'Обычное дело...там что-то отклеилось.',
'Ой, и заболтался я с вами...',
'Он же не промахнётся если ты не отойдёшь!',
'По-моему, кому-то светит инвалидность.',
'Подкинь ему грабли, на которые он еще не наступал.',
'Прав был кот Леопольд, давайте жить дружно?',
'При ударе в живот нарушается кислотно-щелочной баланс.',
'Проверь, не торчит ли у тебя нож из живота.',
'Перестаньте мне орать!',
'Подкинь ему грабли, на которые он еще не наступал.',
'Прыгают тут как блохи... Все, я пошел за дихлофосом!',
'Разбудите меня когда эта порнография закончится...',
'Ребенок сильнее ударил бы!',
'Славно вмазал!',
'Славно они веселятся',
'Смотрю вот на вас, и слезы наворачиваются.',
'Сначала учатся ходить, а потом только в драку лезут.',
'Так они друг другу что-нибудь сломают.',
'Так ты ему все кости переломаешь!',
'У меня в подъезде точно так же соседа отмудохали',
'Убогих развелось...',
'Ух ты, какой прыткий!',
'Фашист!! Надо ж, так по больному месту врезать...',
'Хватит бить его об угол моей кабинки! Мне же потом ее чинить.',
'Хулиганы, прекратите немедленно!',
'Хочешь, подскажу, куда он ударит?',
'Хорошо, что у меня ловкости больше чем у вас всех, а то б вы и меня в инвалидную коляску посадили бы.',
'Хороший бой!',
'Хороший удар!',
'Хиляк-разрядник!',
'Что ты его за волосы схватил?! Отпусти немедленно!',
'Щас я вас настигну, вот тогда мы и похохочем',
'Это была какая-то неизвестная мне техника...',
'Это же противник, а не глина! Хватит мяться!',
'Это не бой, это издевательское избиение.',
'Это поубавит спеси',
'Это и был твой план `Б` ?',
'Это была какая-то неизвестная мне техника...',
'Я же предупреждал, - будет больно.',
'Я не страдаю безумием. Я наслаждаюсь им каждую минуту :)',
'Я красивый, я сильный, я умный, я добрый. А вот вы? Вы себя-то видели?!',
'Я тоже умею драться, но не буду...',
'(тревожно озираясь) я вам по секрету скажу... за вами наблюдают!',
'<вырезано цензурой> после боя я этих <вырезано цензурой> обоих в <вырезано цензурой> и <вырезано цензурой>',
'<вырезано цензурой> каратисты фиговы',
];
$randomcomment = $comments[array_rand($comments)];
self::add(
[
'battle' => $battleId,
'id_hod' => $hodId,
'text' => "{tm1} <i>Комментатор: $randomcomment</i>",
'vars' => 'time1=' . time(),
'type' => 1,
]
);
}
public static function getAttackTurnText(int $weaponType, int $attackZone): array
{
$w = [
0 => ['грудью', 'ребром руки', 'лбом', 'кулаком', 'ногой', 'левой ногой', 'правой ногой', 'коленом',],
1 => ['ножом', 'тыльной стороной лезвия ножа', 'рукоятью ножа', 'лезвием ножа'],
2 => ['сучковатой палкой', 'поленом', 'тяжелой дубиной', 'дубиной', 'рукоятью молота'],
3 => ['секирой', 'топором', 'лезвием секиры', 'алебардой', 'тяжелым держаком', 'длинной секирой'],
4 => ['ножнами', 'гардой', 'мечом', 'лезвием меча', 'рукоятью меча', 'тупым лезвием', 'острой стороной меча', 'огромным мечом',],
5 => ['сучковатой палкой', 'посохом', 'тяжелой тростью', 'корявым посохом', 'основанием посоха'],
22 => ['костылем'],
100 => ['непонятной хреновиной'],
];
$z = [
1 => ['в нос', 'в глаз', 'в челюсть', 'по переносице', 'в кадык', 'по затылку', 'в правый глаз', 'в левый глаз', 'в скулу',],
2 => ['в грудь', 'в корпус', 'в солнечное сплетение', 'в сердце', 'в область лопаток'],
3 => ['в бок', 'по желудку', 'по левой руке', 'по правой руке'],
4 => ['по <вырезано цензурой>', 'в пах', 'в промежность', 'по левой ягодице', 'по правой ягодице'],
5 => ['по ногам', 'в область правой пятки', 'в область левой пятки', 'по коленной чашечке', 'по икрам'],
100 => ['по непонятному месту'],
];
if (!in_array($weaponType, [0, 1, 2, 3, 4, 5, 22])) {
$weaponType = 100;
}
if (!in_array($attackZone, [1, 2, 3, 4, 5])) {
$attackZone = 100;
}
return [
$w[$weaponType][array_rand($w[$weaponType])],
$z[$attackZone][array_rand($z[$attackZone])],
];
}
public static function addLogLine(int $type, int $gender, bool $count = false): string|int
{
$logtext = [
[ // муж.
[],
[
'вспомнил что-то важное',
'высморкался',
'задумался',
'замешкался',
'засмотрелся на <вырезано цензурой>',
'кашлянул',
'ковырялся в зубах',
'обернулся',
'осмотрелся',
'почесался',
'пошатнулся',
'пришел в себя',
'пытался сконцентрироваться',
'пытался увернуться',
'пытался что-то сказать',
'расплылся в улыбке',
'расстроился',
'растерялся',
'удивился',
'чесал <вырезано цензурой>',
'пытался отойти покурить',
'чесал яйца',
],
[
', и за это ',
', а ',
', но в это время ',
', и тут ',
', но вдруг неожиданно ',
', и вдруг ',
', но ',
', и внезапно ',
', но неожиданно ',
', и в этот момент ',
', и в ту же секунду ',
', и в этот миг ',
],
[
'обезумевший',
'расстроенный',
'неустрашимый',
'продвинутый',
'расстроенный',
'страшный',
'задумчивый',
'небритый',
'бесстрастный',
'разъяренный',
'смелый',
'безумный',
'восхитительный',
'жестокий',
'злобный',
'мужественный',
'непобедимый',
'наглый',
'хитрый',
'храбрый',
'отважный',
'железный',
'могучий',
'сильнейший',
'крепкий',
'великий',
'бесстрашный',
],
[
'случайно ',
'отчаянно ',
'проснувшись ',
'мимоходом ',
'разбежавшись ',
'сдуру ',
'со скуки ',
'не помня себя от испуга ',
'улыбаясь ',
'прослезившись ',
'пошатнувшись ',
'проснувшись ',
'беспричинно ',
'опрометчиво ',
'разбежавшись ',
'зевнув ',
'сделав двойное сальто ',
'не подумав ',
'хихикая ',
'ласково ',
'с испугу ',
],
[
'влепил ',
'вломил ',
'саданул ',
],
[
'грубый',
'наглый',
'красивый',
],
[
'неизвестный удар',
'колющий удар',
'рубящий удар',
'дробящий удар',
'режущий удар',
'обжигающий удар',
'удар электричеством',
'обмораживающий удар',
'удар магией земли',
'удар светлой магией',
'удар тёмной магией',
'удар серой магией',
'обычный удар',
'удар',
],
[
'не контролировал ситуацию',
'обманулся',
'старался провести удар',
'думал о <вырезано цензурой>',
'испугался',
'потерял самоконтроль',
'потерял момент',
'был слишком самоуверен',
'пытался провести удар',
'поскользнулся',
'не думал о бое',
'не рассчитал свои силы',
'промахнулся',
'оступился',
'думал не о том',
],
[
', и потому ',
' и ',
', но ',
', вследствие чего ',
', потому ',
],
[
'остановил',
'поставил блок на',
'блокировал',
'отбил',
],
[
'ушел вправо от удара',
'ушел влево от удара',
'увел удар',
'уклонился от удара',
'увернулся от удара',
],
[
'приняв боевые 100 грамм',
'сказав &quot;БУ!&quot;',
'показав противнику кукиш',
'в отчаянном рывке',
'показав сразу два пальца',
],
[
'о<вырезано цензурой>ный',
'точнейший',
],
[
'погиб!',
'повержен!',
'мертв!',
'убит!',
'проиграл бой!',
],
[
'пропустил свой ход',
'потратил свой ход на магию',
'потратил свой ход на прием',
],
[
'использовал',
],
[
'{u1}, вспомнив слова своего сэнсея, из последних сил применил прием &quot;{pr}&quot;.',
'Кроличья лапка, подкова в перчатке и прием &quot;{pr}&quot; помогли {u1} продержаться ещё немного.',
'{u1}, пораскинув мозгами по земле, сообразил, что его выручат или прием &quot;{pr}&quot; или вмешательство Мусорщика.',
'{u1} выкрикнув: &quot;А ещё я вот так могу!&quot;, применил прием &quot;{pr}&quot;.',
'{u1} понял, пропустив очередной удар в голову, что поможет ему только прием &quot;{pr}&quot;.',
'{u1} сам не поняв зачем, применил прием &quot;{pr}&quot;.',
'{u1} нетрезво оценив положение, решил, что его спасение это прием &quot;{pr}&quot;.',
],
[
'{u1}, вспомнив слова своего сэнсея, из последних сил применил прием &quot;{pr}&quot; на {u2}.',
],
[
'{u1}, победив страх, решил поразить {u2} заклятьем &quot;{pr}&quot;',
'{u1} наконец сфокусировал свое внимание на поединке и наколдовал &quot;{pr}&quot; на {u2}',
'{u1} нарисовав вокруг себя несколько рун, призвал заклятье &quot;{pr}&quot; на {u2}',
'{u1} догадавшись, что пришло время показать себя, произнес заклятье &quot;{pr}&quot; на {u2}',
'{u1} с испугу произнес, первое пришедшее на ум, заклятье &quot;{pr}&quot; на {u2}',
'{u1} впал в транс и начал бормотать заклятие &quot;{pr}&quot; на {u2}',
'{u1} очнулся от медитации, и призвал заклятье &quot;{pr}&quot; на {u2}',
],
[
'{u1} пытался наколдовать ужасающее заклятие &quot;{pr}&quot; на {u2}, но ничего не вышло',
'{u1} не смог сфокусировать и наколдовать &quot;{pr}&quot; на {u2}, но ничего не вышло',
'{u1} с испугу произнес ошибочное заклятие &quot;{pr}&quot; на {u2} и ничего не вышло',
'{u1}, потеряв концентрацию, не смог наколдовать &quot;{pr}&quot; на {u2} и ничего не вышло',
'{u1} <вырезано цензурой> от перенапряжения, вследствие чего не смог наколдовать &quot;{pr}&quot; на {u2}',
'{u1} пытался превратить {u2} в табуретку при помощи заклинания &quot;{pr}&quot;... но ничего не вышло',
],
[
'{u1}, победив страх, решил поразить всех и наколдовал &quot;{pr}&quot;',
'{u1} наконец сфокусировал свое внимание на поединке и наколдовал &quot;{pr}&quot;',
'{u1} нарисовав вокруг себя несколько рун, призвал заклятье &quot;{pr}&quot;',
'{u1} догадавшись, что пришло время показать себя, произнес заклятье &quot;{pr}&quot;',
'{u1} с испугу произнес, первое пришедшее на ум, заклятье &quot;{pr}&quot;',
'{u1} впал в транс и начал бормотать заклятие &quot;{pr}&quot;',
'{u1} очнулся от медитации, и призвал заклятье &quot;{pr}&quot;',
],
],
[ // жен.
[],
[
'вспомнила что-то важное',
'высморкалась',
'задумалась',
'замешкалась',
'засмотрелась на <вырезано цензурой>',
'кашлянула',
'ковырялась в зубах',
'обернулась',
'осмотрелась',
'почесалась',
'пошатнулась',
'пришла в себя',
'пыталась сконцентрироваться',
'пыталась увернуться',
'пыталась что-то сказать',
'расплылалась в улыбке',
'расстроилась',
'растерялась',
'удивилась',
'чесала <вырезано цензурой>',
'пыталась отойти покурить',
'поправляла прическу',
],
[
', и за это ',
', а ',
', но в это время ',
', и тут ',
', но вдруг неожиданно ',
', и вдруг ',
', но ',
', и внезапно ',
', но неожиданно ',
', и в этот момент ',
', и в ту же секунду ',
', и в этот миг ',
],
[
'обезумевшая',
'расстроенная',
'неустрашимая',
'продвинутая',
'расстроенная',
'страшная',
'задумчивая',
'взъерошенная',
'бесстрастная',
'разъяренная',
'смелая',
'безумная',
'восхитительная',
'жестокая',
'злобная',
'мужественная',
'непобедимая',
'наглая',
'хитрая',
'храбрая',
'отважная',
'железная',
'могучая',
'сильнейшая',
'крепкая',
'великая',
'бесстрашная',
],
[
'случайно ',
'отчаянно ',
'проснувшись ',
'мимоходом ',
'разбежавшись ',
'сдуру ',
'со скуки ',
'не помня себя от испуга ',
'улыбаясь ',
'прослезившись ',
'пошатнувшись ',
'проснувшись ',
'беспричинно ',
'опрометчиво ',
'разбежавшись ',
'зевнув ',
'сделав двойное сальто ',
'не подумав ',
'хихикая ',
'ласково ',
'с испугу ',
],
[
'влепила ',
'вломила ',
'саданула ',
],
[
'грубый',
'наглый',
'красивый',
],
[
'тычок',
'тычок',
'рубящий удар',
'разбивающий удар',
'рассекающий удар',
'обжигающий удар',
'удар электричеством',
'обмораживающий удар',
'удар магией земли',
'удар светлой магией',
'удар тёмной магией',
'удар серой магией',
'неизсветный удар',
'удар',
],
[
'не контролировала ситуацию',
'обманулась',
'старалась провести удар',
'думала о <вырезано цензурой>',
'испугалась',
'потеряла самоконтроль',
'потеряла момент',
'была слишком самоуверенна',
'пыталась провести удар',
'поскользнулась',
'не думала о бое',
'не рассчитала свои силы',
'промахнулась',
'оступилась',
'думала не о том',
],
[
', и потому ',
' и ',
', но ',
', вследствие чего ',
', потому ',
],
[
'остановила',
'поставила блок на',
'блокировала',
'отбила',
],
[
'ушла вправо от удара',
'ушла влево от удара',
'увела удар',
'уклонилась от удара',
'увернулась от удара',
],
[
'приняв боевые 100 грамм',
'сказав &quot;БУ!&quot;',
'показав противнику кукиш',
'в отчаянном рывке',
'показав сразу два пальца',
],
[
'о<вырезано цензурой>ный',
'точнейший',
],
[
'погибла!',
'повержена!',
'мертва!',
'убита!',
'проиграла бой!',
],
[
'пропустила свой ход',
'потратила свой ход на магию',
'потратила свой ход на прием',
],
[
'использовала',
],
[
'{u1}, вспомнив слова своего сэнсея, из последних сил применила прием &quot;{pr}&quot;.',
'Кроличья лапка, подкова в перчатке и прием &quot;{pr}&quot; помогли {u1} продержаться ещё немного.',
'{u1}, пораскинув мозгами по земле, сообразила, что её выручат или прием &quot;{pr}&quot; или вмешательство Мусорщика.',
'{u1} выкрикнув: &quot;А ещё я вот так могу!&quot;, применила прием &quot;{pr}&quot;.',
'{u1} поняла, пропустив очередной удар в голову, что поможет ей только прием &quot;{pr}&quot;.',
'{u1} сама не поняв зачем, применила прием &quot;{pr}&quot;.',
'{u1} нетрезво оценив положение, решила, что её спасение это прием &quot;{pr}&quot;.',
],
[
'{u1}, вспомнив слова своего сэнсея, из последних сил применила прием &quot;{pr}&quot; на {u2}.',
],
[
'{u1}, победив страх, решила поразить {u2} заклятьем &quot;{pr}&quot;',
'{u1} наконец сфокусировала свое внимание на поединке и наколдовала &quot;{pr}&quot; на {u2}',
'{u1} нарисовав вокруг себя несколько рун, призвала заклятье &quot;{pr}&quot; на {u2}',
'{u1} догадавшись, что пришло время показать себя, произнесла заклятье &quot;{pr}&quot; на {u2}',
'{u1} с испугу произнесла, первое пришедшее на ум, заклятье &quot;{pr}&quot; на {u2}',
'{u1} впала в транс и начала бормотать заклятие &quot;{pr}&quot; на {u2}',
'{u1} очнулась от медитации, и призвала заклятье &quot;{pr}&quot; на {u2}',
],
[
'{u1} пыталась наколдовать ужасающее заклятие &quot;{pr}&quot; на {u2}, но ничего не вышло',
'{u1} не смогла сфокусировать и наколдовать &quot;{pr}&quot; на {u2}, но ничего не вышло',
'{u1} с испугу произнесла ошибочное заклятие &quot;{pr}&quot; на {u2} и ничего не вышло',
'{u1}, потеряв концентрацию, не смогла наколдовать &quot;{pr}&quot; на {u2} и ничего не вышло',
'{u1} <вырезано цензурой> от перенапряжения, вследствие чего не смогла наколдовать &quot;{pr}&quot; на {u2}',
'{u1} пыталась превратить {u2} в табуретку при помощи заклинания &quot;{pr}&quot;... но ничего не вышло',
],
[
'{u1}, победив страх, решила поразить всех и наколдовала &quot;{pr}&quot;',
'{u1} наконец сфокусировала свое внимание на поединке и наколдовала &quot;{pr}&quot;',
'{u1} нарисовав вокруг себя несколько рун, призвала заклятье &quot;{pr}&quot;',
'{u1} догадавшись, что пришло время показать себя, произнесла заклятье &quot;{pr}&quot;',
'{u1} с испугу произнесла, первое пришедшее на ум, заклятье &quot;{pr}&quot;',
'{u1} впала в транс и начала бормотать заклятие &quot;{pr}&quot;',
'{u1} очнулась от медитации, и призвала заклятье &quot;{pr}&quot;',
],
],
];
if ($count) {
return count($logtext[$gender][$type]);
}
if (!in_array($gender, [0, 1]) || !in_array($type, range(1, 21))) {
return 'произошло нечто непонятное';
}
return $logtext[$gender][$type][array_rand($logtext[$gender][$type])];
}
}

View File

@ -1,114 +0,0 @@
<?php
namespace Battle\Priem;
abstract class AbstractPriem implements PriemInterface
{
protected int $caster;
protected string $name;
protected string $icon;
protected int $power;
/**
* На кого применяем приём. Например:
* self, static_friend, static_enemy, random_friend, random_enemy, random_friend_group, random_enemy_group,
* all_friend, all_enemy, all,...
* @var int
*/
protected int $targetType;
/**
* Массив id союзников
* @var array
*/
protected array $friendTeam;
/** Массив id противников
* @var array
*/
protected array $enemyTeam;
public function __construct(
int $caster,
array $friendTeam,
array $enemyTeam,
int $targetType,
string $name,
string $icon = '',
) {
$this->caster = $caster;
$this->friendTeam = $friendTeam;
$this->enemyTeam = $enemyTeam;
$this->targetType = $targetType;
$this->icon = $icon;
$this->name = $name;
}
protected function getTarget(): array
{
$targets = [];
$allExceptCaster = array_merge($this->friendTeam, $this->enemyTeam);
switch ($this->targetType) {
case self::TAGRET_SELF:
$targets[] = $this->caster;
break;
case self::TARGET_RANDOM_ENEMY:
shuffle($this->enemyTeam);
$targets[] = end($this->enemyTeam);
break;
case self::TARGET_RANDOM_FRIEND:
shuffle($this->friendTeam);
$targets[] = end($this->friendTeam);
break;
case self::TARGET_RANDOM:
shuffle($allExceptCaster);
$targets[] = end($allExceptCaster);
break;
case self::TARGET_RANDOM_ENEMIES:
for ($i = 1; $i <= count($this->enemyTeam); $i++) {
if ($i > 1 && mt_rand(1,2) === 1) {
continue;
}
shuffle($this->enemyTeam);
$targets[] = array_shift($this->enemyTeam);
}
break;
case self::TARGET_RANDOM_FRIENDS:
for ($i = 1; $i <= count($this->friendTeam); $i++) {
if ($i > 1 && mt_rand(1,2) === 1) {
continue;
}
shuffle($this->friendTeam);
$targets[] = array_shift($this->friendTeam);
}
break;
case self::TARGET_RANDOMS:
for ($i = 1; $i <= count($allExceptCaster); $i++) {
if ($i > 1 && mt_rand(1,2) === 1) {
continue;
}
shuffle($allExceptCaster);
$targets[] = array_shift($allExceptCaster);
}
break;
case self::TARGET_ALL_ENEMIES:
$targets = $this->enemyTeam;
break;
case self::TARGET_ALL_FRIENDS:
$targets = $this->friendTeam;
break;
case self::TARGET_ALL:
$targets = $allExceptCaster;
$targets[] = $this->caster;
break;
}
return $targets;
}
/**
* Возвращает иконку приёма. В текущей реализации у каждого приёма должна быть иконка.
* @return string
*/
abstract public function getIcon(): string;
}

View File

@ -1,78 +0,0 @@
<?php
namespace Battle\Priem;
class Priem extends AbstractPriem
{
/*
id, name, image,
damage_type_value: static, +value,
damage_time: now, next_turn, x_turns,
target: self, static_friend, static_enemy, random_friend, random_enemy, random_friend_group, random_enemy_group, all_friend, all_enemy, all,
damage_type: physical (колка, рубка, резка, дробка), magical (water, air, earth, fire,)
physical: {
type: [static, +value,]
time: [now, next_turn, x_turns,]
target: [static_enemy,]
}
*/
protected int $power;
private array $targets;
/**
* @param int $caster
* @param array $friendTeam
* @param array $enemyTeam
* @param int $targetType
* @param int $power
* @param int $powerType static, +value,
* @param string $name
* @param int $activeTurns количество ходов которое будет применяться приём. 0 - выполнить в текущий ход.
* @param string $icon
*/
public function __construct(
int $caster,
array $friendTeam,
array $enemyTeam,
int $targetType,
int $power,
int $powerType,
string $name,
int $activeTurns = 1,
string $icon = '',
) {
parent::__construct($caster, $friendTeam, $enemyTeam, $targetType, $name, $icon);
$this->power = $power;
$this->targets = $this->getTarget();
}
public function getIcon(): string
{
return $this->icon;
}
public function getTargetType(): int
{
return $this->targetType;
}
public function getTarget(): array
{
return $this->targets;
}
public function getPower(): int
{
return $this->power;
}
}
//$pr = new Priem(45,[1,2,3],[4,5,6],5,44,'Kaboom!', 'kaboom.gif');
//$pr->

View File

@ -1,36 +0,0 @@
<?php
namespace Battle\Priem;
interface PriemInterface
{
public const DAMAGE = 1;
public const HEAL = 2;
public const TAGRET_SELF = 1; //Приём на себя
public const TARGET_CUSTOM = 2; //Приём на конкретного персонажа
public const TARGET_RANDOM_ENEMY = 3; //Приём на случайного врага
public const TARGET_RANDOM_FRIEND = 4; //Приём на случайного друга
public const TARGET_RANDOM = 5; //Приём на случайного персонажа
public const TARGET_RANDOM_ENEMIES = 6; //Приём на случайных врагов
public const TARGET_RANDOM_FRIENDS = 7; //Приём на случайных друзей
public const TARGET_RANDOMS = 8; //Приём на случайных персонажей
public const TARGET_ALL_ENEMIES = 9; //Приём на всех врагов
public const TARGET_ALL_FRIENDS = 10; //Приём на всех друзей
public const TARGET_ALL = 11; //Приём на всех персонажей
/**
* Возвращает тип цели к которым применяется приём.
* @return int
*/
public function getTargetType(): int;
/**
* Возвращает силу действия приёма. Параметр на который изменится та или иная характеристика. Урон для боевых,
* количество восстановленого здоровья для лечения, количество процентов для процентных значений.
* @return int
*/
public function getPower(): int;
}

View File

@ -1,13 +0,0 @@
<?php
namespace Battle\Priem;
class UsePriem
{
public function __construct(Priem $priem) {
$damage = $priem->getPower();
$targets = $priem->getTarget();
}
}

View File

@ -1,580 +0,0 @@
<?php
namespace Battle;
use Battle;
use Helper\Comparsion;
use Helper\Conversion;
class Razmen
{
private array $attackerStats;
private array $targetStats;
private int $uid1;
private int $uid2;
/**
* @param Battle $battle
* @param int $id
* @param array $at
*/
public function __construct(private readonly Battle $battle, private readonly int $id, private array $at)
{
$uid1 = $this->battle->atacks[$this->id]['uid1'];
$uid2 = $this->battle->atacks[$this->id]['uid2'];
$stats1 = $this->battle->stats[$this->battle->uids[$uid1]];
$stats2 = $this->battle->stats[$this->battle->uids[$uid2]];
if ($stats1['yhod'] > 0) {
$uid1 = $this->battle->yhod_user($uid2, $uid1, $stats1['yhod']);
} elseif ($stats2['yhod'] > 0) {
$uid2 = $this->battle->yhod_user($uid1, $uid2, $stats2['yhod']);
}
$this->uid1 = $uid1;
$this->uid2 = $uid2;
$this->attackerStats = $this->battle->stats[$this->battle->uids[$uid1]];
$this->targetStats = $this->battle->stats[$this->battle->uids[$uid2]];
# Переменные - Моё почтение!
# $this->stats[$this->uids[$this->yhod_user($this->atacks[$this->id]['uid2'], $this->atacks[$this->id]['uid1'], $this->stats[$this->uids[$this->atacks[$this->id]['uid1']]]['yhod'])]];
# $this->battle->stats[$this->battle->uids[$this->battle->yhod_user($this->battle->atacks[$this->id]['uid2'], $this->battle->atacks[$this->id]['uid1'], $this->battle->stats[$this->battle->uids[$this->battle->atacks[$this->id]['uid1']]]['yhod'])]];
}
private function updateBattleStats(): void
{
$this->battle->stats[$this->battle->uids[$this->uid1]] = $this->attackerStats;
$this->battle->stats[$this->battle->uids[$this->uid2]] = $this->targetStats;
}
/**
* Расчет парирования Цели (uid2) от Атакующего (uid1)
* @param int $counterstrikecheck
* @param bool $pat
* @param int $loopstart
* @return void
*/
public function parry(int $counterstrikecheck = 0, bool $pat = false, int $loopstart = 0): void
{
if ($pat) {
$tempAt = $this->at;
$this->at = $tempAt['p'];
}
if ($loopstart > 0) {
$loopstart--;
}
if (is_array($this->at[1]['atack'])) {
for ($j = $loopstart; $j < count($this->at[1]['atack']) && $j < 8; $j++) {
if (
!empty($this->targetStats['no_pr1']) ||
$this->at[1]['atack'][$j][2] != $counterstrikecheck ||
$this->mfs(__FUNCTION__, [1 => $this->targetStats['m7'], 2 => $this->attackerStats['m7'],]) != 1 ||
$this->battle->atacks[$this->id]['out2'] != 0
) {
continue;
}
if (!empty($this->attackerStats['nopryh']) || $this->attackerStats['nopryh_act'] > 0) {
continue;
}
// Парировал
$this->attackerStats['nopryh'] = (int)floor($this->attackerStats['nopryh']);
$this->at[1]['atack'][$j][1] = 6;
$this->attackerStats['nopryh']--;
$this->attackerStats['nopryh_act']++;
}
}
if (is_array($this->at[2]['atack'])) {
for ($j = $loopstart; $j < count($this->at[2]['atack']) && $j < 8; $j++) {
if (
!empty($this->attackerStats['no_pr1']) ||
$this->at[2]['atack'][$j][2] != $counterstrikecheck ||
$this->mfs(__FUNCTION__, [1 => $this->attackerStats['m7'], 2 => $this->targetStats['m7'],]) != 1 ||
$this->battle->atacks[$this->id]['out1'] != 0
) {
continue;
}
if (!empty($this->targetStats['nopryh']) || $this->targetStats['nopryh_act'] > 0) {
continue;
}
// Парировал
$this->targetStats['nopryh'] = (int)floor($this->targetStats['nopryh']);
$this->at[2]['atack'][$j][1] = 6;
$this->targetStats['nopryh']--;
$this->targetStats['nopryh_act']++;
}
}
if (isset($tempAt)) {
$tempAt['p'] = $this->at;
$this->at = $tempAt;
}
$this->updateBattleStats();
}
/**
* Расчет блока щитом Цели (uid2) от Атакующего (uid1)
* @param int $counterstrikecheck
* @param bool $pat
* @return void
*/
public function blockByShield(int $counterstrikecheck = 0, bool $pat = false): void
{
if ($pat) {
$tempAt = $this->at;
$this->at = $tempAt['p'];
}
//m8 блок щитом, m18 абсолютный блок щитом
if ($this->targetStats['shield1'] > 0) {
for ($j = 0; $j < count($this->at[1]['atack']) && $j < 8; $j++) {
if (
$this->at[1]['atack'][$j][2] != $counterstrikecheck ||
$this->battle->atacks[$this->id]['out2'] != 0 ||
$this->mfs(__FUNCTION__, $this->targetStats['m8'] / 2 + $this->targetStats['m18']) != 1
) {
continue;
}
$this->at[1]['atack'][$j][1] = 7;
}
}
if ($this->attackerStats['shield1'] > 0) {
for ($j = 0; $j < count($this->at[2]['atack']) && $j < 8; $j++) {
if (
$this->at[2]['atack'][$j][2] != $counterstrikecheck ||
$this->battle->atacks[$this->id]['out1'] != 0 ||
$this->mfs(__FUNCTION__, $this->attackerStats['m8'] / 2 + $this->attackerStats['m18']) != 1
) {
continue;
}
$this->at[2]['atack'][$j][1] = 7;
}
}
if (isset($tempAt)) {
$tempAt['p'] = $this->at;
$this->at = $tempAt;
}
$this->updateBattleStats();
}
/**
* Расчет крита Атакующего (uid1) по Цели (uid2)
* @param bool $pat
* @param int $loopstart
* @return void
*/
public function criticalDamage(bool $pat = false, int $loopstart = 0): void
{
if ($pat) {
$tempAt = $this->at;
$this->at = $tempAt['p'];
}
if ($loopstart > 0) {
$loopstart--;
}
$checkhand = false;
if (is_array($this->at[1]['atack'])) {
for ($j = $loopstart; $j < count($this->at[1]['atack']) && $j < 8; $j++) {
[$data, $checkhand] = $this->getDataArrayByHand($checkhand, $this->attackerStats);
if ($this->mfs(__FUNCTION__, ['mf' => $this->attackerStats['m1'] + $data['sv_m1'], 'amf' => $this->attackerStats['m14'], 'smf' => $this->targetStats['m2']]) != 1) {
continue;
}
$this->at[1]['atack'][$j][1] = match (true) {
$this->at[1]['atack'][$j][1] == 3 => 4, //в блок
!in_array($this->at[1]['atack'][$j][1], [2, 6, 7, 8]) => 5, //обычный крит
default => 1 // а ты что такое?
};
}
}
if (is_array($this->at[2]['atack'])) {
for ($j = $loopstart; $j < count($this->at[2]['atack']) && $j < 8; $j++) {
[$data, $checkhand] = $this->getDataArrayByHand($checkhand, $this->targetStats);
if ($this->mfs(__FUNCTION__, ['mf' => $this->targetStats['m1'] + $data['sv_m1'], 'amf' => $this->targetStats['m14'], 'smf' => $this->attackerStats['m2']]) != 1) {
continue;
}
$this->at[2]['atack'][$j][1] = match (true) {
$this->at[2]['atack'][$j][1] == 3 => 4, //в блок
!in_array($this->at[2]['atack'][$j][1], [2, 6, 7, 8]) => 5, //обычный крит
default => 1 // а ты что такое?
};
}
}
if (isset($tempAt)) {
$tempAt['p'] = $this->at;
$this->at = $tempAt;
}
$this->updateBattleStats();
}
/**
* Расчет уворота Цели (uid2) от Атакующего (uid1)
* @param int $counterstrikecheck
* @param bool $pat
* @param int $loopstart
* @return void
*/
public function evasion(int $counterstrikecheck = 0, bool $pat = false, int $loopstart = 0): void
{
if ($pat) {
$tempAt = $this->at;
$this->at = $tempAt['p'];
}
if ($loopstart > 0) {
$loopstart--;
}
$checkhand = false;
if (is_array($this->at[1]['atack'])) {
for ($j = $loopstart; $j < count($this->at[1]['atack']) && $j < 8; $j++) {
[$data, $checkhand] = $this->getDataArrayByHand($checkhand, $this->attackerStats);
if (
$this->at[1]['atack'][$j][2] != $counterstrikecheck ||
$this->battle->atacks[$this->id]['out2'] != 0 ||
$this->mfs(
__FUNCTION__,
[
'mf' => $this->targetStats['m4'],
'amf' => $this->targetStats['m15'],
'smf' => $this->attackerStats['m5'] + $data['sv_m5'],
'asmf' => $this->attackerStats['m21'],
]
) != 1
) {
continue;
}
$this->attackerStats['nopryh'] = (int)floor($this->attackerStats['nopryh']);
if (!isset($this->attackerStats['nopryh']) || $this->attackerStats['nopryh'] < 1) {
$this->at[1]['atack'][$j][1] = 2;
} else {
$this->attackerStats['nopryh']--;
$this->attackerStats['nopryh_act']++;
}
}
}
if (is_array($this->at[2]['atack'])) {
for ($j = $loopstart; $j < count($this->at[2]['atack']) && $j < 8; $j++) {
[$data, $checkhand] = $this->getDataArrayByHand($checkhand, $this->targetStats);
if (
$this->at[2]['atack'][$j][2] != $counterstrikecheck ||
$this->battle->atacks[$this->id]['out1'] != 0 ||
$this->mfs(
__FUNCTION__,
[
'mf' => $this->attackerStats['m4'],
'amf' => $this->attackerStats['m15'],
'smf' => $this->targetStats['m5'] + $data['sv_m5'],
'asmf' => $this->targetStats['m21'],
]
) != 1
) {
continue;
}
$this->targetStats['nopryh'] = (int)floor($this->targetStats['nopryh']);
if (!isset($this->targetStats['nopryh']) || $this->targetStats['nopryh'] < 1) {
$this->at[2]['atack'][$j][1] = 2;
} else {
$this->targetStats['nopryh']--;
$this->targetStats['nopryh_act']++;
}
}
}
if (isset($tempAt)) {
$tempAt['p'] = $this->at;
$this->at = $tempAt;
}
$this->updateBattleStats();
}
/**
* Расчет контрудара Цели (uid2) по Атакующему (uid1)
* @param int $counterstrikecheck
* @return void
*/
public function counterstrike(int $counterstrikecheck = 0): void //terrorists win!
{
if (is_array($this->at[1]['atack'])) {
for ($j = 0; $j < count($this->at[1]['atack']) && $j < 8; $j++) {
if (
$this->at[1]['atack'][$j][1] != 2 ||
$this->at[1]['atack'][$j][2] != $counterstrikecheck ||
$this->mfs(__FUNCTION__, ['a' => $this->targetStats['m6'], 'b' => $this->attackerStats['m6']]) != 1
) {
continue;
}
$this->at[1]['atack'][$j][1] = 8;
$rand = mt_rand(1, 5);
if ($this->battle->testRazmenblock1($this->id, $this->uid2, $this->uid1)) {
$this->at[2]['atack'][] = [$rand, 3, 0, 1];
} else {
$this->at[2]['atack'][] = [$rand, 1, 0, 1]; // 3 , 0 , 1
}
$this->counterstrikehit(count($this->at[2]['atack']));
}
}
if (is_array($this->at[2]['atack'])) {
for ($j = 0; $j < count($this->at[2]['atack']) && $j < 8; $j++) {
if (
$this->at[2]['atack'][$j][1] != 2 ||
$this->at[2]['atack'][$j][2] != $counterstrikecheck ||
$this->mfs(__FUNCTION__, ['a' => $this->attackerStats['m6'], 'b' => $this->targetStats['m6']]) != 1
) {
continue;
}
$this->at[2]['atack'][$j][1] = 8;
$rand = mt_rand(1, 5);
if ($this->battle->testRazmenblock1($this->id, $this->uid1, $this->uid2)) {
$this->at[1]['atack'][] = [$rand, 3, 0, 1];
} else {
$this->at[1]['atack'][] = [$rand, 1, 0, 1]; // 3 , 0 , 1
}
$this->counterstrikehit(count($this->at[1]['atack']));
}
}
$this->updateBattleStats();
}
/**
* Рассчёт урона.
* @param bool $pat
* @param int $loopstart
* @return void
*/
public function damage(bool $pat = false, int $loopstart = 0): void
{
$yhod = [1 => 0, 0];
if ($this->battle->stats[$this->battle->uids[$this->uid1]]['yhod'] > 0) {
$yhod = [1 => 1, 0];
} elseif ($this->battle->stats[$this->battle->uids[$this->uid2]]['yhod'] > 0) {
$yhod = [1 => 0, 1];
}
if ($pat) {
$tempAt = $this->at;
$this->at = $tempAt['p'];
}
if ($loopstart > 0) {
$loopstart--;
}
$checkhand = false;
if (is_array($this->at[1]['atack'])) {
for ($j = $loopstart; $j < count($this->at[1]['atack']) && $j < 8; $j++) {
[$data, $checkhand, $wp, $witm] = $this->getDataArrayByHand($checkhand, $this->attackerStats);
$this->at[1]['atack'][$j]['wt'] = $witm['type'];
$this->at[1]['atack'][$j]['yhod'] = $yhod[1];
if (
!isset($this->at[1]['atack'][$j]['yron']) &&
in_array($this->at[1]['atack'][$j][1], [1, 4, 5])
) {
$type = 'yron';
} else {
$type = 'block';
}
$this->at[1]['atack'][$j][$type] = $this->battle->yronGetrazmen($this->uid2, $this->uid1, $witm);
if ($this->at[1]['atack'][$j][1] == 4) {
$this->at[1]['atack'][$j][$type]['y_old'] = $this->at[1]['atack'][$j][$type]['y'];
$this->at[1]['atack'][$j][$type]['y'] = (int)round($this->at[1]['atack'][$j][$type]['k'] / 2);
} elseif ($this->at[1]['atack'][$j][1] == 5) {
$this->at[1]['atack'][$j][$type]['y_old'] = $this->at[1]['atack'][$j][$type]['y'];
$this->at[1]['atack'][$j][$type]['y'] = $this->at[1]['atack'][$j][$type]['k'];
}
$this->at[1]['atack'][$j][$type]['2h'] = $data['2h'];
$this->at[1]['atack'][$j][$type]['w'] = $wp;
if ($this->at[1]['atack'][$j][$type]['y'] > 0) {
$this->at[1]['atack'][$j][$type]['r'] = '-' . $this->at[1]['atack'][$j][$type]['y'];
} else {
$this->at[1]['atack'][$j][$type]['r'] = '--';
}
}
}
if (is_array($this->at[2]['atack'])) {
for ($j = $loopstart; $j < count($this->at[2]['atack']) && $j < 8; $j++) {
[$data, $checkhand, $wp, $witm] = $this->getDataArrayByHand($checkhand, $this->targetStats);
$this->at[2]['atack'][$j]['wt'] = $witm['type'];
$this->at[2]['atack'][$j]['yhod'] = $yhod[1];
if (
!isset($this->at[2]['atack'][$j]['yron']) &&
in_array($this->at[2]['atack'][$j][1], [1, 4, 5])
) {
$type = 'yron';
} else {
$type = 'block';
}
$this->at[2]['atack'][$j][$type] = $this->battle->yronGetrazmen($this->uid1, $this->uid2, $witm);
if ($this->at[2]['atack'][$j][1] == 4) {
$this->at[2]['atack'][$j][$type]['y_old'] = $this->at[2]['atack'][$j][$type]['y'];
$this->at[2]['atack'][$j][$type]['y'] = (int)round($this->at[2]['atack'][$j][$type]['k'] / 2);
} elseif ($this->at[2]['atack'][$j][1] == 5) {
$this->at[2]['atack'][$j][$type]['y_old'] = $this->at[2]['atack'][$j][$type]['y'];
$this->at[2]['atack'][$j][$type]['y'] = $this->at[2]['atack'][$j][$type]['k'];
}
$this->at[2]['atack'][$j][$type]['2h'] = $data['2h'];
$this->at[2]['atack'][$j][$type]['w'] = $wp;
if ($this->at[2]['atack'][$j][$type]['y'] > 0) {
$this->at[2]['atack'][$j][$type]['r'] = '-' . $this->at[2]['atack'][$j][$type]['y'];
} else {
$this->at[2]['atack'][$j][$type]['r'] = '--';
}
}
}
if (isset($tempAt)) {
$tempAt['p'] = $this->at;
$this->at = $tempAt;
}
$this->updateBattleStats();
}
/**
* Возвращает массив:
*
* 0 => data предмета в зависимости от руки в которой тот находится,
*
* 1 => флажок проверки руки,
*
* 2 => число слота руки(?!),
*
* 3 => массив параметров предмета для Battle::class->yronGetrazmen()
* @param bool $check
* @param array $stats
* @return array{array,bool,int,array}
*/
private function getDataArrayByHand(bool $check, array $stats): array
{
if (!$check && isset($stats['wp3id'])) { //Левая рука
$wp = 3;
$check = true;
} else { //Правая рука
if (isset($stats['wp14id']) && $stats['items'][$stats['wp14id']]['type'] != 13) {
$wp = 14;
} else {
$wp = 3;
}
$check = false;
}
$witm = $stats['items'][$stats["wp{$wp}id"]];
return [Conversion::dataStringToArray($witm['data']), $check, $wp, $witm];
}
private function mfs(int|string $type, array|int $mf): int
{
if (is_array($mf)) {
$mf = array_map(fn($a) => max($a, 0), $mf);
}
$rval = 0;
if ($type == 'criticalDamage') {
//Крит
if ($mf['mf'] > $mf['smf']) {
$rval = 100 - floor(((($mf['smf']) / ($mf['mf'] + 1)) * 100));
}
$rval = Comparsion::minimax($rval, 0, 75);
if ($mf['amf'] > 0) {
$mf['amf'] = min(100, $mf['amf']);
if (($mf['amf'] * 100) >= mt_rand(1, 10000)) {
$rval = 100;
}
}
} elseif ($type == 'evasion') {
if ($mf['mf'] > $mf['smf']) {
$rval = 100 - floor(((($mf['smf']) / ($mf['mf'] + 1)) * 100)); //2.5
}
$rval = Comparsion::minimax($rval, 0, 75);
if ($mf['asmf'] > 0) {
$mf['asmf'] = min(100, $mf['asmf']);
if ($mf['asmf'] >= mt_rand(1, 100)) {
$rval = 0;
}
}
if ($mf['amf'] >= 0) {
$mf['amf'] = min(100, $mf['amf']);
if ($mf['amf'] >= mt_rand(1, 100)) {
$rval = 100;
}
}
} elseif ($type == 'parry') {
$mf[1] = max($mf[1], 1);
$mf[2] = max($mf[2], 1);
$rval = $mf[1] - $mf[2] / 2;
$rval = Comparsion::minimax($rval, 1, 75);
} elseif ($type == 4) {
$mf = round($mf * 0.6);
$mf = Comparsion::minimax($mf, 0, 100);
$rval = min($mf, 100); //пробой брони
} elseif ($type == 'blockByShield') {
$mf = max($mf, 0);
$rval = min($mf, 85); //блок щитом
} elseif ($type == 'counterstrike') {
//Контрудар
if ($mf['a'] > 0) {
if ($mf['b'] > 0) {
$rval = round($mf['a'] - ($mf['b'] / 2));
} else {
$rval = $mf['a'];
}
}
$rval = Comparsion::minimax($rval, 0, 75);
}
return Helper::getChanse($rval) ? 1 : 0;
}
/**
* Повторный просчёт всего для успешного контрудара.
* @param int $loopstart
* @return void
*/
private function counterstrikehit(int $loopstart): void
{
$this->evasion(1, true, $loopstart);
$this->parry(1, true, $loopstart);
$this->blockByShield(1, true);
$this->criticalDamage(true, $loopstart);
$this->damage(true, $loopstart);
}
public function getAt(): array
{
return $this->at;
}
}

View File

@ -1,8 +1,6 @@
<?php
use Helper\Conversion;
use Model\ActionModel;
use Model\Constant\Stat;
class BotPriemLogic
{
@ -106,9 +104,9 @@ class BotPriemLogic
private static function testpriem($pl): int
{
global $u;
$notr = 0;
$statnames = new Stat();
$statnames->getRequirement();
$tr = Conversion::dataStringToArray($pl['tr']);
$d2 = Conversion::dataStringToArray($pl['date2']);
@ -125,16 +123,16 @@ class BotPriemLogic
}
if ($pl['xuse'] > 0) {
$xu = ActionModel::testCount(['vars = ' . 'use_priem_' . BotLogic::$bot['battle'] . '_' . BotLogic::$bot['id'], "vals = {$pl['id']}",], $pl['xuse']);
if ($xu >= $pl['xuse']) {
$xu = $u->testAction('`vars` = "use_priem_' . BotLogic::$bot['battle'] . '_' . BotLogic::$bot['id'] . '" AND `vals` = "' . $pl['id'] . '" LIMIT ' . $pl['xuse'] . '', 2);
if ($xu[0] >= $pl['xuse']) {
$notr++;
}
}
$x = 0;
while ($x < count($statnames->sysRequirementNames)) {
$n = $statnames->sysRequirementNames[$x];
$t = $u->items['tr'];
while ($x < count($t)) {
$n = $t[$x];
if (isset($tr['tr_' . $n])) {
if ($n == 'lvl') {
if ($tr['tr_' . $n] > BotLogic::$bot['level']) {

View File

@ -10,103 +10,29 @@ use User\ItemsModel;
class ItemStorage
{
private string $error = '';
private int $clanId;
private int $userId;
private string $userLogin;
public function __construct()
public function put(int $itemId, int $clanId): string
{
$userinfo = User::start()->info;
$this->userId = $userinfo['id'];
$this->clanId = $userinfo['clan'];
$this->userLogin = $userinfo['login'];
}
public function take(int $itemId): string
{
$item = Db::getRows('select items_users.id, name, data from items_users inner join items_main on item_id = items_main.id where uid = ? and items_users.id = ?', ["-21$this->clanId", $itemId]);
if (!isset($item['id'])) {
return 'Предмет не найден.<br>' . $itemId;
}
$data = Conversion::dataStringToArray($item['data']);
$cls = isset($data['toclan']) ? explode('#', $data['toclan'])[1] : 0;
$col = ItemsModel::itemsX($itemId);
Db::sql('update items_users set lastUPD = unix_timestamp(), uid = ? where id = ?', [$this->userId, $itemId]);
Db::sql('insert into clan_operations (clan, type, text, time, val, uid) values (?,5,?,unix_timestamp(),?,?)', [$this->clanId, $this->userLogin, "{$item['name']} (x$col) Id:$itemId Хозяин: $cls", $this->userId]);
return "Вы успешно взяли предмет «{$item['name']}» из хранилища.";
}
public function remove(int $type): void
{
$storedItems = Db::getRows('select items_users.id, uid, name, data, inOdet from items_users inner join items_main on item_id = items_main.id where uid = ? or data like ?', ["-21$this->clanId", "%toclan=$this->clanId#%"]);
foreach ($storedItems as $storedItem) {
$data = Conversion::dataStringToArray($storedItem['data']);
$cls = isset($data['toclan']) ? explode('#', $data['toclan'])[1] : 0;
$col = ItemsModel::itemsX($storedItem['id']);
if ($cls == $this->userId) {
if ($storedItem['uid'] != $this->userId && $storedItem['inOdet'] != 0) {
Db::sql('update items_users set inOdet = 0 where id = ?', [$storedItem['id']]);
}
unset($data['toclan']);
$storedItem['data'] = Conversion::arrayToDataString($data);
Db::sql('update items_users set lastUPD = unix_timestamp(), uid = ?, data = ? where id = ?', [$this->userId, $storedItem['data'], $storedItem['id']]);
Db::sql('insert into clan_operations (clan, type, text, time, val, uid) values (?,?,?,unix_timestamp(),?,?)', [$this->clanId, $type, $this->userLogin, "{$storedItem['name']} (x$col) Id:{$storedItem['id']}", $this->userId]);
} elseif ($storedItem['uid'] == $this->userId) {
Db::sql('update items_users set lastUPD = unix_timestamp(), uid = ? where id = ?', ["-21$this->clanId", $storedItem['id']]);
Db::sql('insert into clan_operations (clan, type, text, time, val, uid) values (?,9,?,unix_timestamp(),?,?)', [$this->clanId, $this->userLogin, "{$storedItem['name']} (x$col) Id:{$storedItem['id']}", $this->userId]);
}
}
}
public function backToOwner(int $itemId): string
{
$item = ItemsModel::getOwnedItemById($itemId, $this->userId, true);
if (empty($item)) {
return 'Предмет не найден.';
}
$ownerIsNotReal = !Db::getValue('select count(id) from stats where id = ? and (bot = 0 or clone = 0)', [$item['uid']]);
if ($ownerIsNotReal) {
return 'Вы не можете изьять данный предмет, он не принадлежит клану.';
}
$iw = $item['inOdet'] > 0 ? 'inOdet = 0' : '';
$col = ItemsModel::itemsX($itemId);
Db::sql('insert into clan_operations (clan, type, text, time, val, uid) values (?,6,?,unix_timestamp(),?,?)', [$this->clanId, $this->userLogin, "{$item['name']} (x$col) Id:$itemId У персонажа: {$item['uid']}", $this->userId]);
Db::sql("update items_users set lastUPD = unix_timestamp(), $iw, uid = ? where id = ?", ["-21$this->clanId", $itemId]);
return "Вы успешно изъяли предмет «{$item['name']}»";
}
public function put(int $itemId): string
{
$item = ItemsModel::getOwnedItemById($itemId, $this->userId);
$clanName = Db::getValue('select name from clan where id = ?', [$this->clanId]) ?? '';
$user = User::start()->info;
$item = ItemsModel::getOwnedItemById($itemId, $user['id']);
$clanName = Db::getValue('select name from clan where id = ?', [$clanId]) ?? '';
if (empty($clanName)) {
return 'Клан не найден.';
}
if (!$this->isGoodForStorage($item)) {
if (!$this->isGoodForStorage($item, $user['clan'])) {
return $this->error;
}
$col = ItemsModel::itemsX($itemId);
$col = User::start()->itemsX(($itemId));
$idata = Conversion::dataStringToArray($item['data']);
if (!isset($idata['toclan'])) {
$idata['toclan'] = $this->clanId . '#' . $this->userId;
$idata['toclan'] = $user['clan'] . '#' . $user['id'];
$item['data'] = Conversion::arrayToDataString($idata);
Delo::add(
2,
'System.transfer.clan',
$this->userId,
'&quot;System.transfer.MONEY&quot;: Предмет &quot;' . $item['name'] . '&quot; (#id : "' . $itemId . '") (x' . $col . ') был пожертвован клану &quot;' . $clanName . '&quot; (' . $this->clanId . ').',
$user['id'],
'&quot;System.transfer.MONEY&quot;: Предмет &quot;' . $item['name'] . '&quot; (#id : "' . $itemId . '") (x' . $col . ') был пожертвован клану &quot;' . $clanName . '&quot; (' . $clanId . ').',
);
$sendType = 4;
} else {
@ -114,17 +40,17 @@ class ItemStorage
}
Db::sql(
'insert into clan_operations (clan, time, type, text, val, uid) values (?,unix_timestamp(),?,?,?,?)',
[$this->clanId, $sendType, $this->userLogin, $item['name'] . ("x$col Ид: [$itemId]"), $this->userId]
[$clanId, $sendType, $user['login'], $item['name'] . ("x$col Ид: [$itemId]"), $user['id']]
);
Db::sql(
'update items_users set lastUPD = unix_timestamp(), uid = ?, data = ? where id = ?',
['-21' . $this->clanId, $item['data'], $itemId]
['-21' . $user['clan'], $item['data'], $itemId]
);
return 'Вы передали предмет &quot;' . $item['name'] . '&quot; клану.';
}
private function isGoodForStorage(array $item): bool
private function isGoodForStorage(array $item, $userClanId): bool
{
if (empty($item['inslot']) || !empty($item['gift'])) {
$this->error = 'Предмет не найден.';
@ -138,9 +64,118 @@ class ItemStorage
) {
$this->error = 'Предмет не подходит.';
}
if (!empty($idata['toclan']) && explode('#', $idata['toclan'])[0] == $this->clanId) {
if (!empty($idata['toclan']) && explode('#', $idata['toclan'])[0] == $userClanId) {
$this->error = 'Предмет уже принадлежит клану.';
}
return empty($this->error);
}
public function ungive_itm_cl($id, $user, $cl): string
{
$itm_ = mysql_fetch_array(
mysql_query(
'SELECT `iu`.*, `im`.* FROM `items_users` AS `iu` LEFT JOIN `items_main` AS `im` ON `iu`.`item_id` = `im`.`id` WHERE `iu`.`uid` >= 0 AND `iu`.`delete` = 0 AND `iu`.`id` = "' . $id . '" LIMIT 1'
)
);
$res = mysql_fetch_array(mysql_query('SELECT * FROM `clan` WHERE `id` = "' . $cl . '" LIMIT 1'));
$user_itm = mysql_fetch_array(
mysql_query('SELECT `id`,`bot`,`clone` FROM `stats` WHERE `id` = "' . $itm_['uid'] . '" LIMIT 1')
);
if ($user_itm['bot'] > 0 || $user_itm['clone'] > 0 || !isset($user_itm['id'])) {
$r = '<font color="#FF0000"><strong>Вы не можете изьять данный предмет, он не принадлежит клану</strong></font><br />';
} elseif (isset($itm_['id'])) {
if ($itm_['inOdet'] != 0) {
$o = ', `inOdet` = 0';
} else {
$o = '';
}
$r = '<font color="#FF0000"><strong>Вы успешно изъяли предмет &quot;' . $itm_['name'] . '&quot;</strong></font><br />';
$col = $this->itemsX(((int)$id));
mysql_query(
'INSERT INTO `clan_operations` (`clan`, `time`, `type`, `text`, `val`, `uid`) VALUES ("' . $res['id'] . '", "' . time() . '", "6", "' . $user['login'] . '", "' . $itm_['name'] . ' (x' . $col . ') Ид : [' . $id . '] | У персонажа : [' . $itm_['uid'] . ']", "' . $user['id'] . '")'
);
mysql_query(
'UPDATE `items_users` SET `lastUPD` = "' . time() . '", `uid` = "-21' . $res['id'] . '" ' . $o . ' WHERE `id` = "' . $id . '" LIMIT 1'
);
} else {
$r = '<font color="#FF0000"><strong>Предмет не найден.</strong></font><br />';
}
return $r;
}
public function take_itm_cl($id, $user, $cl): string
{
$itm_ = mysql_fetch_array(
mysql_query(
'SELECT `iu`.*, `im`.* FROM `items_users` AS `iu` LEFT JOIN `items_main` AS `im` ON `iu`.`item_id` = `im`.`id` WHERE `iu`.`uid` = "-21' . $user['clan'] . '" AND `iu`.`delete` = 0 AND `iu`.`id` = "' . $id . '" LIMIT 1'
)
);
$res = mysql_fetch_array(mysql_query('SELECT * FROM `clan` WHERE `id` = "' . $cl . '" LIMIT 1'));
if (isset($itm_['id'])) {
$po = Conversion::dataStringToArray($itm_['data']);
if (isset($po['toclan'])) {
$cls = explode('#', $po['toclan']);
$cls = $cls[1];
}
$col = $this->itemsX(((int)$id));
mysql_query(
'INSERT INTO `clan_operations` (`clan`, `time`, `type`, `text`, `val`, `uid`) VALUES ("' . $res['id'] . '", "' . time() . '", "5", "' . $user['login'] . '", "' . $itm_['name'] . ' (x' . $col . ') Ид : [' . $id . '] Хозяин : [' . $cls . ']", "' . $user['id'] . '")'
);
mysql_query(
'UPDATE `items_users` SET `lastUPD` = "' . time() . '", `uid` = "' . $user['id'] . '" WHERE `id` = "' . $id . '" LIMIT 1'
);
$r = '<font color="#FF0000"><strong>Вы успешно взяли предмет &quot;' . $itm_['name'] . '&quot; из хранилища</strong></font><br />';
} else {
$r = '<font color="#FF0000"><strong>Предмет не найден.</strong></font><br />' . $id;
}
return $r;
}
public function rem_itm_cl($user, $cl, $type)
{
$itms = mysql_query(
'SELECT * FROM `items_users` WHERE (`uid` = "-21' . $user['clan'] . '" OR `data` LIKE "%toclan=' . $user['clan'] . '#%")'
);
while ($pl = mysql_fetch_array($itms)) {
$po = Conversion::dataStringToArray($pl['data']);
if (isset($po['toclan'])) {
$cls = explode('#', $po['toclan']);
$cls = $cls[1];
}
if ($cls == $user['id']) {
if ($pl['uid'] != $user['id']) {
if ($pl['inOdet'] != 0) {
mysql_query('UPDATE `items_users` SET `inOdet` = 0 WHERE `id` = "' . $pl['id'] . '"');
}
}
unset($po['toclan']);
$pl['data'] = Conversion::arrayToDataString($po);
$col = $this->itemsX(((int)$pl['id']));
$it_n = mysql_fetch_array(
mysql_query('SELECT `name` FROM `items_main` WHERE `id` = "' . $pl['item_id'] . '"')
);
mysql_query(
'UPDATE `items_users` SET `lastUPD` = "' . time() . '", `uid` = "' . $user['id'] . '", `data` = "' . $pl['data'] . '" WHERE `id` = "' . $pl['id'] . '"'
);
mysql_query(
'INSERT INTO `clan_operations` (`clan`, `time`, `type`, `text`, `val`, `uid`) VALUES ("' . $res['id'] . '", "' . time() . '", "' . $type . '", "' . $user['login'] . '", "' . $it_n['name'] . ' (x' . $col . ') Ид : [' . $pl['id'] . ']", "' . $user['id'] . '")'
);
} elseif ($pl['uid'] == $user['id']) {
$col = $this->itemsX(((int)$pl['id']));
$it_n = mysql_fetch_array(
mysql_query('SELECT `name` FROM `items_main` WHERE `id` = "' . $pl['item_id'] . '"')
);
mysql_query(
'UPDATE `items_users` SET `lastUPD` = "' . time() . '", `uid` = "-21' . $user['clan'] . '" WHERE `id` = "' . $pl['id'] . '"'
);
mysql_query(
'INSERT INTO `clan_operations` (`clan`, `time`, `type`, `text`, `val`, `uid`) VALUES ("' . $res['id'] . '", "' . time() . '", "9", "' . $user['login'] . '", "' . $it_n['name'] . ' (x' . $col . ') Ид : [' . $pl['id'] . ']", "' . $user['id'] . '")'
);
}
}
}
}

View File

@ -2,35 +2,10 @@
use Core\Db;
use Helper\Conversion;
use Model\Constant\Stat;
use User\ItemsModel;
class ComissionShop
{
private array $info;
private array $stats;
private array $is;
private array $rep;
/**
* @var array|string[]
*/
private array $align_nm;
private array $items;
public function __construct()
{
$this->info = User::start()->info;
$this->rep = User::start()->rep;
$this->stats = User::start()->stats;
$this->is = User::start()->is;
$this->align_nm = User::start()->align_nm;
$itemStatNames = new Stat();
$itemStatNames->getBonus();
$itemStatNames->getRequirement();
$this->items['tr'] = $itemStatNames->sysRequirementNames;
}
public function commisionShop($preview = 'full'): void
public function commisionShop($preview = 'full')
{
global $code;
$typeOtdel = match ((int)$_GET['otdel']) {
@ -68,8 +43,8 @@ UNION ALL SELECT `items_users`.`id`,`items_users`.`item_id`,`items_users`.`1pric
FROM `items_users` LEFT JOIN `items_main` ON (`items_main`.`id` = `items_users`.`item_id`)
WHERE (( `items_users`.time_create + `items_main`.srok) > unix_timestamp() OR `items_main`.srok = "0") AND `items_users`.`delete`="0" AND `items_users`.`inOdet`="0" AND `items_users`.`inShop`="30" and `items_main`.`type` = "' . mysql_real_escape_string(
$typeOtdel
) . '" and `items_users`.`item_id` = "' . (int)$_GET['itemid'] . '" GROUP BY `items_users`.`uid`, `items_users`.`1price` HAVING `items_users`.inGroup = 0
ORDER BY `1price`, inGroupCount DESC'
) . '" and `items_users`.`item_id` = "' . (int)$_GET['itemid'] . '" GROUP BY `items_users`.`uid`, `items_users`.`1price` HAVING `items_users`.inGroup = 0
ORDER BY `1price`ASC , inGroupCount DESC'
);
} else {
$cl = mysql_query(
@ -81,7 +56,7 @@ ORDER BY `1price`, inGroupCount DESC'
} else {
if ($preview == "full") {
$cl = mysql_query(
'SELECT
'SELECT
`items_users`.`id` as id, `items_users`.`id` AS `idu`,`items_users`.`item_id` as item_id,`items_users`.`1price`,`items_users`.`2price`,`items_users`.`uid`,`items_users`.`use_text`,
`items_users`.`data`,`items_users`.`inOdet`,`items_users`.`inShop`,`items_users`.`delete`,`items_users`.`iznosNOW`,`items_users`.`iznosMAX`,
`items_users`.`gift`,`items_users`.`gtxt1`,`items_users`.`gtxt2`,`items_users`.`kolvo`,`items_users`.`geniration`,`items_users`.`magic_inc`,`items_users`.`maidin`,
@ -92,11 +67,11 @@ ORDER BY `1price`, inGroupCount DESC'
`items_main`.`group`,`items_main`.`group_max`,`items_main`.`geni`,`items_main`.`ts`,`items_main`.`srok`,`items_main`.`class`,`items_main`.`class_point`,`items_main`.`anti_class`,
`items_main`.`anti_class_point`,`items_main`.`max_text`,`items_main`.`useInBattle`,`items_main`.`lbtl`,`items_main`.`lvl_itm`,`items_main`.`lvl_exp`,
`items_main`.`lvl_aexp` , count(`items_users`.`id`) as inGroupCount
FROM `items_users` LEFT JOIN `items_main` ON (`items_main`.`id` = `items_users`.`item_id`)
FROM `items_users` LEFT JOIN `items_main` ON (`items_main`.`id` = `items_users`.`item_id`)
WHERE (( `items_users`.time_create + `items_main`.srok) > unix_timestamp() OR `items_main`.srok = "0") AND `items_users`.`delete`="0" AND `items_users`.`item_id` = "' . (int)$_GET['itemid'] . '"
AND `items_users`.`inOdet`="0" AND `items_users`.`inShop`="30" and `items_main`.`type` != "18" AND `items_main`.`type` != "19" AND `items_main`.`type` != "20" AND `items_main`.`type` != "21" AND `items_main`.`type` != "22" AND `items_main`.`type` != "15" AND `items_main`.`type` != "12" AND `items_main`.`type` != "4" AND `items_main`.`type` != "5" AND `items_main`.`type` != "6" AND `items_main`.`type` != "1" AND `items_main`.`type` != "3" AND `items_main`.`type` != "8" AND `items_main`.`type` != "14" AND `items_main`.`type` != "13" AND `items_main`.`type` != "9" AND `items_main`.`type` != "10" AND `items_main`.`type` != "11" AND `items_main`.`type` != "29" AND `items_main`.`type` != "30"
AND `items_users`.`inOdet`="0" AND `items_users`.`inShop`="30" and `items_main`.`type` != "18" AND `items_main`.`type` != "19" AND `items_main`.`type` != "20" AND `items_main`.`type` != "21" AND `items_main`.`type` != "22" AND `items_main`.`type` != "15" AND `items_main`.`type` != "12" AND `items_main`.`type` != "4" AND `items_main`.`type` != "5" AND `items_main`.`type` != "6" AND `items_main`.`type` != "1" AND `items_main`.`type` != "3" AND `items_main`.`type` != "8" AND `items_main`.`type` != "14" AND `items_main`.`type` != "13" AND `items_main`.`type` != "9" AND `items_main`.`type` != "10" AND `items_main`.`type` != "11" AND `items_main`.`type` != "29" AND `items_main`.`type` != "30"
GROUP BY `items_users`.`inGroup`, `items_users`.`uid`,`items_users`.`1price` HAVING `items_users`.inGroup > 0
UNION ALL
UNION ALL
SELECT `items_users`.`id` as id, `items_users`.`id` AS `idu`,`items_users`.`item_id` as item_id,`items_users`.`1price`,`items_users`.`2price`,`items_users`.`uid`,`items_users`.`use_text`,
`items_users`.`data`,`items_users`.`inOdet`,`items_users`.`inShop`,`items_users`.`delete`,`items_users`.`iznosNOW`,`items_users`.`iznosMAX`,
`items_users`.`gift`,`items_users`.`gtxt1`,`items_users`.`gtxt2`,`items_users`.`kolvo`,`items_users`.`geniration`,`items_users`.`magic_inc`,`items_users`.`maidin`,
@ -107,15 +82,15 @@ SELECT `items_users`.`id` as id, `items_users`.`id` AS `idu`,`items_users`.`item
`items_main`.`group`,`items_main`.`group_max`,`items_main`.`geni`,`items_main`.`ts`,`items_main`.`srok`,`items_main`.`class`,`items_main`.`class_point`,`items_main`.`anti_class`,
`items_main`.`anti_class_point`,`items_main`.`max_text`,`items_main`.`useInBattle`,`items_main`.`lbtl`,`items_main`.`lvl_itm`,`items_main`.`lvl_exp`,
`items_main`.`lvl_aexp`, count(`items_users`.`id`) as inGroupCount
FROM `items_users` LEFT JOIN `items_main` ON (`items_main`.`id` = `items_users`.`item_id`)
FROM `items_users` LEFT JOIN `items_main` ON (`items_main`.`id` = `items_users`.`item_id`)
WHERE (( `items_users`.time_create + `items_main`.srok) > unix_timestamp() OR `items_main`.srok = "0") AND `items_users`.`delete`="0" AND `items_users`.`item_id` = "' . (int)$_GET['itemid'] . '"
AND `items_users`.`inOdet`="0" AND `items_users`.`inShop`="30" and `items_main`.`type` != "18" AND `items_main`.`type` != "19" AND `items_main`.`type` != "20" AND `items_main`.`type` != "21" AND `items_main`.`type` != "22" AND `items_main`.`type` != "15" AND `items_main`.`type` != "12" AND `items_main`.`type` != "4" AND `items_main`.`type` != "5" AND `items_main`.`type` != "6" AND `items_main`.`type` != "1" AND `items_main`.`type` != "3" AND `items_main`.`type` != "8" AND `items_main`.`type` != "14" AND `items_main`.`type` != "13" AND `items_main`.`type` != "9" AND `items_main`.`type` != "10" AND `items_main`.`type` != "11" AND `items_main`.`type` != "29" AND `items_main`.`type` != "30"
AND `items_users`.`inOdet`="0" AND `items_users`.`inShop`="30" and `items_main`.`type` != "18" AND `items_main`.`type` != "19" AND `items_main`.`type` != "20" AND `items_main`.`type` != "21" AND `items_main`.`type` != "22" AND `items_main`.`type` != "15" AND `items_main`.`type` != "12" AND `items_main`.`type` != "4" AND `items_main`.`type` != "5" AND `items_main`.`type` != "6" AND `items_main`.`type` != "1" AND `items_main`.`type` != "3" AND `items_main`.`type` != "8" AND `items_main`.`type` != "14" AND `items_main`.`type` != "13" AND `items_main`.`type` != "9" AND `items_main`.`type` != "10" AND `items_main`.`type` != "11" AND `items_main`.`type` != "29" AND `items_main`.`type` != "30"
GROUP BY `items_users`.`uid`,`items_users`.`1price` HAVING `items_users`.inGroup = 0
ORDER BY `1price`, inGroupCount DESC'
ORDER BY `1price`ASC , inGroupCount DESC'
);
} else {
$cl = mysql_query(
'select items_users.id, items_users.id as idu,items_users.item_id,items_users.`1price`,items_users.`2price`,items_users.uid,items_users.use_text,items_users.data,items_users.inOdet,items_users.inShop,items_users.`delete`,items_users.iznosNOW,items_users.iznosMAX,items_users.gift,items_users.gtxt1,items_users.gtxt2,items_users.kolvo,items_users.geniration,items_users.magic_inc,items_users.maidin,items_users.lastUPD,items_users.timeOver,items_users.overType,items_users.secret_id,items_users.time_create,items_users.inGroup,items_users.dn_delete,items_users.inTransfer,items_users.post_delivery,items_users.lbtl_,items_users.bexp,items_users.so,items_users.blvl,items_main.id,items_main.name,items_main.img,items_main.type,items_main.inslot,items_main.`2h`,items_main.`2too`,items_main.iznosMAXi,items_main.inRazdel,items_main.price1,items_main.price2,items_main.magic_chance,items_main.info,items_main.massa,items_main.level,items_main.magic_inci,items_main.overTypei,items_main.`group`,items_main.group_max,items_main.geni,items_main.ts,items_main.srok,items_main.class,items_main.class_point,items_main.anti_class,items_main.anti_class_point,items_main.max_text,items_main.useInBattle,items_main.lbtl,items_main.lvl_itm,items_main.lvl_exp,items_main.lvl_aexp from items_users left join items_main on (items_main.id = items_users.item_id) where (( items_users.time_create + items_main.srok) > unix_timestamp() or items_main.srok = "0") and items_users.`delete`="0" and items_users.inOdet="0" and items_users.inShop="30" and items_main.type != "18" and items_main.type != "19" and items_main.type != "20" and items_main.type != "21" and items_main.type != "22" and items_main.type != "15" and items_main.type != "12" and items_main.type != "4" and items_main.type != "5" and items_main.type != "6" and items_main.type != "1" and items_main.type != "3" and items_main.type != "8" and items_main.type != "14" and items_main.type != "13" and items_main.type != "9" and items_main.type != "10" and items_main.type != "11" and items_main.type != "29" and items_main.type != "30" group by items_users.item_id order by items_main.id desc'
'SELECT `items_users`.`id`, `items_users`.`id` AS `idu`,`items_users`.`item_id`,`items_users`.`1price`,`items_users`.`2price`,`items_users`.`uid`,`items_users`.`use_text`,`items_users`.`data`,`items_users`.`inOdet`,`items_users`.`inShop`,`items_users`.`delete`,`items_users`.`iznosNOW`,`items_users`.`iznosMAX`,`items_users`.`gift`,`items_users`.`gtxt1`,`items_users`.`gtxt2`,`items_users`.`kolvo`,`items_users`.`geniration`,`items_users`.`magic_inc`,`items_users`.`maidin`,`items_users`.`lastUPD`,`items_users`.`timeOver`,`items_users`.`overType`,`items_users`.`secret_id`,`items_users`.`time_create`,`items_users`.`inGroup`,`items_users`.`dn_delete`,`items_users`.`inTransfer`,`items_users`.`post_delivery`,`items_users`.`lbtl_`,`items_users`.`bexp`,`items_users`.`so`,`items_users`.`blvl`,`items_main`.`id`,`items_main`.`name`,`items_main`.`img`,`items_main`.`type`,`items_main`.`inslot`,`items_main`.`2h`,`items_main`.`2too`,`items_main`.`iznosMAXi`,`items_main`.`inRazdel`,`items_main`.`price1`,`items_main`.`price2`,`items_main`.`magic_chance`,`items_main`.`info`,`items_main`.`massa`,`items_main`.`level`,`items_main`.`magic_inci`,`items_main`.`overTypei`,`items_main`.`group`,`items_main`.`group_max`,`items_main`.`geni`,`items_main`.`ts`,`items_main`.`srok`,`items_main`.`class`,`items_main`.`class_point`,`items_main`.`anti_class`,`items_main`.`anti_class_point`,`items_main`.`max_text`,`items_main`.`useInBattle`,`items_main`.`lbtl`,`items_main`.`lvl_itm`,`items_main`.`lvl_exp`,`items_main`.`lvl_aexp` FROM `items_users` LEFT JOIN `items_main` ON (`items_main`.`id` = `items_users`.`item_id`) WHERE (( `items_users`.time_create + `items_main`.srok) > unix_timestamp() OR `items_main`.srok = "0") AND `items_users`.`delete`="0" AND `items_users`.`inOdet`="0" AND `items_users`.`inShop`="30" and `items_main`.`type` != "18" AND `items_main`.`type` != "19" AND `items_main`.`type` != "20" AND `items_main`.`type` != "21" AND `items_main`.`type` != "22" AND `items_main`.`type` != "15" AND `items_main`.`type` != "12" AND `items_main`.`type` != "4" AND `items_main`.`type` != "5" AND `items_main`.`type` != "6" AND `items_main`.`type` != "1" AND `items_main`.`type` != "3" AND `items_main`.`type` != "8" AND `items_main`.`type` != "14" AND `items_main`.`type` != "13" AND `items_main`.`type` != "9" AND `items_main`.`type` != "10" AND `items_main`.`type` != "11" AND `items_main`.`type` != "29" AND `items_main`.`type` != "30" GROUP BY `items_users`.`item_id` ORDER BY `items_main`.`id` DESC'
);
}
}
@ -146,9 +121,11 @@ ORDER BY `1price`, inGroupCount DESC'
} else {
$po = Helper\Conversion::dataStringToArray($pl['data']);
}
if ((($pl['type'] >= 18 && $pl['type'] <= 24) || $pl['type'] == 26 || $pl['type'] == 27) && $pl['inOdet'] != 14) {
if (($pl['type'] >= 18 && $pl['type'] <= 24) || $pl['type'] == 26 || $pl['type'] == 27) {
//Зоны блока +
$po['zonb']++;
if ($pl['inOdet'] != 14) {
$po['zonb']++;
}
}
$is2 = '';
$is1 = '<img src="//img.new-combats.tech/i/items/' . $pl['img'] . '"><br>';
@ -159,7 +136,7 @@ ORDER BY `1price`, inGroupCount DESC'
}
//название
$col = ItemsModel::itemsX($pl[0]);
$col = $this->itemsX($pl[0]);
if ($col > 1 && $pl['inGroup'] != 0 && $pl['inGroupCount'] > 1) {
$pl['kolvo'] = $col;
$pl['name'] .= ' (x' . $col . ')';
@ -168,6 +145,7 @@ ORDER BY `1price`, inGroupCount DESC'
if ($pl['massa'] > 0 && $preview == "full") {
$is2 .= '(Масса: ' . round($pl['massa'], 2) . ')';
if ($pl['gift'] != '') {
$ttl = '';
if ($pl['gift'] == 1) {
$ttl = 'Вы не можете передать этот предмет кому-либо';
} else {
@ -176,14 +154,16 @@ ORDER BY `1price`, inGroupCount DESC'
$is2 .= ' <img title="' . $ttl . '" src="//img.new-combats.tech/i/podarok.gif">';
}
if (isset($po['art'])) {
$is2 .= ' <img alt="Артефакт" title="Артефакт" src="//img.new-combats.tech/i/artefact.gif">';
$is2 .= ' <img title="Артефакт" src="//img.new-combats.tech/i/artefact.gif">';
}
if (isset($po['sudba'])) {
$is2 .= match ($po['sudba']) {
'0' => ' <img alt="" title="Этот предмет будет связан общей судьбой с первым, кто наденет его. Никто другой не сможет его использовать." src="//img.new-combats.tech/i/destiny0.gif">',
'1' => ' <img alt="" title="Этот предмет будет связан общей судьбой с первым, кто возьмет предмет. Никто другой не сможет его использовать." src="//img.new-combats.tech/i/destiny0.gif">',
default => ' <img title="Этот предмет связан общей судьбой с ' . $po['sudba'] . '. Никто другой не сможет его использовать." src="//img.new-combats.tech/i/desteny.gif">',
};
if ($po['sudba'] == '0') {
$is2 .= ' <img title="Этот предмет будет связан общей судьбой с первым, кто наденет его. Никто другой не сможет его использовать." src="//img.new-combats.tech/i/destiny0.gif">';
} elseif ($po['sudba'] == '1') {
$is2 .= ' <img title="Этот предмет будет связан общей судьбой с первым, кто возьмет предмет. Никто другой не сможет его использовать." src="//img.new-combats.tech/i/destiny0.gif">';
} else {
$is2 .= ' <img title="Этот предмет связан общей судьбой с ' . $po['sudba'] . '. Никто другой не сможет его использовать." src="//img.new-combats.tech/i/desteny.gif">';
}
}
}
//цена
@ -198,38 +178,41 @@ ORDER BY `1price`, inGroupCount DESC'
}
//долговечность
$is2 .= '<br>Долговечность: ';
if ($preview == "preview") {
$durability = floor($steck[1]) . '/' . ceil($steck[2]);
} else {
if ($pl['iznosMAXi'] == 999999999) {
$durability = 'неразрушимо';
} else {
$durability = floor($pl['iznosNOW']) . '/' . ceil($pl['iznosMAX']);
if ($pl['iznosMAX'] > 0) {
$izcol = '';
if (floor($pl['iznosNOW']) >= (floor($pl['iznosMAX']) - ceil($pl['iznosMAX']) / 100 * 20)) {
$izcol = 'brown';
}
}
if ($pl['iznosMAX'] > 0 && floor($pl['iznosNOW']) >= (floor($pl['iznosMAX']) - ceil($pl['iznosMAX']) / 100 * 20)) {
$durability = "<span style='color: brown;'>$durability</span>";
if ($preview == "preview") {
$is2 .= '<br>Долговечность: <font color="' . $izcol . '">' . floor($steck[1]) . '/' . ceil(
$steck[2]
) . '</font>';
} else {
if ($pl['iznosMAXi'] == 999999999) {
$is2 .= '<br>Долговечность: <font color="brown">неразрушимо</font>';
} else {
$is2 .= '<br>Долговечность: <font color="' . $izcol . '">' . floor(
$pl['iznosNOW']
) . '/' . ceil($pl['iznosMAX']) . '</font>';
}
}
$is2 .= $durability;
//Срок годности предмета
if ($po['srok'] > 0) {
$pl['srok'] = $po['srok'];
$is2 .= '<br>Срок годности: ';
}
if ($pl['srok'] > 0 && $preview != "preview") {
if ($pl['srok'] > 0 and $preview != "preview") {
if ($pl['time_create'] + $pl['srok'] < time()) {
$is2 .= $this->timeOut($pl['srok']) . ' (испорчен)';
$is2 .= '<br>Срок годности: ' . $this->timeOut($pl['srok']) . ' (испорчен)';
} else {
$is2 .= $this->timeOut($pl['srok']) . ' (до ' . date('d.m.Y H:i', $pl['time_create'] + $pl['srok']) . ')';
$is2 .= '<br>Срок годности: ' . $this->timeOut($pl['srok']) . ' (до ' . date(
'd.m.Y H:i', $pl['time_create'] + $pl['srok']
) . ')';
}
} elseif ($pl['srok'] > 0) {
$is2 .= $this->timeOut($pl['srok']);
$is2 .= '<br>Срок годности: ' . $this->timeOut($pl['srok']);
}
if ($pl['magic_chance'] > 0) {
$is2 .= '<br>Вероятность срабатывания: ' . min([$pl['magic_chance'], 100]) . '%';
}
@ -286,8 +269,10 @@ ORDER BY `1price`, inGroupCount DESC'
} else {
$tr .= $this->is[$n] . ': ' . $this->align_nm[$po['tr_' . $n]];
}
if ($po['tr_' . $n] > $this->stats[$n] && ($n != 'align' || floor($this->info['align']) != $po['tr_' . $n])) {
$tr .= '</font>';
if ($po['tr_' . $n] > $this->stats[$n]) {
if ($n != 'align' || floor($this->info['align']) != $po['tr_' . $n]) {
$tr .= '</font>';
}
}
}
$x++;
@ -307,7 +292,7 @@ ORDER BY `1price`, inGroupCount DESC'
if ($po['add_' . $n] < 0) {
$z = '';
}
$tr .= '<br>• ' . $this->is[$n] . ': ' . $z . $po['add_' . $n];
$tr .= '<br>• ' . $this->is[$n] . ': ' . $z . '' . $po['add_' . $n];
}
$x++;
}
@ -321,7 +306,7 @@ ORDER BY `1price`, inGroupCount DESC'
if ($po['add_mab' . $i] < 0) {
$z = '';
}
$tr .= '<br>• Броня ' . $bn[$i] . ': ' . $z . $po['add_mab' . $i];
$tr .= '<br>• Броня ' . $bn[$i] . ': ' . $z . '' . $po['add_mab' . $i];
} else {
$tr .= '<br>• Броня ' . $bn[$i] . ': ' . $po['add_mib' . $i] . '-' . $po['add_mab' . $i] . ' (' . $this->bronFx(
[$po['add_mib' . $i], $po['add_mab' . $i]]
@ -347,7 +332,7 @@ ORDER BY `1price`, inGroupCount DESC'
if ($po['sv_' . $n] < 0) {
$z = '';
}
$tr .= '<br>• ' . $this->is[$n] . ': ' . $z . $po['sv_' . $n];
$tr .= '<br>• ' . $this->is[$n] . ': ' . $z . '' . $po['sv_' . $n];
}
$x++;
}
@ -405,7 +390,7 @@ ORDER BY `1price`, inGroupCount DESC'
}
if (isset($po['free_stats']) && $po['free_stats'] > 0) {
$is2 .= '<br><strong>Распределение статов:</strong>';
$is2 .= '&bull; Возможных распределений: ' . $po['free_stats'];
$is2 .= '&bull; Возможных распределений: ' . $po['free_stats'] . '';
}
if (floor($pl['iznosNOW']) >= ceil($pl['iznosMAX'])) {
$d[0] = 0;
@ -418,7 +403,7 @@ ORDER BY `1price`, inGroupCount DESC'
//не отображается
$com1 = ['name' => 'Неизвестный Комплект', 'x' => 0, 'text' => ''];
$spc = mysql_query(
'SELECT `id`,`com`,`name`,`x`,`data` FROM `complects` WHERE `com` = "' . $po['complect'] . '" ORDER BY `x` LIMIT 20'
'SELECT `id`,`com`,`name`,`x`,`data` FROM `complects` WHERE `com` = "' . $po['complect'] . '" ORDER BY `x` ASC LIMIT 20'
);
while ($plc = mysql_fetch_array($spc)) {
$com1['name'] = $plc['name'];
@ -527,11 +512,16 @@ ORDER BY `1price`, inGroupCount DESC'
if ($pl['dn_delete'] > 0) {
$is2 .= '<div style="color:brown;">Предмет будет удален при выходе из подземелья</div>';
}
if ($this->pokol > $pl['geni']) {
$is2 .= '<div style="color:brown">Предмет устарел</div>';
}
if (isset($po['zazuby']) && $po['zazuby'] > 0) {
$is2 .= '<div style="color:brown;">Предмет куплен за зубы</div>';
}
$is2 .= '</small>';
}
if ($preview == "preview") {
$kolvoprint = "<small style=\"float:right; color:grey; text-align=right\">Количество: <strong>$steck[0]</strong> шт.</small>";
$kolvoprint = "<small style=\"float:right; color:grey;\" align=\"right\">Количество: <strong>$steck[0]</strong> шт.</small>";
}
echo '<tr style="background-color:#' . $cr . ';"><td width="100" style="padding:7px;" valign="middle" align="center">' . $is1 . '</td><td style="padding:7px;" valign="top">' . $kolvoprint . $is2 . '</td></tr>';
$i++;
@ -542,28 +532,6 @@ ORDER BY `1price`, inGroupCount DESC'
}
}
private function timeOut(int|string $seconds): string
{
return Conversion::secondsToTimeout($seconds);
}
private function bronFx($br): string
{
$r = '';
if ($br[0] > 0) {
$r .= $br[0] - 1;
} else {
$r .= 0;
}
$r .= 'd';
if ($br[0] > 0) {
$r .= $br[1] - $br[0];
} else {
$r .= 0;
}
return $r;
}
public function buyItem(int $iid, User $u): string
{
$irow = Db::getRow('select items_users.id, uid, 1price, inGroup, inShop, data, item_id, login, items_main.name, price1
@ -582,7 +550,7 @@ ORDER BY `1price`, inGroupCount DESC'
$u->addKr(-$price);
$u->addKr($price, $irow['uid']);
$col = ItemsModel::itemsX($iid);
$col = $u->itemsX($iid);
if ($col > 1) {
Db::sql('update items_users set uid = ?, inGroup = inGroup + 1000, 1price = ?, lastUPD = unix_timestamp(), inShop = 0
where inShop = 30 and inOdet = 0 and item_id = ? and uid = ? and inGroup = ? limit ?',
@ -603,45 +571,56 @@ ORDER BY `1price`, inGroupCount DESC'
return '<div>' . $r . '</div>';
}
public function rent($action, int $iid, int $price): void
public function rent($action, int $iid, int $price, User $u)
{
if ($action == "Сдать в магазин" && $price > 0) {
$this->rentPut($iid, $price);
$ChImtem = mysql_fetch_array(
mysql_query(
'SELECT `id`, `item_id`, `data`, `inGroup`, `uid` FROM `items_users` WHERE `id` = ' . $iid . ' LIMIT 1'
)
);
$ChSudba = Conversion::dataStringToArray($ChImtem['data']);
if (!isset($ChSudba['sudba']) && $ChSudba['sudba'] == 0 && $ChSudba['sudba'] != 1 && !isset($ChSudba['toclan'])) {
if (isset($ChImtem['inGroup']) && $ChImtem['inGroup'] > 0) {
$col = $u->itemsX($ChImtem['id']);
if ($col > 1) {
mysql_query(
'UPDATE `items_users` SET `inShop` = 30, `1price` = ' . $price . ' WHERE `item_id`="' . $ChImtem['item_id'] . '" AND `uid`="' . $ChImtem['uid'] . '" AND `inGroup` = "' . $ChImtem['inGroup'] . '" LIMIT ' . $col . ''
);
} else {
mysql_query(
'UPDATE `items_users` SET `inShop` = 30, `1price` = ' . $price . ' WHERE `uid` = "' . $u->info['id'] . '" AND `id` = "' . $iid . '" AND `inOdet` = "0" AND `delete` = "0" '
);
}
} else {
mysql_query(
'UPDATE `items_users` set `inShop` = 30, `1price` = ' . $price . ' where `uid` = "' . $u->info['id'] . '" AND `id` = "' . $iid . '" AND `inOdet` = "0" AND `delete` = "0" '
);
}
}
} elseif ($action == "Забрать") {
$this->rentTake($iid);
$i = mysql_fetch_array(
mysql_query(
'SELECT `im`.`price1`,
`iu`.* FROM `items_users` AS `iu` LEFT JOIN `items_main` AS `im` ON (`im`.`id` = `iu`.`item_id`) WHERE `iu`.`id` = "' . $iid . '" AND `iu`.`inShop` = "30" AND `iu`.`delete` = "0" LIMIT 1'
)
);
if (isset($i['inGroup']) and $i['inGroup'] > 0) {
$col = $u->itemsX($i['id']);
if ($col > 1) {
mysql_query(
'UPDATE `items_users` SET `inShop` = 0, `1price` = ' . $i['price1'] . ' WHERE `item_id`="' . $i['item_id'] . '" AND `inShop` = "30" AND `uid`="' . $i['uid'] . '" AND `inGroup` = "' . $i['inGroup'] . '" LIMIT ' . $col . ''
);
} else {
mysql_query(
'UPDATE `items_users` SET `inShop` = 0, `1price` = ' . $i['price1'] . ' WHERE `uid` = "' . $u->info['id'] . '" AND `id` = "' . $iid . '" AND `inOdet` = "0" AND `delete` = "0" '
);
}
} else {
mysql_query(
'UPDATE `items_users` SET `inShop` = 0, `1price` = "' . $i['price1'] . '" WHERE `id` = "' . $iid . '" and `inShop` = "30" LIMIT 1'
);
}
}
}
private function rentPut(int $id, int $price): void
{
$item = Db::getRow('select id, item_id, data, ingroup, uid from items_users where id = ?', [$id]);
$data = Conversion::dataStringToArray($item['data']);
$col = ItemsModel::itemsX($item['id']);
if (isset($data['sudba']) || $data['sudba'] != 0 || isset($data['toclan'])) {
return;
}
if (!isset($item['ingroup']) || $item['ingroup'] <= 0 || $col < 2) {
Db::sql('update items_users set inShop = 30, 1price = ? where id = ? and uid = ? and inOdet = 0', [$price, $id, $item['uid']]);
return;
}
Db::sql('update items_users set inShop = 30, 1price = ? where item_id = ? and uid = ? and inGroup = ? limit ?', [$price, $item['id'], $item['uid'], $item['ingroup'], (int)$col]);
}
private function rentTake(int $id): void
{
$item = Db::getRow('select items_users.*, price1, inGroup from items_users inner join items_main on items_main.id = item_id where items_users.id = ? and inShop = 30 limit 1', [$id]);
if (!isset($item['inGroup']) || $item['inGroup'] <= 0) {
Db::sql('update items_users set inShop = 0, 1price = ? where id = ? and inShop = 30', [$item['price1'], $id]);
return;
}
$col = ItemsModel::itemsX($item['id']);
if ($col > 1) {
Db::sql('update items_users set inShop = 0, 1price = ? where item_id = ? and uid = ? and inGroup = ? and inShop = 30 limit ?',
[$item['price1'], $item['item_id'], $item['uid'], $item['ingroup'], (int)$col]);
} else {
Db::sql('update items_users set inShop = 0, 1price = ? where id = ? and uid = ? and inOdet = 0', [$item['price1'], $id, $item['uid']]);
}
}
}
}

View File

@ -2,16 +2,14 @@
namespace Core;
use DateTime;
class Config
{
const EKR_RUB_PRICE = 30;
const KR_TO_EKR_EXCHANGE = 500;
const EKR_TO_KR_EXCHANGE = 200;
private const HOSTNAME = 'new-combats.tech';
public const GAMENAME = 'Новый Бойцовский Клуб';
private static self $instance;
private static string $hostname = 'new-combats.tech';
private static string $gamename = 'Бойцовский Клуб';
private function __construct()
{
@ -29,51 +27,77 @@ class Config
private static function subdomain(string $name): string
{
return DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR . $name . '.' . self::HOSTNAME;
return DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR . $name . '.' . self::$hostname;
}
public static function get(?string $key = null)
{
$c['ver'] = '0.8.2 alpha';
$c['ver'] = '1.8.3.7';
/* Конфигурации игры */
$c['title'] = self::GAMENAME . ' - Бесплатная, браузерная онлайн игра'; //Название игры
$c['keys'] = self::GAMENAME . ', combats.com, ' . self::GAMENAME . ' игра, ' . self::GAMENAME . ' играть, игра ' . self::GAMENAME . ', старый ' . self::GAMENAME . ', ' . self::GAMENAME . ' онлайн игра, ' . self::GAMENAME . ' браузерная игра, играть в ' . self::GAMENAME . ', игра бк, бк игра, старый бк, играть в бк, бк онлайн игра, новый бк, Легендарный ' . self::GAMENAME . ', легендарный бк, combats, комбатс, combats ru, combats com, OldBK, oldbk ru, oldbk com, олдбк, old bk, олд бк, mycombats, rebk, recombats, oldcombats, obk2'; //Ключевые слова META
$c['desc'] = self::GAMENAME . ' это бесплатная увлекательная браузерная онлайн игра 2004-2009г, в которой сконцентрировано все самое лучшее от современных онлайн игр. В этой браузерной игре заложены самые интересные традиции всем известной онлайн игры под названием «' . self::GAMENAME . ' 2004-2009», которая, кстати, стала первооткрывателем всех браузерных игр.'; //Описание META
$c['footer'] = self::GAMENAME . ' © 2013-' . date('Y');
$c['name'] = 'Новый «' . self::$gamename . '»';
$c['title'] = $c['name'] . ' - Бесплатная,браузерная онлайн игра'; //Название игры
$c['title2'] = ' - Бесплатная, онлайн игра посвященная сражениям и магии!';
$c['title3'] = $c['name'];
$c['keys'] = self::$gamename . ', combats.com, ' . self::$gamename . ' игра, ' . self::$gamename . ' играть, игра ' . self::$gamename . ', старый ' . self::$gamename . ', ' . self::$gamename . ' онлайн игра, ' . self::$gamename . ' браузерная игра, играть в ' . $c['name'] . ', игра бк, бк игра, старый бк, играть в бк, бк онлайн игра, новый бк, Легендарный ' . $c['name'] . ', легендарный бк, combats, комбатс, combats ru, combats com, OldBK, oldbk ru, oldbk com, олдбк, old bk, олд бк, mycombats, rebk, recombats, oldcombats, obk2'; //Ключевые слова META
$c['desc'] = self::$gamename . ' это бесплатная увлекательная браузерная онлайн игра 2004-2009г, в которой сконцентрировано все самое лучшее от современных онлайн игр. В этой браузерной игре заложены самые интересные традиции всем известной онлайн игры под названием «' . self::$gamename . ' 2004-2009», которая, кстати, стала первооткрывателем всех браузерных игр.'; //Описание META
$c['footer'] = $c['name'] . ' © 2013-' . date('Y');
//Сервера
$c['host'] = self::HOSTNAME;
$c['host'] = self::$hostname;
$c['forum'] = self::subdomain('forum');
$c['img'] = 'img.' . self::HOSTNAME;
$c['https'] = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR . self::HOSTNAME;
$c['img'] = 'img.' . self::$hostname;
$c['thiscity'] = 'capitalcity';
$c['capitalcity'] = self::$hostname;
$c['abandonedplain'] = self::$hostname;
$c['https'] = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR . self::$hostname;
$c['img2'] = self::subdomain('img');
$c['lib'] = self::subdomain('lib');
$c['exit'] = "<script>window.location.replace('{$c['https']}');</script>";
$c['support'] = 'support@' . self::HOSTNAME;
$c['support'] = 'support@' . $c['host'];
//Валюта
$c['curency_name'] = 'RUB';
$c['curency_value'] = 30;
//Бот клон
$c['bot_level'] = 0; // до какого лвл бот (включительно)
$c['propsk_die'] = 0; //Смерть при пропуске ходов, 0 - выкл. , >= 1 - количество пропусков до смерти при нападении
$c['exp'] = 0; //бонус опыта
//Скупка
$c['exp'] = 0; //бонус опыта
$c['shop_type1'] = 100; //в гос НЕ ТРОГАТЬ
$c['shop_type2'] = 90; //в березку НЕ ТРОГАТЬ
$c['shop_all'] = 0; //Скупка на все! , 0 - сделать для отключения скупки.
$c['shop_all_type1'] = 100; //Скупка только с госе! , 0 - сделать для отключения скупки.
$c['shop_all_type2'] = 100; //Скупка только с березки! , 0 - сделать для отключения скупки.
//
$c['nosanich'] = true; //Странички Саныча не выпадают - true , выпадают - false
$c['zuby'] = false; //зубы
$c['limitedexp'] = false; //лимит опыта
$c['infinity5level'] = false; //вечные 5 уровни
$c['expstop'] = 2999999; //9; //Опыт на котором останавливаемся 11 149999999
$c['expstopu'] = 2999999; //Опыт на котором останавливаемся
$c['noobgade'] = false; //нуб квест (пещера)
$c['level_transfer'] = 8; //С какого уровня разрешены передачи
$c['level_ransfer'] = 8; //С какого уровня разрешены передачи
$c['nolevel'] = false; //лимитирование уровней
$c['noitembuy'] = false; //Не требует ресурсы для покупки
$c['effz'] = 0; //Скольким секундам равен заряд
$c['money_haot'] = true; //кр за хаоты
$c['crtoecr'] = 500; //Курс обмена кр на екр (если 0, то выключено)
$c['ecrtocr'] = 200; //Курс обмена екр на кр
$c['bonuslevel'] = true; //Бонус уровня
$c['bonussocial'] = false; //Бонус социальный
$c['w'] = date('w');
$c['m'] = date('m');
$c['counters'] = '';
$c['counters_noFrm'] = '';
$c['securetime'] = 0; //Время последнего возможного взлома персов (подбор пароля по базам данных других игр)
$c['copyright'] = 'Copyright © ' . date('Y') . ' « Новый Бойцовский Клуб »';
$c['db_host'] = 'db';
$c['db_user'] = 'prod1';
$c['db_name'] = 'game_production';
@ -88,9 +112,4 @@ class Config
}
return self::$instance;
}
public static function getCopyright(): string
{
return '©' . (new DateTime())->format('Y') . ' Copyright «<a href="//' . self::HOSTNAME . '">' . self::GAMENAME . '</a>». All Rights Reserved.';
}
}

View File

@ -53,15 +53,11 @@ class Db
/**
* @param string $query
* @param array $args
* @return array
* @return false|array
*/
public static function getRows(string $query, array $args = []): array
public static function getRows(string $query, array $args = []): false|array
{
$stmt = self::run($query, $args)->fetchAll();
if (!$stmt) {
return [];
}
return $stmt;
return self::run($query, $args)->fetchAll();
}
/**
@ -112,23 +108,19 @@ class Db
{
$result = self::getRow($query, $args);
if (!empty($result)) {
return array_shift($result);
$result = array_shift($result);
}
return '';
return $result;
}
/**
* @param string $query
* @param array $args
* @return array
* @return mixed
*/
public static function getRow(string $query, array $args = []): array
public static function getRow(string $query, array $args = []): mixed
{
$stmt = self::run($query, $args)->fetch();
if (!$stmt) {
return [];
}
return $stmt;
return self::run($query, $args)->fetch();
}
/**
@ -138,11 +130,7 @@ class Db
*/
public static function getColumn(string $query, array $args = []): array
{
$stmt = self::run($query, $args)->fetchAll(PDO::FETCH_COLUMN);
if (!$stmt) {
return [];
}
return $stmt;
return self::run($query, $args)->fetchAll(PDO::FETCH_COLUMN);
}
/**

View File

@ -1,13 +0,0 @@
<?php
namespace Core;
class Debug
{
public static function x(): void
{
ini_set('xdebug.var_display_max_depth', 10);
ini_set('xdebug.var_display_max_children', 256);
ini_set('xdebug.var_display_max_data', 1024);
}
}

View File

@ -1,69 +0,0 @@
<?php
namespace Core;
readonly class TOTP
{
private const BASE32CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; // RFC 4648 Base32
public function __construct(private string $secret)
{
}
public static function otpSecret($uniqueString, $length = 20): string
{
// Уникальная строка + текущее время в микросекундах
$seed = $uniqueString . microtime(true);
// Хэшируем сид для более случайного распределения
$seed = hash('sha256', $seed);
$secret = '';
$max = strlen(self::BASE32CHARS) - 1;
// Генерируем случайную строку нужной длины
for ($i = 0; $i < $length; $i++) {
$index = hexdec(substr($seed, $i, 2)) % $max; // Получаем индекс символа из хэшированного сида
$secret .= self::BASE32CHARS[$index];
}
return $secret;
}
public function generate(int $digits = 6, int $timeStep = 30): string
{
$time = floor(time() / $timeStep);
$secretKey = $this->base32_decode($this->secret);
$binaryTime = pack('N*', 0) . pack('N*', $time);
$hash = hash_hmac('sha1', $binaryTime, $secretKey, true);
$offset = ord($hash[strlen($hash) - 1]) & 0x0F;
$otp = (
((ord($hash[$offset]) & 0x7F) << 24) |
((ord($hash[$offset + 1]) & 0xFF) << 16) |
((ord($hash[$offset + 2]) & 0xFF) << 8) |
(ord($hash[$offset + 3]) & 0xFF)
) % 10 ** $digits;
return str_pad((string)$otp, $digits, '0', STR_PAD_LEFT);
}
private function base32_decode(string $input): string
{
$base32charsFlipped = array_flip(str_split(self::BASE32CHARS));
$output = '';
$v = 0;
$vbits = 0;
for ($i = 0, $j = strlen($input); $i < $j; $i++) {
$v <<= 5;
if ($input[$i] == '=') continue;
$v += $base32charsFlipped[$input[$i]];
$vbits += 5;
if ($vbits >= 8) {
$vbits -= 8;
$output .= chr(($v & (0xFF << $vbits)) >> $vbits);
}
}
return $output;
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace DTO;
readonly class BattlePriem
{
/**
* @param int $act 1 - когда персонаж получает повреждение
* 2 - когда персонаж наносит удар
*
* @param int $typeOf 1 - уворот
* 2 - крит
* 3 - атака
* 4 - защита
* 5 - прочее
* @param int|null $typeSec
* @param int|null $moment
* @param int|null $momentEnd
*/
public function __construct(
public int $act,
public int $typeOf,
public ?int $typeSec = null,
public ?int $moment = null,
public ?int $momentEnd = null,
) {}
}

View File

@ -2,7 +2,6 @@
use Core\Db;
use Helper\Conversion;
use Model\ActionModel;
use User\ItemsModel;
use User\Stats;
@ -414,7 +413,7 @@ class Dungeon
if ($usr_real['clan'] > 0) {
$usrreal .= '<img src=//img.new-combats.tech/i/clan/' . $usr_real['clan'] . '.gif width=24 height=15 >';
}
$usrreal .= '<b>' . $usr_real['login'] . '</b>[' . $usr_real['level'] . ']<a target=_blank href=/info/' . $usr_real['id'] . ' ><img width=12 heihgt=11 src=//img.new-combats.tech/i/inf_capitalcity.gif ></a>';
$usrreal .= '<b>' . $usr_real['login'] . '</b>[' . $usr_real['level'] . ']<a target=_blank href=/info/' . $usr_real['id'] . ' ><img width=12 hiehgt=11 src=//img.new-combats.tech/i/inf_capitalcity.gif ></a>';
} else {
$mereal = '<i>Невидимка</i>[??]';
}
@ -426,7 +425,7 @@ class Dungeon
if ($me_real['clan'] > 0) {
$mereal .= '<img src=//img.new-combats.tech/i/clan/' . $me_real['clan'] . '.gif width=24 height=15 >';
}
$mereal .= '<b>' . $me_real['login'] . '</b>[' . $me_real['level'] . ']<a target=_blank href=/info/' . $me_real['id'] . ' ><img width=12 heihgt=11 src=//img.new-combats.tech/i/inf_capitalcity.gif ></a>';
$mereal .= '<b>' . $me_real['login'] . '</b>[' . $me_real['level'] . ']<a target=_blank href=/info/' . $me_real['id'] . ' ><img width=12 hiehgt=11 src=//img.new-combats.tech/i/inf_capitalcity.gif ></a>';
} else {
$mereal = '<i>Невидимка</i>[??]';
}
@ -541,7 +540,7 @@ class Dungeon
if ($usr_real['clan'] > 0) {
$usrreal .= '<img src=//img.new-combats.tech/i/clan/' . $usr_real['clan'] . '.gif width=24 height=15 >';
}
$usrreal .= '<b>' . $usr_real['login'] . '</b>[' . $usr_real['level'] . ']<a target=_blank href=/info/' . $usr_real['id'] . ' ><img width=12 heihgt=11 src=//img.new-combats.tech/i/inf_capitalcity.gif ></a>';
$usrreal .= '<b>' . $usr_real['login'] . '</b>[' . $usr_real['level'] . ']<a target=_blank href=/info/' . $usr_real['id'] . ' ><img width=12 hiehgt=11 src=//img.new-combats.tech/i/inf_capitalcity.gif ></a>';
} else {
$mereal = '<i>Невидимка</i>[??]';
}
@ -553,7 +552,7 @@ class Dungeon
if ($me_real['clan'] > 0) {
$mereal .= '<img src=//img.new-combats.tech/i/clan/' . $me_real['clan'] . '.gif width=24 height=15 >';
}
$mereal .= '<b>' . $me_real['login'] . '</b>[' . $me_real['level'] . ']<a target=_blank href=/info/' . $me_real['id'] . ' ><img width=12 heihgt=11 src=//img.new-combats.tech/i/inf_capitalcity.gif ></a>';
$mereal .= '<b>' . $me_real['login'] . '</b>[' . $me_real['level'] . ']<a target=_blank href=/info/' . $me_real['id'] . ' ><img width=12 hiehgt=11 src=//img.new-combats.tech/i/inf_capitalcity.gif ></a>';
} else {
$mereal = '<i>Невидимка</i>[??]';
}
@ -877,7 +876,7 @@ class Dungeon
$i = count($a);
}
} elseif ($s[0] == 'repl_ptp') {
require_once 'dnaction/_dungeon_replace.php';
require_once('dnaction/_dungeon_replace.php');
die();
} elseif ($s[0] == 'add_eff') {
//Кастуем эффект
@ -885,10 +884,16 @@ class Dungeon
$j = 0;
while ($j < count($t)) {
$itm = explode('=', $t[$j]);
$ch = ActionModel::testCount(["uid = {$this->userinfo['id']}", "vars = add_eff_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток
$ch2 = ActionModel::testCount(["vars = add_eff_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[4]); //кол-во прошлых попыток (все юзеры)
$ch = $u->testAction(
'`vars` = "add_eff_' . $this->info['id'] . '_' . $obj['id'] . '" AND `uid` = "' . $this->userinfo['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '',
2
); //кол-во прошлых попыток
$ch = $ch[0];
$ch2 = $u->testAction(
' `vars` = "add_eff_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[4]) . '',
2
); //кол-во прошлых попыток (все юзеры)
$ch2 = $ch2[0];
if (($ch2 < $itm[4] || $itm[4] == 0) && $ch < $itm[2]) {
if ($itm[1] * 100 >= rand(0, 10000)) {
//удачно
@ -931,8 +936,11 @@ class Dungeon
$t = explode(',', $s[1]);
while ($j < count($t)) {
$itm = explode('=', $t[$j]);
$ch = ActionModel::testCount(["vars = bafit_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток
$ch = $u->testAction(
'`vars` = "bafit_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '',
2
); //кол-во прошлых попыток
$ch = $ch[0];
if ($ch < $itm[3]) {
if ($itm[2] * 1000 >= rand(1, 100000)) {
if ($itm[0] == 'hpNow') {
@ -1018,8 +1026,11 @@ class Dungeon
$t = explode(',', $s[1]);
while ($j < count($t)) {
$itm = explode('=', $t[$j]);
$ch = ActionModel::testCount(["uid = {$this->userinfo['id']}", "vars = takeit_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток
$ch = $u->testAction(
'`uid` = "' . $this->userinfo['id'] . '" AND `vars` = "takeit_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '',
2
); //кол-во прошлых попыток
$ch = $ch[0];
if ($ch >= $itm[2]) {
//закончились попытки
$r = 'ничего не произошло...<br>';
@ -1039,8 +1050,9 @@ class Dungeon
);
if (isset($it['id'])) {
$r .= 'Вы обнаружили предмет &quot;<b>' . $it['name'] . '</b>&quot;.<br>';
ItemsModel::addItem($it['id'], $this->userinfo['id']);
//ItemsModel::addItem(['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]]);
ItemsModel::addItem(
['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]]
);
}
} else {
//неудачная попытка
@ -1055,84 +1067,98 @@ class Dungeon
}
} elseif ($s[0] == 'itm1') {
//Добавляем предмет , только 1 предмет из всех и все юзеры могут тоже
$nj = 0;
$t = explode(',', $s[1]);
$j = rand(0, count($t));
$itm = explode('=', $t[$j]);
$ch = ActionModel::testCount(["uid = {$this->userinfo['id']}", "vars = takeit_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток
if ($nj == 0) {
$itm = explode('=', $t[$j]);
$ch = $u->testAction(
'`uid` = "' . $this->userinfo['id'] . '" AND `vars` = "takeit_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '',
2
); //кол-во прошлых попыток
$ch = $ch[0];
if ($ch >= $itm[2]) {
//закончились попытки
$r .= 'Странно, но ничего не произошло... <br>';
} else {
if ($itm[1] * 1000 >= rand(1, 100000)) {
if ($ch >= $itm[2]) {
//закончились попытки
$r .= 'Странно, но ничего не произошло... <br>';
} else {
if ($itm[1] * 1000 >= rand(1, 100000)) {
//Случайный предмет (Башня смерти)
if ($itm[0] == 'random1') {
$itm[0] = $this->itbs[rand(0, count($this->itbs))];
}
//Случайный предмет (Башня смерти)
if ($itm[0] == 'random1') {
$itm[0] = $this->itbs[rand(0, count($this->itbs))];
}
//удачная попытка
$it = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `items_main` WHERE `id`="' . ((int)$itm[0]) . '" LIMIT 1'
)
);
if (isset($it['id'])) {
$r .= 'Вы обнаружили предмет &quot;<b>' . $it['name'] . '</b>&quot;.<br>';
//удачная попытка
$it = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `items_main` WHERE `id`="' . ((int)$itm[0]) . '" LIMIT 1'
)
);
if (isset($it['id'])) {
$r .= 'Вы обнаружили предмет &quot;<b>' . $it['name'] . '</b>&quot;.<br>';
$u->addAction(
time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city']
);
ItemsModel::addItem(
['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]]
);
$nj++;
}
} else {
//неудачная попытка
$u->addAction(
time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city']
);
ItemsModel::addItem($it['id'], $this->userinfo['id']);
//ItemsModel::addItem(['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]]);
$r .= 'Вы ничего не нашли ... <br>';
}
} else {
//неудачная попытка
$u->addAction(
time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city']
);
$r .= 'Вы ничего не нашли ... <br>';
}
}
} elseif ($s[0] == 'itm2') {
//Добавляем предмет , только 1 предмет из всех и только 1 юзер может поднять
$nj = 0;
$t = explode(',', $s[1]);
$j = rand(0, count($t) - 1);
$itm = explode('=', $t[$j]);
$ch = ActionModel::testCount(["vars = takeit_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток
if ($nj == 0) {
$itm = explode('=', $t[$j]);
$ch = $u->testAction(
'`vars` = "takeit_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '',
2
); //кол-во прошлых попыток
$ch = $ch[0];
if ($ch >= $itm[2]) {
//закончились попытки
$r .= 'Ничего не произошло... <br>';
} else {
if ($itm[1] * 1000 >= rand(1, 100000)) {
if ($ch >= $itm[2]) {
//закончились попытки
$r .= 'Ничего не произошло... <br>';
} else {
if ($itm[1] * 1000 >= rand(1, 100000)) {
//Случайный предмет (Башня смерти)
if ($itm[0] == 'random1') {
$itm[0] = $this->itbs[rand(0, count($this->itbs))];
}
//Случайный предмет (Башня смерти)
if ($itm[0] == 'random1') {
$itm[0] = $this->itbs[rand(0, count($this->itbs))];
}
//удачная попытка
$it = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `items_main` WHERE `id`="' . ((int)$itm[0]) . '" LIMIT 1'
)
);
if (isset($it['id'])) {
$r .= 'Вы обнаружили предмет &quot;<b>' . $it['name'] . '</b>&quot;.<br>';
//удачная попытка
$it = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `items_main` WHERE `id`="' . ((int)$itm[0]) . '" LIMIT 1'
)
);
if (isset($it['id'])) {
$r .= 'Вы обнаружили предмет &quot;<b>' . $it['name'] . '</b>&quot;.<br>';
$u->addAction(
time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city']
);
ItemsModel::addItem(
['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]]
);
$nj++;
}
} else {
//неудачная попытка
$u->addAction(
time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city']
);
ItemsModel::addItem($it['id'], $this->userinfo['id']);
//ItemsModel::addItem(['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]]);
$r .= 'Вы ничего не нашли ... <br>';
}
} else {
//неудачная попытка
$u->addAction(
time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city']
);
$r .= 'Вы ничего не нашли ... <br>';
}
}
} elseif ($s[0] == 'fileact') {
@ -1140,7 +1166,7 @@ class Dungeon
}
$i++;
}
$r = rtrim($r, '\<br>');
$r = rtrim($r, '\<br\>');
if ($r == '') {
$r = 'В этот раз не удалось найти что-либо еще';
}
@ -1664,7 +1690,7 @@ class Dungeon
}
$sp = mysql_query('select * from dungeon_now where time_finish = 0 limit 50');
$sp = mysql_query('SELECT * FROM `dungeon_now` WHERE `time_finish` = "0" LIMIT 50');
while ($pl = mysql_fetch_assoc($sp)) {
$cn = mysql_fetch_assoc(
mysql_query('SELECT `id` FROM `stats` WHERE `dnow` = "' . $pl['id'] . '" LIMIT 1')

View File

@ -12,6 +12,7 @@ enum ShopId: int
case ANIMALS = 8; // магазин новичка
case TAVERN = 9; // наковальня
case IZLOM = 10;
case BLOOD_ALTAR = 11; //алтарь крови
case TEMPLE = 14;
case MUSHROOMS = 17; // общий рыцарский
case REFERALS = 27;

View File

@ -383,12 +383,10 @@ class FightRequest
/**
* Звуковой пинг в чат?
* @param string $to
* @param int $room
* @return void
* @todo убрать колхоз с условиями когда станет ясно как оно работает.
*/
private function sendSysChatSound(string $to = '', int $room = 0): void
private function sendSysChatSound(string $to = '', int $room = 0)
{
$cmsg = new ChatMessage();
if (empty($to)) {
@ -401,9 +399,9 @@ class FightRequest
} else {
$cmsg->setRoom($room);
}
$cmsg->setCity($this->u->info['city']);
$cmsg->setType(11);
$cmsg->setSound(117);
$cmsg->setText('Ваш бой начался!');
(new Chat())->sendMsg($cmsg);
}
@ -623,7 +621,6 @@ class FightRequest
$nz['time_start'] = 600;
}
if (isset($_POST['mut_hidden'])) {
$nz['invise'] = 1;
}
@ -820,17 +817,19 @@ class FightRequest
return isset($symbols[1]) ? $symbols[0] . '.' . $symbols[1] : $symbols[0] . '.0';
}
public function getEndedBattlesList(string $slogin, int $dt): void
public function getEndedBattlesList(string $slogin, int $dt)
{
$code = PassGen::intCode();
$btl = '';
$see = '';
$usr = Db::getRow('select id, login, level, city from users where login = ? limit 1', [$slogin]);
$uid = Db::getValue('select id from users where login = ? limit 1', [$slogin]);
if ($uid) {
if (isset($usr['id'])) {
$tms = $dt;
$tmf = $dt + 86400;
$sp = Db::getRows(
'select * from battle_last where time >= ? and time < ? and uid = ? order by id desc ',
[$dt, $dt + 86400, $uid]
[$tms, $tmf, $usr['id']]
);
$jk = 0;
$btl_lst = [];
@ -841,13 +840,11 @@ class FightRequest
$tms = [];
$ts = [];
$spi = Db::getRows('select * from battle_last where battle_id = ?', [$pl['battle_id']]);
foreach ($spi as $pli) {
if (!isset($tms[$pli['team']])) {
$ts[] = $pli['team'];
}
$tms[$pli['team']][] = $pli;
$tms[$pli['team']][count($tms[$pli['team']])] = $pli;
}
$k = 0;
while ($k < count($ts)) {
@ -862,7 +859,7 @@ class FightRequest
}
$tm2 .= '<b>' . $tms[$g][$h]['login'] . '</b> [' . $tms[$g][$h]['lvl'] . ']
<a href="info/' . $tms[$g][$h]['uid'] . '" target="_blank">
<img src="' . Config::img() . '/i/inf.gif" alt=""></a>, ';
<img src="' . Config::img() . '/i/inf_capitalcity.gif" alt=""></a>, ';
}
$h++;
}
@ -878,24 +875,20 @@ class FightRequest
$k++;
}
}
if (isset($btl_lst[$b['id']])) {
continue;
if (!isset($btl_lst[$b['id']])) {
$btl_lst[$b['id']] = true;
if ($tm == '') {
$tm = 'Данные поединка потеряны';
}
$jk++;
$btl .= $jk . '. <span class=date>' . date(
'd.m.y H:i', $pl['time']
) . '</span> ' . $tm . ' <A HREF="logs.php?log=' . $pl['battle_id'] . '&rnd=' . $code . '" target=_blank>»»</A><br>';
}
$btl_lst[$b['id']] = true;
if ($tm == '') {
$tm = 'Данные поединка потеряны';
}
$jk++;
$btl .= $jk . '. <span class=date>' . date('d.m.y H:i', $pl['time']) . '</span> ' .
$tm . ' <a href="/logs.php?log=' . $pl['battle_id'] . '&rnd=' . $code . '" target=_blank>»»</a><br>';
}
}
echo empty($btl) ?
'<div style="font-weight: bold;">В этот день не было боев, или же, летописец опять потерял свитки...</div><hr><br>' :
$btl;
$see .= empty($btl) ? '<div style="font-weight: bold;">В этот день не было боев, или же, летописец опять потерял свитки...</div><hr><br>' : $btl;
echo $see;
}
public function getCurrentBattlesList(): void

View File

@ -4,9 +4,9 @@ namespace FightRequest;
class FRHelper
{
/** Считает разрешенные уровни игроков в групповых заявках.
* @param int $type тип фильтра.
* @param int $userLevel уровень игрока подающего заявку.
/** Считает разрешенные уровни игроков в групповых заявках.
* @param int $type тип фильтра.
* @param int $userLevel уровень игрока подающего заявку.
* @return object
*/
public static function getTeammatesLevel(int $type, int $userLevel): object
@ -16,25 +16,25 @@ class FRHelper
switch ($type) {
default:
break;
case 1: // только моего и ниже
case 1: // только моего и ниже
$max = $userLevel;
break;
case 2: // только ниже моего
case 2: // только ниже моего
$max = $userLevel - 1;
break;
case 3: // только моего
case 3: // только моего
$min = $userLevel;
$max = $userLevel;
break;
case 4: // не выше меня на 1 уровень
case 4: // не выше меня на 1 уровень
$min = $userLevel;
$max = $userLevel + 1;
break;
case 5: // не ниже меня на 1 уровень
case 5: // не ниже меня на 1 уровень
$min = $userLevel - 1;
$max = $userLevel;
break;
case 6: // мой уровень +- 1
case 6: // мой уровень +- 1
$min = $userLevel - 1;
$max = $userLevel + 1;
break;
@ -45,9 +45,9 @@ class FRHelper
];
}
/** Считает разрешенные уровни игроков в хаотических заявках.
* @param int $type тип фильтра.
* @param int $userLevel уровень игрока подающего заявку.
/** Считает разрешенные уровни игроков в хаотических заявках.
* @param int $type тип фильтра.
* @param int $userLevel уровень игрока подающего заявку.
* @return object
*/
public static function getChaoticTeammatesLevel(int $type, int $userLevel): object

View File

@ -4,7 +4,7 @@ namespace Helper;
class Comparsion
{
/** Не даёт значению выйти за пределы.
/** Не даёт значению выйти за пределы.
* @param $value
* @param $minimum
* @param $maximum

View File

@ -1,68 +0,0 @@
<?php
namespace Helper;
use Exception;
class QueryBuilder
{
public function __construct(private readonly string $tableName, private string $columns = '*') {}
public function setColumns(string $columns): void
{
$this->columns = $columns;
}
/**
* @throws Exception
*/
public function select(array $filters = [], int $limit = 0): array
{
if (empty($filters)) {
return ['sql' => "select $this->columns from $this->tableName"];
}
$where = [];
$params = [];
foreach ($filters as $filter) {
[$name, $operation, $value] = explode(' ', $filter, 3);
$placeholder = ":$name";
$value = explode(' ', $value, 3); //todo: а ведь может прилететь значение из нескольких слов с пробелом...
if (count($value) === 1) {
$value = $value[0];
if (is_numeric($value)) {
$value = (int)$value;
}
} else {
array_walk_recursive($value, function (&$var) {
if (is_numeric($var)) {
$var = (int)$var;
}
});
if (is_numeric($value[0]) && is_numeric($value[2])) {
$value = match ($value[1]) {
'+' => $value[0] + $value[2],
'-' => $value[0] - $value[2],
'*' => $value[0] * $value[2],
'/' => ($value[2] != 0) ? $value[0] / $value[2] : throw new Exception('Деление на ноль недопустимо.'),
default => throw new Exception('Недопустимый оператор. Допустимы: +, -, *, /.'),
};
} elseif (is_string($value[0])) {
$placeholder = "$value[0] $value[1] :$name";
$value = $value[2];
} elseif (is_string($value[2])) {
$placeholder = "$value[2] $value[1] :$name";
$value = $value[0];
}
}
//todo: но есть ещё форменное скотство, когда в запрос кидают сложные формулы...
$where[] = "$name $operation $placeholder";
$params[$name] = $value;
}
return [
'sql' => "select $this->columns from $this->tableName where " . implode(" and ", $where) . ($limit > 0 ? " limit $limit" : ""),
'binds' => $params,
];
}
}

View File

@ -12,14 +12,13 @@ class Bonuses
public function __construct(array $data)
{
$this->stat = new Stat();
$this->stat->getBonus();
foreach ($data as $bonusName => $value) {
if (!$this->stat->bonusNames[$bonusName]) {
if (!$this->stat->getBonusNames()[$bonusName]) {
$this->result[$bonusName] = $value; //fixme на период отладки для отлова забытых
//continue;
}
$this->result[$this->stat->bonusNames[$bonusName]] = $value;
$this->result[$this->stat->getBonusNames()[$bonusName]] = $value;
}
$this->armor($data);
}
@ -59,10 +58,10 @@ class Bonuses
public function addZonb(): void
{
if (isset($this->result[$this->stat->bonusNames['zonb']])) {
$this->result[$this->stat->bonusNames['zonb']]++;
if (isset($this->result[$this->stat->getBonusNames()['zonb']])) {
$this->result[$this->stat->getBonusNames()['zonb']]++;
} else {
$this->result[$this->stat->bonusNames['zonb']] = 1;
$this->result[$this->stat->getBonusNames()['zonb']] = 1;
}
}
}

View File

@ -20,13 +20,13 @@ class Requirements
private int $alignValue = 0;
private array $result = [];
private Stat $stat;
public function __construct(array $data)
{
$statnames = new Stat();
$statnames->getRequirement();
$this->stat = new Stat();
foreach ($data as $requirementName => $value) {
if (!$statnames->requirementNames[$requirementName]) {
if (!$this->stat->getRequirementNames()[$requirementName]) {
$this->result[$requirementName] = $value; //fixme на период отладки для отлова забытых
//continue;
}
@ -49,7 +49,7 @@ class Requirements
//$this->result[$this->stat->getRequirementNames()[$requirementName]] = $value;
$this->result[$requirementName] = [
'name' => $statnames->requirementNames[$requirementName],
'name' => $this->stat->getRequirementNames()[$requirementName],
'value' => $value,
];
}

View File

@ -25,10 +25,4 @@ class ItemModel
{
return $this->item['img'];
}
public static function getNameById(int $id): string
{
$name = Db::getValue('select name from items_main where id = ?', [$id]);
return $name ?: '';
}
}

View File

@ -40,7 +40,7 @@ class Magic
if (isset($itm['id'])) {
//Группа предметов
if ($itm['group'] == 1 && ItemsModel::itemsX($itm['id']) > 1) {
if ($itm['group'] == 1 && $u->itemsX($itm['id']) > 1) {
//вытаскиваем предмет из группы
$u->unstack($itm['id'], 1);
}
@ -685,7 +685,7 @@ class Magic
$u->error = 'Неудалось использовать на мертвых...';
} elseif ($u->info['hpNow'] < 1) {
$u->error = 'Неудалось использовать, вы погибли...';
} elseif ($btl->i->noeff > 0) {
} elseif ($btl->info['noeff'] > 0) {
$u->error = 'Запрет на использования свитков восстановления';
} elseif ($po['magic_hpNow'] < 1 && $po['magic_mpNow'] < 1) {
$u->error = 'Неудалось использовать, в магическом свитке нет магии...';
@ -845,7 +845,7 @@ class Magic
);
if (isset($bu['id'])) {
$u->error = 'Нельзя использовать свиток каждый ход...';
} elseif ($btl->i->noeff > 0) {
} elseif ($btl->info['noeff'] > 0) {
$u->error = 'Запрет на использования свитков восстановления';
} elseif (($usr['battle'] == $u->info['battle'] && ($u->info['team'] == $usr['team'] && ($po['magic_hpNow'] > 0 || $po['magic_mpNow'] > 0))) && $usr['hpNow'] > 1 && $u->info['hpNow'] >= 1) {
//кастуем
@ -1491,6 +1491,9 @@ class Magic
} else {
$u->error = 'Персонаж "' . $jl . '" не найден в этом городе (' . $u->info['city'] . ')';
}
} elseif (isset($st['useOnItem']) && $st['useOnItem'] == 1) {
//используем на предмет
} else {
//на себя
$goodUse = 1;
@ -1499,7 +1502,170 @@ class Magic
$u->error = 'Хаосники не могут использовать данное заклятие';
}
if ($itm['magic_inci'] == 'lech') {
if ($itm['magic_inci'] == 'sanich2') {
if ($u->info['battle'] == 0) {
$sz = $u->testAction(
'`uid` = "' . $u->info['id'] . '" AND `vars` = "sanich2" AND `time` > ' . (time() - 4 * 60 * 60) . ' LIMIT 1', 1
);
if (!isset($sz['id'])) {
$slech = rand(0, 4);
$goodUse = 0;
if ($slech == 1) {
//3083 Настойка на жучьей требухе
//$this->add_eff($u->info['id'],3083);
mysql_query(
'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 290 AND `delete` =0'
);
$this->addEffect($u->info['id'], 290);
$echotext = 'Настойка на жучьей требухе!';
$u->error = 'Вы получили эфект от ' . $echotext . '';
} elseif ($slech == 2) {
//5239 Амброзия подмастерья Владык
//$this->add_eff($u->info['id'],5239);
mysql_query(
'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 472 AND `delete` =0'
);
mysql_query(
'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 470 AND `delete` =0'
);
$this->addEffect($u->info['id'], 472);
$echotext = 'Амброзия подмастерья Владык!';
$u->error = 'Вы получили эфект от ' . $echotext . '';
} elseif ($slech == 3) {
//5069 Амброзия Скучающих Владык
//$this->add_eff($u->info['id'],470);
mysql_query(
'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 472 AND `delete` =0'
);
mysql_query(
'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 470 AND `delete` =0'
);
$this->addEffect($u->info['id'], 470);
$echotext = 'Амброзия Скучающих Владык!';
$u->error = 'Вы получили эфект от ' . $echotext . '';
} elseif ($slech == 4) {
//1463 Звездное Сияние
//$this->add_eff($u->info['id'],1463);
mysql_query(
'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 35 AND `delete` =0'
);
$this->addEffect($u->info['id'], 35);
$echotext = 'Звездное Сияние!';
$u->error = 'Вы получили эфект от ' . $echotext . '';
} else {
$slech = 1;
$echotext = 'Не удалось прочитать страницу!';
$u->error = ' ' . $echotext . ' ';
}
$itm['iznosNOW'] += $slech;
mysql_query(
'UPDATE `items_users` SET `iznosNOW` = "' . $itm['iznosNOW'] . '" WHERE `id` = "' . $itm['id'] . '" AND `uid` = "' . $u->info['id'] . '" LIMIT 1'
);
$u->addAction(time(), 'sanich2', $slech);
if ($u->info['sex'] == 1) {
$rtxt = '[img[items/' . $itm['img'] . ']] &quot;' . $u->info['login'] . '&quot; использовала &quot;' . $itm['name'] . ' Саныча&quot; и получила эффект ' . $echotext . ' травмы.';
} else {
$rtxt = '[img[items/' . $itm['img'] . ']] &quot;' . $u->info['login'] . '&quot; использовал &quot;' . $itm['name'] . ' Саныча&quot; и получил эффект ' . $echotext . ' травмы.';
}
} else {
$u->error = 'Задержка использования ' . Conversion::secondsToTimeout(
($sz['time'] + 4 * 60 * 60) - time()
) . '.';
}
} else {
$u->error = 'Невозможно использовать в бою';
}
} elseif ($itm['magic_inci'] == 'sanich1' && $u->info['battle'] > 0) {
$sz = $u->testAction(
'`uid` = "' . $u->info['id'] . '" AND `vars` = "sanich1" AND `time` > ' . (time() - 6 * 60) . ' LIMIT 1', 1
);
if (!isset($sz['id'])) {
$goodUse = 0;
$u->error = 'Вы успешно использовали &quot;' . $itm['name'] . '&quot;';
$z = 1;
while ($z <= 5) {
$u->info['tactic' . $z]++;
if ($u->info['tactic' . $z] > 25) {
$u->info['tactic' . $z] = 25;
} elseif ($u->info['tactic' . $z] < 0) {
$u->info['tactic' . $z] = 0;
}
$z++;
}
if ($u->info['sex'] == 1) {
$this->inBattleLog('{u1} использовала &quot;<b>' . $itm['name'] . ' Саныча</b>&quot;.');
} else {
$this->inBattleLog('{u1} использовал &quot;<b>' . $itm['name'] . ' Саныча</b>&quot;.');
}
mysql_query(
'UPDATE `stats` SET `tactic1` = "' . $u->info['tactic1'] . '",`tactic2` = "' . $u->info['tactic2'] . '",`tactic3` = "' . $u->info['tactic3'] . '",`tactic4` = "' . $u->info['tactic4'] . '",`tactic5` = "' . $u->info['tactic5'] . '" WHERE `id` = "' . $u->info['id'] . '" LIMIT 1'
);
$itm['iznosNOW']++;
mysql_query(
'UPDATE `items_users` SET `iznosNOW` = "' . $itm['iznosNOW'] . '" WHERE `id` = "' . $itm['id'] . '" AND `uid` = "' . $u->info['id'] . '" LIMIT 1'
);
$u->addAction(time(), 'sanich1', $u->info['battle']);
} else {
$u->error = 'Задержка использования ' . Conversion::secondsToTimeout(($sz['time'] + 6 * 60) - time()) . '.';
}
} elseif ($itm['magic_inci'] == 'sanich3' && $u->info['battle'] > 0) {
$sz = $u->testAction(
'`uid` = "' . $u->info['id'] . '" AND `vars` = "sanich3" AND `time` > ' . (time() - 3 * 60 * 60) . ' LIMIT 1', 1
);
if (!isset($sz['id'])) {
$usr = mysql_fetch_array(
mysql_query(
'SELECT `u`.`id`,`u`.`level`,`s`.`hpNow`,`s`.`team`,`u`.`login`,`u`.`sex` FROM `users` AS `u` LEFT JOIN `stats` AS `s` ON `s`.`id` = `u`.`id` WHERE `u`.`id` = "' . $u->info['enemy'] . '" AND `u`.`battle` = "' . $u->info['battle'] . '" LIMIT 1'
)
);
if (isset($usr['id']) && $usr['hpNow'] >= 1) {
$iznslvl = $usr['level'];
$goodUse = 0;
$u->error = 'Вы успешно использовали &quot;' . $itm['name'] . '&quot; на ' . $usr['login'] . '';
if ($u->info['sex'] == 1) {
$this->inBattleLog(
'{u1} использовала &quot;<b>' . $itm['name'] . ' Саныча</b>&quot; на {u2}.',
$usr
);
} else {
$this->inBattleLog(
'{u1} использовал &quot;<b>' . $itm['name'] . ' Саныча</b>&quot; на {u2}.', $usr
);
}
mysql_query(
'UPDATE `stats` SET `hpNow` = "' . $usr['hpNow'] . '" WHERE `id` = "' . $u->info['id'] . '" LIMIT 1'
);
mysql_query(
'UPDATE `stats` SET `hpNow` = "' . $u->stats['hpNow'] . '" WHERE `id` = "' . $usr['id'] . '" LIMIT 1'
);
$itm['iznosNOW'] += $iznslvl;
mysql_query(
'UPDATE `items_users` SET `iznosNOW` = "' . $itm['iznosNOW'] . '" WHERE `id` = "' . $itm['id'] . '" AND `uid` = "' . $u->info['id'] . '" LIMIT 1'
);
$u->addAction(time(), 'sanich3', $u->info['battle']);
} else {
$u->error = 'Нет подходящего противника';
}
} else {
$u->error = 'Задержка использования ' . Conversion::secondsToTimeout(
($sz['time'] + 3 * 60 * 60) - time()
) . '.';
}
} elseif ($itm['magic_inci'] == 'lech') {
$goodUse = 0;
if ($u->info['level'] >= 2 and $u->info['level'] <= 13) {
$travm = mysql_fetch_array(
@ -1532,6 +1698,7 @@ class Magic
if ($goodUse == 1) {
$upd1 = 1;
$upd2 = 1;
//добавляем эффект персонажу

View File

@ -2,6 +2,7 @@
namespace Magic\Elemental;
use Battle;
use DTO\BattleSpell;
use Helper\Math;

View File

@ -1,43 +1,39 @@
<?php
if (!defined('GAME')) {
die();
if(!defined('GAME'))
{
die();
}
$bu = mysql_fetch_array(mysql_query('SELECT * FROM `tactic` WHERE `btl` = "' . $u->info['battle'] . '" AND `uid` = "' . $u->info['id'] . '" LIMIT 1'));
$bu = mysql_fetch_array(mysql_query('SELECT * FROM `tactic` WHERE `btl` = "'.$u->info['battle'].'" AND `uid` = "'.$u->info['id'].'" LIMIT 1'));
if ($u->info['battle'] == 0) {
$u->error = 'Использовать можно только в поединке';
} elseif (isset($bu['id'])) {
$u->error = 'Нельзя использовать свиток каждый ход...';
} elseif (isset($btl->i->id)) {
//
mysql_query(
'INSERT INTO `tactic` (`btl`,`uid`,`time`,`item_id`,`var`,`hod`) VALUES ("' . $u->info['battle'] . '","' . $u->info['id'] . '","' . time(
) . '","' . $itm['item_id'] . '","' . $itm['name'] . '","1")'
);
//
$btl->priemAddLog(
$id, 1, 2, $u->info['id'], $u->info['enemy'],
'',
'{tm1} {u1} использовал заклятие &quot;<b>' . $itm['name'] . '</b>&quot;.',
($btl->hodID)
);
$btl->users[$btl->uids[$u->info['id']]]['tactic1'] += 1;
$btl->users[$btl->uids[$u->info['id']]]['tactic2'] += 1;
$btl->users[$btl->uids[$u->info['id']]]['tactic3'] += 1;
$btl->users[$btl->uids[$u->info['id']]]['tactic4'] += 1;
$btl->users[$btl->uids[$u->info['id']]]['tactic5'] += 1;
mysql_query(
'UPDATE `stats` SET
`tactic1` = "' . $btl->users[$btl->uids[$u->info['id']]]['tactic1'] . '",
`tactic2` = "' . $btl->users[$btl->uids[$u->info['id']]]['tactic2'] . '",
`tactic3` = "' . $btl->users[$btl->uids[$u->info['id']]]['tactic3'] . '",
`tactic4` = "' . $btl->users[$btl->uids[$u->info['id']]]['tactic4'] . '",
`tactic5` = "' . $btl->users[$btl->uids[$u->info['id']]]['tactic5'] . '"
WHERE `id` = "' . $u->info['id'] . '" LIMIT 1'
);
//
mysql_query('UPDATE `items_users` SET `iznosNOW` = `iznosNOW` + 1 WHERE `id` = ' . $itm['id'] . ' LIMIT 1');
$u->error = '‚ы использовали “никальную тактику +1';
if($u->info['battle']==0) {
$u->error = 'Использовать можно только в поединке';
}elseif(isset($bu['id'])) {
$u->error = 'Нельзя использовать свиток каждый ход...';
}elseif( isset($btl->info['id']) ) {
//
mysql_query('INSERT INTO `tactic` (`btl`,`uid`,`time`,`item_id`,`var`,`hod`) VALUES ("'.$u->info['battle'].'","'.$u->info['id'].'","'.time().'","'.$itm['item_id'].'","'.$itm['name'].'","1")');
//
$btl->priemAddLog( $id, 1, 2, $u->info['id'], $u->info['enemy'],
'',
'{tm1} {u1} использовал заклятие &quot;<b>'.$itm['name'].'</b>&quot;.',
($btl->hodID)
);
$btl->users[$btl->uids[$u->info['id']]]['tactic1'] += 1;
$btl->users[$btl->uids[$u->info['id']]]['tactic2'] += 1;
$btl->users[$btl->uids[$u->info['id']]]['tactic3'] += 1;
$btl->users[$btl->uids[$u->info['id']]]['tactic4'] += 1;
$btl->users[$btl->uids[$u->info['id']]]['tactic5'] += 1;
mysql_query('UPDATE `stats` SET
`tactic1` = "'.$btl->users[$btl->uids[$u->info['id']]]['tactic1'].'",
`tactic2` = "'.$btl->users[$btl->uids[$u->info['id']]]['tactic2'].'",
`tactic3` = "'.$btl->users[$btl->uids[$u->info['id']]]['tactic3'].'",
`tactic4` = "'.$btl->users[$btl->uids[$u->info['id']]]['tactic4'].'",
`tactic5` = "'.$btl->users[$btl->uids[$u->info['id']]]['tactic5'].'"
WHERE `id` = "'.$u->info['id'].'" LIMIT 1');
//
mysql_query('UPDATE `items_users` SET `iznosNOW` = `iznosNOW` + 1 WHERE `id` = '.$itm['id'].' LIMIT 1');
$u->error = '‚ы использовали “никальную тактику +1';
}
?>

View File

@ -18,7 +18,7 @@ if( $itm['magic_inci'] == 'dispell' ) {
//Действие при клике
if( isset($btl->i->id) ) {
if( isset($btl->info['id']) ) {
$btl->priemAddLog( $id, 1, 2, $usr['id'], $u->info['enemy'],
'',
'{tm1} {u1} использовал заклятие &quot;<b>'.$itm['name'].'</b>&quot;.',
@ -56,7 +56,7 @@ if( $itm['magic_inci'] == 'dispell' ) {
$pvr['pl'] = mysql_fetch_array($pvr['sp']);
if(!isset($pvr['pl']['id'])) {
$u->error = '<font color=red><b>Не удалось использовать &quot;'.$itm['name'].'&quot;, на вас нет проклятий!</b></font>';
}elseif( isset($btl->i->id) ) {
}elseif( isset($btl->info['id']) ) {
$pvr['pl']['priem'] = mysql_fetch_array(mysql_query('SELECT * FROM `priems` WHERE `id` = "'.$pvr['pl']['v2'].'" LIMIT 1'));
//if( isset($pvr['pl']['priem']) ) {
// $btl->delPriem($pvr['pl'],$btl->users[$btl->uids[$u->info['id']]],100);

View File

@ -13,9 +13,9 @@ if( $itm['magic_inci'] == 'esfer' ) {
//Действие при клике
if( $u->stats['hpNow'] < 1 ) {
$u->error = '<font color=red><b>Вы поглибли и не можете воспользоваться свитком...</b></font>';
}elseif( isset($btl->i->id) ) {
}elseif( isset($btl->info['id']) ) {
if( $btl->i->noinc > 0 ) {
if( $btl->info['noinc'] > 0 ) {
$u->error = '<font color=red><b>Бой был изолирован ранее</b></font>';
}else{
$btl->priemAddLog( $id, 1, 2, $u->info['id'], $u->info['enemy'],
@ -24,7 +24,7 @@ if( $itm['magic_inci'] == 'esfer' ) {
($btl->hodID)
);
$u->error = '<font color=red><b>Мерцающая сфера отделила всех вас от остального мира... </b></font>';
mysql_query('UPDATE `battle` SET `noinc` = 1 WHERE `id` = '.$btl->i->id.' LIMIT 1');
mysql_query('UPDATE `battle` SET `noinc` = 1 WHERE `id` = '.$btl->info['id'].' LIMIT 1');
mysql_query('UPDATE `items_users` SET `iznosNOW` = `iznosNOW` + 1 WHERE `id` = '.$itm['id'].' LIMIT 1');
}

View File

@ -11,19 +11,19 @@ if( $itm['magic_inci'] == 'exitbtl' ) {
$pvr = array();
//Действие при клике
if( isset($btl->i->id) ) {
if( isset($btl->info['id']) ) {
if( $btl->i->dnId > 0 || $btl->i->izlom > 0 ) {
if( $btl->info['dn_id'] > 0 || $btl->info['izlom'] > 0 ) {
$u->error = '<font color=red><b>Магия не действует в пещерах и подобных локациях...</b></font>';
}elseif( $btl->i->noinc > 0 ) {
}elseif( $btl->info['noinc'] > 0 ) {
$u->error = '<font color=red><b>Бой изолирован и вы не можете его покинуть</b></font>';
}elseif( $btl->i->clone > 0 ) {
}elseif( $btl->info['clone'] > 0 ) {
$u->error = '<font color=red><b>Невозможно покинуть поединок с клоном</b></font>';
}elseif( $u->info['hpNow'] < 1 ) {
$u->error = '<font color=red><b>Вы умерли и не можете покинуть бой</b></font>';
}elseif( $btl->i->type == 500 || $btl->i->type == 33){
}elseif( $btl->info['type'] == 500 || $btl->info['type'] == 33){
$u->error = '<font color=red><b>Невозможно покинуть этот поединок!</b></font>';
}elseif( $btl->i->smert == 1){
}elseif( $btl->info['smert'] == 1){
$u->error = '<font color=red><b>Невозможно покинуть этот поединок!</b></font>';
}else{
$btl->priemAddLog( $id, 1, 2, $u->info['id'], $u->info['enemy'],
@ -33,7 +33,7 @@ if( $itm['magic_inci'] == 'exitbtl' ) {
);
$u->error = '<font color=red><b>Вы сбежали с поля боя и потеряли всю энергию...</b></font>';
//
mysql_query('INSERT INTO `battle_last` (`login`,`city`,`battle_id`,`uid`,`time`,`team`,`lvl`,`align`,`clan`,`exp`,`bot`,`money`,`money2`,`money3`) VALUES ("'.$u->info['login'].'","'.$u->info['city'].'","'.$btl->i->id.'","'.$u->info['id'].'","'.time().'","'.$btl->i->getTeamwin().'","'.$u->info['lvl'].'","'.$u->info['align'].'","'.$u->info['clan'].'","0","0","'.$u->info['money'].'","'.$u->info['money2'].'","'.$u->info['money'].'")');
mysql_query('INSERT INTO `battle_last` (`login`,`city`,`battle_id`,`uid`,`time`,`team`,`lvl`,`align`,`clan`,`exp`,`bot`,`money`,`money2`,`money3`) VALUES ("'.$u->info['login'].'","'.$u->info['city'].'","'.$btl->info['id'].'","'.$u->info['id'].'","'.time().'","'.$btl->info['team_win'].'","'.$u->info['lvl'].'","'.$u->info['align'].'","'.$u->info['clan'].'","0","0","'.$u->info['money'].'","'.$u->info['money2'].'","'.$u->info['money'].'")');
mysql_query('UPDATE `stats` SET `battle_yron` = 0, `battle_exp` = 0,`tactic1` = 0 , `tactic2` = 0 , `tactic3` = 0 , `tactic4` = 0 , `tactic5` = 0 , `tactic6` = 0 , `tactic7` = -1 , `last_pr` = 0 , `last_hp` = -1 , `team` = 0 WHERE `id` = '.$u->info['id'].' LIMIT 1');
mysql_query('UPDATE `users` SET `battle` = "0", `lose` = `lose` + 1 WHERE `id` = '.$u->info['id'].' LIMIT 1');
//
@ -41,7 +41,7 @@ if( $itm['magic_inci'] == 'exitbtl' ) {
//
mysql_query('UPDATE `items_users` SET `iznosNOW` = `iznosNOW` + 1 WHERE `id` = '.$itm['id'].' LIMIT 1');
//
mysql_query('INSERT INTO `battle_last` (`login`,`city`,`battle_id`,`uid`,`time`,`team`,`lvl`,`align`,`clan`,`exp`,`bot`,`money`,`money2`,`money3`) VALUES ('.$u->info['login'].','.$u->info['city'].','.$btl->i->id.','.$u->info['id'].','.time().','.$btl->i->getTeamwin().','.$u->info['lvl'].','.$u->info['align'].','.$u->info['clan'].',0,0,'.$u->info['money'].','.$u->info['money2'].','.$u->info['money'].')');
mysql_query('INSERT INTO `battle_last` (`login`,`city`,`battle_id`,`uid`,`time`,`team`,`lvl`,`align`,`clan`,`exp`,`bot`,`money`,`money2`,`money3`) VALUES ('.$u->info['login'].','.$u->info['city'].','.$btl->info['id'].','.$u->info['id'].','.time().','.$btl->info['team_win'].','.$u->info['lvl'].','.$u->info['align'].','.$u->info['clan'].',0,0,'.$u->info['money'].','.$u->info['money2'].','.$u->info['money'].')');
mysql_query('DELETE FROM `battle_act` WHERE `uid1` = "'.$u->info['id'].'" OR `uid2` = "'.$u->info['id'].'"');
mysql_query('UPDATE `battle_users` SET `finish` = 1 WHERE `uid` = "'.$u->info['id'].'"');
mysql_query('UPDATE `stats` SET `hpNow`= 1, `mpNow` = 1,`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" WHERE `id` = "'.$u->info['id'].'" LIMIT 1');

View File

@ -1,39 +1,38 @@
<?php
use Core\Db;
use Helper\Conversion;
use Model\ActionModel;
use User\ItemsModel;
if (!defined('GAME')) {
die();
}
if ($itm['magic_inci'] == 'podvig') {
$test = Db::getRow("select id, time from actions where uid = ? and vars = 'podvig' and time > unix_timestamp() limit 1", [$u->info['id']]);
if (isset($test['id'])) {
$u->error = 'Задержка не прошла, еще ' . Conversion::secondsToTimeout($test['time'] - time());
} else {
//
$dngcity = [
5035 => ['angelscity', 'Бездна'],
5036 => ['capitalcity', 'Пещера Тысячи Проклятий'],
5037 => ['demonscity', 'Катакомбы'],
5038 => ['abandonedplain', 'Гора Легиона'], //mooncity
5039 => ['suncity', 'Грибница'],
5040 => ['sandcity', 'Пещера Мглы'],
];
$dngcity = $dngcity[$itm['item_id']];
$hgo1 = ActionModel::getOne(["uid = {$u->info['id']}", "time > unix_timestamp() - 86400", "vars = psh_qt_$dngcity[0]"], 'id');
if (!isset($hgo1)) {
$u->error = 'Нет задержки для подземелья ' . $dngcity[1] . '.';
$test = mysql_fetch_array(mysql_query('SELECT `id`,`time` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "podvig" AND `time` > "' . (time()) . '" LIMIT 1'));
if ($u->info['align'] != 2) {
if (isset($test['id'])) {
$u->error = 'Задержка не прошла, еще ' . Conversion::secondsToTimeout($test['time'] - time());
} else {
$u->addAction(time(), 'podvig', '');
$u->error = "Успешно использован свиток Право на Подвиг ($dngcity[1])";
Db::sql('update actions set time = unix_timestamp() - 86401 where id = ?', [$hgo1]);
ItemsModel::addIznos($itm['id']);
//
$dngcity = [
5035 => ['angelscity', 'Бездна'],
5036 => ['capitalcity', 'Пещера Тысячи Проклятий'],
5037 => ['demonscity', 'Катакомбы'],
5038 => ['abandonedplain', 'Гора Легиона'], //mooncity
5039 => ['suncity', 'Грибница'],
5040 => ['sandcity', 'Пещера Мглы'],
];
$dngcity = $dngcity[$itm['item_id']];
$hgo1 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > "' . (time() - 86400) . '" AND `vars` = "psh_qt_' . $dngcity[0] . '" LIMIT 1', 1);
if (!isset($hgo1['id'])) {
$u->error = 'Нет задержки для подземелья ' . $dngcity[1] . '.';
} else {
$u->addAction(time(), 'podvig', '');
$u->error = 'Успешно использован свиток Право на Подвиг (' . $dngcity[1] . ')';
mysql_query('UPDATE `actions` SET `time` = "' . (time() - 86401) . '" WHERE `id` = "' . ($hgo1['id']) . '" LIMIT 1');
mysql_query('UPDATE `items_users` SET `iznosNOW` = `iznosNOW` + 1 WHERE `id` = "' . $itm['id'] . '" LIMIT 1');
}
}
} else {
$u->error = 'Хаосники не могут пользоваться этим свитком!';
}
}

View File

@ -1,8 +1,4 @@
<?php
use Model\ActionModel;
use User\ItemsModel;
if (!defined('GAME')) {
die();
}
@ -19,16 +15,15 @@ if (isset($po['finish_file']) && $po['finish_file'] == 'tznanie') {
//Уже что-то изучаем
$u->error = 'Так не пойдет, вы уже что-то изучаете';
} else {
$tst = (bool)ActionModel::testCount(["uid = $u->info['id']", 'vars = read', "vals = {$itm['item_id']}"]);
if ($tst) {
$tst = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `vars` = "read" AND `vals` = "' . $itm['item_id'] . '" LIMIT 1', 1);
if (isset($tst['id'])) {
$u->error = 'Вы уже изучили данное знание';
} else {
$fn = '';
$tom_iz = 0;
if (($itm['item_id'] >= 1045 && $itm['item_id'] <= 1047) || ($itm['item_id'] >= 4812 && $itm['item_id'] <= 4813)) {
$tst2 = (bool)ActionModel::testCount(["uid = $u->info['id']", 'vars = read', "vals = {$itm['item_id']} - 1"]);
if (!$tst2) {
$tst2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `vars` = "read" AND `vals` = "' . ($itm['item_id'] - 1) . '" LIMIT 1', 1);
if (!isset($tst2['id'])) {
$tom_iz = 1;
}
unset($tst2);
@ -46,7 +41,7 @@ if (isset($po['finish_file']) && $po['finish_file'] == 'tznanie') {
$u->error = 'Вы изучили &quot;' . $itm['name'] . '&quot;.';
$u->addAction(time() + $st['timeRead'], 'read', $itm['item_id']);
ItemsModel::addIznos($itm['id']);
mysql_query('UPDATE `items_users` SET `iznosNOW` = `iznosNOW` + 1 WHERE `id` = ' . $itm['id'] . ' LIMIT 1');
} else {
$u->error = 'Требует изучения предыдущего тома';

View File

@ -19,7 +19,7 @@ if( $itm['magic_inci'] == 'undie' ) {
$u->error = '<font color=red><b>Вы поглибли и не можете воспользоваться свитком...</b></font>';
}elseif( $u->info['tactic7'] < $pvr['trs7'] ) {
$u->error = '<font color=red><b>Недостаточно духа, необходимо '.$pvr['trs7'].'...</b></font>';
}elseif( isset($btl->i->id) ) {
}elseif( isset($btl->info['id']) ) {
/*
$btl->priemAddLog( $id, 1, 2, $u->info['id'], $u->info['enemy'],
'',

View File

@ -16,7 +16,7 @@ if( $itm['magic_inci'] == 'yarostzvezd' ) {
$u->error = '<font color=red><b>Вы поглибли и не можете воспользоваться свитком...</b></font>';
}elseif( $u->info['tactic7'] < $pvr['trs7'] ) {
$u->error = '<font color=red><b>Недостаточно духа, необходимо '.$pvr['trs7'].'...</b></font>';
}elseif( isset($btl->i->id) ) {
}elseif( isset($btl->info['id']) ) {
/*
$btl->priemAddLog( $id, 1, 2, $u->info['id'], $u->info['enemy'],
'',

View File

@ -3,13 +3,10 @@
namespace Model;
use Core\Db;
use Exception;
use Helper\QueryBuilder;
use User\UserIp;
class ActionModel
{
private const TABLE_NAME = 'actions';
private int $uid;
public function __construct(int $uid)
@ -17,7 +14,7 @@ class ActionModel
$this->uid = $uid;
}
public static function new(array $user, string $vals, string $vars, int $time = 0): void
public static function new(array $user, string $vals, string $vars, int $time = 0)
{
if (!$time) {
$time = time();
@ -27,7 +24,7 @@ class ActionModel
[
$user['id'],
$time,
'',
$user['city'],
$user['room'],
$vars,
UserIp::get(),
@ -37,51 +34,14 @@ class ActionModel
);
}
public static function get(array $filters, string $columns = '*'): array
public static function getAll(string $filter = ''): array
{
$query = new QueryBuilder(self::TABLE_NAME, $columns);
try {
$stmt = $query->select($filters, 1);
return Db::getRow($stmt['sql'], $stmt['binds']);
} catch (Exception $e) {
echo $e->getMessage();
trigger_error(__METHOD__ . ': ' . $e->getMessage(), E_USER_ERROR);
}
return Db::getRows('select * from actions');
}
public static function getOne(array $filters, string $column): mixed
public function getByVals(string $vals)
{
$result = self::get($filters, $column);
if (!empty($result)) {
return array_shift($result);
}
return '';
}
public static function deleteById(int $id): void
{
Db::sql('delete from actions where id = ?', [$id]);
}
public static function testCount(array $filters, int $limit = 0): int
{
$query = new QueryBuilder(self::TABLE_NAME, 'count(id)');
try {
$stmt = $query->select($filters, $limit);
return Db::getValue($stmt['sql'], $stmt['binds']);
} catch (Exception $e) {
echo $e->getMessage();
trigger_error(__METHOD__ . ': ' . $e->getMessage(), E_USER_ERROR);
}
}
public static function testCountCustom(string $filter, array $binds, int $limit = 0): int
{
$sql = "select count(id) from actions where $filter";
if ($limit > 0) {
$sql .= ' limit ' . $limit;
}
return (int)Db::getValue($sql, $binds);
return Db::getRow('select * from actions where uid = ? and vals = ?', [$this->uid, $vals]);
}
public function getLastByVals(string $vals)
@ -94,35 +54,33 @@ class ActionModel
public function getLastByValsAndTime(string $vals, int $time)
{
$filter = [
"uid = $this->uid",
"vals = '$vals'",
"time > unix_timestamp() - $time",
];
return Db::getRow(
'select * from actions where uid = ? and vals = ? and time > unix_timestamp() - ? order by time desc limit 1',
[$this->uid, $vals, $time]
);
}
public function deleteByVals(string $vals): void
public function deleteByVals(string $vals)
{
Db::sql('delete from actions where uid = ? and vals = ?', [$this->uid, $vals]);
}
public function getFinishedDailyQuestTasks(int $timeout): array
public static function deleteById(int $id): void
{
$arr = [];
$counter = Db::getRows(
"select count(*) as c, vars
from actions
where vars in ('end_trup', 'end_xaot', 'psh0', 'trup_sun', 'izlom', 'win') and time > ? and uid = ?
group by vars",
[$timeout, $this->uid]
);
foreach ($counter as $c) {
$arr[$c['vars']] = $c['c'];
}
return $arr;
Db::sql('delete from actions where id = ?', [$id]);
}
/*protected function testAction($filter, $tp): array
{
if ($tp == 1) {
$query = 'select * from actions where ' . $filter;
} elseif ($tp == 2) {
$query = 'select count(*) from actions where ' . $filter;
} else {
return [];
}
$arr = mysql_fetch_array(mysql_query($query));
return !empty($arr) ? $arr : [];
}*/
}

View File

@ -1,48 +0,0 @@
<?php
namespace Model;
use Core\Db;
use stdClass;
readonly class BattleModel
{
public stdClass $battle;
public array $battleArray;
private array $all;
public function __construct(int $id) {
$this->all = Db::getRows('select * from battle');
if (empty($id)) {
$this->battle = new stdClass();
$this->battleArray = [];
} else {
foreach ($this->all as $b) {
if ($b['id'] != $id) {
continue;
}
$this->battle = (object)$b;
$this->battleArray = get_object_vars($this->battle);
return;
}
}
}
public static function countClanWars(int $clanid): array
{
$today = (new \DateTimeImmutable('now 00:00:00'))->getTimestamp();
$sql = "select count(id) from battle where
type = 250 and
time_over > ? and
(team_win = ? and clan1 = ?) or (team_win = ? and clan2 = ?)";
$count1 = Db::getValue($sql, [$today, 1, $clanid, 2, $clanid]);
$count2 = Db::getValue($sql, [$today, 2, $clanid, 1, $clanid]);
return [
$count1 ?? 0,
$count2 ?? 0,
];
}
}

View File

@ -7,16 +7,17 @@ use Enum\StatFilterCellName;
class Stat extends Constant
{
public readonly array $sysBonusNames;
public readonly array $sysRequirementNames;
public readonly array $bonusNames;
public readonly array $requirementNames;
public function __construct()
{
self::$tableName = 'const_stats';
parent::__construct();
}
public function getBonusNames(): array
{
return $this->filterByCell(StatFilterCellName::Bonus);
}
private function filterByCell(StatFilterCellName $cellName): array
{
$result = [];
@ -29,24 +30,8 @@ class Stat extends Constant
return $result;
}
/**
* Создаёт и заполняет массивы bonusNames и sysBonusNames.
* @return void
*/
public function getBonus(): void
public function getRequirementNames(): array
{
$this->bonusNames = $this->filterByCell(StatFilterCellName::Bonus);
$this->sysBonusNames = array_keys($this->bonusNames);
return $this->filterByCell(StatFilterCellName::Requirement);
}
/**
* Создаёт и заполняет массивы requirementNames и sysRequirementNames.
* @return void
*/
public function getRequirement(): void
{
$this->requirementNames = $this->filterByCell(StatFilterCellName::Requirement);
$this->sysRequirementNames = array_keys($this->requirementNames);
}
}
}

View File

@ -25,7 +25,7 @@ class AdmFactory
10,
'moderation.addmoderator',
$this->targetUser['id'],
'Назначен на пост модератора.'
'Назначен на пост модератора.'
);
}
@ -36,7 +36,7 @@ class AdmFactory
10,
'moderation.removemoderator',
$this->targetUser['id'],
'Уволен с поста модератора.'
'Уволен с поста модератора.'
);
}
@ -48,7 +48,7 @@ class AdmFactory
10,
'moderation.changegender',
$this->targetUser['id'],
'Изменен пол персонажа.'
'Изменен пол персонажа.'
);
}
@ -63,7 +63,7 @@ class AdmFactory
10,
'moderation.changelogin',
$this->targetUser['id'],
"Изменен логин персонажа. $this->targetLogin => " . strip_tags($login)
"Изменен логин персонажа. $this->targetLogin => " . strip_tags($login)
);
}
@ -84,7 +84,7 @@ class AdmFactory
public function kickfrombattle(): void
{
if (empty($this->targetUser['battle'])) {
$this->status = 'Персонаж не в поединке.';
$this->status = 'Персонаж не в поединке.';
return;
}
Db::sql('update users left join stats on users.id = stats.id
@ -94,6 +94,6 @@ class AdmFactory
battle_yron = default,
battle_exp = default
where id = ?', [$this->targetUser['id']]);
// В оригинале тут ещё писалась запись в лог боя, но нужна ли она?
// В оригинале тут ещё писалась запись в лог боя, но нужна ли она?
}
}

View File

@ -17,13 +17,13 @@ class Announcement
{
echo <<<HTML
<div style="padding:0 10px 5px 10px; margin:5px; border-bottom:1px solid #cac9c7;">
<h4>Мегафон</h4>
<h4>Ìåãàôîí</h4>
<form method="post"></form>
<label for="announcementText">Сообщение</label>
<label for="announcementText">Ñîîáùåíèå</label>
<input name="announcementText" type="text" id="announcementText" size="70" maxlength="1000">
<input type="submit" name="announcementModeration" id="announcementModeration" class="btn" value="Написать"><br>
<input type="submit" name="announcementModeration" id="announcementModeration" class="btn" value="Íàïèñàòü"><br>
<input name="announcementIsSigned" type="checkbox" id="announcementIsSigned" value="1">
<label for="announcementIsSigned">от своего имени</label>
<label for="announcementIsSigned">îò ñâîåãî èìåíè</label>
</form>
</div>
HTML;
@ -41,9 +41,9 @@ HTML;
return;
}
$sender = empty($_POST['announcementIsSigned']) ? '<b>Администрация</b>' : User::getLogin(User::start()->info['id']);
$sender = empty($_POST['announcementIsSigned']) ? '<b>Àäìèíèñòðàöèÿ</b>' : User::getLogin(User::start()->info['id']);
(new Chat())->sendsys("$sender: $strippedMessage");
echo '<span style="color: red; "><b>Сообщение успешно отправлено</b></span>';
echo '<span style="color: red; "><b>Ñîîáùåíèå óñïåøíî îòïðàâëåíî</b></span>';
}
}

View File

@ -10,7 +10,7 @@ use User;
class ModFactory
{
private const ERROR_WRONG_DURATION = 'Неверно указан срок наказания';
private const ERROR_WRONG_DURATION = 'Íåâåðíî óêàçàí ñðîê íàêàçàíèÿ';
public readonly string $status;
private DateTime $time;
private ChatMessage $msg;
@ -21,12 +21,12 @@ class ModFactory
public function __construct(
private readonly string $targetLogin,
private readonly string $reason,
int $moderatorsRoom // Комната где сидит модератор.
int $moderatorsRoom // Êîìíàòà ãäå ñèäèò ìîäåðàòîð.
)
{
$this->targetUser = User::getInfo($this->targetLogin);
if (empty($this->targetUser)) {
$this->status = 'Персонаж не найден!';
$this->status = 'Ïåðñîíàæ íå íàéäåí!';
return;
}
$this->chat = new Chat();
@ -46,7 +46,7 @@ class ModFactory
}
$this->time->modify("+ $minutes minute");
$this->moderation->silence($this->time, $this->reason);
$this->status = "Персонажу $this->targetLogin запрещено общаться в чате до {$this->time->format(Moderation::EXPIRATION_DATETIME_FORMAT)}.";
$this->status = "Ïåðñîíàæó $this->targetLogin çàïðåùåíî îáùàòüñÿ â ÷àòå äî {$this->time->format(Moderation::EXPIRATION_DATETIME_FORMAT)}.";
$this->msg->setText("[img[items/silence.gif]] $this->status");
$this->chat->sendMsg($this->msg);
}
@ -54,11 +54,11 @@ class ModFactory
public function unsilence(): void
{
if ($this->targetUser['molch1'] < $this->time->getTimestamp()) {
$this->status = 'Персонаж не молчит!';
$this->status = 'Ïåðñîíàæ íå ìîë÷èò!';
return;
}
$this->moderation->unsilence();
$this->status = "С персонажа $this->targetLogin снят запрет на общение в чате.";
$this->status = "Ñ ïåðñîíàæà $this->targetLogin ñíÿò çàïðåò íà îáùåíèå â ÷àòå.";
$this->msg->setText("[img[items/pal_button3.gif]] $this->status");
$this->chat->sendMsg($this->msg);
}
@ -71,8 +71,8 @@ class ModFactory
}
$this->time->modify("+ $days day");
$this->moderation->prison($this->time, $this->reason);
Db::sql('delete from dungeon_zv where uid = ?', [$this->targetUser['id']]); // Удаляем заявки в пещеры.
$this->status = "Персонаж $this->targetLogin был отправлен в тюрьму до {$this->time->format(Moderation::EXPIRATION_DATETIME_FORMAT)}.";
Db::sql('delete from dungeon_zv where uid = ?', [$this->targetUser['id']]); // Óäàëÿåì çàÿâêè â ïåùåðû.
$this->status = "Ïåðñîíàæ $this->targetLogin áûë îòïðàâëåí â òþðüìó äî {$this->time->format(Moderation::EXPIRATION_DATETIME_FORMAT)}.";
$this->msg->setText("[img[items/jail.gif]] $this->status");
$this->chat->sendMsg($this->msg);
}
@ -80,7 +80,7 @@ class ModFactory
public function unprison(): void
{
$this->moderation->unprison();
$this->status = "Персонаж $this->targetLogin был выпущен из тюрьмы.";
$this->status = "Ïåðñîíàæ $this->targetLogin áûë âûïóùåí èç òþðüìû.";
$this->msg->setText("[img[items/jail_off.gif]] $this->status");
$this->chat->sendMsg($this->msg);
}
@ -92,12 +92,12 @@ class ModFactory
return;
}
if ($this->targetUser['info_delete'] === 1 || $this->targetUser['info_delete'] >= $this->time->getTimestamp()) {
$this->status = 'Персонаж уже под подозрением.';
$this->status = 'Ïåðñîíàæ óæå ïîä ïîäîçðåíèåì.';
return;
}
$this->time->modify("+ $days day");
$this->moderation->depersonalize($this->time, $this->reason);
$this->status = "Персонаж $this->targetLogin под подозрением до {$this->time->format(Moderation::EXPIRATION_DATETIME_FORMAT)}";
$this->status = "Ïåðñîíàæ $this->targetLogin ïîä ïîäîçðåíèåì äî {$this->time->format(Moderation::EXPIRATION_DATETIME_FORMAT)}";
$this->msg->setText("[img[items/cui.gif]] $this->status");
$this->chat->sendMsg($this->msg);
}
@ -105,11 +105,11 @@ class ModFactory
public function undepersonalize(): void
{
if ($this->targetUser['info_delete'] <= $this->time->getTimestamp()) {
$this->status = 'Персонаж не под подозрением.';
$this->status = 'Ïåðñîíàæ íå ïîä ïîäîçðåíèåì.';
return;
}
$this->moderation->undepersonalize();
$this->status = "Персонаж $this->targetLogin больше не под подозрением";
$this->status = "Ïåðñîíàæ $this->targetLogin áîëüøå íå ïîä ïîäîçðåíèåì";
$this->msg->setText("[img[items/uncui.gif]] $this->status");
$this->chat->sendMsg($this->msg);
}
@ -119,15 +119,15 @@ class ModFactory
$this->moderation->ban($this->reason);
Db::sql('delete from chat where login = ?', [$this->targetLogin]);
Db::sql('insert into ban_email (email, uid, nick_name) values (?,?,?)', [$this->targetUser['mail'], $this->targetUser['id'], $this->targetLogin]);
Db::sql('delete from zayvki where creator = ?', [$this->targetUser['id']]); // Удаляем заявки на бой.
Db::sql('delete from dungeon_zv where uid = ?', [$this->targetUser['id']]); // Удаляем заявки в пещеры.
Db::sql('delete from zayvki where creator = ?', [$this->targetUser['id']]); // Óäàëÿåì çàÿâêè íà áîé.
Db::sql('delete from dungeon_zv where uid = ?', [$this->targetUser['id']]); // Óäàëÿåì çàÿâêè â ïåùåðû.
if (!empty($this->targetUser['battle'])) {
Db::sql(
'update users left join stats on users.id = stats.id set battle = default, regHP = unix_timestamp(), team = 0, battle_yron = 0, battle_exp = 0 where users.id = ?',
[$this->targetUser['id']]
);
}
$this->status = "Персонаж $this->targetLogin заблокирован";
$this->status = "Ïåðñîíàæ $this->targetLogin çàáëîêèðîâàí";
$this->msg->setText("[img[items/pal_button6.gif]] $this->status");
$this->chat->sendMsg($this->msg);
}
@ -135,12 +135,12 @@ class ModFactory
public function unban(): void
{
if (empty($this->targetUser['banned'])) {
$this->status = 'Персонаж не в блоке.';
$this->status = 'Ïåðñîíàæ íå â áëîêå.';
return;
}
$this->moderation->unban();
Db::sql('delete from ban_email where email = ?', [$this->targetUser['mail']]);
$this->status = "Персонаж $this->targetLogin разблокирован";
$this->status = "Ïåðñîíàæ $this->targetLogin ðàçáëîêèðîâàí";
$this->msg->setText("[img[items/pal_button7.gif]] $this->status");
$this->chat->sendMsg($this->msg);
}

View File

@ -7,7 +7,7 @@ use User;
class UserRegistrationList
{
/** Регистрации персонажей: только для администраторов.
/** Ðåãèñòðàöèè ïåðñîíàæåé: òîëüêî äëÿ àäìèíèñòðàòîðîâ.
* @return void
*/
public static function get(): void
@ -35,14 +35,14 @@ class UserRegistrationList
</script>
<div style="padding:0 10px 5px 10px; margin:5px; border-bottom:1px solid #cac9c7;">
<h4>Регистрации персонажей</h4>
<label for="loginLD520">Дата регистрации</label>
<h4>Ðåãèñòðàöèè ïåðñîíàæåé</h4>
<label for="loginLD520">Äàòà ðåãèñòðàöèè</label>
<input name="pometka520" class="btn btn-success" onclick="regprev()" type="submit" value="&laquo;"/>
<input value="<?= $pld520 ?>" name="loginLD520" type="text" id="loginLD520" size="20" maxlength="10"/>
<input name="pometka520" class="btn btn-success" onclick="regnext()" type="submit" value="&raquo;"/>
<input type="submit" name="pometka520" id="pometka520" class="btn" value="Показать"/>
<input type="submit" name="pometka520" id="pometka520" class="btn" value="Ïîêàçàòü"/>
<?php if (isset($_POST['pometka520'])): ?>
<br><b style="color: red;">Персонажи зарегистрированные <?= $pld520 ?></b>
<br><b style="color: red;">Ïåðñîíàæè çàðåãèñòðèðîâàííûå <?= $pld520 ?></b>
<ol>
<?php foreach (Db::getRows($query, [$pld520TS, $pld520TS + 86400]) as $pl):
$logincolor = match (true) {
@ -55,13 +55,13 @@ class UserRegistrationList
<li>
<span style="color: <?= $logincolor ?>"> <?= User::getLogin($pl['id']) ?> </span>
<?php if ($pl['molch1'] > time()): ?>
<i>(молчит)</i>
<i>(ìîë÷èò)</i>
<?php endif; ?>
<?php if ($pl['battle'] > 0): ?>
<a href="/logs.php?log=<?= $pl['battle'] ?>" target="_blank">(в бою)</a>
<a href="/logs.php?log=<?= $pl['battle'] ?>" target="_blank">(â áîþ)</a>
<?php endif; ?>
<?php if ($pl['host_reg'] > 0): ?>
<small>(реферал персонажа <?= User::getLogin($pl['host_reg']) ?>)</small>
<small>(ðåôåðàë ïåðñîíàæà <?= User::getLogin($pl['host_reg']) ?>)</small>
<?php endif; ?>
</li>
<?php endforeach; ?>

View File

@ -1,114 +0,0 @@
<?php
if (!defined('GAME')) {
die();
}
/*
Прием: Вломить
Следующий удар по противнику наносит на 4 ед. больше
*/
$pvr = [];
if (isset($pr_tested_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $btl;
//Параметры приема
$pvr['used'] = 0;
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid1) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid2) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
if (isset($at['p'][$a]['priems']['kill'][$uid][$j_id])) {
mysql_query('UPDATE `eff_users` SET `delete` = "' . time() . '" WHERE `id` = "' . $btl->stats[$btl->uids[$uid]]['u_priem'][$j_id][3] . '" AND `uid` = "' . $uid . '" LIMIT 1');
unset($btl->stats[$btl->uids[$uid]]['u_priem'][$j_id]);
}
// -- конец приема
return $at;
};
unset($pr_used_this);
} elseif (isset($pr_used_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $btl;
//Параметры приема
$pvr['used'] = 0;
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid1) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid2) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
if ($a > 0) {
$j = 0;
$k = 0;
$wp = 3;
while ($j < count($at['p'][$a]['atack'])) {
if (isset($at['p'][$a]['atack'][$j]['yron']) && (
$at['p'][$a]['atack'][$j][1] == 1 ||
$at['p'][$a]['atack'][$j][1] == 4 ||
$at['p'][$a]['atack'][$j][1] == 5)) {
if ($pvr['used'] == 0 && !isset($at['p'][$a]['priems']['kill'][$uid][$j_id])) {
//
$pvr['hp'] = 4;
$pvr['hp'] = $btl->testYronPriem($u1, $u2, 12, $pvr['hp'], -1, true, false, 0);
$pvr['mg'] = mysql_fetch_array(mysql_query('SELECT * FROM `eff_users` WHERE `uid` = "' . $u2 . '" AND `v2` = "249" AND `delete` = 0 LIMIT 1'));
if ($pvr['hp'] <= 1 && isset($pvr['mg'])) {
$pvr['hp'] = 0;
$at['p'][$a]['atack'][$j]['yron']['y'] = 1;
$at['p'][$a]['atack'][$j]['yron']['r'] = -1;
$at['p'][$a]['atack'][$j]['yron']['k'] = 1;
$at['p'][$a]['atack'][$j]['yron']['m_k'] = 1;
$at['p'][$a]['atack'][$j]['yron']['m_y'] = 1;
} else {
$at['p'][$a]['atack'][$j]['yron']['y'] += $pvr['hp'];
$at['p'][$a]['atack'][$j]['yron']['r'] -= $pvr['hp'];
$at['p'][$a]['atack'][$j]['yron']['k'] += $pvr['hp'];
$at['p'][$a]['atack'][$j]['yron']['m_y'] += $pvr['hp'];
$at['p'][$a]['atack'][$j]['yron']['m_k'] += $pvr['hp'];
}
$at['p'][$a]['atack'][$j]['yron']['plog'][] = '$this->deleffm(2,' . (0 + $uid) . ',' . $btl->stats[$btl->uids[$uid]]['u_priem'][$j_id][3] . ');
$this->priemAddLog( ' . $id . ', ' . $a . ', ' . $b . ', ' . $u1 . ', ' . $u2 . ',
"' . $btl->stats[$btl->uids[$u1]]['effects'][$btl->stats[$btl->uids[$uid]]['u_priem'][$j_id][0]]['name'] . '",
"{tm1} ' . $btl->addlt($a, 17, $btl->users[$btl->uids[$u1]]['sex'], null) . '",
' . ($btl->hodID + 1) . ' );';
$at['p'][$a]['atack'][$j]['yron']['used'][] = [$j_id, $uid, $pvr['used']];
$at['p'][$a]['atack'][$j]['yron']['kill'][] = [$j_id, $uid, $pvr['kill']];
$at['p'][$a]['priems']['kill'][$uid][$j_id] = true;
}
}
$j++;
}
}
// -- конец приема
return $at;
};
unset($pr_used_this);
} else {
//Действие при клике
$this->addEffPr($pl, $id);
}
unset($pvr);

View File

@ -1,157 +0,0 @@
<?php
if (!defined('GAME')) {
die();
}
/*
Прием: Магический барьер [4]
Поглощает: 352 ед.
Цена: 2 маны - 1 ед.
Процент поглощения: 50%
*/
$pvr = [];
//Действие при клике
if (isset($pr_momental_this)) {
$fx_moment = function ($uid, $enemy, $j_id, $yron, $profil) {
if (!isset($btl->stats[$btl->uids[$uid]]['um_priem'][$j_id])) {
global $u, $btl;
$prv['j_priem'] = $btl->stats[$btl->uids[$uid]]['u_priem'][$j_id][0];
$prv['priem_th'] = $btl->stats[$btl->uids[$uid]]['effects'][$prv['j_priem']]['id'];
$yron = $btl->testPogB($uid, $yron, $btl->stats[$btl->uids[$uid]]['effects'][$prv['j_priem']]['id']);
$btl->testPogB($uid, 1, $btl->stats[$btl->uids[$uid]]['effects'][$prv['j_priem']]['id'], 1);
//$btl->stats[$btl->uids[$uid]]['um_priem'][$j_id]
/*$btl->priemAddLogFast( $uid, 0, "Призрачная защита",
'{tm1} '.$btl->addlt(1 , 17 , $btl->users[$btl->uids[$uid]]['sex'] , NULL).'',
0, time() );*/
if ($yron < 0) {
$yron = 0;
}
$btl->stats[$btl->uids[$uid]]['um_priem'][$j_id] = true;
}
return round($yron);
};
} elseif (isset($pr_tested_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $u, $btl;
//
//Параметры приема
$pvr['used'] = 0;
//
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid2) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid1) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
//
// -- конец приема
return $at;
};
unset($pr_used_this);
} elseif (isset($pr_used_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $u, $btl;
//
//Параметры приема
$pvr['used'] = 0;
//
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid2) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid1) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
if ($a > 0) {
$j = 0;
$k = 0;
$wp = 3;
$checktuman = mysql_fetch_array(
mysql_query(
'SELECT * FROM `eff_users` WHERE `uid` = "' . $uid . '"
AND (`v2` = 273 OR `v2` = 286 OR `v2` = 287 OR `v2` = 288)
AND `delete` =0 LIMIT 1'
)
); //проверка на туманный образ
if (!isset($checktuman['id'])) {
while ($j < count($at['p'][$a]['atack'])) {
if (isset($at['p'][$a]['atack'][$j]['yron']) && (
$at['p'][$a]['atack'][$j][1] == 1 ||
$at['p'][$a]['atack'][$j][1] == 4 ||
$at['p'][$a]['atack'][$j][1] == 5)) {
//if( !isset($at['p'][$a]['priems']['kill'][$uid][$j_id]) ) {
//
$prv['j_priem'] = $btl->stats[$btl->uids[$uid]]['u_priem'][$j_id][0];
$prv['priem_th'] = $btl->stats[$btl->uids[$uid]]['effects'][$prv['j_priem']]['id'];
//
$attest = round($btl->testPogB($uid, $at['p'][$a]['atack'][$j]['yron']['y'], $btl->stats[$btl->uids[$uid]]['effects'][$prv['j_priem']]['id']));
if ($at['p'][$a]['atack'][$j]['yron']['y'] < 1) {
$at['p'][$a]['atack'][$j]['yron']['y'] = 0;
}
$at['p'][$a]['atack'][$j]['yron']['y'] = round($at['p'][$a]['atack'][$j]['yron']['y'] / 2);
$at['p'][$a]['atack'][$j]['yron']['r'] = round($at['p'][$a]['atack'][$j]['yron']['r'] / 2);
$at['p'][$a]['atack'][$j]['yron']['k'] = round($at['p'][$a]['atack'][$j]['yron']['k'] / 2);
$at['p'][$a]['atack'][$j]['yron']['m_k'] = round($at['p'][$a]['atack'][$j]['yron']['m_k'] / 1.2);
$at['p'][$a]['atack'][$j]['yron']['m_y'] = round($at['p'][$a]['atack'][$j]['yron']['m_y'] / 2);
if ($at['p'][$a]['atack'][$j]['yron']['y'] < 1) {
$at['p'][$a]['atack'][$j]['yron']['y'] = 1;
}
if ($at['p'][$a]['atack'][$j]['yron']['r'] >= 0) {
$at['p'][$a]['atack'][$j]['yron']['r'] = -1;
}
if ($at['p'][$a]['atack'][$j]['yron']['k'] < 1) {
$at['p'][$a]['atack'][$j]['yron']['k'] = 1;
}
if ($at['p'][$a]['atack'][$j]['yron']['m_k'] < 1) {
$at['p'][$a]['atack'][$j]['yron']['m_k'] = 1;
}
if ($at['p'][$a]['atack'][$j]['yron']['m_y'] < 1) {
$at['p'][$a]['atack'][$j]['yron']['m_y'] = 1;
}
//
$at['p'][$a]['atack'][$j]['yron']['used'][] = [$j_id, $uid, $pvr['used']];
$at['p'][$a]['atack'][$j]['yron']['kill'][] = [$j_id, $uid, $pvr['kill']];
//
$at['p'][$a]['priems']['kill'][$uid][$j_id] = true;
//}
}
$j++;
}
}
}
// -- конец приема
return $at;
};
unset($pr_used_this);
} else {
//Действие при клике
$btl->priemAddLog(
$id, 1, 2, $u->info['id'], $u->info['enemy'],
'Магический Барьер [4]',
'{tm1} ' . $btl->addlt(1, 21, $btl->users[$btl->uids[$u->info['id']]]['sex'], null) . '',
($btl->hodID + 1)
);
echo '<font color=red><b>Вы успешно использовали прием &quot;Магический Барьер [4]&quot;</b></font>';
$this->addEffPr($pl, $id);
}
unset($pvr);

View File

@ -1,104 +0,0 @@
<?php
if (!defined('GAME')) {
die();
}
/*
Прием: Скрытая ловкость
Уворот от 1-го удара и наносите контрудар
*/
$pvr = [];
if (isset($pr_tested_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $u, $btl;
//
//Параметры приема
$pvr['used'] = 0;
//
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid2) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid1) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
if (isset($at['p'][$a]['priems']['kill'][$uid][$j_id])) {
mysql_query('UPDATE `eff_users` SET `delete` = "' . time() . '" WHERE `id` = "' . $btl->stats[$btl->uids[$uid]]['u_priem'][$j_id][3] . '" AND `uid` = "' . $uid . '" LIMIT 1');
unset($btl->stats[$btl->uids[$uid]]['u_priem'][$j_id]);
}
//
// -- конец приема
return $at;
};
unset($pr_used_this);
} elseif (isset($pr_used_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $u, $btl;
//
//Параметры приема
$pvr['used'] = 0;
//
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid2) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid1) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
if ($a > 0) {
$j = 0;
$k = 0;
$wp = 3;
while ($j < count($at['p'][$a]['atack'])) {
if (
!isset($at['p'][$a]['atack'][$j]['priem_used']) &&
($at['p'][$a]['atack'][$j][1] > 0)
) {
if (/* $btl->stats[$btl->uids[$u1]]['nopryh_act'] < 1 хуй знает для чего &&*/ $pvr['used'] == 0 && !isset($at['p'][$a]['priems']['kill'][$uid][$j_id])) {
//
//Уворот от удара выставляем
unset($at['p'][$a]['atack'][$j]['yron']);
$at['p'][$a]['atack'][$j][1] = 8;
$pvr['rnd_a'] = rand(1, 5);
if (!$btl->testRazmenblock1($id, $u2, $u1)) {
//Попал
$at['p'][$b]['atack'][] = [$pvr['rnd_a'], 1, 0, 1]; // 1 1 1
} else {
//В блок
$at['p'][$b]['atack'][] = [$pvr['rnd_a'], 3, 0, 1]; // 2 1 1
}
$at['p'][$a]['atack'][$j]['yron']['used'][] = [$j_id, $uid, $pvr['used']];
$at['p'][$a]['atack'][$j]['yron']['kill'][] = [$j_id, $uid, $pvr['kill']];
$at['p'][$a]['priems']['kill'][$uid][$j_id] = true;
$at['p'][$a]['atack'][$j]['priem_used'] = $id;
if (!$btl->testRazmenblock1($id, $u2, $u1)) {
$at = $this->yronRazmen($id, $at, true);
}
}
}
$j++;
}
}
// -- конец приема
return $at;
};
unset($pr_used_this);
} else {
//Действие при клике
$this->addEffPr($pl, $id);
}
unset($pvr);

View File

@ -1,144 +0,0 @@
<?php
if (!defined('GAME')) {
die();
}
/*
Прием: €ней 10
Следующий удар противника по вам нанесет на 25% меньше урона
*/
$pvr = [];
if (isset($pr_momental_this)) {
$fx_moment = function ($uid, $enemy, $j_id, $yron, $profil) {
if (!isset($btl->stats[$btl->uids[$uid]]['um_priem'][$j_id])) {
global $u, $btl;
$prv['color2'] = $btl->mcolor[$btl->mname['вода']];
$yron = $yron * 0.80;
$btl->priemAddLogFast(
$uid, 0, "<font color^^^^#" . $prv['color2'] . "> Иней [10]</font>",
'{tm1} ' . $btl->addlt(1, 21, $btl->users[$btl->uids[$uid]]['sex'], null) . '',
0, time()
);
if ($yron < 0) {
$yron = 1;
}
$btl->stats[$btl->uids[$uid]]['um_priem'][$j_id] = true;
}
return round($yron);
};
} elseif (isset($pr_tested_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $u, $btl;
$prv['color2'] = $btl->mcolor[$btl->mname['вода']];
//
//Параметры приема
$pvr['used'] = 0;
//
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid2) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid1) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
if (isset($at['p'][$a]['priems']['kill'][$uid][$j_id])) {
unset($btl->stats[$btl->uids[$uid]]['u_priem'][$j_id]);
}
//
// -- конец приема
return $at;
};
unset($pr_used_this);
} elseif (isset($pr_used_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $btl, $priem;
$prv['color2'] = $btl->mcolor[$btl->mname['вода']];
//
//Параметры приема
$pvr['used'] = 0;
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid2) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid1) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
if ($a > 0) {
$j = 0;
$k = 0;
$wp = 3;
//
$testtum = mysql_fetch_array(mysql_query('SELECT * FROM `eff_users` WHERE `v1` = "priem" AND `v2` = 273 AND `delete` = 0 AND `uid` = "' . $u2 . '" LIMIT 1;'));
if (!isset($testtum['id'])) {
while ($j < count($at['p'][$a]['atack'])) {
if (isset($at['p'][$a]['atack'][$j]['yron']) && (
$at['p'][$a]['atack'][$j][1] == 1 ||
$at['p'][$a]['atack'][$j][1] == 4 ||
$at['p'][$a]['atack'][$j][1] == 5)) {
$at['p'][$a]['atack'][$j]['yron']['y'] = round($at['p'][$a]['atack'][$j]['yron']['y'] * 0.70);
$at['p'][$a]['atack'][$j]['yron']['r'] = round($at['p'][$a]['atack'][$j]['yron']['r'] * 0.70);
$at['p'][$a]['atack'][$j]['yron']['k'] = round($at['p'][$a]['atack'][$j]['yron']['k'] * 0.70);
$at['p'][$a]['atack'][$j]['yron']['m_k'] = round($at['p'][$a]['atack'][$j]['yron']['m_k'] * 0.70);
$at['p'][$a]['atack'][$j]['yron']['m_y'] = round($at['p'][$a]['atack'][$j]['yron']['m_y'] * 0.70);
if ($at['p'][$a]['atack'][$j]['yron']['y'] < 1) {
$at['p'][$a]['atack'][$j]['yron']['y'] = 1;
}
if ($at['p'][$a]['atack'][$j]['yron']['r'] >= 0) {
$at['p'][$a]['atack'][$j]['yron']['r'] = -1;
}
if ($at['p'][$a]['atack'][$j]['yron']['k'] < 1) {
$at['p'][$a]['atack'][$j]['yron']['k'] = 1;
}
if ($at['p'][$a]['atack'][$j]['yron']['m_k'] < 1) {
$at['p'][$a]['atack'][$j]['yron']['m_k'] = 1;
}
if ($at['p'][$a]['atack'][$j]['yron']['m_y'] < 1) {
$at['p'][$a]['atack'][$j]['yron']['m_y'] = 1;
}
$pvr['x5'] = mysql_fetch_array(mysql_query('SELECT `id`,`x` FROM `eff_users` WHERE `uid` = "' . $u1 . '" AND `v2` = 25 AND `delete` = 0 LIMIT 1'));
if ($pvr['x5']['x'] < 5) {
$priem->addPriem($u1, 25, '|add_zm3=-20', 2, 77, -1, $u2, 100, 'цельводы', 0, 0, 1);
}
$at['p'][$a]['atack'][$j]['yron']['used'][] = [$j_id, $uid, $pvr['used']];
$at['p'][$a]['atack'][$j]['yron']['kill'][] = [$j_id, $uid, $pvr['kill']];
$at['p'][$a]['priems']['kill'][$uid][$j_id] = true;
}
$j++;
}
}
}
// -- конец приема
return $at;
};
unset($pr_used_this);
} else {
$prv['color2'] = $btl->mcolor[$btl->mname['вода']];
//Действие при клике
$this->addEffPr($pl, $id);
$prv['text'] = '{tm1}' . $btl->addlt(1, 21, $btl->users[$btl->uids[$u->info['id']]]['sex'], null) . '.';
$btl->priemAddLog(
$id, 1, 2, $u->info['id'], $u->info['id'],
'<font color^^^^#' . $prv['color2'] . '> Иней [10]</font>',
$prv['text'],
($btl->hodID + 1)
);
}
unset($pvr);

View File

@ -1,112 +0,0 @@
<?php
if (!defined('GAME')) {
die();
}
/*
Прием: Танец лезвий
Уворот от 1-го удара и наносите контрудар
*/
$pvr = [];
if (isset($pr_tested_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $u, $btl;
//
//Параметры приема
$pvr['used'] = 0;
//
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid2) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid1) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
if (isset($at['p'][$a]['priems']['kill'][$uid][$j_id])) {
mysql_query('UPDATE `eff_users` SET `delete` = "' . time() . '" WHERE `id` = "' . $btl->stats[$btl->uids[$uid]]['u_priem'][$j_id][3] . '" AND `uid` = "' . $uid . '" LIMIT 1');
unset($btl->stats[$btl->uids[$uid]]['u_priem'][$j_id]);
}
//
// -- конец приема
return $at;
};
unset($pr_used_this);
} elseif (isset($pr_used_this)) {
$fx_priem = function ($id, $at, $uid, $j_id) {
// -- начало приема
global $u, $btl;
//
//Параметры приема
$pvr['used'] = 0;
//
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid2) {
$a = 1;
$b = 2;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid1) {
$a = 2;
$b = 1;
$u1 = $uid2;
$u2 = $uid1;
}
if ($a > 0) {
$j = 0;
$k = 0;
$wp = 3;
while ($j < count($at['p'][$a]['atack'])) {
if (
!isset($at['p'][$a]['atack'][$j]['priem_used']) &&
($at['p'][$a]['atack'][$j][1] > 0)
) {
if ($btl->stats[$btl->uids[$u1]]['nopryh_act'] < 1 && $pvr['used'] == 0 && !isset($at['p'][$a]['priems']['kill'][$uid][$j_id])) {
//
//Уворот от удара выставляем
unset($at['p'][$a]['atack'][$j]['yron']);
$at['p'][$a]['atack'][$j][1] = 8;
$pvr['rnd_a'] = rand(1, 5);
if (!$btl->testRazmenblock1($id, $u2, $u1)) {
//Попал
$at['p'][$b]['atack'][] = [$pvr['rnd_a'], 1, 0, 1];
} else {
//В блок
$at['p'][$b]['atack'][] = [$pvr['rnd_a'], 3, 0, 1];
}
$at['p'][$a]['atack'][$j]['yron']['plog'][] = '$this->deleffm(48,' . (0 + $uid) . ',' . $btl->stats[$btl->uids[$uid]]['u_priem'][$j_id][3] . ');
$this->priemAddLog( ' . $id . ', ' . $b . ', ' . $a . ', ' . $u2 . ', ' . $u1 . ',
"Танец лезвий",
"{tm1} ' . $btl->addlt($b, 17, $btl->users[$btl->uids[$u2]]['sex'], null) . '",
' . ($btl->hodID + 1) . ' );';
$at['p'][$a]['atack'][$j]['yron']['used'][] = [$j_id, $uid, $pvr['used']];
$at['p'][$a]['atack'][$j]['yron']['kill'][] = [$j_id, $uid, $pvr['kill']];
//
$at['p'][$a]['priems']['kill'][$uid][$j_id] = true;
$at['p'][$a]['atack'][$j]['priem_used'] = $id;
//
if (!$btl->testRazmenblock1($id, $u2, $u1)) {
$at = $this->yronRazmen($id, $at, true);
}
//
}
//
}
$j++;
}
}
// -- конец приема
return $at;
};
unset($pr_used_this);
} else {
//Действие при клике
$this->addEffPr($pl, $id);
}
unset($pvr);

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,6 @@
use Core\Db;
use Helper\Conversion;
use Model\ActionModel;
use User\ItemsModel;
class Quests
@ -68,18 +67,16 @@ class Quests
}
//Сколько раз можно пройти квест
if (isset($d['tr_raz'])) {
$qlst = ActionModel::testCount(["uid = {$u->info['id']}", "vars = start_quest{$pl['id']}"], $d['tr_raz']);
//$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2);
if ($d['tr_raz'] > 0 && $d['tr_raz'] - $qlst <= 0) {
$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2);
if ($d['tr_raz'] > 0 && $d['tr_raz'] - $qlst[0] <= 0) {
$r = 0;
}
unset($qlst);
}
//Попыток пройти квест
if (isset($d['tr_raz2'])) {
$qlst = ActionModel::testCount(["uid = {$u->info['id']}", "vars = start_quest{$pl['id']}", "vals != go", "vals != win"], $d['tr_raz2']);
//$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2);
if ($d['tr_raz2'] - $qlst <= 0) {
$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2);
if ($d['tr_raz2'] - $qlst[0] <= 0) {
$r = 0;
}
unset($qlst);
@ -215,7 +212,8 @@ class Quests
$bot2 = mysql_fetch_array(mysql_query('SELECT * FROM `test_bot` WHERE `id` = "' . $ex2[0] . '" LIMIT 1'));
if (isset($bot2['id'])) {
if (isset($qst['id'])) {
$x2 = ActionModel::testCount(["uid = {$u->info['id']}", "vars = win_bot_$ex2[0]", "time > {$qst['time']}"], $ex2[1]);
$x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $qst['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2);
$x2 = 0 + $x2[0];
}
if (isset($d['all_kill']) && $d['all_kill'] > 0) {
$r = $d['all_kill'];
@ -395,17 +393,15 @@ class Quests
if ($d['tr_raz'] == -1) {
$t .= 'Сколько еще раз можно выполнить задание: <b><small>бесконечно</small></b><br>';
} else {
$qlst = ActionModel::testCount(["uid = {$u->info['id']}", "vars = start_quest{$pl['id']}"], $d['tr_raz']);
//$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2);
$t .= 'Сколько раз можно выполнить задание: ' . ($d['tr_raz'] - $qlst) . '<br>';
$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2);
$t .= 'Сколько раз можно выполнить задание: ' . ($d['tr_raz'] - $qlst[0]) . '<br>';
}
unset($qlst);
}
//Попыток пройти квест
if (isset($d['tr_raz2'])) {
$qlst = ActionModel::testCount(["uid = {$u->info['id']}", "vars = start_quest{$pl['id']}", "vals != go", "vals != win"], $d['tr_raz2']);
//$qlst = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2);
$t .= 'Осталось попыток выполнить задание: ' . ($d['tr_raz2'] - $qlst) . '<br>';
$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2);
$t .= 'Осталось попыток выполнить задание: ' . ($d['tr_raz2'] - $qlst[0]) . '<br>';
unset($qlst);
}
@ -437,7 +433,7 @@ class Quests
}
if (isset($d['add_rep'])) {
$t .= 'Репутация ' . $pl['city'] . ': ' . $d['add_rep'] . '<br>';
$t .= 'Репутация ' . $u->city_name[$pl['city']] . ': ' . $d['add_rep'] . '<br>';
}
if (isset($d['add_repizlom'])) {
@ -483,32 +479,28 @@ class Quests
//Убить ботов
if (isset($d['kill_bot'])) {
$ex = explode(',', $d['kill_bot']);
if (isset($d['all_kill']) && (int)$d['all_kill'] > 0) {
$x = '';
$ex = explode(',', $d['kill_bot']);
$i = 0; # Количество циклов для каждого типа бота.
$botid = 0;
$sqlWhere = [];
$sqlParams = [];
$q = '';
while ($i < count($ex)) {
$ex2 = explode('=', $ex[$i]);
$botid = $ex2[0];
$sqlWhere[] = "(uid = :uid$i and time > :time$i and vars = :vars$i)";
$sqlParams["uid$i"] = $u->info['id'];
$sqlParams["time$i"] = $qst['time'];
$sqlParams["vars$i"] = "win_bot_$ex2[0]";
if ($q != '') {
$q .= ' OR ';
}
$q .= ' (`uid` = "' . $u->info['id'] . '" AND `time` > ' . $qst['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" )';
$i++;
}
$sqlWhere = implode(' or ', $sqlWhere);
$x2 = ActionModel::testCountCustom($sqlWhere, $sqlParams);
$x2 = $u->testAction($q, 2);
$x2 = $x2[0];
if ($d['all_kill'] < $x2) {
$x2 = $d['all_kill'];
}
$botlogin = Db::getValue('select login from test_bot where id = ?', [$botid]);
if (isset($botlogin)) {
$x .= '&nbsp; &nbsp; &bull; <b>' . $botlogin . '</b> [' . $x2 . '/' . $d['all_kill'] . ']<br>';
$bot2 = mysql_fetch_array(mysql_query('SELECT * FROM `test_bot` WHERE `id` = "' . $ex2[0] . '" LIMIT 1'));
if (isset($bot2['id'])) {
$x .= '&nbsp; &nbsp; &bull; <b>' . $bot2['login'] . '</b> [' . $x2 . '/' . $d['all_kill'] . ']<br>';
} else {
$x .= '&nbsp; &nbsp; &bull; <b>' . $pl['name'] . '</b> [' . $x2 . '/' . $d['all_kill'] . ']<br>';
}
@ -517,12 +509,13 @@ class Quests
while ($i < count($ex)) {
$x2 = 0;
$ex2 = explode('=', $ex[$i]);
$botlogin = Db::getValue('select login from test_bot where id = ?', [$ex2[0]]);
if (isset($botlogin)) {
$bot2 = mysql_fetch_array(mysql_query('SELECT * FROM `test_bot` WHERE `id` = "' . $ex2[0] . '" LIMIT 1'));
if (isset($bot2['id'])) {
if (isset($qst['id'])) {
$x2 = ActionModel::testCount(["uid = {$u->info['id']}", "vars = win_bot_$ex2[0]", "time > {$qst['time']}"], $ex2[1]);
$x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $qst['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2);
$x2 = 0 + $x2[0];
}
$x .= '&nbsp; &nbsp; &bull; <b>' . $botlogin . '</b> [' . $x2 . '/' . $ex2[1] . ']<br>';
$x .= '&nbsp; &nbsp; &bull; <b>' . $bot2['login'] . '</b> [' . $x2 . '/' . $ex2[1] . ']<br>';
}
$i++;
}
@ -532,7 +525,7 @@ class Quests
$x = trim($x, ', ');
$t .= 'Убить ботов: <br>' . $x;
}
unset($x, $ex, $x2, $ex2, $botlogin);
unset($x, $ex, $x2, $bot2, $ex2);
}
//Собрать ресурсы
@ -589,89 +582,75 @@ class Quests
return $r;
}
public function testquest(): void
public function testquest()
{
global $u;
if ($u->info['battle'] != 0 || $u->room['name'] === 'Башня Смерти') {
return;
}
if ($u->info['battle'] == 0 && $u->room['name'] != 'Башня Смерти') {
$sp = mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` LIKE "%start_quest%" AND `vals` = "go" LIMIT 100');
$sp = mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` LIKE "%start_quest%" AND `vals` = "go" LIMIT 100');
while ($pl2 = mysql_fetch_array($sp)) {
$pl = mysql_fetch_array(mysql_query('SELECT * FROM `quests` WHERE `id` = "' . (str_replace('start_quest', '', $pl2['vars'])) . '" LIMIT 1'));
while ($pl2 = mysql_fetch_array($sp)) {
$pl = mysql_fetch_array(mysql_query('SELECT * FROM `quests` WHERE `id` = "' . (str_replace('start_quest', '', $pl2['vars'])) . '" LIMIT 1'));
$g = 1;
//Действия квеста
$d = $this->expl($pl['act_date']);
$g = 1;
//Действия квеста
$d = $this->expl($pl['act_date']);
//Поговорить с NPS
if (isset($d['dlg_nps'])) {
$g = 0;
unset($x);
}
//Убить игроков
if (isset($d['kill_user'])) {
$x = 0;
if ($x < $d['kill_user']) {
//Поговорить с NPS
if (isset($d['dlg_nps'])) {
$g = 0;
unset($x);
}
//$d['kill_user'] - стольких нужно убить
unset($x);
}
//Убить ботов
if (isset($d['kill_bot'])) {
$ex = explode(',', $d['kill_bot']);
$ii = 0; // Количество циклов для каждого типа бота.
$smth2 = 0; // неизвестное.
$sqlFilter = [];
$sqlParams = [];
while ($ii < count($ex)) {
$ex2 = explode('=', $ex[$ii]);
$smth2 = $ex2[1];
$sqlFilter[] = "(uid = :uid$ii and time > :time$ii and vars = :vars$ii)";
$sqlParams["uid$ii"] = $u->info['id'];
$sqlParams["time$ii"] = $pl2['time'];
$sqlFilter["vars$ii"] = "win_bot_$ex2[0]";
$ii++;
}
$sqlFilter = implode(' or ', $sqlFilter);
if (isset($d['all_kill']) && $d['all_kill'] > 0) {
$x2 = ActionModel::testCountCustom($sqlFilter, $sqlParams, $d['all_kill']);
if ($x2 < $d['all_kill']) {
$g = 0;
}
} else {
$x2 = ActionModel::testCountCustom($sqlFilter, $sqlParams, $smth2);
if (!isset($d['all_kill']) && $x2 < $smth2) {
$g = 0;
}
}
}
//Собрать ресурсы
if (isset($d['tk_itm'])) {
$g = $this->collect_01(explode(',', $d['tk_itm']), $u);
}
//Собирание трофеев
if (isset($d['tkill_itm'])) {
$g = $this->collect_01(explode(',', $d['tkill_itm']), $u);
}
if ($g == 1) {
$pl['time'] = $pl2['time'];
$this->endq($pl['id'], 'win');
$status = $this->winQuest($u->info['id'], $pl, $pl2['time']);
//Отправляем сообщение в чат
if ($status) {
$chatDto = new ChatMessage();
$chatDto->setRoom($u->info['room']);
$chatDto->setTo($u->info['login']);
$chatDto->setText($status);
$chatDto->setType(5);
(new Chat())->sendMsg($chatDto);
//Убить игроков
if (isset($d['kill_user'])) {
$x = 0;
if ($x < $d['kill_user']) {
$g = 0;
}
//$d['kill_user'] - стольких нужно убить
unset($x);
}
//Убить ботов
if (isset($d['kill_bot'])) {
$ex = explode(',', $d['kill_bot']);
$ii = 0; // Количество циклов для каждого типа бота.
$q = '';
while ($ii < count($ex)) {
$ex2 = explode('=', $ex[$ii]);
if ($q != '') {
$q .= ' OR ';
}
$q .= ' (`uid` = "' . $u->info['id'] . '" AND `time` > ' . $pl2['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" )';
$ii++;
}
if (isset($d['all_kill']) && $d['all_kill'] > 0) {
$x2 = $u->testAction($q . ' LIMIT ' . $d['all_kill'], 2);
if ($x2[0] < $d['all_kill']) {
$g = 0;
}
} else {
$x2 = $u->testAction($q . ' LIMIT ' . $ex2[1], 2);
if (!isset($d['all_kill']) && $x2[0] < $ex2[1]) {
$g = 0;
}
}
unset($x, $ex, $x2, $x3, $bot2, $ex2);
}
//Собрать ресурсы
if (isset($d['tk_itm'])) {
$g = $this->collect_01(explode(',', $d['tk_itm']), $u);
}
//Собирание трофеев
if (isset($d['tkill_itm'])) {
$g = $this->collect_01(explode(',', $d['tkill_itm']), $u);
}
if ($g == 1) {
$pl['time'] = $pl2['time'];
$this->endq($pl['id'], 'win');
$this->winQuest($pl);
echo $pl['name'];
}
echo $pl['name'];
}
}
}
@ -709,117 +688,128 @@ class Quests
# Функция отвечает за ПРОВЕРКУ на ЗАВЕРШЕНИЕ квестов для ПОДЗЕМОК
private function winQuest($uid, $pl, $time): string
private function winQuest($pl)
{
global $magic;
global $u, $c, $magic;
if (!isset($pl['id'])) {
return '';
}
if (isset($pl['id'])) {
$d = $this->expl($pl['act_date']);
$d = $this->expl($pl['act_date']);
$d = array_merge($d, $this->expl($pl['win_date']));
$d = array_merge($d, $this->expl($pl['win_date']));
if ($_COOKIE['login'] == 'R' || $_COOKIE['login'] == 'r') {
echo '<script>alert("';
print_r(str_replace("\n", ' ', $d));
echo '");</script>';
die();
}
// Забираем ресурсы
if (isset($d['tk_itm'])) {
$ex = explode(',', $d['tk_itm']);
$i = 0;
while ($i < count($ex)) {
$ex2 = explode('=', $ex[$i]);
$x2 = ActionModel::testCount(["uid = $uid", "vars = win_bot_$ex[2]", "time > $time"], $ex2[1]);
ItemsModel::deleteItemsById($ex2[0], $ex2[1]);
$i++;
if ($_COOKIE['login'] == 'R' || $_COOKIE['login'] == 'r') {
echo '<script>alert("';
print_r(str_replace("\n", ' ', $d));
echo '");</script>';
die();
}
}
// Забираем трофеи
if (isset($d['tkill_itm'])) {
$ex = explode(',', $d['tkill_itm']);
$i = 0;
while ($i < count($ex)) {
$ex2 = explode('=', $ex[$i]);
$x2 = ActionModel::testCount(["uid = $uid", "vars = win_bot_$ex[2]", "time > $time"], $ex2[1]);
ItemsModel::deleteItemsById($ex2[0], $ex2[1]);
$i++;
}
}
$t = '';
if (isset($d['add_rep'])) { // Получаем репутацию за квест, если это убийства ботов.
if (isset($d['kill_bot']) && isset($d['all_kill']) && $d['add_rep'] > 0) {
$ex = explode(',', $d['kill_bot']);
$ii = 0;
$d['add_rep'] = 0;
while ($ii < count($ex)) {
$i = 0;
// Забираем ресурсы
if (isset($d['tk_itm'])) {
$ex = explode(',', $d['tk_itm']);
$i = 0;
while ($i < count($ex)) {
$ex2 = explode('=', $ex[$i]);
while ($i < $d['all_kill']) {
$d['add_rep'] = $d['add_rep'] + (int)$ex2[1];
$x2 = ActionModel::testCount(["uid = $uid", "vars = win_bot_$ex[2]", "time > $time"], $d['all_kill']);
$i++;
$ex2 = explode('=', $ex[$i]);
$x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $pl2['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2);
ItemsModel::deleteItemsById($ex2[0], $ex2[1]);
$i++;
}
}
// Забираем трофеи
if (isset($d['tkill_itm'])) {
$ex = explode(',', $d['tkill_itm']);
$i = 0;
while ($i < count($ex)) {
$ex2 = explode('=', $ex[$i]);
$ex2 = explode('=', $ex[$i]);
$x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $pl2['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2);
ItemsModel::deleteItemsById($ex2[0], $ex2[1]);
$i++;
}
}
$t = '';
if (isset($d['add_rep'])) { // Получаем репутацию за квест, если это убийства ботов.
if (isset($d['kill_bot']) && isset($d['all_kill']) && $d['add_rep'] > 0) {
$ex = explode(',', $d['kill_bot']);
$ii = 0;
$d['add_rep'] = 0;
while ($ii < count($ex)) {
$i = 0;
$ex2 = explode('=', $ex[$i]);
while ($i < $d['all_kill']) {
$x2 = 0;
$d['add_rep'] = $d['add_rep'] + $ex2[1];
$x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $pl2['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $d['all_kill'], 2);
$i++;
}
$ii++;
}
$ii++;
}
unset($x, $i, $ii, $ex, $x2, $bot2, $ex2);
if ($pl['city'] != '') {
$t .= '' . $d['add_rep'] . ' ед. репутации ' . $u->city_name[$pl['city']] . ', ';
$rep = mysql_fetch_array(mysql_query('SELECT * FROM `rep` WHERE `id` = "' . $u->info['id'] . '" LIMIT 1'));
// Рыцарки
/*if($rep['rep'.$pl['city']] < 10000 && $rep['rep'.$pl['city']] + $d['add_rep'] >= 10000 && $pl['kin'] != 1) {
$rep['rep'.$pl['city']] = 9999;
} else*/
if ($rep['rep' . $pl['city']] < 24999 && $rep['rep' . $pl['city']] + $d['add_rep'] >= 24999 && $pl['kin'] != 2) {
$rep['rep' . $pl['city']] = 24999;
} else {
$rep['rep' . $pl['city']] += $d['add_rep'];
}
mysql_query('UPDATE `rep` SET `rep' . $pl['city'] . '` = "' . $rep['rep' . $pl['city']] . '" WHERE `id` = "' . $rep['id'] . '" LIMIT 1');
}
}
unset($x, $i, $ii, $ex, $x2, $bot2, $ex2);
if ($pl['city'] != '') {
$t .= '' . $d['add_rep'] . ' ед. репутации ' . $pl['city'] . ', ';
$rep = mysql_fetch_array(mysql_query('SELECT * FROM `rep` WHERE `id` = "' . $uid . '" LIMIT 1'));
if ($rep['rep' . $pl['city']] < 24999 && $rep['rep' . $pl['city']] + $d['add_rep'] >= 24999 && $pl['kin'] != 2) {
$rep['rep' . $pl['city']] = 24999;
} else {
$rep['rep' . $pl['city']] += $d['add_rep'];
if (isset($d['add_repizlom'])) {
$t .= '' . $d['add_repizlom'] . ' ед. репутации Излома Хаоса, ';
$rep = mysql_fetch_array(mysql_query('SELECT * FROM `rep` WHERE `id` = "' . $u->info['id'] . '" LIMIT 1'));
$rep['repizlom'] += $d['add_repizlom'];
if ($rep['repizlom'] > 24999) {
$rep['repizlom'] = 24999;
}
mysql_query('UPDATE `rep` SET `rep' . $pl['city'] . '` = "' . $rep['rep' . $pl['city']] . '" WHERE `id` = "' . $rep['id'] . '" LIMIT 1');
mysql_query('UPDATE `rep` SET `repizlom` = "' . $rep['repizlom'] . '" WHERE `id` = "' . $rep['id'] . '" LIMIT 1');
}
}
if (isset($d['add_repizlom'])) {
$t .= '' . $d['add_repizlom'] . ' ед. репутации Излома Хаоса, ';
$rep = mysql_fetch_array(mysql_query('SELECT * FROM `rep` WHERE `id` = "' . $uid . '" LIMIT 1'));
$rep['repizlom'] += $d['add_repizlom'];
if ($rep['repizlom'] > 24999) {
$rep['repizlom'] = 24999;
}
mysql_query('UPDATE `rep` SET `repizlom` = "' . $rep['repizlom'] . '" WHERE `id` = "' . $rep['id'] . '" LIMIT 1');
}
if (isset($d['add_eff'])) {
$i = 0;
$j = explode('=', $d['add_eff']);
while ($i < count($j)) {
if ($j[$i] > 0) {
$magic->addEffect($uid, $j[$i], 1);
if (isset($d['add_eff'])) {
$i = 0;
$j = explode('=', $d['add_eff']);
while ($i < count($j)) {
if ($j[$i] > 0) {
$magic->addEffect($u->info['id'], $j[$i], 1);
}
$i++;
}
$i++;
}
}
if (isset($d['add_cr'])) {
$t .= '' . $d['add_cr'] . ' кр., ';
mysql_query('UPDATE `users` SET `money` = `money`+' . $d['add_cr'] . ' WHERE `id` = "' . $uid . '" LIMIT 1');
}
if (isset($d['add_cr'])) {
$t .= '' . $d['add_cr'] . ' кр., ';
mysql_query('UPDATE `users` SET `money` = `money`+' . $d['add_cr'] . ' WHERE `id` = "' . $u->info['id'] . '" LIMIT 1');
}
if ($t != '') {
$t = rtrim($t, ', ');
$r = 'Задание <b>' . $pl['name'] . '</b> было успешно выполнено! Вы получили награду: ' . $t . '.';
unset($t);
} else {
$r = 'Задание <b>' . $pl['name'] . '</b> было успешно выполнено!';
if ($t != '') {
$t = rtrim($t, ', ');
$r = 'Задание <b>' . $pl['name'] . '</b> было успешно выполнено! Вы получили награду: ' . $t . '.';
unset($t);
} else {
$r = 'Задание <b>' . $pl['name'] . '</b> было успешно выполнено!';
}
$r = '<small>' . $r . '</small>';
//Отправляем сообщение в чат
$chatDto = new ChatMessage();
$chatDto->setCity($u->info['city']);
$chatDto->setRoom($u->info['room']);
$chatDto->setTo($u->info['login']);
$chatDto->setText($r);
$chatDto->setType(5);
(new Chat())->sendMsg($chatDto);
}
return "<small>$r</small>";
}
public function questCheckEnd($pl): int
public function questCheckEnd($pl)
{
global $u;
$quest = mysql_fetch_array(mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" ORDER BY `time` DESC LIMIT 1'));
@ -849,31 +839,29 @@ class Quests
if (isset($d['kill_bot'])) {
$ex = explode(',', $d['kill_bot']);
$i = 0; # Количество циклов для каждого типа бота.
$smth1 = 0; // неизвестно что.
$sqlFilter = [];
$sqlParams = [];
$q = '';
while ($i < count($ex)) {
$ex2 = explode('=', $ex[$i]);
$smth1 = $ex2[1];
$sqlFilter[] = "(uid = :uid$i and time > :time$i and vars = :vars$i)";
$sqlParams[":uid$i"] = $u->info['id'];
$sqlParams[":time$i"] = $quest['time'];
$sqlParams[":vars$i"] = "win_bot_$ex2[0]";
if ($q != '') {
$q .= ' OR ';
}
$q .= ' (`uid` = "' . $u->info['id'] . '" AND `time` > ' . $quest['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" )';
$i++;
}
$sqlFilter = implode(' or ', $sqlFilter);
if (isset($d['all_kill']) && (int)$d['all_kill'] > 0) {
$x2 = ActionModel::testCountCustom($sqlFilter, $sqlParams);
if ((int)$d['all_kill'] <= $x2) {
$x2 = $u->testAction($q, 2);
if ((int)$d['all_kill'] <= $x2[0]) {
$x2 = (int)$d['all_kill'];
} else {
$x2 = $x2[0];
}
if ($x2 < (int)$d['all_kill']) {
$g = 0;
}
} else {
$x2 = ActionModel::testCountCustom($sqlFilter, $sqlParams, $smth1);
$x2 = min($smth1, $x2);
if ($x2 < $smth1) {
$x2 = $u->testAction($q . ' LIMIT ' . $ex2[1], 2);
$x2 = min($ex2[1], $x2[0]);
if ($x2 < $ex2[1]) {
$g = 0;
}
}
@ -901,10 +889,10 @@ class Quests
$x2 = Db::getValue('select count(*) from items_users where maidin = ? and item_id = ? and uid = ? and `delete` in (0,1000) and inTransfer = 0 and inShop = 0',
[$pl['city'], (int)$ex2[0], $u->info['id']]);
if ($x2 >= $ex2[1]) {
if ($x2 <= ((int)$ex2[1] + round($ex2[1] * 0.15))) {
if ($x2 <= ($ex2[1] + round($ex2[1] * 0.15))) {
$ex2[1] = $x2;
} else {
$ex2[1] = ((int)$ex2[1] + round($ex2[1] * 0.15));
$ex2[1] = ($ex2[1] + round($ex2[1] * 0.15));
}
}
if ($x2 < $ex2[1]) {
@ -943,10 +931,10 @@ class Quests
$x2 = Db::getValue('select count(*) from items_users where maidin = ? and item_id = ? and uid = ? and `delete` in (0,1000) and inTransfer = 0 and inShop = 0',
[$quest['city'], (int)$ex2[0], $u->info['id']]);
if ($x2 >= $ex2[1]) {
if ($x2 <= ((int)$ex2[1] + round($ex2[1] * 0.15))) {
if ($x2 <= ($ex2[1] + round($ex2[1] * 0.15))) {
$ex2[1] = $x2;
} else {
$ex2[1] = ((int)$ex2[1] + round($ex2[1] * 0.15));
$ex2[1] = ($ex2[1] + round($ex2[1] * 0.15));
}
}
$d['add_rep'] = (int)$d['add_rep'] * (int)$ex2[1];
@ -968,8 +956,9 @@ class Quests
$i = 0;
$ex2 = explode('=', $ex[$i]);
while ($i < $d['all_kill']) {
$d['add_rep'] = $d['add_rep'] + (int)$ex2[1];
$x2 = ActionModel::testCount(["uid = {$u->info['id']}", "vars = win_bot_$ex2[0]", "time > {$action['time']}"], $d['all_kill']);
$x2 = 0;
$d['add_rep'] = $d['add_rep'] + $ex2[1];
$x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $action['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $d['all_kill'], 2);
$i++;
}
$ii++;
@ -987,7 +976,7 @@ class Quests
if ($this->stats['more_awards'] >= 0) {
$d['add_rep'] += $d['add_rep'] / 100 * 50;
}
$t .= '' . $d['add_rep'] . ' ед. репутации ' . $quest['city'] . ', ';
$t .= '' . $d['add_rep'] . ' ед. репутации ' . $u->city_name[$quest['city']] . ', ';
if (
$rep['rep' . $quest['city']] < 24999 &&
$rep['rep' . $quest['city']] + $d['add_rep'] >= 24999 &&

File diff suppressed because it is too large Load Diff

View File

@ -31,7 +31,7 @@ class Clan
}
}
private function join(string $clanname): void
private function join(string $clanname)
{
Db::sql('update users set clan = (select id from clan where clan.name = ?) where id = ?', [$clanname, $this->userid]);
}
@ -46,7 +46,7 @@ class Clan
return $this->status;
}
public function printClan(): void
public function printClan()
{
echo '<img style="vertical-align:text-bottom;" src="' . Config::img() . '/i/align/align' . $this->getAlign() . '.gif" alt="Склонность">' . $this->printLogoImage() . $this->getName();
}
@ -88,9 +88,4 @@ class Clan
{
return !empty($this->id) && $this->status === 0;
}
public static function addExp(int $value, int $clanid): void
{
Db::sql('update clan set exp = exp + ? where id = ?',[max($value,0), $clanid]);
}
}

View File

@ -6,24 +6,30 @@ use Core\Config;
use Core\Db;
use Helper\Mail;
use PassGen;
use UserIp;
class Confirmation
{
/**
* Для однотипных писем с подтверждением.
* @param array $userinfo Данные из (User)->info.
* @param string $value Новое значение
* @param mixed $value Новое значение
* @param ?int $code Проверочный код
* @param string $type Тип меняемого значения. С маленькой буквы, именительный падеж.
* @return void
*/
public static function byEmail(array $userinfo, string $type, string $value, ?int $code = null): void
public static function byEmail(array $userinfo, string $type, $value, ?int $code = null)
{
if ($type === 'pass2' && is_null($code)) {
self::pass2ByEmailCustom($userinfo, $value);
return;
}
$ip = UserIp::get();
$date = date('d.m.y H:i');
$https = Config::get('https');
$support = Config::get('support');
$activationLink = Config::get('https') . "/confirm.php?id={$userinfo['id']}&code=$code";
$activationLink = 'https://' . $userinfo['city'] . Config::get('host') .
"/confirm.php?id={$userinfo['id']}&code=$code";
$fulllogin = $userinfo['login'] . "[{$userinfo['level']}]";
Mail::send(
$userinfo['mail'],
@ -49,7 +55,31 @@ class Confirmation
);
}
public static function userRegistrationCodeByEmail(string $email, string $login): void
private static function pass2ByEmailCustom(array $userinfo, string $pass2)
{
$ip = UserIp::get();
$fulllogin = $userinfo['login'] . "[{$userinfo['level']}]";
Mail::send(
$userinfo['mail'],
<<<HTML
<html lang="ru">
<head><title>Второй пароль от персонажа $fulllogin.</title></head>
<body>
Вами, с IP адреса - $ip, был установлен второй пароль в игре Бойцовский Клуб.<br>
Если это были не Вы, свяжитесь с администрацией сайта.<br><br>
------------------------------------------------------------------<br>
Ваш логин | {$userinfo['login']}<br>
Второй пароль | ' . $pass2 . '<br>
------------------------------------------------------------------<br>
<br><br>Желаем Вам приятной игры.<br><br><i>Администрация</i>
</body>
HTML,
"Второй пароль от персонажа $fulllogin"
);
}
public static function userRegistrationCodeByEmail(string $email, string $login)
{
$code = PassGen::intCode(4);
Db::sql('insert into secure_code (email, code, time) values (?,?,unix_timestamp())', [$email, $code]);

View File

@ -118,37 +118,6 @@ insert into eff_users
return true;
}
public static function addInjury($uid, $type, $lvl): void
{
$stat = rand(1, 3); // пока без духовности
$img = "eff_travma$type.gif";
if ($type == 1) {
$name = 'Легкая травма';
$timeEnd = rand(1, 3);// время травмы от 1.30 до 6 часов
$data = 'add_s' . $stat . '=-' . $lvl;
} elseif ($type == 2) {
$name = 'Средняя травма';
$timeEnd = rand(3, 5);// время травмы от 6 до 12 часов
$data = 'add_s' . $stat . '=-' . ($lvl * 2);
} elseif ($type == 3) {
$name = 'Тяжелая травма';
$timeEnd = rand(5, 7);// время травмы от 12 до 6 часов
$data = 'add_s' . $stat . '=-' . ($lvl * 3);
} else {
$name = 'Неизлечимая травма';
$timeEnd = 24;// время травмы от 24 часа
$data = 'add_s' . $stat . '=-' . ($lvl * 50);
}
$timeEnd *= 3600;
Db::sql(
"insert into eff_users (id_eff, uid, name, timeUse, data, img2, v1, timeace) values (4,?,?,unix_timestamp(),?,?,?,?)",
[$uid, $name, $data, $img, $type, $timeEnd]
);
self::addById($uid, 263);
}
public static function removeByEffectId(int $userId, int $effectId): void
{
Db::sql('delete from eff_users where id_eff = ? and uid = ?', [$effectId, $userId]);
@ -169,17 +138,8 @@ insert into eff_users
return Db::getValue('select count(*) from eff_users where (id_eff between 301 and 304 or id_eff between 321 and 332) and id = ? and uid = ?', [$addictionId, $uid]) > 0;
}
/**
* @param int $userId если 0, удаление только по id.
* @param int $id
* @return void
*/
public static function removeById(int $userId, int $id): void
{
if ($userId === 0) {
Db::sql('delete from eff_users where id = ?', [$id]);
return;
}
Db::sql('delete from eff_users where id = ? and uid = ?', [$id, $userId]);
}
@ -188,11 +148,6 @@ insert into eff_users
Db::sql('delete from eff_users where id in (?) and uid = ?', [implode(',', $ids), $userId]);
}
public static function removePriems(int $userid): void
{
Db::sql("delete from eff_users where v1 = 'priem' and uid = ?", [$userid]);
}
public static function hasAttackTimeLimit(int $attackerId): bool
{
return Db::getValue('select count(*) from eff_users where id_eff = 478 and `delete` = 0 and uid = ?', [$attackerId]) > 0;
@ -208,46 +163,17 @@ insert into eff_users
Db::sql("insert into eff_users (no_Ace, id_eff, overType, uid, name, data, timeUse) values (1,479,112,?,'Защита от нападения','zashitatk=1',unix_timestamp())", [$userId]);
}
/**
* @param int $id
* @param int $hod
* @param int|string $x для запроса x = x + 1, вводить 'x + 1'
* @param string $data
* @return void
*/
public static function setHod(int $id, int $hod, int|string $x = 0, string $data = ''): void
{
$args = ['id' => $id, 'hod' => $hod];
$xsql = '';
$datasql = '';
if ($x === 'x + 1') {
$xsql = ', x = x + 1';
} elseif (is_numeric($x)) {
$xsql = ', x = :x';
$args['x'] = $x;
}
if (!empty($data)) {
$datasql = ', data = :data';
$args['data'] = $data;
}
$sql = "update eff_users set hod = :hod$xsql$datasql where id = :id";
Db::sql($sql, $args);
}
/**
* Духовность. Спасение.
* Из свитка нападения.
* @param $uid
* @param $id
* @return void
*/
public static function addSpasenie($uid): void
public static function addSpasenie($id): void
{
self::removeByOverType($uid, 101);
Db::sql('delete from eff_users where uid = ? and overType = 101');
Db::sql("insert into eff_users (id_eff, uid, name, data, overType, timeUse, user_use, v1, v2, img2, bj, mark)
values (22,?,'Спасение','add_spasenie=1',101,77,?,'priem',324,'preservation.gif','спасение',1)", [$uid, $uid]);
values (22,?,'Спасение','add_spasenie=1',101,77,?,'priem',324,'preservation.gif','спасение',1)", [$id, $id]);
}

View File

@ -5,7 +5,6 @@ namespace User;
use Core\Config;
use Core\Db;
use Helper\Conversion;
use Model\Constant\Stat;
use User;
/**
@ -13,12 +12,16 @@ use User;
*/
class InfoBox
{
private array $info;
public function __construct(private readonly User $user, private readonly Stat $statname = new Stat())
private User $user;
private array $info;
private array $is;
public function __construct(User $user)
{
$this->user = $user;
$this->info = $user->info;
$this->statname->getBonus();
$this->is = $user->is;
}
public function getInfoPers($uid, $i1, $sn = 0, $ivv = 0): array
@ -113,7 +116,7 @@ class InfoBox
$lvar = $this->getInfoItemInfo($pl, $td);
if (isset($tp_img[$pl['inOdet']], $sn['items_img'][$tp_img[$pl['inOdet']]])) {
if (@isset($sn['items_img'][$tp_img[$pl['inOdet']]])) {
$uimg = 'rimg/r' . $sn['items_img'][$tp_img[$pl['inOdet']]];
} else {
$uimg = 'i/items/' . $pl['img'];
@ -157,7 +160,6 @@ class InfoBox
}
}
}
//Шлем,Венок
$wj1i = '';
$br = '<div align=\\\'center\\\' style=\\\'margin:4px;\\\'><img src=\\\'' . Config::img() . '/1x1.gif\\\' height=\\\'1\\\' width=\\\'111\\\' style=\\\'background-color:black;\\\'></div>';
@ -385,16 +387,17 @@ class InfoBox
//Действие эффекта
$tr = '';
$t = $this->user->items['add'];
$x = 0;
$ed = Conversion::dataStringToArray($e['data']);
while ($x < count($this->statname->sysBonusNames)) {
$n = $this->statname->sysBonusNames[$x];
if (isset($ed['add_' . $n])) {
while ($x < count($t)) {
$n = $t[$x];
if (isset($ed['add_' . $n], $this->is[$n])) {
$z = '';
if ($ed['add_' . $n] > 0) {
$z = '+';
}
$tr .= '<br>' . $this->statname->bonusNames[$n] . ': ' . $z . $ed['add_' . $n];
$tr .= '<br>' . $this->is[$n] . ': ' . $z . $ed['add_' . $n];
}
$x++;
}
@ -423,7 +426,7 @@ class InfoBox
//здоровье
$hptop = 0;
$lh = [0 => 'hp_none'];
$lh = [0 => 'hp_none', 1 => 1];
if ($sn['hpNow'] == 0 || $sn['hpAll'] == 0) {
$lh[1] = 0;
@ -441,7 +444,8 @@ class InfoBox
}
if ($sn['mpAll'] > 0) {
//мана
$lm = ['hp_none', floor($sn['mpNow'] / $sn['mpAll'] * 120)];
$lm = [0 => 'hp_none', 1 => 1];
$lm[1] = floor($sn['mpNow'] / $sn['mpAll'] * 120);
if ($lm[1] > 0) {
$lm[0] = 'hp_mp';
}
@ -467,10 +471,10 @@ class InfoBox
$pb = '';
if ($u['banned'] > 0) {
$pb .= '<div style="margin:0 2px 0 2px; color: red; background-color: #fae0e0;"><strong>Персонаж заблокирован</strong></div>';
$pb .= '<div style="margin:0 2px 0 2px;"><font color="red" style="background-color:#fae0e0"><strong>Персонаж заблокирован</strong></font></div>';
}
if (isset($u['allLock']) && $u['allLock'] > time()) {
$pb .= '<div style="margin:0 2px 0 2px; color: red; background-color: #fae0e0;"><strong>Временный запрет передач!</strong></div>';
if ($u['allLock'] > time()) {
$pb .= '<div style="margin:0 2px 0 2px;"><font color="red" style="background-color:#fae0e0"><strong>Временный запрет передач!</strong></font></div>';
}
$swm = 0; //свитки магии
@ -499,39 +503,39 @@ class InfoBox
if ($ssm > 0 && $i1 == 0) {
$witmg .= '<table style="padding-top:2px;padding-bottom:2px;" width="240" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="60" height="60">' . $witm[59] . '</td>
<td width="60">' . $witm[60] . '</td>
<td width="60">' . $witm[61] . '</td>
<td width="60">' . $witm[62] . '</td>
</tr>
</table>';
<tr>
<td width="60" height="60">' . $witm[59] . '</td>
<td width="60">' . $witm[60] . '</td>
<td width="60">' . $witm[61] . '</td>
<td width="60">' . $witm[62] . '</td>
</tr>
</table>';
}
if ($swm > 0 && $i1 == 0) {
$witmg .= '<table width="240" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="40" height="25">' . $witm[40] . '</td>
<td width="40">' . $witm[41] . '</td>
<td width="40">' . $witm[42] . '</td>
<td width="40">' . $witm[43] . '</td>
<td width="40">' . $witm[44] . '</td>
<td width="40">' . $witm[50] . '</td>
</tr>
<tr>
<td height="25">' . $witm[45] . '</td>
<td>' . $witm[46] . '</td>
<td>' . $witm[47] . '</td>
<td>' . $witm[48] . '</td>
<td>' . $witm[49] . '</td>
<td>' . $witm[51] . '</td>
</tr>
</table>';
<tr>
<td width="40" height="25">' . $witm[40] . '</td>
<td width="40">' . $witm[41] . '</td>
<td width="40">' . $witm[42] . '</td>
<td width="40">' . $witm[43] . '</td>
<td width="40">' . $witm[44] . '</td>
<td width="40">' . $witm[50] . '</td>
</tr>
<tr>
<td height="25">' . $witm[45] . '</td>
<td>' . $witm[46] . '</td>
<td>' . $witm[47] . '</td>
<td>' . $witm[48] . '</td>
<td>' . $witm[49] . '</td>
<td>' . $witm[51] . '</td>
</tr>
</table>';
}
$zag = '';
if ($u['zag'] != '' && $i1 == 1) {
$rt[0] .= '<style> .inf2s { position:relative; filter: alpha(opacity=10); -moz-opacity: 0.10; opacity: 0.10; } .inf2s:hover { background-color:#e2e0e0;filter: alpha(opacity=70); -moz-opacity: 0.70; opacity: 0.70; } </style>';
$rt[0] .= '<style> .inf2s { position:relative; filter: alpha(opacity=10); -moz-opacity: 0.10; -khtml-opacity: 0.10; opacity: 0.10; } .inf2s:hover { background-color:#e2e0e0;filter: alpha(opacity=70); -moz-opacity: 0.70; -khtml-opacity: 0.70; opacity: 0.70; } </style>';
$zag = '<img width="243" height="283" style="position:absolute;top:-1px;left:-1px;" src="' . Config::img() . '/i/zag/' . $u['zag'] . '">';
@ -708,27 +712,45 @@ class InfoBox
$lvar .= '<br>Урон: ' . $po['sv_yron_min'] . '-' . $po['sv_yron_max'];
}
$t = $this->user->items['add'];
$x = 0;
while ($x < count($this->statname->sysBonusNames)) {
$n = $this->statname->sysBonusNames[$x];
if (isset($po['add_' . $n])) {
while ($x < count($t)) {
$n = $t[$x];
if (isset($po['add_' . $n], $this->is[$n])) {
$z = '+';
if ($po['add_' . $n] < 0) {
$z = '';
}
$lvar .= '<br>' . $this->statname->bonusNames[$n] . ': ' . $z . $po['add_' . $n];
$lvar .= '<br>' . $this->is[$n] . ': ' . $z . $po['add_' . $n];
}
$x++;
}
//
$x = 0;
while ($x < count($t)) {
$n = $t[$x];
if (isset($po['sv_' . $n])) {
$z = '+';
if ($po['sv_' . $n] < 0) {
$z = '';
}
if ($n != 'yron_min' && $n != 'yron_max') {
$lvar .= '<br>' . $this->is[$n] . ': ' . $z . $po['sv_' . $n];
}
}
$x++;
}
if (isset($pl['2h']) && $pl['2h'] == 1) {
$lvar .= '<br>• Двуручное оружие';
}
if (isset($po['zonb'])) {
$lvar .= '<br>Зоны блокирования: ';
if ($po['zonb'] > 0) {
$lvar .= str_repeat('+', $po['zonb']);
$x = 1;
while ($x <= $po['zonb']) {
$lvar .= '+';
$x++;
}
} else {
$lvar .= '—';
}
@ -750,7 +772,7 @@ class InfoBox
if (isset($pl['iznosMAX']) && $pl['iznosMAX'] > 0) {
$lvar .= '<br>Долговечность: ' . (int)($pl['iznosMAX'] - $pl['iznosNOW']);
$lvar .= '<br>Долговечность: ' . floor($pl['iznosNOW']) . DIRECTORY_SEPARATOR . ceil($pl['iznosMAX']);
}
if (!empty($po['battleUseZd']) && $po['battleUseZd'] > 0) {

View File

@ -1,106 +0,0 @@
<?php
namespace User;
use Helper\Conversion;
use Model\Constant\Stat;
class Item
{
public readonly int $id;
public readonly int $type;
public readonly string $name;
public readonly string $img;
public int $inslot;
public int $inodet;
public readonly string $data;
public int $durability;
public readonly int $add_a1;
public readonly int $add_a2;
public readonly int $add_a3;
public readonly int $add_a4;
public readonly int $add_a5;
public readonly int $add_aall;
public readonly int $add_hpall;
public readonly int $add_m1;
public readonly int $add_m10;
public readonly int $add_m11;
public readonly int $add_m14;
public readonly int $add_m15;
public readonly int $add_m18;
public readonly int $add_m19;
public readonly int $add_m2;
public readonly int $add_m3;
public readonly int $add_m4;
public readonly int $add_m5;
public readonly int $add_m6;
public readonly int $add_m7;
public readonly int $add_m8;
public readonly int $add_m9;
public readonly int $add_mall;
public readonly int $add_mg1;
public readonly int $add_mg2;
public readonly int $add_mg3;
public readonly int $add_mg4;
public readonly int $add_mg7;
public readonly int $add_mpall;
public readonly int $add_pa1;
public readonly int $add_pa2;
public readonly int $add_pa3;
public readonly int $add_pa4;
public readonly int $add_pm1;
public readonly int $add_pm2;
public readonly int $add_pm3;
public readonly int $add_pm4;
public readonly int $add_pm7;
public readonly int $add_s1;
public readonly int $add_s2;
public readonly int $add_s3;
public readonly int $add_s4;
public readonly int $add_s5;
public readonly int $add_s6;
public readonly int $add_s7;
public readonly int $add_za;
public readonly int $add_za1;
public readonly int $add_za2;
public readonly int $add_za3;
public readonly int $add_za4;
public readonly int $add_zm;
public readonly int $add_zm1;
public readonly int $add_zm2;
public readonly int $add_zm3;
public readonly int $add_zm4;
public readonly int $add_zona;
public readonly int $add_zonb;
public function __construct(array $item)
{
[
'id' => $this->id,
'type' => $this->type,
'name' => $this->name,
'img' => $this->img,
'inslot' => $this->inslot,
'inOdet' => $this->inodet,
'data' => $this->data,
'iznosNOW' => $iNow,
'iznosMAX' => $iMax,
] = $item;
$this->durability = (int)$iMax - (int)$iNow;
$stat = new Stat();
$stat->getBonus();
$dataArr = Conversion::dataStringToArray(strtolower($this->data));
foreach ($stat->sysBonusNames as $bonusName) {
if (!isset($dataArr["add_$bonusName"])) {
$this->{"add_$bonusName"} = 0;
continue;
}
$this->{"add_$bonusName"} = $dataArr["add_$bonusName"];
}
}
}

View File

@ -73,7 +73,7 @@ class ItemsModel
return [
'now' => Db::getValue('select sum(massa) from items_users left join items_main on item_id = items_main.id
where uid = ? and (`delete` = 0 or (`delete` = 1000 and inGroup > 0)) and inShop = 0 and inOdet = 0', [$uid]),
'max' => 40 + (($stats['os7'] ?? 0) * 10) + $stats['s4'] + $stats['maxves'] + $stats['s1'] * 4,
'max' => 40 + ($stats['os7'] * 10) + $stats['s4'] + $stats['maxves'] + $stats['s1'] * 4,
'items' => Db::getValue('select count(*) from items_users where uid = ? and `delete` = 0 and inShop = 0 and inOdet = 0', [$uid]),
];
}
@ -81,14 +81,12 @@ class ItemsModel
/** Выбор предмета в инвентаре.
* @param int $itemId
* @param int $ownerId
* @param bool $includeWeared
* @return array
*/
public static function getOwnedItemById(int $itemId, int $ownerId, bool $includeWeared = false): array
public static function getOwnedItemById(int $itemId, int $ownerId): array
{
$iw = $includeWeared ? 1 : 0;
return Db::getRow("select * from items_users left join items_main on item_id = items_main.id
where uid = ? and items_users.id = ? and `delete` = 0 and inOdet = $iw and inShop = 0 and is_arrested = 0", [$ownerId, $itemId]);
return Db::getRow('select * from items_users left join items_main on item_id = items_main.id
where uid = ? and items_users.id = ? and `delete` = 0 and inOdet = 0 and inShop = 0 and is_arrested = 0', [$ownerId, $itemId]);
}
public static function delete(int $id): void
@ -213,27 +211,4 @@ class ItemsModel
}
return $rt;
}
public static function addIznos(int $itemId): void
{
Db::sql('update items_users set iznosNOW = iznosNOW + 1 where id = ?', [$itemId]);
}
public static function itemsX(int $id, $uid = null, $item_id = null): bool|int
{
//fixme какая-то дичь тут.
$item = Db::getRow('select uid, item_id, ingroup, inshop from items_users where id = ?', [$id]);
if ($uid) {
$item['uid'] = $uid;
}
if ($item_id) {
$item['item_id'] = $item_id;
}
return Db::getValue(
'select count(id) from items_users where inshop = ? and item_id = ? and uid = ? and ingroup = ?',
[$item['inShop'], $item['item_id'], $item['uid'], $item['ingroup']]
);
}
}

View File

@ -1,23 +0,0 @@
<?php
namespace User;
use Core\Config;
readonly final class Login
{
public string $fullLogin;
public function __construct(
int|string|null $align,
int|string|null $clanName,
int $level,
string $login
) {
$imgBase = Config::img() . DIRECTORY_SEPARATOR . 'i';
$alignStr = empty($align) ? '' : "<img src='$imgBase/align/align$align.gif' alt=''>";
$clanStr = empty($clanName) ? '' : "<img src='$imgBase/clan/$clanName.gif' alt='$clanName'>";
$spacedLogin = str_replace(' ', '%20', $login);
$loginLink = "<a href='/inf.php?login=$spacedLogin' target='_blank'><img src='$imgBase/inf.gif' title='Инф. о $login' alt='Инф. о $login'></a>";
$this->fullLogin = "$alignStr$clanStr<strong>$login</strong> [$level]$loginLink";
}
}

View File

@ -57,5 +57,28 @@ class Password
}
return $this->info['pass'];
}
public function changeSecond(?int $passLength): array
{
if (in_array($passLength, [4, 6, 8])) {
$query = 'update users set pass2 = ? where id = ?';
$pass2 = PassGen::intCode($passLength);
$args = [
password_hash($pass2, PASSWORD_DEFAULT),
$this->info['id'],
];
Confirmation::byEmail($this->info, 'pass2', $pass2);
$hash = $args[0];
} else {
$query = 'update users set pass2 = default where id = ?';
$args = [$this->info['id']];
}
Db::sql($query, $args);
return [
'pass2' => $pass2 ?? '',
'hash' => $hash ?? null,
];
}
}

View File

@ -57,6 +57,12 @@ class Register
'effects' => [8, 20, 25, 37, 38, 283, 296, 412, 472],
],
];
private array $restrictedLogins = [
'ангел', 'angel', 'администрация', 'administration', 'Комментатор',
'Мироздатель', 'Мусорщик', 'Падальщик', 'Повелитель',
'Архивариус', 'Пересмешник', 'Волынщик', 'Лорд Разрушитель',
'Милосердие', 'Справедливость', 'Искушение', 'Вознесение',
];
public function hasGoodEmail(string $email): bool
{
@ -135,30 +141,40 @@ class Register
public function hasGoodLogin(string $login): bool
{
$validator = (new \Validator\Login())->setLogin($login);
if (!$validator->check()) {
$this->error = match ($validator->getErrorCode()) {
1 => 'Логин ' . $login . ' уже занят, выберите другой.',
2 => 'В логине разрешено использовать только буквы одного алфавита русского или английского. Нельзя смешивать.',
3 => 'Логин должен содержать не менее ' . $validator::LENGTH['min'] . ' символов.',
4 => 'Логин должен содержать не более ' . $validator::LENGTH['max'] . ' символов.',
5 => 'Не более двух разделителей одновременно (пробел, тире, нижнее подчеркивание).',
6 => 'В логине используются запрещённые символы.',
};
$isRestricted = in_array($login, $this->restrictedLogins);
$isRegistered = Db::getValue('select count(*) from users where login = ?', [$login]);
//Бывшие в употреблении логины. Дичь, но ладно.
$wasRegistered = Db::getValue('select count(*) from lastnames where login = ?', [$login]);
$login = str_replace(' ', ' ', $login);
if (mb_strlen($login) > 20) {
$this->error = 'Логин должен содержать не более 20 символов.';
}
if (mb_strlen($login) < 4) {
$this->error = 'Логин должен содержать не менее 4 символов.';
}
if ($this->hasMixedLatCur($login)) {
$this->error = 'В логине разрешено использовать только буквы одного алфавита русского или английского. Нельзя смешивать.';
}
if (substr_count($login, ' ') + substr_count($login, '-') + substr_count($login, '_') > 2) {
$this->error = 'Не более двух разделителей одновременно (пробел, тире, нижнее подчеркивание).';
}
if (!empty($this->error)) {
$this->error .= '<br>Пример правильного никнейма: Петя Убиватор, Коля, xalop.<br>Пример неправильного никнейма: )))), kolя)=-/.';
} else {
$login = $validator->get();
$isRegistered = Db::getValue('select count(*) from users where login = ?', [$login]);
//Бывшие в употреблении логины. Дичь, но ладно.
$wasRegistered = Db::getValue('select count(*) from lastnames where login = ?', [$login]);
if ($isRegistered || $wasRegistered) {
$this->error = 'Логин ' . $login . ' уже занят, выберите другой.';
}
}
if ($isRegistered || $wasRegistered || $isRestricted) {
$this->error = 'Логин ' . $login . ' уже занят, выберите другой.';
}
return !$this->error;
}
public function hasMixedLatCur(string $txt): bool
{
$en = preg_match("/^(([0-9A-z -])+)$/iu", $txt);
$ru = preg_match("/^([а-яёіїє\s\d]*)$/iu", $txt);
return ($ru && $en) || (!$ru && !$en);
}
private function setCookies($login): void
{
setcookie('login', 1, 1, '/', Config::get('host'), true);

View File

@ -12,22 +12,22 @@ class Reputation
public function __construct(int $userid)
{
$this->uid = $userid;
$this->r = $this->getr();
if (empty($this->r)) {
Db::sql('insert into rep (id) value (?)', [$this->uid]);
$this->r = $this->getr();
}
}
private function getr(): array
{
return Db::getRow(
$this->r = Db::getRow(
'select *,
(repcapitalcity+repdemonscity+repangelscity+repsuncity+repdreamscity+repabandonedplain+repsandcity+repemeraldscity+repdevilscity) as allrep,
(nu_capitalcity+nu_demonscity+nu_angelscity+nu_suncity+nu_dreamscity+nu_abandonedplain+nu_sandcity+nu_emeraldscity+nu_devilscity) as allnurep
from rep where id = ?', [$this->uid]
);
if (empty($this->r)) {
Db::sql('insert into rep (id) value (?)', [$this->uid]);
$this->r = Db::getRow(
'select *,
(repcapitalcity+repdemonscity+repangelscity+repsuncity+repdreamscity+repabandonedplain+repsandcity+repemeraldscity+repdevilscity) as allrep,
(nu_capitalcity+nu_demonscity+nu_angelscity+nu_suncity+nu_dreamscity+nu_abandonedplain+nu_sandcity+nu_emeraldscity+nu_devilscity) as allnurep
from rep where id = ?', [$this->uid]
);
}
}
public function get(): array
@ -35,7 +35,7 @@ class Reputation
return $this->r;
}
public function addRep(string $dungeonName, int $value): mixed
public function addRep(string $dungeonName, int $value): int
{
if (!isset($this->r[$dungeonName]) || $value <= 0) {
return 0;

View File

@ -14,17 +14,16 @@ class Stats
private User $u;
/** Список разрешённых для бонусов системных названий статов
* @var Stat
* @var array
*/
private Stat $sysNames;
private array $sysNames;
private array $statsKeys = [];
public function __construct(User $user)
{
$this->u = $user;
$this->sysNames = new Stat();
$this->sysNames->getBonus();
$this->sysNames = (new Stat())->getBonusNames();
}
@ -124,70 +123,23 @@ class Stats
];
}
public static function saveBattleStats(array $stats, int $id): void
public function getStats(int|array|null $uid = null, $i1 = 0, $res = 0, $reimg = false, $btl_cache = false): array
{
if (!isset(
$stats['hpnow'],
$stats['mpNow'],
$stats['tactic1'],
$stats['tactic2'],
$stats['tactic3'],
$stats['tactic4'],
$stats['tactic5'],
$stats['tactic6'],
$stats['tactic7'],
$stats['enemy'],
$stats['battle_yron'],
$stats['battle_exp'],
$stats['last_hp'],
$stats['priems_z'],
)
) {
return;
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);
}
Db::sql(
'update stats set hpNow = ?,mpNow = ?,
tactic1 = ?,tactic2 = ?,tactic3 = ?,tactic4 = ?,tactic5 = ?,tactic6 = ?,tactic7 = ?,
enemy = ?,battle_yron = ?,last_hp = ?,battle_exp = ?,priems_z = ?
where id = ?',
[
$stats['hpnow'],
$stats['mpNow'],
$stats['tactic1'],
$stats['tactic2'],
$stats['tactic3'],
$stats['tactic4'],
$stats['tactic5'],
$stats['tactic6'],
$stats['tactic7'],
$stats['enemy'],
$stats['battle_yron'],
$stats['battle_exp'],
$stats['last_hp'],
$stats['priems_z'],
$id,
]
);
}
public function getStats(int|array|null $uid = null, $i1 = 0, $reimg = false, $btl_cache = false): array
{
$u = match (true) {
empty($uid) => $this->u->info,
is_array($uid) => $uid,
default => User::getInfo($uid),
};
if (!isset($u['id'])) {
return [];
}
// Как? Нахуя 4 переменные разные для одного и того же?
$st = array_fill_keys($this->sysNames->sysBonusNames, 0);
$st = array_fill_keys($this->sysNames, 0);
$sti = $st;
$s_v = $st;
$s_vi = $st;
@ -219,12 +171,9 @@ class Stats
$st['items'] = [];
$st['effects'] = [];
if (!empty($u['vip'])) {
$st['vip'] = $u['vip'];
}
$st['vip'] = $u['vip'];
foreach (Conversion::dataStringToArray($u['stats']) as $stat => $value) {
//fixme несуществующие статы mg5 mg6 a6 s8-s15
$this->addKeyIfNotExist($stat, (int)$value, $st);
}
@ -245,7 +194,7 @@ class Stats
}
[$hnd1, $hnd2, $sht1, $dom, $coms] = $this->addWearedItemsBonuses($u['id'], $st, $s_v, $baseStats);
[$hnd1, $hnd2, $sht1, $oza, $ozm, $dom, $coms] = $this->addWearedItemsBonuses($u['id'], $st, $s_v, $baseStats);
$this->addMedalsBonuses($u['id'], $st);
@ -253,7 +202,6 @@ class Stats
$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']]);
$st['team'] = $u['team'];
}
//Характеристики от эффектов
@ -276,7 +224,7 @@ class Stats
} elseif (Config::get('effz') > 0 && $e['hod'] == -1) {
$efzz = round(($e['timeUse'] + $e['actionTime'] + $e['timeAce']) - time());
if ($efzz > 0) {
Effects::setHod($e['id'], $efzz / Config::get('effz'));
Db::sql('update eff_users set hod = ? where id = ?', [$efzz / Config::get('effz'), $e['id']]);
}
}
}
@ -337,28 +285,29 @@ class Stats
// мф.анти-уворот = 2.5
$st['m5'] += $st['s2'] * 5;
$st['za'] += $st['s4'];
$st['za'] += $st['s4'] * 1.0;
$st['m19'] += (int)($st['s3'] * 0.03);
$st['m19'] += round($st['s3'] * 0.03);
//Мощности
//Мощность против "Мощность крит. урона". Гамс
$st['antm3'] += $st['s5'] * 0.5;
//Бонусы комплектов
if (isset($coms['new']) && is_iterable($coms['new'])) {
if (is_iterable($coms['new'])) {
foreach ($coms['new'] as $complect) {
$com = Db::getValue(
'select data from complects where com = ? and x <= ? order by x desc limit 1',
$com = Db::getValue('select data from complects where com = ? and x <= ? order by x desc limit 1',
[
(int)$complect,
(int)$coms['com'][$complect], // кол-во предметов данного комплекта
]
);
]);
if (!$com) {
continue;
}
$sti = Conversion::dataStringToArray($com);
foreach ($this->sysNames->sysBonusNames as $stat) {
foreach ($this->sysNames as $stat) {
if (!isset($sti[$stat])) {
continue;
}
@ -373,19 +322,33 @@ class Stats
//Бонусы статов
$this->addStatBonuses($st);
/* Владения */
//если второе оружие одето
if ($hnd2 == 1 && $hnd1 == 1) {
$st['zona']++;
}
if ($sht1 == 1) {
$st['zonb']++;
}/* Владения */
//mib1-mib4, mab1-mab4 armor??
if (!empty($st['s5'])) {
$st['pm1'] += (int)($st['s5'] * 0.5);
$st['pm2'] += (int)($st['s5'] * 0.5);
$st['pm3'] += (int)($st['s5'] * 0.5);
$st['pm4'] += (int)($st['s5'] * 0.5);
$st['pm7'] += (int)($st['s5'] * 0.5);
if (isset($st['s5'])) {
$st['pm1'] += $st['s5'] * 0.5;
$st['pm2'] += $st['s5'] * 0.5;
$st['pm3'] += $st['s5'] * 0.5;
$st['pm4'] += $st['s5'] * 0.5;
$st['pm7'] += $st['s5'] * 0.5;
}
if (!empty($st['aall'])) {
if (isset($st['m11a'])) {
$st['pm1'] += $st['m11a'] * 0.5;
$st['pm2'] += $st['m11a'] * 0.5;
$st['pm3'] += $st['m11a'] * 0.5;
$st['pm4'] += $st['m11a'] * 0.5;
$st['pm7'] += $st['m11a'] * 0.5;
}
if (isset($st['aall'])) {
$st['a1'] += $st['aall'];
$st['a2'] += $st['aall'];
$st['a3'] += $st['aall'];
@ -393,35 +356,56 @@ class Stats
$st['a5'] += $st['aall'];
}
if (!empty($st['zm'])) {
if (isset($st['m2all'])) {
$st['mg1'] += $st['m2all'];
$st['mg2'] += $st['m2all'];
$st['mg3'] += $st['m2all'];
$st['mg4'] += $st['m2all'];
$st['mg7'] += $st['m2all'];
}
if (isset($st['zm'])) {
$st['zm1'] += $st['zm'];
$st['zm2'] += $st['zm'];
$st['zm3'] += $st['zm'];
$st['zm4'] += $st['zm'];
$st['zm5'] += $st['zm'];
$st['zm6'] += $st['zm'];
$st['zm7'] += $st['zm'];
}
if (!empty($st['mall'])) {
if (isset($st['zma'])) {
$st['zm1'] += $st['zma'];
$st['zm2'] += $st['zma'];
$st['zm3'] += $st['zma'];
$st['zm4'] += $st['zma'];
$st['zm5'] += $st['zma'];
$st['zm6'] += $st['zma'];
$st['zm7'] += $st['zma'];
}
if (isset($st['mall'])) {
$st['mg1'] += $st['mall'];
$st['mg2'] += $st['mall'];
$st['mg3'] += $st['mall'];
$st['mg4'] += $st['mall'];
}
if (!empty($st['m11'])) {
if (isset($st['m11'])) {
$st['pm1'] += $st['m11'];
$st['pm2'] += $st['m11'];
$st['pm3'] += $st['m11'];
$st['pm4'] += $st['m11'];
}
if (!empty($st['m10'])) {
if (isset($st['m10'])) {
$st['pa1'] += $st['m10'];
$st['pa2'] += $st['m10'];
$st['pa3'] += $st['m10'];
$st['pa4'] += $st['m10'];
}
if (!empty($st['za'])) {
if (isset($st['za'])) {
$st['za1'] += $st['za'];
$st['za2'] += $st['za'];
$st['za3'] += $st['za'];
@ -429,16 +413,16 @@ class Stats
}
if (!empty($st['hpVinos'])) {
$st['hpall'] += (int)($st['hpVinos'] * $st['s4']);
$st['hpall'] += round($st['hpVinos'] * $st['s4']);
}
if (!empty($st['mpVinos'])) {
$st['mpall'] += (int)($st['mpVinos'] * $st['s6']);
$st['mpall'] += round($st['mpVinos'] * $st['s6']);
}
if (!empty($st['hpProc'])) {
$st['hpall'] += (int)($st['hpall'] / 100 * $st['hpProc']);
$st['hpall'] += round($st['hpall'] / 100 * $st['hpProc']);
}
if (!empty($st['mpProc'])) {
$st['mpall'] += (int)($st['mpall'] / 100 * $st['mpProc']);
$st['mpall'] += round($st['mpall'] / 100 * $st['mpProc']);
}
//Реген. - 250 ед.
@ -447,18 +431,21 @@ class Stats
$st['mpNow'] = Comparsion::minimax($st['mpNow'], 0, $st['mpall']);
//зоны блока и удара
//если второе оружие одето
if ($hnd2 == 1 && $hnd1 == 1) {
$st['zona']++;
if ($st['zona'] < 1) {
$st['zona'] = 1;
}
if ($sht1 == 1) {
$st['zonb']++;
if ($st['zona'] > 5) {
$st['zona'] = 5;
}
if ($st['zonb'] < 1) {
$st['zonb'] = 1;
}
if ($st['zonb'] > 3) {
$st['zonb'] = 3;
}
$st['zona'] = Comparsion::minimax($st['zona'], 1, 5);
$st['zonb'] = Comparsion::minimax($st['zonb'], 1, 3);
$st['ozash'] = $oza;
$st['ozmsh'] = $ozm;
$st['weapon1'] = $hnd1;
$st['weapon2'] = $hnd2;
$st['sheld1'] = $sht1;
@ -487,9 +474,12 @@ class Stats
$st['btl_cof'] = $st['prckr'];
Db::sql('update stats set btl_cof = ? where id = ?', [$st['prckr'], $st['id']]);
}
$st['hpall'] = max($st['hpall'], 1);
$st['mpall'] = max($st['mpall'], 0);
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;
@ -506,8 +496,8 @@ class Stats
} 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 ($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 = [
@ -536,24 +526,13 @@ class Stats
$st[$key] += $value;
}
/**
* Добавляет бонусы к статам игрока.
* Генерирует переменную User:class->stats['items'], где лежат одетые предметы.
* @param int $uid
* @param array $st
* @param array $s_v
* @param array $baseStats
* @return array
*/
private function addWearedItemsBonuses(int $uid, array &$st, array &$s_v, array $baseStats): array
{
//Характеристики от предметов //ТУТ tr_lvl
// Вся вторая строчка - спасибо Users.
$wearedItems = Db::getRows(
'select type, data, inOdet,
$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 = ?', [$uid]
);
from items_users left join items_main on items_main.id = item_id where inOdet != 0 and uid = ?', [$uid]);
$h = 0;
$hnd1 = 0;
@ -563,20 +542,32 @@ class Stats
$coms = []; // комплекты
$dom = [];
$wi = new WearedItem(); // на замену User:class->stats['items']
$st['items_o'] = $wi;
$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],
]; //особенности магии
$ozaozmtypes = [
1 => [1, 9,],//Слабая
2 => [20, 39,],//Нормальная
3 => [40, 69,],//Хорошая
4 => [10, 19,],//Посредственная
5 => [70, 89,],//Великолепная
];
foreach ($wearedItems as $wearedItem) {
// Генерируем всратую пепяку User:class->stats['wpXid'] > 0, которая показывает, что определённый слот
// чем-то занят. Странное решение.
$this->addKeyIfNotExist('wp' . $wearedItem['inOdet'] . 'id', $h, $st);
$st['items'][$h] = $wearedItem;
$h++;
$wi->add(new Item($wearedItem));
// Если в левой руке (3) предметы определённого типа, то рука занята оружием.
if ($wearedItem['inOdet'] == 3 &&
(($wearedItem['type'] >= 18 && $wearedItem['type'] <= 24) ||
$wearedItem['type'] == 26 ||
@ -584,8 +575,6 @@ class Stats
$wearedItem['type'] == 28)) {
$hnd1 = 1;
}
// Если в правой руке (14) предметы определённого типа, то рука занята оружием или щитом.
if ($wearedItem['inOdet'] == 14 &&
(($wearedItem['type'] >= 18 && $wearedItem['type'] <= 24) ||
$wearedItem['type'] == 26 ||
@ -596,13 +585,55 @@ class Stats
$sht1 = 1;
}
// Если в любом слоте что-то есть, повышается User:class->stats['reting'] за каждый слот
// Используется каким-то непонятным образом в хаотах.
$data = Conversion::dataStringToArray($wearedItem['data']);
if ($wearedItem['inOdet'] <= 18 && $wearedItem['inOdet'] > 0) {
$this->addKeyIfNotExist('reting', 1, $st);
}
$data = Conversion::dataStringToArray($wearedItem['data']);
if (isset($data['add_oza'])) {
$oza = array_fill_keys($oza, $ozaozmtypes[$data['add_oza']]);
}
if (isset($data['add_ozm'])) {
$ozm = array_fill_keys($ozm, $ozaozmtypes[$data['add_ozm']]);
} else {
$ozm = array_fill_keys($ozm, $ozaozmtypes[1]);
}
if (in_array($data['add_oza1'], range(1, 5))) {
$oza[1] = $ozaozmtypes[$data['add_oza1']];
}
if (in_array($data['add_oza2'], range(1, 5))) {
$oza[2] = $ozaozmtypes[$data['add_oza2']];
}
if (in_array($data['add_oza3'], range(1, 5))) {
$oza[3] = $ozaozmtypes[$data['add_oza3']];
}
if (in_array($data['add_oza4'], range(1, 5))) {
$oza[4] = $ozaozmtypes[$data['add_oza4']];
}
if (in_array($data['add_ozm1'], range(1, 5))) {
$ozm[1] = $ozaozmtypes[$data['add_ozm1']];
} else {
$ozm[1] = $ozaozmtypes[1];
}
if (in_array($data['add_ozm2'], range(1, 5))) {
$ozm[2] = $ozaozmtypes[$data['add_ozm2']];
} else {
$ozm[2] = $ozaozmtypes[1];
}
if (in_array($data['add_ozm3'], range(1, 5))) {
$ozm[3] = $ozaozmtypes[$data['add_ozm3']];
} else {
$ozm[3] = $ozaozmtypes[1];
}
if (in_array($data['add_ozm4'], range(1, 5))) {
$ozm[4] = $ozaozmtypes[$data['add_ozm4']];
} else {
$ozm[4] = $ozaozmtypes[1];
}
if (isset($data['art'])) {
$this->addKeyIfNotExist('art', $data['art'], $st);
}
@ -644,7 +675,7 @@ class Stats
//Добавляем статы от данного предмета
if (!isset($data['restart_stats'])) {
foreach ($this->sysNames->sysBonusNames as $stat) {
foreach ($this->sysNames as $stat) {
if (!isset($data['add_' . $stat])) {
continue;
}
@ -653,6 +684,13 @@ class Stats
} else {
$reitm[] = $data;
}
foreach ($this->sysNames as $stat) {
if (!isset($data['sv_' . $stat])) {
continue;
}
$s_v[$stat] += (int)$data['sv_' . $stat];
}
}
//Сохраненные хар-ки и умения
@ -692,7 +730,7 @@ class Stats
}
}
}
return [$hnd1, $hnd2, $sht1, $dom, $coms];
return [$hnd1, $hnd2, $sht1, $oza, $ozm, $dom, $coms];
}
private function addMedalsBonuses(int $uid, array &$st): void
@ -703,7 +741,7 @@ class Stats
foreach ($efs as $data) {
$sts = Conversion::dataStringToArray($data);
foreach ($sts as $paramName => $value) {
if (!in_array($paramName, $this->sysNames->sysBonusNames, true)) { // есть ли параметр в разрешенных?
if (!in_array($paramName, $this->sysNames, true)) { // есть ли параметр в разрешенных?
continue;
}
$st[$paramName] += $value;
@ -713,7 +751,7 @@ class Stats
private function addValuesToAllArrays(array $sts, array &$st, array &$sti, array &$s_v, array &$s_vi): void
{
foreach ($this->sysNames->sysBonusNames as $stat) {
foreach ($this->sysNames as $stat) {
if (!isset($sts['add_' . $stat])) {
continue;
}
@ -1042,7 +1080,7 @@ class Stats
private function addIntelligenceBonuses(array &$st): void
{
//интелект
//интелект
if ($st['s5'] > 24 && $st['s5'] < 50) {
$st['m11'] += 10;
}
@ -1072,7 +1110,7 @@ class Stats
private function addWisdomBonuses(array &$st): void
{
//мудрость
//мудрость
if ($st['s6'] > 24 && $st['s6'] < 50) {
$st['mpall'] += 150;
$st['speedmp'] += 100;
@ -1113,8 +1151,7 @@ class Stats
private function addDungeonsBonuses(int $id, array &$st): void
{
$finishedDungeons = Db::getValue(
'select
$finishedDungeons = Db::getValue('select
if(repcapitalcity > 24999, 1, 0) +
if(repdemonscity > 24999, 1, 0) +
if(repangelscity > 24999, 1, 0) +
@ -1124,19 +1161,10 @@ class Stats
if(repsandcity > 24999, 1, 0) +
if(repemeraldscity > 24999, 1, 0) +
if(repizlom > 24999, 1, 0) +
0 as finished from rep where id = ?', [$id]
);
if (empty($finishedDungeons)) {
return;
}
0 as finished from rep where id = ?', [$id]);
//Бонус за количество полностью вырытых пещер.
if (isset($st['m10'])) {
$st['m10'] += 10 * $finishedDungeons;
} else {
$st['m10'] = 10 * $finishedDungeons;
}
$st['m10'] += 10 * $finishedDungeons;
}
private function addAdminBonuses(array $u, array &$st): void
@ -1152,12 +1180,10 @@ class Stats
return;
}
Db::sql(
"update stats set
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']]
);
where id = ?", [$u['id']]);
}
/** Переименовывает элементы массива с несовпадающими с остальным скриптом именами полей.
@ -1166,21 +1192,11 @@ class Stats
*/
private function renameArrayKeys(array &$st): void
{
if (isset($st['level'])) {
$st['lvl'] = $st['level'];
}
if (isset($st['hpall'])) {
$st['hpAll'] = $st['hpall'];
}
if (isset($st['mpall'])) {
$st['mpAll'] = $st['mpall'];
}
if (isset($st['hpnow'])) {
$st['hpNow'] = $st['hpnow'];
}
if (isset($st['mpnow'])) {
$st['mpNow'] = $st['mpnow'];
}
unset($st['level'], $st['hpnow'], $st['mpnow'], $st['hpall'], $st['mpall']);
$st['lvl'] = $st['level'];
$st['hpNow'] = $st['hpnow'];
$st['mpNow'] = $st['mpnow'];
unset($st['level'], $st['hpnow'], $st['mpnow']);
}
}

View File

@ -1,34 +0,0 @@
<?php
namespace User;
class WearedItem
{
private array $slot = [];
public function add(Item $item): void
{
$this->slot[$item->inslot] = $item;
}
public function exist(int $slot): bool
{
return array_key_exists($slot, $this->slot);
}
public function get(int $slot): Item
{
return $this->slot[$slot];
}
public function count(): int
{
return count($this->slot);
}
public function remove(int $slot): void
{
array_splice($this->slot, $slot, 1);
}
}

View File

@ -5,33 +5,33 @@ namespace User;
use Core\Db;
/**
* Непонятный кусок функции, который лежал внутри системы подсчёта бонусов к параметрам,
* при этом никак на это не влияя и ни с чем не взаимодействуя. Надо понять что его
* вызывает и выгнать его из User\Stats.
* Непонятный кусок функции, который лежал внутри системы подсчёта бонусов к параметрам,
* при этом никак на это не влияя и ни с чем не взаимодействуя. Надо понять что его
* вызывает и выгнать его из User\Stats.
*/
class WearedScrolls
{
public static function ScrollsChange(array &$u): void
{
//Замена свитков
if (empty($u['autospell']) || !empty($u['battle'])) {
//Замена свитков
if ($u['autospell'] == 0 || $u['battle'] != 0) {
return;
}
//проверяем свитки
//проверяем свитки
$sparr = [];
foreach (Db::getRows('select item_id, inOdet from items_users where inOdet between 40 and 50 and uid = ? order by item_id desc', [$u['id']]) as $scroll) {
$sparr[] = "{$scroll['item_id']} - {$scroll['inOdet']}";
}
$splink = implode(',', $sparr);
//Запоминаем новый комплект свитков
//Запоминаем новый комплект свитков
if ($u['autospell'] == 1) {
$u['autospell'] = $splink;
Db::sql('update users set autospell = ? where id = ?', [$splink, $u['id']]);
}
//Выдаем нужный свиток, если он есть в инвентаре
//Выдаем нужный свиток, если он есть в инвентаре
if ($u['autospell'] != $splink) {
$spe1 = explode(',', $splink);
$spe2 = explode(',', $u['autospell']);

View File

@ -1,67 +0,0 @@
<?php
namespace Validator;
class Login
{
private const RESTRICTED = [
'ангел', 'angel', 'администрация', 'administration', 'Комментатор',
'Мироздатель', 'Мусорщик', 'Падальщик', 'Повелитель',
'Архивариус', 'Пересмешник', 'Волынщик', 'Лорд Разрушитель',
'Милосердие', 'Справедливость', 'Искушение', 'Вознесение',
];
public const LENGTH = ['min' => 4, 'max' => 16];
protected readonly string $login;
private int $errorcode = 0;
public function getErrorCode(): int
{
return $this->errorcode;
}
public function setLogin(string $login): self
{
$login = preg_replace('!\s+!', ' ', $login); // remove inner spaces
$login = trim($login); // remove outer spaces
$this->login = $login;
return $this;
}
public function get(): string
{
return $this->check() ? $this->login : '';
}
public function check(): bool
{
if (!$this->isAllowed()) {
$this->errorcode = 1;
} elseif ($this->isMixed()) {
$this->errorcode = 2;
} elseif (mb_strlen($this->login) < self::LENGTH['min']) {
$this->errorcode = 3;
} elseif (mb_strlen($this->login) > self::LENGTH['max']) {
$this->errorcode = 4;
} elseif (substr_count($this->login, ' ') + substr_count($this->login, '-') + substr_count($this->login, '_') > 2) {
$this->errorcode = 5;
} elseif (strpos("!@#$%^&*()\+|/'\"", $this->login) || empty($this->login)) {
$this->errorcode = 6;
}
return $this->errorcode === 0;
}
private function isAllowed(): bool
{
$d = implode('|', self::RESTRICTED);
$pattern = "/\b($d)\b/iu";
return !preg_match($pattern, $this->login);
}
private function isMixed(): bool
{
$en = preg_match("/^(([0-9A-z -])+)$/iu", $this->login);
$ru = preg_match("/^([а-яёіїє\s\d]*)$/iu", $this->login);
return ($ru && $en) || (!$ru && !$en);
}
}

Some files were not shown because too many files have changed in this diff Show More