예제 #1
0
파일: angrip.php 프로젝트: Kuzat/kofradia
 /**
  * Behandle angrep
  */
 protected function handle_attack()
 {
     // har vi ingen kuler?
     if (login::$user->player->data['up_weapon_bullets'] == 0) {
         return;
     }
     $bullets = max(0, (int) postval("kuler"));
     // har vi ikke så mange kuler?
     if ($bullets > login::$user->player->data['up_weapon_bullets']) {
         ess::$b->page->add_message("Du har ikke så mange kuler.", "error");
         return;
     }
     // har ikke skrevet inn noe?
     if ($bullets == 0) {
         ess::$b->page->add_message("Du må fylle inn antall kuler du ønsker å benytte.", "error");
         return;
     }
     // er offeret i fengsel?
     if ($this->up_offer->fengsel_check()) {
         ess::$b->page->add_message('<user id="' . $this->up_offer->id . '" /> er i fengsel og kan ikke angripes nå.', "error");
         return;
     }
     // kontroller skjema
     if (!$this->form->validateHashOrAlert(null, "Angrip spiller: {$this->up_offer->data['up_name']}")) {
         return;
     }
     // oppdater tidspunkt for siste angrep
     \Kofradia\DB::get()->exec("UPDATE users_players SET up_df_time = " . time() . " WHERE up_id = " . login::$user->player->id);
     // er i annen bydel, bomberom eller vi klarte ikke å finne spilleren?
     $not_found_b = $this->up_offer->data['up_b_id'] != login::$user->player->data['up_b_id'];
     $not_found_brom = $this->up_offer->bomberom_check();
     $prob = rand(1, 100);
     $find_prob = $this->up_offer->calc_find_player_prob() * 100;
     $not_found_prob = $prob > $find_prob;
     if ($not_found_b || $not_found_brom || $not_found_prob) {
         // logg
         if ($not_found_b) {
             $reason = 'Ikke i samme bydel (' . login::$user->player->bydel['name'] . ' mot ' . $this->up_offer->bydel['name'] . ').';
             if ($not_found_brom) {
                 $reason .= ' Offeret er også i bomberom.';
             }
         } elseif ($not_found_brom) {
             $reason = 'Offeret er i bomberom.';
         } else {
             $reason = 'Traff ikke på sannsynligheten (' . $prob . ' > ' . ceil($find_prob) . ').';
         }
         putlog("DF", "ANGREP FEILET: " . login::$user->player->data['up_name'] . " skulle angripe%c3 " . $this->up_offer->data['up_name'] . "%c med {$bullets} " . fword("kule", "kuler", $bullets) . ". {$reason}");
         // øk telleren over antall ganger vi ikke har funnet spiller
         \Kofradia\DB::get()->exec("UPDATE users_players SET up_attack_failed_num = up_attack_failed_num + 1 WHERE up_id = " . login::$user->player->id);
         // øk telleren over antall ganger vi ikke har funnet spiller (for familien spilleren er medlem i)
         login::$user->player->attack_ff_update("failed");
         // øk teller for ff for offeret
         $this->up_offer->attacked_ff_update("failed");
         // sett i fengsel i 2-4 minutter
         $fengsel = login::$user->player->fengsel_rank(100, true, true, rand(120, 240));
         // mist energi
         login::$user->player->energy_use(self::ENERGY_NOT_FOUND);
         // øk anti-bot
         $this->antibot->increase_counter();
         // trigger
         login::$user->player->trigger("attack_notfound", array("not_found_b" => $not_found_b, "not_found_brom" => $not_found_brom, "not_found_prob" => $not_found_prob, "bullets" => $bullets, "up" => $this->up_offer));
         // vis resultat og last inn siden
         $this->attack_result_notfound_show($fengsel, $bullets);
         redirect::handle();
     }
     // angrip spilleren
     $result = login::$user->player->weapon->attack($this->up_offer, $bullets);
     // sett ned antall kuler spilleren har
     \Kofradia\DB::get()->exec("UPDATE users_players SET up_weapon_bullets = GREATEST(0, up_weapon_bullets - {$bullets}) WHERE up_id = " . login::$user->player->id);
     login::$user->player->data['up_weapon_bullets'] = max(0, login::$user->player->data['up_weapon_bullets'] - $bullets);
     // trigger
     login::$user->player->trigger("attack", array("attack" => $result, "up" => $this->up_offer));
     // vis resultat og last inn siden
     $this->attack_result_show($result, $bullets);
 }