This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * @property array $reqPassed |
||
4 | * @property boolean $success |
||
5 | * @property integer $gained_xp |
||
6 | * @property integer $gained_dollar |
||
7 | * @property integer $gained_routine |
||
8 | * @property boolean $gained_visit |
||
9 | * @property Item $found_setpart |
||
10 | */ |
||
11 | class MissionAction extends CModel |
||
12 | { |
||
13 | private $mission; |
||
14 | private $reqPassed = []; |
||
15 | private $success; |
||
16 | private $gained_xp; |
||
17 | private $gained_dollar; |
||
18 | private $gained_routine; |
||
19 | private $gained_visit; |
||
20 | private $found_setpart; |
||
21 | |||
22 | public function getReqPassed() |
||
23 | { |
||
24 | return $this->reqPassed; |
||
25 | } |
||
26 | |||
27 | public function getSuccess() |
||
28 | { |
||
29 | return $this->success; |
||
30 | } |
||
31 | |||
32 | public function getGained_xp() |
||
33 | { |
||
34 | return (int)$this->gained_xp; |
||
35 | } |
||
36 | |||
37 | public function getGained_dollar() |
||
38 | { |
||
39 | return (int)$this->gained_dollar; |
||
40 | } |
||
41 | |||
42 | public function getGained_routine() |
||
43 | { |
||
44 | return (int)$this->gained_routine; |
||
45 | } |
||
46 | |||
47 | public function getGained_visit() |
||
48 | { |
||
49 | return (bool)$this->gained_visit; |
||
50 | } |
||
51 | |||
52 | public function getFound_setpart() |
||
53 | { |
||
54 | return $this->found_setpart; |
||
55 | } |
||
56 | |||
57 | public function setMission($mission) |
||
58 | { |
||
59 | $this->mission = $mission; |
||
60 | } |
||
61 | |||
62 | public function setGained_visit($visit) |
||
63 | { |
||
64 | $this->gained_visit = (bool)$visit; |
||
65 | $this->mission->gate_visited = (bool)$visit; |
||
66 | } |
||
67 | |||
68 | public function attributeNames() |
||
69 | { |
||
70 | return []; |
||
71 | } |
||
72 | |||
73 | public function complete() |
||
74 | { |
||
75 | if (!$this->requirementsOk()) { |
||
76 | return false; |
||
77 | } |
||
78 | |||
79 | if (!$this->doMission()) { |
||
80 | throw new CFlashException('A követelményeknek megfelelsz, mégsem sikerül teljesÃteni a megbÃzást mivel csak '. $this->mission->chance .'% esélyed volt rá.<br/> |
||
81 | Nagyobb szakértelemmel (több felszereléssel és csalival) ez növelhető.'); |
||
82 | } |
||
83 | $this->incrementRoutine(); |
||
84 | } |
||
85 | |||
86 | private function requirementsOk() |
||
87 | { |
||
88 | $player = Yii::app()->player->model; |
||
89 | |||
90 | //check if the mission is gate and the submissions are maxed out |
||
91 | if ($this->mission->gate) { |
||
92 | $this->reqPassed['routinesFull'] = $this->mission->locationRoutinesFull; |
||
93 | } |
||
94 | |||
95 | //check energy |
||
96 | $this->reqPassed['energy'] = ($player->energy >= $this->mission->req_energy); |
||
97 | |||
98 | //check baits |
||
99 | foreach ($this->mission->req_baits as $req) { |
||
100 | $this->reqPassed['bait_'.$req['item']->id] = $req['haveEnought']; |
||
101 | } |
||
102 | |||
103 | foreach ($this->reqPassed as $passed) { |
||
104 | if (!$passed) { |
||
105 | throw new CFlashException('Nem tudod elvégezni a megbÃzást, mert nem teljesÃted a követelményeket.'); |
||
106 | } |
||
107 | } |
||
108 | |||
109 | //routine full |
||
110 | if ($this->mission->routine >= 100) { |
||
111 | throw new CFlashException('Ezt a megbÃzást már 100% rutinnal végzed, ezért unalmas lenne ismételgetni.'); |
||
112 | } |
||
113 | |||
114 | return true; |
||
115 | } |
||
116 | |||
117 | private function doMission() |
||
118 | { |
||
119 | $incr = $decr = []; |
||
120 | |||
121 | //take requirements |
||
122 | $decr['energy'] = $this->mission->req_energy; |
||
123 | |||
124 | //complete |
||
125 | $this->success = $this->beatMission(); |
||
126 | |||
127 | //add awards |
||
128 | $incr['xp_all'] = $incr['xp_delta'] = $this->gainXP(); |
||
129 | $incr['dollar'] = $this->gainDollar(); |
||
130 | |||
131 | if ($this->success) { |
||
132 | if ($this->mission->gate && !$this->mission->gate_visited) { |
||
133 | $incr['gold'] = Yii::app()->params['goldPerGateMission']; |
||
134 | } |
||
135 | if ($this->mission->award_setpart) { |
||
136 | $this->addSetPart(); |
||
137 | } |
||
138 | } |
||
139 | |||
140 | Yii::app()->player->model->updateAttributes($incr, $decr); |
||
141 | |||
142 | //increment contest points |
||
143 | $contest = new Contest; |
||
144 | $contest->addPoints(Yii::app()->player->uid, Contest::ACT_MISSION, $decr['energy'], $incr['xp_all'], $incr['dollar']); |
||
145 | |||
146 | return $this->success; |
||
147 | } |
||
148 | |||
149 | private function incrementRoutine() |
||
150 | { |
||
151 | if ($this->mission->gate) { |
||
152 | return false; //do not increment for gate missions |
||
153 | } |
||
154 | if (!$this->success) { |
||
155 | return false; // do not increment on failed missions |
||
156 | } |
||
157 | |||
158 | $uid = Yii::app()->player->model->uid; |
||
159 | $routine = (int)$this->mission->routine_gain; |
||
160 | if ($routine<1) { |
||
161 | $routine = 1; |
||
162 | } |
||
163 | |||
164 | if ($this->mission->routine >= 100) { |
||
165 | $this->mission->routine_gain = 0; |
||
166 | return false; |
||
167 | } |
||
168 | |||
169 | $update = Yii::app()->db |
||
170 | ->createCommand("UPDATE users_missions SET routine=routine+:routine WHERE uid=:uid AND id=:id") |
||
171 | ->bindValues([':uid'=>$uid, 'id'=>(int)$this->mission->id, ':routine'=>$routine]) |
||
172 | ->execute(); |
||
173 | |||
174 | View Code Duplication | if (!$update) { |
|
175 | Yii::app()->db->createCommand() |
||
176 | ->insert('users_missions', [ |
||
177 | 'uid'=>$uid, |
||
178 | 'id'=>(int)$this->mission->id, |
||
179 | 'water_id'=>(int)$this->mission->water_id, |
||
180 | 'routine'=>$routine |
||
181 | ]); |
||
182 | } |
||
183 | $this->mission->routine += $routine; |
||
184 | $this->gained_routine = $routine; |
||
185 | Yii::app()->badge->model->triggerRoutine($this->mission->routine); |
||
186 | } |
||
187 | |||
188 | private function beatMission() |
||
189 | { |
||
190 | $random = rand(1, 100); |
||
191 | $success = ($random <= $this->mission->chance); //win |
||
192 | |||
193 | //log mission counter |
||
194 | $cell = 'mission_' . ($this->mission->gate ? 'gate_' : '') . ($success ? 'success' : 'fail'); |
||
195 | |||
196 | $logger = new Logger; |
||
197 | $logger->uid = Yii::app()->player->model->uid; |
||
198 | $logger->level = Yii::app()->player->model->level; |
||
199 | $logger->increment($cell, 1); |
||
200 | |||
201 | return $success; |
||
202 | } |
||
203 | |||
204 | private function gainXP() |
||
0 ignored issues
–
show
|
|||
205 | { |
||
206 | $xp = $this->mission->award_xp; |
||
207 | if (!$this->success) { |
||
208 | $xp = round($this->mission->award_xp / 10); |
||
209 | } |
||
210 | $this->gained_xp = $xp; |
||
211 | |||
212 | return $xp; |
||
213 | } |
||
214 | |||
215 | private function gainDollar() |
||
216 | { |
||
217 | $dollar = 0; |
||
218 | if ($this->success) { |
||
219 | $dollar = rand($this->mission->award_dollar_min, $this->mission->award_dollar_max); |
||
220 | } |
||
221 | $this->gained_dollar = $dollar; |
||
222 | |||
223 | return $dollar; |
||
224 | } |
||
225 | |||
226 | private function addSetPart() |
||
227 | { |
||
228 | $player = Yii::app()->player->model; |
||
229 | |||
230 | $logger = new Logger; |
||
231 | $logger->key = 'setitem:'.$player->uid; |
||
232 | $logger->addToSet('----start: '.date('Y.m.d. H:i:s').'----'); |
||
233 | |||
234 | $findChance = Yii::app()->params['setPartFindChanceInitial']; // Chance % to find something |
||
235 | $logger->addToSet('initialize variables'); |
||
236 | |||
237 | $now = time(); |
||
238 | if ($now - strtotime($player->found_setitem_time) < Yii::app()->params['setPartFindTimeLimit']) { |
||
239 | $findChance = Yii::app()->params['setPartFindChanceTimeLimit']; //decrease chance in last 24 hour |
||
240 | } |
||
241 | if ($player->xp_all - $player->found_setitem_xp < Yii::app()->params['setPartFindXpLimit']) { |
||
242 | $findChance = Yii::app()->params['setPartFindChanceXpLimit']; //decrease chance in last xp interval |
||
243 | } |
||
244 | |||
245 | $rnd = rand(1, 100); |
||
246 | $logger->addToSet('chance: '. $rnd .'/'.$findChance); |
||
247 | if ($rnd > $findChance) { |
||
248 | return false; |
||
249 | } |
||
250 | |||
251 | //select rnd setitem |
||
252 | $items = Yii::app()->db->createCommand() |
||
253 | ->select('id') |
||
254 | ->from('parts') |
||
255 | ->where('level < :minLevel', [':minLevel'=>$player->level+1]) |
||
256 | ->queryAll(); |
||
257 | |||
258 | $rnd = array_rand($items); |
||
259 | $logger->addToSet('items key: '.$rnd); |
||
260 | $itemId = isset($items[$rnd]) ? $items[$rnd]['id'] : false; |
||
261 | $logger->addToSet('itemId: '. $itemId); |
||
262 | if (!$itemId) { |
||
263 | return false; |
||
264 | } |
||
265 | |||
266 | $i = new Item; |
||
267 | $i->id = $itemId; |
||
268 | $i->item_type = Item::TYPE_PART; |
||
269 | $i->fetch(); |
||
270 | $logger->addToSet('item: '. $i->title); |
||
271 | |||
272 | //add to inventory |
||
273 | $i->buy(1); |
||
274 | $logger->addToSet('errors: '. CJSON::encode($i->errors)); |
||
275 | $logger->addToSet('price: '. $i->price); |
||
276 | $player->rewriteAttributes([ |
||
277 | 'found_setitem_time'=>date("Y-m-d H:i:s", $now), |
||
278 | 'found_setitem_xp'=>$player->xp_all, |
||
279 | ]); |
||
280 | $this->found_setpart = $i; |
||
281 | $logger->addToSet('item bought'); |
||
282 | |||
283 | //log found part |
||
284 | Yii::app()->gameLogger->log(['type'=>'setpart', 'found_setpart'=>$i->title]); |
||
285 | $logger->addToSet('---- end: '.date('Y.m.d. H:i:s').'----'); |
||
286 | |||
287 | //stat |
||
288 | $logger->uid = $player->uid; |
||
289 | $logger->level = $player->level; |
||
290 | $found = $logger->increment('found_part', 1); |
||
291 | Yii::app()->badge->model->triggerSetPart($found); |
||
292 | } |
||
293 | } |
||
294 |
Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a
@return
annotation as described here.