/** * Godta/avslå søknad * @param boolean $outcome - om søknaden blir innvilget eller ikke * @param integer $ds_id * @param string $reason */ public static function decide($outcome, $ds_id, $reason) { global $_base, $__server; $ds_id = (int) $ds_id; // hent søknaden $soknad = self::get($ds_id); // fant ikke søknaden? if (!$soknad) { return false; } // er søknaden allerede behandlet? if ($soknad['ds_reply_decision'] != 0) { return false; } // typen $type = self::get_type($soknad['ds_type']); // har vi tilgang til søknaden? if (!access::has($type['access'])) { return false; } // sjekk for tom begrunnelse $have_reason = trim(game::format_data($reason)) != ""; // sett opp params $params = unserialize($soknad['ds_params']); // sett opp søknadsinfo $info = self::get_info($type['name'], $soknad, $params); // info er ikke gyldig - søknaden er ikke gyldig if (!is_array($info)) { // slett søknaden self::delete($ds_id); return $info; } // avslå søknad if (!$outcome) { $msg = 'bb:' . $type['title'] . ': Din søknad ble avslått. (' . $info['bb'] . ') Begrunnelse: ' . ($have_reason ? $reason : 'Ingen begrunnelse gitt.'); // spesielle handlinger switch ($type['name']) { case "ff_name": // sett tilbakepengene på bankkontoen if (isset($params['cost']) && $params['cost'] > 0) { $msg .= ' Beløpet på ' . game::format_cash($params['cost']) . ' som ble innbetalt ved søknad er satt inn på kontoen igjen.'; ff::bank_static(ff::BANK_TILBAKEBETALING, $params['cost'], $soknad['ds_rel_id'], 'Navnsøknad avslått: ' . $params['name']); } break; } } else { $msg = 'bb:' . $type['title'] . ': Din søknad har blitt innvilget. (' . $info['bb'] . ') Begrunnelse: ' . ($have_reason ? $reason : 'Ingen begrunnelse gitt.'); // spesielle handlinger switch ($type['name']) { case "ff_name": $ff = ff::get_ff($soknad['ds_rel_id'], ff::LOAD_SCRIPT); if ($ff) { $ff->change_name($params['name'], $soknad['ds_up_id']); // lagre gammelt navn på FF i søknaden $params['name_old'] = $info['ff_name']; } break; } } // legg til logg hos spilleren player::add_log_static("soknader", $msg, 0, $soknad['ds_up_id']); // oppdater søknaden \Kofradia\DB::get()->exec("UPDATE div_soknader SET ds_params = " . \Kofradia\DB::quote(serialize($params)) . ", ds_reply_decision = " . ($outcome ? 1 : -1) . ", ds_reply_reason = " . \Kofradia\DB::quote($reason) . ", ds_reply_up_id = " . self::up_id() . ", ds_reply_time = " . time() . " WHERE ds_id = {$ds_id}"); // oppdater cache tasks::set("soknader", \Kofradia\DB::get()->query("SELECT COUNT(ds_id) FROM div_soknader WHERE ds_reply_decision = 0")->fetchColumn(0)); return $info; }
/** * Spiller blir drept * @param bool $instant døde spilleren momentant? * @param player $by_up hvem som forårsaket dødsfallet */ public function dies($instant, player $by_up = NULL) { // er ikke aktivert? if (!$this->active) { return false; } $ret = array(); if ($instant) { $ret['penger_bank'] = 0; } $prev_level = $this->data['up_access_level']; $this->active = false; $this->data['up_access_level'] = 0; $this->data['up_deactivated_time'] = time(); $this->data['up_deactivated_up_id'] = $by_up ? $by_up->id : NULL; $this->data['up_deactivated_dead'] = $instant ? 1 : 2; $this->data['up_deactivated_reason'] = NULL; $this->data['up_deactivated_note'] = NULL; $this->data['up_deactivated_points'] = $this->data['up_points']; $this->data['up_deactivated_rank_pos'] = $this->data['upr_rank_pos']; // deaktiver spilleren $by_up_id = $by_up ? $by_up->id : 'NULL'; $a = \Kofradia\DB::get()->exec("\n\t\t\tUPDATE users_players LEFT JOIN users_players_rank ON upr_up_id = up_id\n\t\t\tSET\n\t\t\t\tup_access_level = 0, up_deactivated_time = {$this->data['up_deactivated_time']}, up_deactivated_up_id = {$by_up_id}, up_deactivated_dead = {$this->data['up_deactivated_dead']},\n\t\t\t\tup_deactivated_reason = NULL, up_deactivated_note = NULL,\n\t\t\t\tup_deactivated_points = up_points, up_deactivated_rank_pos = upr_rank_pos\n\t\t\tWHERE up_id = {$this->id} AND up_access_level != 0"); if ($a == 0) { return false; } // har vi noen som skal få penger vi har i banken? if ($this->data['up_bank'] > 0) { // hent liste over FF-id vi er med i $ff_list = $this->get_ff_id_list(); $num_ff = count($ff_list); if ($num_ff > 0) { $ff_ids = implode(",", $ff_list); // familier som skal få penger $result = \Kofradia\DB::get()->query("\n\t\t\t\t\tSELECT ff_id\n\t\t\t\t\tFROM ff\n\t\t\t\t\tWHERE ff_id IN ({$ff_ids}) AND ff_type = 1 AND ff_is_crew = 0"); $num_ff = $result->rowCount(); } // har vi noen familier eller ble drept instant if ($num_ff > 0 || $instant) { // hent ut beløpet i banken og sett bankkontoen til 10 % \Kofradia\DB::get()->exec("\n\t\t\t\t\tUPDATE users_players, (SELECT up_id ref_up_id, @bank := up_bank FROM users_players WHERE up_id = {$this->id}) ref\n\t\t\t\t\tSET up_bank = up_bank * 0.1\n\t\t\t\t\tWHERE ref_up_id = up_id"); $bank = \Kofradia\DB::get()->query("SELECT @bank")->fetchColumn(0); if ($num_ff > 0 && $instant) { $f_ff = 0.3; $f_up = 0.6; } elseif ($num_ff > 0) { $f_ff = 0.9; $f_up = 0; } else { $f_ff = 0; $f_up = 0.9; } // noe til familie? if ($f_ff > 0) { // hvor mye hver familie skal få $ff_bank_each = bcdiv(bcmul($bank, $f_ff), $num_ff); // del ut pengene til familiene while ($row = $result->fetch()) { ff::bank_static(ff::BANK_DONASJON, $ff_bank_each, $row['ff_id'], "Testamentert", $this->id); } } // noe til angriper? if ($f_up > 0) { $ret['penger_bank'] = bcmul($bank, $f_up); $by_up->data['up_cash'] = bcadd($by_up->data['up_cash'], $ret['penger_bank']); \Kofradia\DB::get()->exec("UPDATE users_players SET up_cash = up_cash + {$ret['penger_bank']} WHERE up_id = {$by_up->id}"); } } } $info = $instant ? 'ble drept av ' . $by_up->data['up_name'] : ($by_up ? 'døde av skadene påført av ' . $by_up->data['up_name'] : 'døde pga. lav helse og energi'); putlog("INFO", "%bDrept%b: Spilleren {$this->data['up_name']} " . ($instant ? 'ble drept ' : 'døde av skader ') . $this->generate_profile_url()); putlog("DF", "%bDrept%b: Spilleren {$this->data['up_name']} {$info} " . $this->generate_minside_url()); // hent familier $familier = array(); $list = $this->get_ff_list(); foreach ($list as $row) { if ($row['ff_type'] != 1 || $row['ff_is_crew'] != 0) { continue; } $familier[] = '<a href="' . ess::$s['relative_path'] . '/ff/?ff_id=' . $row['ff_id'] . '">' . htmlspecialchars($row['ff_name']) . '</a>'; } // live-feed livefeed::add_row('<user id="' . $this->id . '" />' . (count($familier) > 0 ? ' (medlem av ' . implode(", ", $familier) . ')' : '') . ' ' . ($instant ? 'ble drept' : ($by_up ? 'døde av et tidligere angrep' : 'døde pga. lav helse og energi')) . '.'); $ret = array_merge($ret, $this->release_relations($prev_level, $by_up, $instant)); // behandle hitlist $ret = array_merge($ret, etterlyst::player_dies($this, $by_up, $instant)); // informer spilleren på e-post $email = new email(); $email->text = 'Hei, Din spiller ' . $this->data['up_name'] . ' ' . ($instant ? 'har blitt drept av en annen spiller' : 'døde på grunn av lav energi og lav helse') . '. Du kan se informasjon om din spiller og opprette en ny spiller ved å logge inn på din bruker. -- www.kofradia.no'; $email->send($this->user->data['u_email'], "Din spiller {$this->data['up_name']} " . ($instant ? 'har blitt drept' : 'er død')); // legg til hendelse hos spilleren $this->add_log("dead", $instant ? 1 : 0); return $ret; }
/** * Betale leie for garasje */ protected function garasje_betale_show() { ess::$b->page->add_title("Betale leie"); // hent informasjon om garasjen $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT ugg_time, ugg_time_next_rent, ugg_ff_id, ugg_cost_total, ugg_places\n\t\t\tFROM users_garage\n\t\t\tWHERE ugg_up_id = {$this->gta->up->id} AND ugg_b_id = {$this->gta->up->data['up_b_id']}"); $garasje = $result->fetch(); // har vi ingen garasje eller kan ikke betale leie nå? if (!$garasje || !gta::can_pay($garasje['ugg_time_next_rent'])) { redirect::handle("/gta/garasje", redirect::ROOT); } // hent alle firmaene og plukk ut det korrekte $ff_list = $this->gta->get_ff(); if (!isset($ff_list[$garasje['ugg_ff_id']])) { throw new HSException("Mangler firma for garasje."); } $ff = $ff_list[$garasje['ugg_ff_id']]; // beregn pris for neste periode $price = $garasje['ugg_places'] * $ff['price']; // utføre betaling? if (isset($_POST['pay'])) { $places = (int) postval("places"); $price_old = (int) postval("price"); // bydel forandret seg if (postval("b_id") != $this->gta->up->data['up_b_id']) { ess::$b->page->add_message("Du har reist til en annen bydel siden du sist viste siden.", "error"); redirect::handle("/gta/garasje", redirect::ROOT); } if ($places != $garasje['ugg_places']) { ess::$b->page->add_message("Kapasiteten i garasjen har endret seg.", "error"); } elseif ($price_old != $price) { ess::$b->page->add_message("Leieprisen hos utleiefirmaet har endret seg.", "error"); } else { // trekk fra penger $a = \Kofradia\DB::get()->exec("UPDATE users_players SET up_cash = up_cash - {$price} WHERE up_id = {$this->gta->up->id} AND up_cash >= {$price}"); if ($a == 0) { ess::$b->page->add_message("Du har ikke råd til å betale for denne leien.", "error"); } else { // sett opp tidspunkt for neste innbetaling $next = ess::$b->date->get($garasje['ugg_time_next_rent']); $next->setTime(6, 0, 0); $next->modify("+7 days"); $next = $next->format("U"); // oppdater garasje $a = \Kofradia\DB::get()->exec("UPDATE users_garage SET ugg_time_next_rent = {$next}, ugg_cost_total = ugg_cost_total + {$price} WHERE ugg_up_id = {$this->gta->up->id} AND ugg_b_id = {$this->gta->up->data['up_b_id']} AND ugg_time_next_rent = {$garasje['ugg_time_next_rent']} AND ugg_places = {$garasje['ugg_places']}"); // kunne ikke oppdatere garasje if ($a == 0) { // gi tilbake pengene \Kofradia\DB::get()->exec("UPDATE users_players SET up_cash = up_cash + {$price} WHERE up_id = {$this->gta->up->id}"); } else { // gi pengene til firmaet ff::bank_static(ff::BANK_TJENT, round($price * ff::GTA_PERCENT), $ff['ff_id']); ess::$b->page->add_message('Du har utvidet leieavtalen på <b>' . game::$bydeler[$this->gta->up->data['up_b_id']]['name'] . '</b> hos firmaet <a href="&rpath;/ff/?ff_id=' . $ff['ff_id'] . '">' . htmlspecialchars($ff['ff_name']) . '</a> med 7 dager for ' . game::format_cash($price) . '.'); } redirect::handle("/gta/garasje", redirect::ROOT); } } } echo ' <div class="bg1_c xsmall"> <h1 class="bg1">Betale leie for garasje på ' . htmlspecialchars($this->gta->up->bydel['name']) . '<span class="left2"></span><span class="right2"></span></h1> <div class="bg1"> <p class="c"><a href="&rpath;/gta/garasje">Tilbake</a></p> <dl class="dd_right"> <dt>Utleiefirma</dt> <dd><a href="&rpath;/ff/?ff_id=' . $ff['ff_id'] . '">' . htmlspecialchars($ff['ff_name']) . '</a></dd> <dt>Kapasitet</dt> <dd>' . game::format_num($garasje['ugg_places']) . '</dd> <dt>Leiepris per plass</dt> <dd>' . game::format_cash($ff['price']) . '</dd> <dt>Neste betalingsfrist</dt> <dd>' . ess::$b->date->get($garasje['ugg_time_next_rent'])->format() . '</dd> </dl> <form action="" method="post"> <input type="hidden" name="price" value="' . $price . '" /> <input type="hidden" name="places" value="' . $garasje['ugg_places'] . '" /> <input type="hidden" name="b_id" value="' . $this->gta->up->data['up_b_id'] . '" /> <dl class="dd_right"> <dt>Total leiepris neste periode</dt> <dd>' . game::format_cash($price) . '</dd> </dl> <p class="c">' . show_sbutton("Utfør betaling for neste leie", 'name="pay"') . '</p> </form> <p class="c">Husk at det kan hende det lønner seg å bytte til et <a href="&rpath;/gta/garasje/detaljer">annet firma</a>. Du kan også <a href="&rpath;/gta/garasje/endre">justere kapasiteten</a> før du betaler for å få billigere leie.</p> </div> </div>'; }