public function getIndex() { // All Quests $quest_records = QuestItem::with('classjob', 'classjob.en_abbr', 'item', 'item.name', 'item.recipe')->orderBy('classjob_id')->orderBy('level')->orderBy('item_id')->get(); $quests = array(); foreach ($quest_records as $quest) { if (!isset($quests[$quest->classjob->en_abbr->term])) { $quests[$quest->classjob->en_abbr->term] = array(); } if (empty($quest->item->recipe)) { var_dump($quest); exit; } foreach ($quest->item->recipe as $r) { if ($r->classjob_id == $quest->classjob_id) { $quest->recipe = $r; } } $quests[$quest->classjob->en_abbr->term][] = $quest; } $job_ids = array_merge(Config::get('site.job_ids.crafting'), Config::get('site.job_ids.gathering')); return View::make('pages.quests')->with('quests', $quests)->with('job_ids', $job_ids)->with('job_list', ClassJob::with('name', 'en_abbr')->whereIn('id', $job_ids)->get()); }
public function getList() { // All Jobs $job_list = ClassJob::get_name_abbr_list(); View::share('job_list', $job_list); $include_quests = TRUE; if (!Input::all()) { return Redirect::back(); } // Get Options $options = explode(':', array_keys(Input::all())[0]); // Parse Options // Defaults $desired_job = isset($options[0]) ? $options[0] : 'CRP'; $start = isset($options[1]) ? $options[1] : 1; $end = isset($options[2]) ? $options[2] : 5; $self_sufficient = isset($options[3]) ? $options[3] : 1; $misc_items = isset($options[4]) ? $options[4] : 0; $special = isset($options[5]) ? $options[5] : 0; $item_ids = $item_amounts = array(); $top_level = TRUE; if ($desired_job == 'List') { $start = $end = null; $include_quests = FALSE; // Get the list $item_amounts = Session::get('list', array()); $item_ids = array_keys($item_amounts); if (empty($item_ids)) { return Redirect::to('/list'); } View::share('item_ids', $item_ids); View::share('item_amounts', $item_amounts); $top_level = $item_amounts; } if ($desired_job == 'Item') { $item_id = $special; $start = $end = null; $include_quests = FALSE; // Get the list $item_amounts = array($item_id => 1); $item_ids = array_keys($item_amounts); if (empty($item_ids)) { return Redirect::to('/list'); } View::share('item_ids', $item_ids); View::share('item_amounts', $item_amounts); View::share('item_special', true); $top_level = $item_amounts; } if (!$item_ids) { // Jobs are capital $desired_job = strtoupper($desired_job); // Make sure it's a real job, jobs might be multiple $job = array(); foreach (explode(',', $desired_job) as $ds) { $job[] = ClassJob::get_by_abbr($ds); } // If the job isn't real, error out if (!isset($job[0])) { // Check for DOL quests $quests = array(); foreach (array('MIN', 'BTN', 'FSH') as $job) { $job = ClassJob::get_by_abbr($job); $quests[$job] = QuestItem::where('classjob_id', $job->id)->orderBy('level')->with('item')->get(); } return View::make('crafting')->with('error', TRUE)->with('quests', $quests); } $job_ids = array(); foreach ($job as $j) { $job_ids[] = $j->id; } $full_name_desired_job = false; if (count($job) == 1) { $job = $job[0]; $full_name_desired_job = $job->name->term; } // Starting maximum of 1 if ($start < 0) { $start = 1; } if ($start > $end) { $end = $start; } if ($end - $start > 9) { $end = $start + 9; } // Check for quests $quest_items = QuestItem::with('classjob', 'classjob.abbr')->whereBetween('level', array($start, $end))->whereIn('classjob_id', $job_ids)->orderBy('level')->with('item')->get(); View::share(array('job' => $job, 'start' => $start, 'end' => $end, 'quest_items' => $quest_items, 'desired_job' => $desired_job, 'full_name_desired_job' => $full_name_desired_job)); } // Gather Recipes and Reagents $query = Recipes::with('name', 'classjob', 'classjob.name', 'classjob.abbr', 'item', 'item.name', 'item.quest', 'item.leve', 'item.vendors', 'item.beasts', 'item.clusters', 'item.clusters.classjob', 'item.clusters.classjob.abbr', 'reagents', 'reagents.vendors', 'reagents.beasts', 'reagents.clusters', 'reagents.clusters.classjob', 'reagents.clusters.classjob.abbr', 'reagents.recipe', 'reagents.recipe.name', 'reagents.recipe.item', 'reagents.recipe.item.name', 'reagents.recipe.item.vendors', 'reagents.recipe.item.beasts', 'reagents.recipe.item.clusters', 'reagents.recipe.item.clusters.classjob', 'reagents.recipe.item.clusters.classjob.abbr', 'reagents.recipe.classjob', 'reagents.recipe.classjob.abbr')->groupBy('recipes.item_id')->orderBy('rank'); if ($misc_items == 0 && $desired_job != 'List') { $query->whereHas('item', function ($query) { $query->whereNotIn('itemcategory_id', array(14, 15))->where(function ($query) { $query->where('itemcategory_id', '!=', 16)->where('itemuicategory_id', '!=', 63); // Other }); }); } if ($item_ids) { $query->whereIn('recipes.item_id', $item_ids); } else { $query->whereHas('classjob', function ($query) use($job_ids) { $query->whereIn('classjob.id', $job_ids); })->whereBetween('level', array($start, $end)); } $recipes = $query->remember(Config::get('site.cache_length'))->get(); // Fix the amount of the top level to be evenly divisible by the amount the recipe yields if (is_array($top_level)) { foreach ($recipes as $recipe) { $tl_item =& $top_level[$recipe->item_id]; // If they're not evently divisible if ($tl_item % $recipe->yields != 0) { // Make it so $tl_item = ceil($tl_item / $recipe->yields) * $recipe->yields; } } unset($tl_item); View::share('item_amounts', $top_level); } $reagent_list = $this->_reagents($recipes, $self_sufficient, 1, $include_quests, $top_level); // Look through the list. Is there something we're already crafting? // Subtract what's being made from needed reagents. // Example, culinary 11 to 15, you need olive oil for Parsnip Salad (lvl 13) // But you make 3 olive oil at level 11. We don't want them crafting another olive oil. foreach ($recipes as $recipe) { if (!isset($reagent_list[$recipe->item_id])) { continue; } $reagent_list[$recipe->item_id]['both_list_warning'] = TRUE; $reagent_list[$recipe->item_id]['make_this_many'] += 1; } // Look through the reagent list, make sure the reagents are evently divisible by what they yield foreach ($reagent_list as &$reagent) { // If they're not evently divisible if ($reagent['make_this_many'] % $reagent['yields'] != 0) { // Make it so $reagent['make_this_many'] = ceil($reagent['make_this_many'] / $reagent['yields']) * $reagent['yields']; } } unset($reagent); // Let's sort them further, group them by.. // Gathered, Then by Level // Other (likely mob drops) // Crafted, Then by level // Bought, by price $sorted_reagent_list = array('Gathered' => array(), 'Bought' => array(), 'Other' => array(), 'Pre-Requisite Crafting' => array(), 'Crafting List' => array()); $gathering_class_abbreviations = ClassJob::get_abbr_list(Config::get('site.job_ids.gathering')); foreach ($reagent_list as $reagent) { $section = 'Other'; $level = 0; // Section if (in_array($reagent['self_sufficient'], $gathering_class_abbreviations)) { $section = 'Gathered'; $level = $reagent['item']->level; } elseif ($reagent['self_sufficient']) { $section = 'Pre-Requisite Crafting'; if (!isset($reagent['item']->recipe[0])) { dd($reagent['item']); } $level = $reagent['item']->recipe[0]->level; } elseif (count($reagent['item']->vendors)) { $section = 'Bought'; $level = $reagent['item']->min_price; } if (!isset($sorted_reagent_list[$section][$level])) { $sorted_reagent_list[$section][$level] = array(); } $sorted_reagent_list[$section][$level][$reagent['item']->id] = $reagent; ksort($sorted_reagent_list[$section][$level]); } foreach ($sorted_reagent_list as $section => $list) { ksort($sorted_reagent_list[$section]); } // Sort the pre-requisite crafting by rank // We don't need to sort them by level, just make sure it's in the proper structure // The keys don't matter either $prc =& $sorted_reagent_list['Pre-Requisite Crafting']; $new_prc = array('1' => array()); foreach ($prc as $vals) { foreach ($vals as $v) { $new_prc['1'][] = $v; } } // Sort them by rank first usort($new_prc['1'], function ($a, $b) { return $a['item']->rank - $b['item']->rank; }); // Then by classjob usort($new_prc['1'], function ($a, $b) { return $a['item']->recipe[0]->classjob_id - $b['item']->recipe[0]->classjob_id; }); $prc = $new_prc; return View::make('crafting.list')->with(array('recipes' => $recipes, 'reagent_list' => $sorted_reagent_list, 'self_sufficient' => $self_sufficient, 'misc_items' => $misc_items, 'include_quests' => $include_quests)); }