1 | <?php |
||||
2 | |||||
3 | /** @noinspection SqlResolve */ |
||||
4 | |||||
5 | namespace Unit; |
||||
6 | |||||
7 | use Exception; |
||||
8 | use mysqli_result; |
||||
9 | use Planet\Planet; |
||||
10 | use SN; |
||||
11 | |||||
12 | class DBStaticUnit { |
||||
13 | |||||
14 | public static function db_unit_time_restrictions($date = SN_TIME_NOW) { |
||||
15 | $date = is_numeric($date) ? "FROM_UNIXTIME({$date})" : "'{$date}'"; |
||||
16 | |||||
17 | return |
||||
18 | "(unit_time_start IS NULL OR unit_time_start <= {$date}) AND |
||||
19 | (unit_time_finish IS NULL OR unit_time_finish = '1970-01-01 03:00:00' OR unit_time_finish >= {$date})"; |
||||
20 | } |
||||
21 | |||||
22 | /** |
||||
23 | * Used by `unit_captain` |
||||
24 | * |
||||
25 | * @param int $unit_id |
||||
26 | * |
||||
27 | * @return array|bool|mysqli_result|null |
||||
28 | */ |
||||
29 | public static function db_unit_by_id($unit_id) { |
||||
30 | return doquery("SELECT * FROM `{{unit}}` WHERE `unit_id` = " . idval($unit_id), true); |
||||
0 ignored issues
–
show
Deprecated Code
introduced
by
![]() true of type true is incompatible with the type string expected by parameter $table of doquery() .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
31 | } |
||||
32 | |||||
33 | /** |
||||
34 | * @param int $user_id |
||||
35 | * @param int $location_type |
||||
36 | * @param int $location_id |
||||
37 | * @param int $unit_snid |
||||
38 | * |
||||
39 | * @return array|false|mixed|null |
||||
40 | */ |
||||
41 | public static function db_unit_by_location($user_id, $location_type, $location_id, $unit_snid = 0) { |
||||
0 ignored issues
–
show
The parameter
$user_id is not used and could be removed.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for parameters that have been defined for a function or method, but which are not used in the method body. ![]() |
|||||
42 | // apply time restrictions ???? |
||||
43 | $allUnits = DBStaticUnit::db_get_unit_list_by_location($location_type, $location_id); |
||||
44 | |||||
45 | $unit_snid = intval($unit_snid); |
||||
46 | |||||
47 | $resultOld = $unit_snid ? (isset($allUnits[$unit_snid]) ? $allUnits[$unit_snid] : null ) : $allUnits; |
||||
48 | |||||
49 | return $resultOld; |
||||
50 | } |
||||
51 | |||||
52 | public static $locator = array(); // Кэширует соответствия между расположением объектов - в частности юнитов |
||||
53 | |||||
54 | /** |
||||
55 | * @param $location_type |
||||
56 | * @param $location_id |
||||
57 | * |
||||
58 | * @return array|false |
||||
59 | */ |
||||
60 | public static function db_get_unit_list_by_location($location_type, $location_id) { |
||||
61 | if (!($location_type = idval($location_type)) || !($location_id = idval($location_id))) { |
||||
62 | return false; |
||||
63 | } |
||||
64 | |||||
65 | if (!isset(DBStaticUnit::$locator[$location_type][$location_id])) { |
||||
66 | $got_data = SN::db_get_record_list(LOC_UNIT, "unit_location_type = {$location_type} AND unit_location_id = {$location_id} AND " . DBStaticUnit::db_unit_time_restrictions()); |
||||
67 | if (is_array($got_data)) { |
||||
68 | foreach ($got_data as $unitRow) { |
||||
69 | DBStaticUnit::$locator[$unitRow['unit_location_type']][$unitRow['unit_location_id']][$unitRow['unit_snid']] = $unitRow; |
||||
70 | } |
||||
71 | } |
||||
72 | } |
||||
73 | |||||
74 | $result = false; |
||||
75 | |||||
76 | if (is_array(DBStaticUnit::$locator[$location_type][$location_id])) { |
||||
77 | foreach (DBStaticUnit::$locator[$location_type][$location_id] as $key => $value) { |
||||
78 | $result[$key] = $value; |
||||
79 | } |
||||
80 | } |
||||
81 | |||||
82 | return $result; |
||||
83 | } |
||||
84 | |||||
85 | public static function cache_clear() { |
||||
86 | DBStaticUnit::$locator = []; |
||||
87 | } |
||||
88 | |||||
89 | public static function db_unit_count_by_user_and_type_and_snid($user_id, $unit_type = 0, $unit_snid = 0) { |
||||
90 | $query = doquery( |
||||
0 ignored issues
–
show
The function
doquery() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
91 | "SELECT unit_snid, sum(unit_level) as `qty` FROM {{unit}} WHERE `unit_player_id` = {$user_id} " . |
||||
92 | ($unit_type ? "AND `unit_type` = {$unit_type} " : '') . |
||||
93 | ($unit_snid ? "AND `unit_snid` = {$unit_snid} " : '') . |
||||
94 | 'GROUP BY `unit_snid`' |
||||
95 | ); |
||||
96 | $result = array(); |
||||
97 | while ($row = db_fetch($query)) { |
||||
0 ignored issues
–
show
The function
db_fetch() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
98 | $result[$row['unit_snid']] = $row; |
||||
99 | } |
||||
100 | |||||
101 | return $result; |
||||
102 | } |
||||
103 | |||||
104 | // Used by UNIT_CAPTAIN module TODO |
||||
105 | public static function db_unit_in_fleet_by_user($user_id, $location_id, $unit_snid, $for_update) { |
||||
106 | return doquery( |
||||
0 ignored issues
–
show
The function
doquery() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
107 | "SELECT * |
||||
108 | FROM {{fleets}} AS f |
||||
109 | JOIN {{unit}} AS u ON u.`unit_location_id` = f.fleet_id |
||||
110 | WHERE |
||||
111 | f.fleet_owner = {$user_id} AND |
||||
112 | (f.fleet_start_planet_id = {$location_id} OR f.fleet_end_planet_id = {$location_id}) |
||||
113 | AND u.unit_snid = {$unit_snid} AND u.`unit_location_type` = " . LOC_FLEET . " AND " . self::db_unit_time_restrictions() . |
||||
114 | " LIMIT 1" . |
||||
115 | ($for_update ? ' FOR UPDATE' : '') |
||||
116 | , true); |
||||
0 ignored issues
–
show
true of type true is incompatible with the type string expected by parameter $table of doquery() .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
117 | } |
||||
118 | |||||
119 | |||||
120 | public static function db_unit_list_laboratories($user_id) { |
||||
121 | return doquery("SELECT DISTINCT unit_location_id AS `id` |
||||
0 ignored issues
–
show
The function
doquery() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
122 | FROM {{unit}} |
||||
123 | WHERE unit_player_id = {$user_id} AND unit_location_type = " . LOC_PLANET . " AND unit_level > 0 AND unit_snid IN (" . STRUC_LABORATORY . ", " . STRUC_LABORATORY_NANO . ");"); |
||||
124 | } |
||||
125 | |||||
126 | public static function db_unit_set_by_id($unit_record_id, $set) { |
||||
127 | return SN::db_upd_record_by_id(LOC_UNIT, $unit_record_id, $set); |
||||
128 | } |
||||
129 | |||||
130 | /** |
||||
131 | * @param string $set |
||||
132 | * |
||||
133 | * @return array|bool|false|mysqli_result|null |
||||
134 | */ |
||||
135 | public static function db_unit_set_insert($set) { |
||||
136 | return SN::db_ins_record(LOC_UNIT, $set); |
||||
137 | } |
||||
138 | |||||
139 | public static function db_unit_list_delete($user_id, $unit_location_type, $unit_location_id = 0, $unit_snid = 0) { |
||||
140 | return SN::db_del_record_list(LOC_UNIT, |
||||
141 | "`unit_location_type` = {$unit_location_type}" . |
||||
142 | ($unit_location_id = idval($unit_location_id) ? " AND `unit_location_id` = {$unit_location_id}" : '') . |
||||
0 ignored issues
–
show
|
|||||
143 | ($user_id = idval($user_id) ? " AND `unit_player_id` = {$user_id}" : '') . |
||||
0 ignored issues
–
show
|
|||||
144 | ($unit_snid = idval($unit_snid) ? " AND `unit_snid` = {$unit_snid}" : '')); |
||||
0 ignored issues
–
show
|
|||||
145 | } |
||||
146 | |||||
147 | public static function db_unit_list_stat_calculate() { |
||||
148 | return doquery( |
||||
0 ignored issues
–
show
The function
doquery() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
149 | "SELECT unit_player_id, unit_type, unit_snid, unit_level, count(*) AS unit_amount |
||||
150 | FROM `{{unit}}` |
||||
151 | WHERE unit_level > 0 AND " . self::db_unit_time_restrictions() . |
||||
152 | " GROUP BY unit_player_id, unit_type, unit_snid, unit_level" |
||||
153 | ); |
||||
154 | } |
||||
155 | |||||
156 | |||||
157 | public static function db_unit_change_owner($location_type, $location_id, $new_owner_id) { |
||||
158 | doquery("UPDATE {{unit}} SET `unit_player_id` = {$new_owner_id} WHERE `unit_location_type` = {$location_type} AND `unit_location_id` = {$location_id}"); |
||||
0 ignored issues
–
show
The function
doquery() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
159 | } |
||||
160 | |||||
161 | |||||
162 | public static function db_unit_list_admin_delete_mercenaries_finished() { |
||||
163 | /** @noinspection SqlWithoutWhere */ |
||||
164 | return doquery("DELETE FROM {{unit}} WHERE unit_time_finish IS NOT NULL AND unit_time_finish < FROM_UNIXTIME(" . SN_TIME_NOW . ") AND unit_type = " . UNIT_MERCENARIES); |
||||
0 ignored issues
–
show
The function
doquery() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
165 | } |
||||
166 | |||||
167 | public static function db_unit_list_admin_set_mercenaries_expire_time($default_length) { |
||||
168 | return doquery( |
||||
0 ignored issues
–
show
The function
doquery() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
169 | "UPDATE {{unit}} |
||||
170 | SET |
||||
171 | unit_time_start = FROM_UNIXTIME(" . SN_TIME_NOW . "), |
||||
172 | unit_time_finish = FROM_UNIXTIME(" . (SN_TIME_NOW + $default_length) . ") |
||||
173 | WHERE unit_type = " . UNIT_MERCENARIES |
||||
174 | ); |
||||
175 | } |
||||
176 | |||||
177 | /** |
||||
178 | * Adjust unit amount |
||||
179 | * |
||||
180 | * @param int $playerId |
||||
181 | * @param int $planetId |
||||
182 | * @param int $unitSnId |
||||
183 | * @param float $amount |
||||
184 | * @param int $reason |
||||
185 | * |
||||
186 | * @return bool |
||||
187 | * |
||||
188 | * @throws Exception |
||||
189 | */ |
||||
190 | public static function dbChangeUnit($playerId, $planetId, $unitSnId, $amount, $reason = RPG_NONE) { |
||||
191 | $result = false; |
||||
192 | |||||
193 | // TODO - Lock user |
||||
194 | $userArray = db_user_by_id($playerId); |
||||
0 ignored issues
–
show
The function
db_user_by_id() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
195 | |||||
196 | if ($unitSnId == RES_DARK_MATTER) { |
||||
197 | // Add dark matter to user |
||||
198 | $result = boolval(rpg_points_change($playerId, $reason, $amount)); |
||||
199 | } elseif (in_array($unitSnId, sn_get_groups(UNIT_RESOURCES_STR_LOOT))) { |
||||
200 | // Add resources to user's capital |
||||
201 | if ($userArray['user_as_ally'] == 1) { |
||||
202 | // TODO - If ally - adding resources to user record |
||||
203 | } else { |
||||
204 | // Adding resources to planet |
||||
205 | $planet = new Planet(); |
||||
206 | $planet->dbLoadRecord($planetId); |
||||
207 | $planet->changeResource($unitSnId, $amount); |
||||
208 | $planet->save(); |
||||
209 | |||||
210 | $result = true; |
||||
211 | } |
||||
212 | } elseif (in_array($unitSnId, sn_get_groups(UNIT_ARTIFACTS_STR))) { |
||||
213 | // Add artifacts to player |
||||
214 | $result = self::dbAdd($playerId, 0, $unitSnId, $amount); |
||||
215 | } elseif (!empty($planetId) && in_array($unitSnId, sn_get_groups([UNIT_STRUCTURES_STR, UNIT_SHIPS_STR, UNIT_DEFENCE_STR, ]))) { |
||||
216 | // Add fleet or defense to user's capital |
||||
217 | $result = self::dbAdd($playerId, $planetId, $unitSnId, $amount); |
||||
218 | } |
||||
219 | |||||
220 | return $result; |
||||
221 | } |
||||
222 | |||||
223 | |||||
224 | /** |
||||
225 | * Add unit to player/planet |
||||
226 | * |
||||
227 | * Supports units. DOES NOT support resources |
||||
228 | * |
||||
229 | * DOES NOT autodetect location |
||||
230 | * |
||||
231 | * @param int $playerId |
||||
232 | * @param int $planetId 0 - for player units |
||||
233 | * @param int $unitSnId |
||||
234 | * @param float $amount |
||||
235 | * |
||||
236 | * @return bool |
||||
237 | */ |
||||
238 | protected static function dbAdd($playerId, $planetId, $unitSnId, $amount) { |
||||
239 | if (!in_array($unitSnId, sn_get_groups([UNIT_SHIPS_STR, UNIT_DEFENCE_STR, UNIT_ARTIFACTS_STR, UNIT_STRUCTURES_STR,]))) { |
||||
240 | return false; |
||||
241 | } |
||||
242 | |||||
243 | if ($planetId == 0) { |
||||
244 | $locationType = LOC_USER; |
||||
245 | $locationId = $playerId; |
||||
246 | } else { |
||||
247 | $locationType = LOC_PLANET; |
||||
248 | $locationId = $planetId; |
||||
249 | } |
||||
250 | |||||
251 | $fields = [ |
||||
252 | 'unit_player_id' => $playerId, |
||||
253 | 'unit_location_type' => $locationType, |
||||
254 | 'unit_location_id' => $locationId, |
||||
255 | 'unit_snid' => $unitSnId, |
||||
256 | ]; |
||||
257 | if (!($unitRecord = RecordUnit::findFirst($fields))) { |
||||
258 | if ($amount < 0) { |
||||
259 | return false; |
||||
260 | } |
||||
261 | |||||
262 | // New unit |
||||
263 | // $unitRecord = RecordUnit::build([ |
||||
264 | // 'unit_player_id' => $playerId, |
||||
265 | // 'unit_location_type' => $locationType, |
||||
266 | // 'unit_location_id' => $locationId, |
||||
267 | // 'unit_snid' => $unitSnId, |
||||
268 | // 'unit_type' => get_unit_param($unitSnId, P_UNIT_TYPE), |
||||
269 | // 'unit_level' => $level, |
||||
270 | // ]); |
||||
271 | |||||
272 | $fields += [ |
||||
273 | 'unit_type' => get_unit_param($unitSnId, P_UNIT_TYPE), |
||||
274 | 'unit_level' => $amount, |
||||
275 | ]; |
||||
276 | $unitRecord = RecordUnit::build($fields); |
||||
277 | |||||
278 | return $unitRecord->insert(); |
||||
279 | } else { |
||||
280 | if ($unitRecord->unit_level + $amount < 0) { |
||||
281 | // TODO - Log error or throw Exception |
||||
282 | return false; |
||||
283 | } |
||||
284 | |||||
285 | $unitRecord->inc()->unit_level = $amount; |
||||
286 | |||||
287 | return $unitRecord->update(); |
||||
288 | } |
||||
289 | } |
||||
290 | |||||
291 | public static function dbUserAdd($playerId, $unitSnId, $amount) { |
||||
292 | // if (!($unitRecord = RecordUnit::findFirst([ |
||||
293 | // 'unit_player_id' => $playerId, |
||||
294 | // 'unit_location_type' => LOC_USER, |
||||
295 | // 'unit_location_id' => $playerId, |
||||
296 | // 'unit_snid' => $unitSnId, |
||||
297 | // ]))) { |
||||
298 | // if ($level < 0) { |
||||
299 | // return false; |
||||
300 | // } |
||||
301 | // |
||||
302 | // // New unit |
||||
303 | // $unitRecord = RecordUnit::build([ |
||||
304 | // 'unit_player_id' => $playerId, |
||||
305 | // 'unit_location_type' => LOC_USER, |
||||
306 | // 'unit_location_id' => $playerId, |
||||
307 | // 'unit_type' => get_unit_param($unitSnId, P_UNIT_TYPE), |
||||
308 | // 'unit_snid' => $unitSnId, |
||||
309 | // 'unit_level' => $level, |
||||
310 | // ]); |
||||
311 | // |
||||
312 | //// var_dump($unitRecord);die(); |
||||
313 | // |
||||
314 | // return $unitRecord->insert(); |
||||
315 | // } else { |
||||
316 | // if ($unitRecord->unit_level + $level < 0) { |
||||
317 | // // TODO - Log error or throw Exception |
||||
318 | // return false; |
||||
319 | // } |
||||
320 | // |
||||
321 | // $unitRecord->inc()->unit_level = $level; |
||||
322 | // |
||||
323 | // return $unitRecord->update(); |
||||
324 | // } |
||||
325 | return self::dbAdd($playerId, 0, $unitSnId, $amount); |
||||
326 | } |
||||
327 | |||||
328 | } |
||||
329 |