/** * Frigjør en spiller fra aktive auksjoner * @param player $up * @param int $up_id * @param int $type skal dette kun gjelde en bestemt type auksjon? */ public static function player_release(player $up = null, $up_id = null, $type = null) { if ($up) { $up_id = $up->id; } $type = $type ? " AND a_type = " . (int) $type : ""; // hent auksjonene spilleren selv holder $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT a_id\n\t\t\tFROM auksjoner\n\t\t\tWHERE a_completed = 0 AND a_up_id = {$up_id}{$type}"); while ($row = $result->fetch()) { $a = auksjon::get($row['a_id']); if ($a) { $a->handle_delete(); } } // hent budene vi har og sett de som inaktive $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT ab_id, ab_up_id, ab_bid, a_id, a_type, a_params\n\t\t\tFROM auksjoner_bud JOIN auksjoner ON a_id = ab_a_id\n\t\t\tWHERE a_completed = 0 AND ab_up_id = {$up_id} AND ab_active != 0{$type}"); while ($row = $result->fetch()) { self::set_bud_inactive($row, null, $up); } }
/** * Frigjør relasjon grunnet lav helse */ public function release_relations_low_health($release_all = null, player $up_attack = null, $instant = null) { $ret = array("ffm" => array()); // behandle FF $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT ff_id\n\t\t\tFROM ff_members\n\t\t\t\tJOIN ff ON ffm_ff_id = ff_id AND ff_inactive = 0" . ($release_all ? "" : " AND ff_is_crew = 0") . "\n\t\t\tWHERE ffm_up_id = {$this->id} AND ffm_status != " . ff_member::STATUS_KICKED . " AND ffm_status != " . ff_member::STATUS_DEACTIVATED); $lost = false; while ($row = $result->fetch()) { $ff = ff::get_ff($row['ff_id'], ff::LOAD_SCRIPT); if ($ff && isset($ff->members['list'][$this->id])) { $ffm = $ff->members['list'][$this->id]; if ($ffm->data['ffm_status'] == ff_member::STATUS_MEMBER) { $ret['ffm'][] = $ffm; } $ffm->remove_player(true, $instant ? $up_attack : null); } $lost = true; } // oppdater tidspunkt for når man mistet FF if ($lost) { \Kofradia\DB::get()->exec("UPDATE users_players SET up_health_ff_time = 0 WHERE up_id = {$this->id}"); } // fjern fra aktive auksjoner for firma if (!$release_all) { auksjon::player_release($this, null, auksjon::TYPE_FIRMA); } return $ret; }
* * Hvis en spiller har under 25 % våpentrening mister spilleren våpenet (om det er bedre våpen enn glock) */ // sett ned våpentreningen $expire = time() - 172800; // kun for de som har vært aktive siste 48 timer \Kofradia\DB::get()->exec("\n\tUPDATE users_players\n\tSET up_weapon_training = GREATEST(0.1, up_weapon_training * 0.988)\n\tWHERE up_weapon_training > 0.1\n\t\tAND up_last_online > {$expire}"); // hent de spillerene som skal nedgradere eller miste våpenet sitt $result = \Kofradia\DB::get()->query("\n\tSELECT up_id, up_name, up_weapon_id, up_weapon_bullets\n\tFROM users_players\n\tWHERE up_weapon_training < 0.25 AND up_weapon_id > 1 AND up_access_level != 0"); while ($row = $result->fetch()) { if (!isset(weapon::$weapons[$row['up_weapon_id']])) { continue; } $w =& weapon::$weapons[$row['up_weapon_id']]; // fjern fra evt. auksjoner auksjon::player_release(null, $row['up_id'], auksjon::TYPE_KULER); // skal vi nedgradere våpenet? // man vil aldri miste våpen, det blir alltid nedgradert til dårligste våpen // beholder resten av koden i tilfelle vi ønsker å gjøre forandringer igjen if ($row['up_weapon_id'] > 1) { $new_id = $row['up_weapon_id'] - 1; $new_w =& weapon::$weapons[$new_id]; $training = weapon::DOWNGRADE_TRAINING; // sett til 50 % på forrige våpen $a = \Kofradia\DB::get()->exec("\n\t\t\tUPDATE users_players\n\t\t\tSET up_weapon_id = {$new_id}, up_weapon_bullets = 0, up_weapon_training = {$training}\n\t\t\tWHERE up_id = {$row['up_id']} AND up_weapon_id = {$row['up_weapon_id']}"); if ($a > 0) { // gi hendelse player::add_log_static("weapon_lost", $row['up_weapon_id'] . ":" . urlencode($w['name']) . ":" . urlencode($row['up_weapon_bullets']) . ":" . urlencode($new_w['name']) . ":" . $training, 1, $row['up_id']); // logg putlog("LOG", "NEDGRADERT VÅPEN: {$row['up_name']} mistet våpenet {$w['name']} med {$row['up_weapon_bullets']} kuler grunnet lav våpentrening. Fikk i stedet våpenet {$new_w['name']}."); }
/** * FF dør ut * @param player $up_attack spilleren som angrep eier som førte til at FF ble lagt ned */ public function dies(player $up_attack = null) { global $_game, $__server; // allerede inaktiv? if (!$this->active) { throw new HSException("FF er allerede lagt ned."); } // legg til logg hos medlemmer og inviterte foreach ($this->members['members'] as $member) { // brukerlogg player::add_log_static("ff_dead", $this->refstring . ":" . urlencode($this->data['ff_name']), $this->id, $member->id); } foreach ($this->members['invited'] as $member) { // brukerlogg player::add_log_static("ff_dead_invited", $this->refstring . ":" . urlencode($this->data['ff_name']), $this->id, $member->id); } // fjern fra menyen hos medlemmer $this->remove_menu_entries(); // logg putlog("CREWCHAN", ucfirst($this->refstring) . " %u{$this->data['ff_name']}%u har blitt oppløst. {$__server['path']}/ff/?ff_id={$this->id}"); putlog("INFO", ucfirst($this->refstring) . " %u{$this->data['ff_name']}%u har blitt oppløst."); // live-feed livefeed::add_row(ucfirst($this->refstring) . " " . htmlspecialchars($this->data['ff_name']) . " ble oppløst."); // broderskap? if ($this->type['type'] == "familie") { // sett FF til inaktiv $time = time(); $this->active = false; $this->data['ff_inactive'] = 1; $this->data['ff_inactive_time'] = $time; \Kofradia\DB::get()->exec("UPDATE ff SET ff_inactive = 1, ff_inactive_time = {$time} WHERE ff_id = {$this->id}"); // legg ut konkurranse om nytt broderskap $others = false; if ($this->competition) { // er vi det eneste broderskapet igjen i konkurransen? $result = \Kofradia\DB::get()->query("SELECT COUNT(ff_id) FROM ff WHERE ff_fff_id = {$this->data['fff_id']} AND ff_inactive = 0 AND ff_id != {$this->id}"); $others = $result->fetchColumn(0) > 0; } if (!$this->data['ff_is_crew'] && !$this->params->get("die_no_new") && !$others) { self::create_competition(); // sett params slik at det ikke blir lagt ut ny konkurranse dersom broderskapet blir aktivert og så deaktivert igjen $this->params->update("die_no_new", 1, true); } // hendelse $this->add_log("dissolve", null); } else { $name_old = $this->data['ff_name']; // nullstill firmaet $this->reset((bool) $up_attack); $this->reset_members(); // hendelse $this->add_log("dissolve", null); if ($up_attack) { // angriper overtar firmaet $this->player_set_priority($up_attack->id, 1, null, true); $this->reset_date_reg(true); // gi hendelse til angriper $up_attack->add_log("ff_takeover", $this->id . ":" . urlencode($name_old) . ":" . urlencode($this->data['ff_name']) . ":" . urlencode($this->type['refobj']) . ":" . urlencode($this->type['priority'][1]), 0); // live-feed livefeed::add_row('<user id="' . $up_attack->id . '" /> tok over driften av ' . $this->type['refobj'] . ' <a href="' . ess::$s['rpath'] . '/ff/?ff_id=' . $this->id . '">' . htmlspecialchars($this->data['ff_name']) . '</a>' . ($name_old != $this->data['ff_name'] ? ' (tidligere ' . htmlspecialchars($name_old) . ')' : '') . '.'); } else { // opprett ny auksjon auksjon::create_auksjon_ff($this); } } }
/** * Trekke tilbake bud * Bud på kuleauksjoner skal ikke trekkes tilbake */ protected function bid_delete() { // hent budet $result = \Kofradia\DB::get()->query("SELECT ab_id, ab_bid, ab_time FROM auksjoner_bud WHERE ab_a_id = {$this->auksjon->id} AND ab_up_id = {$this->up->id} AND ab_active != 0"); $bud = $result->fetch(); // har ikke noe bud? if (!$bud) { ess::$b->page->add_message("Du har ikke noe bud på denne auksjonen.", "error"); redirect::handle(); } // for gammelt? if ($bud['ab_time'] < time() - auksjon::MAX_TIME_REMOVE) { ess::$b->page->add_message("Budet ditt har stått i mer enn " . game::timespan(auksjon::MAX_TIME_REMOVE, game::TIME_FULL) . " og er bindende. Du må vente til noen nyere bud har stått lengre enn " . game::timespan(auksjon::MAX_TIME_REMOVE, game::TIME_FULL) . ".", "error"); redirect::handle(); } // fjern budet vi har på auksjonen if (!auksjon::set_bud_inactive($bud, $this->auksjon, $this->up, true)) { ess::$b->page->add_message("Budet ditt hadde endret seg.", "error"); redirect::handle(); } // behandle forskjellige auksjonstyper switch ($this->auksjon->data['a_type']) { // firma case auksjon::TYPE_FIRMA: // informer om handlingen putlog("INFO", "%bAUKSJONER:%b %u{$this->up->data['up_name']}%u fjernet sitt bud på %b" . game::format_cash($bud['ab_bid']) . "%b fra %b{$this->auksjon->data['a_title']}%b " . ess::$s['spath'] . "/auksjoner?a_id={$this->auksjon->id}"); break; } // var dette det siste budet? $result = \Kofradia\DB::get()->query("SELECT ab_id FROM auksjoner_bud WHERE ab_a_id = {$this->auksjon->id} AND ab_active != 0 AND ab_id > {$bud['ab_id']} LIMIT 1"); $msg = ''; if ($result->rowCount() == 0) { // sørg for at det er minimum 2 min igjen av auksjonen $end_min = time() + 120; if ($this->auksjon->data['a_end'] < $end_min) { \Kofradia\DB::get()->exec("UPDATE auksjoner SET a_end = {$end_min} WHERE a_id = {$this->auksjon->id} AND a_end < {$end_min}"); $msg .= " Auksjonen ble forlenget til " . ess::$b->date->get($end_min)->format(date::FORMAT_SEC) . "."; putlog("LOG", "%bAUKSJONER:%b %b{$this->auksjon->data['a_title']}%b ble utsatt til " . ess::$b->date->get($end_min)->format(date::FORMAT_SEC) . " " . ess::$s['spath'] . "/auksjoner?a_id={$this->auksjon->id}"); } } ess::$b->page->add_message("Du trakk tilbake budet ditt på " . game::format_cash($bud['ab_bid']) . " innen det gikk " . game::timespan(auksjon::MAX_TIME_REMOVE, game::TIME_FULL) . ".{$msg}"); redirect::handle(); }