/** * Behandle auksjonen når den er ferdig */ protected function handle_complete() { // forsøk å sett som behandlet $this->data['a_completed'] = 1; $affected = \Kofradia\DB::get()->exec("UPDATE auksjoner SET a_completed = 1 WHERE a_id = {$this->id} AND a_completed = 0"); // allerede behandlet? if ($affected == 0) { return; } // hent vinnerbudet $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT ab_id, ab_bid, ab_up_id\n\t\t\tFROM auksjoner_bud\n\t\t\tWHERE ab_a_id = {$this->id} AND ab_active != 0\n\t\t\tORDER BY ab_time DESC LIMIT 1"); $bud = $result->fetch(); unset($result); // har ikke noe bud? if (!$bud) { // behandle hver type auksjon forskjellig switch ($this->data['a_type']) { // firma case self::TYPE_FIRMA: // forleng auksjonen med 3 timer fra nå $this->data['a_end'] = time() + 10800; $this->data['a_completed'] = 0; $this->status = self::STATUS_ACTIVE; \Kofradia\DB::get()->exec("UPDATE auksjoner SET a_end = {$this->data['a_end']}, a_completed = 0 WHERE a_id = {$this->id}"); break; // kuler // kuler case self::TYPE_KULER: // gi kulene tilbake til personen som startet auksjonen $kuler = (int) $this->params->get("bullets"); if ($kuler && $this->data['a_up_id']) { player::add_log_static("auksjon_kuler_no_bid", $this->id, $kuler, $this->data['a_up_id']); \Kofradia\DB::get()->exec("UPDATE users_players SET up_weapon_bullets = up_weapon_bullets + {$kuler}, up_weapon_bullets_auksjon = GREATEST(0, up_weapon_bullets_auksjon - {$kuler}) WHERE up_id = {$this->data['a_up_id']}"); } break; } } else { $up = player::get($bud['ab_up_id']); // behandle hver type auksjon forskjellig switch ($this->data['a_type']) { // firma case self::TYPE_FIRMA: // inviter spilleren til firmaet $ff_id = $this->params->get("ff_id"); if ($ff_id) { $ff = ff::get_ff($ff_id, ff::LOAD_SCRIPT); $ff->player_set_priority($bud['ab_up_id'], 1); $ff->reset_date_reg(true); // første firma av denne typen i spillet? hall_of_fame::trigger("ff_owner", $ff); } break; // kuler // kuler case self::TYPE_KULER: // gi kulene til vinneren av auksjonen $kuler = (int) $this->params->get("bullets"); if ($kuler) { // oppdater antall auksjonskuler for spilleren som holdt auksjonen if ($this->data['a_up_id']) { \Kofradia\DB::get()->exec("UPDATE users_players SET up_weapon_bullets_auksjon = GREATEST(0, up_weapon_bullets_auksjon - {$kuler}) WHERE up_id = {$this->data['a_up_id']}"); } // gi kulene til vinneren $up->add_log("auksjon_kuler_won", $this->id . ":" . $bud['ab_bid'], $kuler); $up->data['up_weapon_bullets'] += $kuler; $up->data['up_weapon_bullets'] = max(0, $up->data['up_weapon_bullets'] - $kuler); \Kofradia\DB::get()->exec("UPDATE users_players SET up_weapon_bullets = up_weapon_bullets + {$kuler}, up_weapon_bullets_auksjon = GREATEST(0, up_weapon_bullets_auksjon - {$kuler}) WHERE up_id = {$bud['ab_up_id']}"); } break; } // live-feed livefeed::add_row('<user id="' . $bud['ab_up_id'] . '" /> vant auksjonen <a href="' . ess::$s['relative_path'] . '/auksjoner?a_id=' . $this->id . '">' . htmlspecialchars($this->data['a_title']) . '</a>.'); // gi penger til den som la ut auksjonen if ($this->data['a_up_id']) { \Kofradia\DB::get()->exec("\n\t\t\t\t\tUPDATE users_players\n\t\t\t\t\tSET up_cash = up_cash + {$bud['ab_bid']}, up_auksjoner_total_in = up_auksjoner_total_in = {$bud['ab_bid']}\n\t\t\t\t\tWHERE up_id = {$this->data['a_up_id']}"); } // oppdater statistikk til spilleren som vant budet \Kofradia\DB::get()->exec("\n\t\t\t\tUPDATE users_players\n\t\t\t\tSET up_auksjoner_total_out = up_auksjoner_total_out = {$bud['ab_bid']}\n\t\t\t\tWHERE up_id = {$bud['ab_up_id']}"); // hent alle budene som skal settes inaktive $result = \Kofradia\DB::get()->query("\n\t\t\t\tSELECT ab_id, ab_bid, ab_up_id\n\t\t\t\tFROM auksjoner_bud\n\t\t\t\tWHERE ab_a_id = {$this->id} AND ab_active != 0 AND ab_id != {$bud['ab_id']}"); while ($row = $result->fetch()) { self::set_bud_inactive($row, $this); } // behandle trigger $up->trigger("auksjon_won", array("auksjon" => $this, "bud" => $bud)); } // behandle trigger if ($this->data['a_up_id']) { $up = player::get($this->data['a_up_id']); if ($up) { $up->trigger("auksjon_complete", array("auksjon" => $this, "winner_bud" => $bud)); } } // oppdater cache self::update_cache(); }
/** * Hent broderskapet med flest rangeringspoeng */ public static function get_fam_points_rank() { // hent alle broderskapene $ff_list = self::get_ff_group("ff_type = " . self::TYPE_FAMILIE . " AND ff_inactive = 0 AND ff_is_crew = 0"); // hent alle eiere og medeiere $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT ffm_up_id, ffm_ff_id, ffm_priority\n\t\t\tFROM ff_members JOIN ff ON ffm_ff_id = ff_id AND ff_type != " . self::TYPE_FAMILIE . " AND ff_is_crew = 0 AND ff_inactive = 0\n\t\t\tWHERE ffm_priority <= 2 AND ffm_status = " . ff_member::STATUS_MEMBER); $list = array(); while ($row = $result->fetch()) { $list[$row['ffm_up_id']][] = $row['ffm_priority']; } // tell opp poeng i alle FF $ff_points_most_count = 0; $ff_points_most = null; $ff_points = array(); foreach ($ff_list as $ff) { $points_ff = 0; // disse 3 er bare for å bryte ned statistikken $points_up = 0; $points_kill = 0; foreach ($ff->members['members'] as $ffm) { // firmaer if (isset($list[$ffm->id])) { foreach ($list[$ffm->id] as $pri) { // eier = 3 poeng, medeier = 2 poeng $p = $pri == 1 ? 3 : 2; $points_ff += $p; } } // hent rank $rank = game::rank_info($ffm->data['up_points'], $ffm->data['upr_rank_pos'], $ffm->data['up_access_level']); $points_up += $rank['number']; // ett poeng per rank for medlemmene // sjekk rank posisjon if ($rank['pos'] == 1) { $points_up += 3; } elseif ($rank['pos'] <= 5) { $points_up += 2; } elseif ($rank['pos'] <= 15) { $points_up += 1; } // 1 poeng for Lucky Luciano } // 1 poeng per 5. drap $points_kill += floor(($ff->data['ff_attack_killed_num'] + $ff->data['ff_attack_bleed_num']) / 5); // minus 1 poeng per 2. spiller i broderskapet som er drept $points_kill -= floor(($ff->data['ff_attacked_killed_num'] + $ff->data['ff_attacked_bleed_num']) / 2); $points = $ff->data['ff_points']; $points += $points_ff + $points_up + $points_kill; $ff_points[] = $points; $ff->data['ff_points_sum'] = $points; $ff->data['ff_points_ff'] = $points_ff; $ff->data['ff_points_up'] = $points_up; $ff->data['ff_points_kill'] = $points_kill + $ff->data['ff_points']; // flest poeng? if ($points > $ff_points_most_count) { $ff_points_most_count = $points; $ff_points_most = $ff; } } // sorter FF etter poeng array_multisort($ff_points, SORT_DESC, SORT_NUMERIC, $ff_list); // sett opp med ID-er $ff_list_indexed = array(); foreach ($ff_list as $ff) { $ff_list_indexed[$ff->id] = $ff; } // sjekk for all-time-high if ($ff_points_most) { hall_of_fame::trigger("familie_rank", $ff_points_most); } return $ff_list_indexed; }
/** * Behandle trigger * @string $name * @array $data */ public function trigger($name, array $data) { // behandle oppdrag switch ($name) { case "kriminalitet": $this->oppdrag->handle_trigger("kriminalitet_different", $data); $this->achievements->handle("kriminalitet", $data); break; case "poker_result": $this->oppdrag->handle_trigger("poker_unique_people", $data); $this->achievements->handle("poker", $data); break; case "rank_points": $this->oppdrag->handle_trigger($name, $data); $this->achievements->handle($name, $data); hall_of_fame::trigger("rank", $data, $this); break; case "fengsel_rank": // kom i fengsel? if ($data['fengsel']) { $this->oppdrag->fengsel(); } $this->oppdrag->handle_trigger("wanted_level", $data); break; case "fengsel": $this->achievements->handle($name, $data); $this->oppdrag->handle_trigger("fengsel_breakout", $data); break; case "biltyveri": case "utpressing": case "ff_won_member": case "ff_priority_change": case "ff_join": case "oppdrag": case "lotto": $this->achievements->handle($name, $data); break; case "money_change": $this->achievements->handle($name, $data); hall_of_fame::trigger("cash_num", $data, $this); break; case "attack_bleed": case "attack": $this->achievements->handle($name, $data); hall_of_fame::trigger("rank_kill", $data, $this); ff::handle_up_kill($this, $data); break; } }
/** * Behandle valg av bygning */ protected function page_br_handle() { // allerede valgt bygning? if ($this->ff->data['br_id'] && !$this->ff->mod) { ess::$b->page->add_message(ucfirst($this->ff->type['refobj']) . " er allerede tilknyttet en bygning."); redirect::handle(); } ess::$b->page->add_title("Velg bygning"); $bydel = login::$user->player->bydel; // hent ledige bygninger i denne bydelen $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT br_id, br_pos_x, br_pos_y\n\t\t\tFROM bydeler_resources\n\t\t\t\tLEFT JOIN (SELECT DISTINCT ff_br_id FROM ff WHERE ff_inactive = 0 AND ff_br_id IS NOT NULL) ref ON ff_br_id = br_id\n\t\t\tWHERE br_b_id = {$bydel['id']} AND br_type = 1 AND ff_br_id IS NULL"); $resources_free = array(); while ($row = $result->fetch()) { $resources_free[$row['br_id']] = $row; } // velge bygning? if (isset($_POST['br'])) { $br_id = (int) $_POST['br']; // ikke gyldig bygning? if (!isset($resources_free[$br_id])) { ess::$b->page->add_message("Fant ikke valgt bygning."); } else { // oppdater FF \Kofradia\DB::get()->exec("UPDATE ff SET ff_br_id = {$br_id} WHERE ff_id = {$this->ff->id}"); global $__server; putlog("INFO", ucfirst($this->ff->type['refobj']) . " %u{$this->ff->data['ff_name']}%u har nå valgt" . ($this->ff->data['br_id'] ? ' ny' : '') . " bygning på {$bydel['name']}. {$__server['path']}/ff/?ff_id={$this->ff->id}"); putlog("CREWCHAN", ucfirst($this->ff->type['refobj']) . " %u{$this->ff->data['ff_name']}%u har nå valgt" . ($this->ff->data['br_id'] ? ' ny' : '') . " bygning på {$bydel['name']}. {$__server['path']}/ff/?ff_id={$this->ff->id}"); // live-feed livefeed::add_row(ucfirst($this->ff->refstring) . ' <a href="' . ess::$s['relative_path'] . '/ff/?ff_id=' . $this->ff->id . '">' . htmlspecialchars($this->ff->data['ff_name']) . '</a> har valgt bygning på ' . htmlspecialchars($bydel['name']) . '.'); // første familien i spillet? if ($this->ff->type['type'] == "familie") { hall_of_fame::trigger("familie", $this->ff); hall_of_fame::trigger("ff_owner", $this->ff); } ess::$b->page->add_message("Du har valgt bygning for {$this->ff->type['refobj']} på {$bydel['name']}."); redirect::handle("?ff_id={$this->ff->id}"); } } // hent FF-ene i denne bydelen $result = \Kofradia\DB::get()->query("SELECT ff_id, ff_name, br_pos_x, br_pos_y FROM ff JOIN bydeler_resources ON ff_br_id = br_id WHERE br_b_id = {$bydel['id']} AND ff_inactive = 0"); $resources = array(); while ($row = $result->fetch()) { $resources[$row['ff_id']] = $row; } ess::$b->page->add_css(' #default_main { overflow: visible } .bydel_parent { position: relative } .bydel_resource { position: absolute } .bydel_resource img { cursor: pointer; z-index: 100 } .bydel_resource div { position: absolute; left: 28px; top: 2px; font-size: 11px; background-color: #0B0B0B; color: #AAA; padding: 2px; z-index: 1000; white-space: nowrap; } '); ess::$b->page->add_js_file("../js/bydeler.js"); ess::$b->page->add_js_domready(' var bydel_resources = new Hash(' . js_encode($resources) . '); var bydel_resources_free = new Hash(' . js_encode($resources_free) . '); var bydel_x = ' . $bydel['b_coords_x'] . '; var bydel_y = ' . $bydel['b_coords_y'] . '; var kart = $("bydelskart"); kart.getParent().setStyle("position", "relative"); var pos = kart.getPosition(kart.getParent()); var bydel_container = new Element("div", {"styles": {"position": "absolute", "left": 4, "top": 0}}).inject(kart, "before"); bydel_resources.each(function(value) { new BydelResourceFF(value, bydel_container, bydel_x, bydel_y); }); var select_br = function() { if (confirm("Er du sikker på at du vil velge denne bygningen for ' . $this->ff->type['refobj'] . '? Dette kan ikke endres senere.")) { $("br_id").set("value", this.options.data["br_id"]).form.submit(); } }; bydel_resources_free.each(function(value) { new BydelResourceSelect(value, bydel_container, bydel_x, bydel_y, select_br); });'); echo ' <div class="bg1_c" style="width: ' . ($bydel['b_size_x'] + 30) . 'px; margin: 40px auto"> <h1 class="bg1">Du er på ' . $bydel['name'] . '<span class="left"></span><span class="right"></span></h1> <p class="h_left"><a href="./?ff_id=' . $this->ff->id . '">« Tilbake</a></p> <div class="bg1" style="overflow: visible; padding-top: 1px; margin-top: -1px"> <form action="" method="post"> <input type="hidden" name="br" id="br_id" /> <boxes />' . (count($resources_free) == 0 ? ' <p>Det er ingen ledige plasser i denne bydelen.</p>' : ' <p>Det er ' . count($resources_free) . ' ' . fword("ledig plass", "ledige plasser", count($resources_free)) . ' i denne bydelen.</p>') . ' <p class="c bydel_parent"><img src="' . IMGS_HTTP . '/bydeler/bydel_' . $bydel['id'] . '.png" id="bydelskart" alt="Bydelskart for ' . htmlspecialchars($bydel['name']) . '" /></p> </form> </div> </div>'; $this->ff->load_page(); }