Пример #1
0
 /**
  * Behandle siden
  */
 protected function handle()
 {
     // oppdatere ranklista?
     if (isset($_GET['update']) && access::has("crewet")) {
         ranklist::flush();
         ess::$b->page->add_message("Ranklisten skal nå være oppdatert.");
     }
     // vise komplett liste?
     if (isset($_GET['alle'])) {
         $this->all();
     } else {
         $this->top();
     }
 }
Пример #2
0
 /**
  * Endre rankpoengene for en bestemt spiller
  * @param integer $points_change
  * @param player $up (evt. integer)
  * @param boolean $use_login skal vi oppdatere sesjonsinfo hvis dette er den innloggede spilleren?
  * @param boolean $silent ikke annonser svaret på f.eks. IRC
  * @param integer $points_change_rel
  * @param string $oppdrag_name navn for oppdragtrigger å identifisere funksjonen som gav poeng
  * @return integer rank pos change/boolean false 404
  */
 public static function increase_rank_static($points_change, $up, $use_login = false, $silent = null, $points_change_rel = null, $oppdrag_name = null)
 {
     // ikke behandle hvis antall poeng ikke endres
     if (!$points_change) {
         return;
     }
     // hent ut spillerid
     if (!is_numeric($up) && (!is_object($up) || !$up instanceof player)) {
         throw new HSException("Ukjent spiller.");
     }
     if (is_numeric($up)) {
         $up_id = $up;
         $up = player::get($up_id);
     } else {
         $up_id = $up->id;
     }
     // tilhører spilleren brukeren som er logget inn?
     $is_login = $use_login && login::$logged_in && $up_id == login::$user->player->id;
     // hent helt fersk spillerinfo
     $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT up_name, up_access_level, up_points, upr_rank_pos\n\t\t\tFROM users_players\n\t\t\t\tLEFT JOIN users_players_rank ON upr_up_id = up_id\n\t\t\tWHERE up_id = {$up_id}");
     $row = $result->fetch();
     // sett opp info
     $points_change_rel = $points_change_rel === null ? $points_change : (int) $points_change_rel;
     $access_level = $row['up_access_level'];
     $points = $row['up_points'];
     $points_after = $points + $points_change;
     $points_after_rel = $points + $points_change_rel;
     $rank_pos = $row['upr_rank_pos'];
     $name = $row['up_name'];
     $pos_change = 0;
     $extra = "";
     // må ranklista oppdateres?
     if ($rank_pos === null) {
         ranklist::flush();
         // hent oppdatert plassering
         $result = \Kofradia\DB::get()->query("SELECT upr_rank_pos FROM users_players_rank WHERE upr_up_id = {$up_id}");
         $row = $result->fetch();
         // har fortsatt ikke plassering?
         if (!$row) {
             throw new HSException("Klarer ikke å finne korrekt rankplassering.");
         }
     }
     // ranken vi har nå
     $rank = game::rank_info($points);
     $rank_num_now = $rank['number'];
     // ranken vi kommer til å være på etter endring
     $rank_after = game::rank_info($points_after);
     $rank_num_after = $rank_after['number'];
     $invisible = $access_level >= ess::$g['access_noplay'] || $access_level == 0;
     // positiv forandring
     if ($points_change > 0) {
         // hent ny rankplassering
         $result = \Kofradia\DB::get()->query("\n\t\t\t\tSELECT MIN(upr_rank_pos)\n\t\t\t\tFROM users_players_rank\n\t\t\t\tWHERE upr_up_points > {$points} AND upr_up_points <= {$points_after} AND upr_up_access_level != 0 AND upr_up_access_level < " . ess::$g['access_noplay']);
         // endre rankplassering?
         $pos = $result->fetchColumn(0);
         if ($pos !== NULL) {
             #$extra = ", up_rank_pos = $pos";
             $pos_change = $rank_pos - $pos;
             if ($up) {
                 $up->data['upr_rank_pos'] -= $pos_change;
             }
         }
         // oppdater brukeren
         \Kofradia\DB::get()->exec("UPDATE users_players SET up_points = up_points + {$points_change}, up_points_rel = up_points_rel + {$points_change_rel}{$extra} WHERE up_id = {$up_id}");
         // oppdater ranklisten
         \Kofradia\DB::get()->exec("UPDATE users_players_rank SET upr_up_points = upr_up_points + {$points_change} WHERE upr_up_id = {$up_id}");
         // oppdater rankplasseringen til de vi går forbi
         #if (!$invisible) \Kofradia\DB::get()->exec("UPDATE users_players SET up_rank_pos = up_rank_pos + 1 WHERE up_points >= $points AND up_points < $points_after");
         ranklist::update();
     } elseif ($points_change < 0) {
         // hent ny rankplassering
         $result = \Kofradia\DB::get()->query("\n\t\t\t\tSELECT MAX(upr_rank_pos)\n\t\t\t\tFROM users_players_rank\n\t\t\t\tWHERE upr_up_points < {$points} AND upr_up_points > {$points_after} AND upr_up_access_level != 0 AND upr_up_access_level < " . ess::$g['access_noplay']);
         // endre rankplassering?
         $pos = $result->fetchColumn(0);
         if ($pos !== NULL) {
             $pos++;
             #$extra = ", up_rank_pos = $pos";
             $pos_change = $rank_pos - $pos;
             if ($up) {
                 $up->data['upr_rank_pos'] -= $pos_change;
             }
         }
         // oppdater brukeren
         \Kofradia\DB::get()->exec("UPDATE users_players SET up_points = up_points + {$points_change}, up_points_rel = up_points_rel + {$points_change_rel}{$extra} WHERE up_id = {$up_id}");
         // oppdater ranklisten
         \Kofradia\DB::get()->exec("UPDATE users_players_rank SET upr_up_points = upr_up_points + {$points_change} WHERE upr_up_id = {$up_id}");
         // oppdater rankplasseringen til de vi går forbi
         #if (!$invisible) \Kofradia\DB::get()->exec("UPDATE users_players SET up_rank_pos = GREATEST(1, up_rank_pos - 1) WHERE up_points < $points AND up_points >= $points_after");
         ranklist::update();
     }
     // oppdater info knyttet til users_hits og sessions
     if ($is_login) {
         \Kofradia\DB::get()->exec("UPDATE users_hits SET uhi_points = uhi_points + {$points_change} WHERE uhi_up_id = {$up_id} AND uhi_secs_hour = " . login::$info['secs_hour']);
         \Kofradia\DB::get()->exec("UPDATE sessions SET ses_points = ses_points + {$points_change} WHERE ses_id = " . login::$info['ses_id']);
     }
     // logg
     putlog("SPAMLOG", "%c6%bRANKPOENG:%b%c %u{$name}%u skaffet %b%u{$points_change}%u%b rankpoeng ({$_SERVER['REQUEST_URI']}) ({$_SERVER['REQUEST_METHOD']})");
     // økning?
     if ($rank_num_after > $rank_num_now) {
         for ($i = $rank_num_now + 1; $i <= $rank_num_after && $i <= count(game::$ranks['items']); $i++) {
             $rank_name = game::$ranks['items_number'][$i]['name'];
             // forfremmet
             self::add_log_static("forfremmelse", $rank_name, 0, $up_id);
             // mirc msg
             if (!$silent) {
                 // live-feed
                 if ($i >= 6) {
                     livefeed::add_row('<user id="' . $up_id . '" /> ble forfremmet til ' . htmlspecialchars($rank_name) . '.');
                 }
                 $type = $i >= 6 ? "INFO" : "SPAM";
                 putlog($type, "%bFORFREMMELSE:%b %u{$name}%u ble forfremmet til %b{$rank_name}%b!");
             }
         }
     } elseif ($rank_num_after < $rank_num_now) {
         for ($i = $rank_num_now - 1; $i >= $rank_num_after && $i > 0; $i--) {
             $rank_name = game::$ranks['items_number'][$i]['name'];
             // nedgradert
             self::add_log_static("nedgradering", $rank_name, 0, $up_id);
             // mirc msg
             if (!$silent) {
                 // live-feed
                 if ($i >= 6) {
                     livefeed::add_row('<user id="' . $up_id . '" /> ble nedgradert til ' . htmlspecialchars($rank_name) . '.');
                 }
                 putlog("INFO", "%bNEDGRADERING:%b %u{$name}%u ble nedgradert til %b{$rank_name}%b!");
             }
         }
     }
     // sett ny helse og energi
     if ($rank_num_after != $rank_num_now) {
         \Kofradia\DB::get()->exec("\n\t\t\t\tUPDATE users_players\n\t\t\t\tSET\n\t\t\t\t\tup_health = ROUND(up_health * ({$rank_after['rank_max_health']} / up_health_max)), up_health_max = {$rank_after['rank_max_health']},\n\t\t\t\t\tup_energy = ROUND(up_energy * ({$rank_after['rank_max_energy']} / up_energy_max)), up_energy_max = {$rank_after['rank_max_energy']}\n\t\t\t\tWHERE up_id = {$up_id}");
     }
     // sjekke oppdrag?
     // kontroller spiller
     if ($up) {
         // nullstill rankobjekt
         unset($up->rank);
         // sett ny helse og energi
         if ($rank_num_after != $rank_num_now) {
             $up->data['up_health'] = round($up->data['up_health'] * ($rank_after['rank_max_health'] / $up->data['up_health_max']));
             $up->data['up_health_max'] = $rank_after['rank_max_health'];
             $up->data['up_energy'] = round($up->data['up_energy'] * ($rank_after['rank_max_energy'] / $up->data['up_energy_max']));
             $up->data['up_energy_max'] = $rank_after['rank_max_energy'];
         }
         // oppdater rankpoeng
         $up->data['up_points'] += $points_change;
         $up->data['up_points_rel'] += $points_change_rel;
         // fyr av trigger
         $up->trigger("rank_points", array("source" => $oppdrag_name, "points" => $points_change, "points_rel" => $points_change_rel, "points_after" => $points_after, "points_after_rel" => $points_after_rel, "rank" => $rank_num_after - $rank_num_now, "pos" => $pos_change));
     }
     // har vi endret plass når vi er i top 100 lista?
     if (($rank_pos <= 10 || $pos <= 10) && $pos_change != 0 && !$silent) {
         if ($pos_change < 0) {
             putlog("INFO", "%bRANKNUMMER:%b %u{$name}%u falt tilbake %b" . abs($pos_change) . "%b plass" . ($pos_change != -1 ? 'er' : '') . " til %b{$pos}.%b plass..");
             // live-feed
             livefeed::add_row('<user id="' . $up_id . '" /> falt tilbake <b>' . abs($pos_change) . '</b> plass' . ($pos_change != -1 ? 'er' : '') . ' til <b>' . $pos . '</b> plass.');
         } else {
             putlog("INFO", "%bRANKNUMMER:%b %u{$name}%u avanserte %b" . $pos_change . "%b plass" . ($pos_change != 1 ? 'er' : '') . " til %b{$pos}.%b plass!");
             // live-feed
             livefeed::add_row('<user id="' . $up_id . '" /> avanserte <b>' . abs($pos_change) . '</b> plass' . ($pos_change != 1 ? 'er' : '') . ' til <b>' . $pos . '</b>. plass.');
         }
     }
     return $pos_change;
 }