From e970aa7a26fecfa38041bb1cfa59a1d5f40a0194 Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Fri, 23 Aug 2024 15:06:37 -0700 Subject: initial groundwork for interactivity via mdx --- src/components/AnotherComponent.tsx | 28 +++++++++++++++++ src/components/FFXIVWorldSelector.tsx | 59 +++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/components/AnotherComponent.tsx create mode 100644 src/components/FFXIVWorldSelector.tsx (limited to 'src/components') diff --git a/src/components/AnotherComponent.tsx b/src/components/AnotherComponent.tsx new file mode 100644 index 0000000..f74e924 --- /dev/null +++ b/src/components/AnotherComponent.tsx @@ -0,0 +1,28 @@ +import React, { useState, useEffect } from 'react'; + +const AnotherComponent: React.FC = () => { + const [selectedWorld, setSelectedWorld] = useState(null); + + useEffect(() => { + // Load selected world from localStorage + const savedWorld = localStorage.getItem('selectedWorld'); + if (savedWorld) { + setSelectedWorld(savedWorld); + } + }, []); + + return ( +
+

Selected World: {selectedWorld}

+ +
+ ); +}; + +export default AnotherComponent; \ No newline at end of file diff --git a/src/components/FFXIVWorldSelector.tsx b/src/components/FFXIVWorldSelector.tsx new file mode 100644 index 0000000..f2dc4cc --- /dev/null +++ b/src/components/FFXIVWorldSelector.tsx @@ -0,0 +1,59 @@ +import React, { useState, useEffect } from 'react'; + +interface World { + id: number; + name: string; +} + +const FFXIVWorldSelector: React.FC = () => { + const [worlds, setWorlds] = useState([]); + const [selectedWorld, setSelectedWorld] = useState(null); + + useEffect(() => { + const fetchWorlds = async () => { + try { + const response = await fetch('https://universalis.app/api/v2/worlds'); + const data = await response.json(); + setWorlds(data); + } catch (error) { + console.error('Error fetching worlds:', error); + } + }; + + fetchWorlds(); + + // Load selected world from localStorage + const savedWorld = localStorage.getItem('selectedWorld'); + if (savedWorld) { + setSelectedWorld(savedWorld); + } + }, []); + + const handleWorldChange = (event: React.ChangeEvent) => { + const selectedWorld = event.target.value; + setSelectedWorld(selectedWorld); + localStorage.setItem('selectedWorld', selectedWorld); // Save to localStorage + }; + + const handleApplyClick = () => { + window.location.reload(); // Refresh the page + }; + + return ( +
+ + + {selectedWorld &&

Selected World: {selectedWorld}

} + +
+ ); +}; + +export default FFXIVWorldSelector; \ No newline at end of file -- cgit v1.2.3 From ba51582e825477bec23c2aa37ba43bd6482a2a29 Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Fri, 23 Aug 2024 15:53:38 -0700 Subject: implement itemprice component --- src/components/AnotherComponent.tsx | 28 ------------ src/components/FFXIVItemPrice.tsx | 83 +++++++++++++++++++++++++++++++++++ src/components/FFXIVWorldSelector.tsx | 17 ++++--- src/content/blog/ffxiv-gil-making.mdx | 13 +++--- src/styles/ffxiv-selector.css | 72 ++++++++++++++++++++++++++++++ 5 files changed, 172 insertions(+), 41 deletions(-) delete mode 100644 src/components/AnotherComponent.tsx create mode 100644 src/components/FFXIVItemPrice.tsx create mode 100644 src/styles/ffxiv-selector.css (limited to 'src/components') diff --git a/src/components/AnotherComponent.tsx b/src/components/AnotherComponent.tsx deleted file mode 100644 index f74e924..0000000 --- a/src/components/AnotherComponent.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React, { useState, useEffect } from 'react'; - -const AnotherComponent: React.FC = () => { - const [selectedWorld, setSelectedWorld] = useState(null); - - useEffect(() => { - // Load selected world from localStorage - const savedWorld = localStorage.getItem('selectedWorld'); - if (savedWorld) { - setSelectedWorld(savedWorld); - } - }, []); - - return ( -
-

Selected World: {selectedWorld}

- -
- ); -}; - -export default AnotherComponent; \ No newline at end of file diff --git a/src/components/FFXIVItemPrice.tsx b/src/components/FFXIVItemPrice.tsx new file mode 100644 index 0000000..8f265fc --- /dev/null +++ b/src/components/FFXIVItemPrice.tsx @@ -0,0 +1,83 @@ +import React, { useState, useEffect } from 'react'; + +interface FFXIVItemPriceProps { + itemId: number; + itemName: string; + itemImageUrl: string; +} + +const FFXIVItemPrice: React.FC = ({ itemId = 5530, itemName="Coke", itemImageUrl="https://xivapi.com/i/021000/021462_hr1.png"}) => { + const [selectedWorld, setSelectedWorld] = useState(null); + const [dailySaleVelocity, setDailySaleVelocity] = useState(null); + const [averageSalePrice, setAverageSalePrice] = useState(null); + const [inputQuantity, setInputQuantity] = useState(0); + const [potentialGil, setPotentialGil] = useState(0); + + useEffect(() => { + const savedWorld = localStorage.getItem('selectedWorld'); + if (savedWorld) { + setSelectedWorld(savedWorld); + } else { + setSelectedWorld('Midgardsormr'); + } + + fetch(`https://universalis.app/api/v2/aggregated/${selectedWorld}/${itemId}`) + .then(response => response.json()) + .then(data => { + const result = data.results[0]; + setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.world.quantity)); + setAverageSalePrice(Math.round(result.nq.averageSalePrice.world.price)); + }) + .catch(error => console.error('Error fetching data:', error)); + }, [itemId, selectedWorld]); + + const handleInputChange = (e: React.ChangeEvent) => { + const quantity = parseInt(e.target.value, 10); + setInputQuantity(quantity); + setPotentialGil(quantity * (averageSalePrice || 0)); + }; + + const formatNumber = (number: number | null) => { + return number !== null ? new Intl.NumberFormat().format(number) : 'N/A'; + }; + + return ( +
+
+

{itemName}

+ {itemName} +
+ + + + + + + + + + + + + + + + + + + +
Daily Sale Velocity:{formatNumber(dailySaleVelocity)} items
Average Price/Item:{formatNumber(averageSalePrice)} gil
Enter Quantity: + +
Potential Gil Earnings:{formatNumber(potentialGil)} gil
+
{selectedWorld} Marketboard Data provided by Universalis API
+
+ ); +}; + +export default FFXIVItemPrice; \ No newline at end of file diff --git a/src/components/FFXIVWorldSelector.tsx b/src/components/FFXIVWorldSelector.tsx index f2dc4cc..63eff07 100644 --- a/src/components/FFXIVWorldSelector.tsx +++ b/src/components/FFXIVWorldSelector.tsx @@ -1,11 +1,15 @@ import React, { useState, useEffect } from 'react'; - +import '../styles/ffxiv-selector.css'; interface World { id: number; name: string; } -const FFXIVWorldSelector: React.FC = () => { +interface FFXIVWorldSelectorProps { + message: string; +} + +const FFXIVWorldSelector: React.FC = ({ message = "Select a World" }) => { const [worlds, setWorlds] = useState([]); const [selectedWorld, setSelectedWorld] = useState(null); @@ -40,9 +44,9 @@ const FFXIVWorldSelector: React.FC = () => { }; return ( -
- - {worlds.map((world) => ( ))} - {selectedWorld &&

Selected World: {selectedWorld}

} - +
); }; diff --git a/src/content/blog/ffxiv-gil-making.mdx b/src/content/blog/ffxiv-gil-making.mdx index 002ab8c..eb35a28 100644 --- a/src/content/blog/ffxiv-gil-making.mdx +++ b/src/content/blog/ffxiv-gil-making.mdx @@ -5,15 +5,16 @@ pubDate: "2024-08-23" --- import '../../styles/ffxiv-gil-making.css' import FFXIVWorldSelector from '../../components/FFXIVWorldSelector'; -import AnotherComponent from '../../components/AnotherComponent'; - -*Enter the world you play on below to get crowdsourced marketboard prices* - +import FFXIVItemPrice from '../../components/FFXIVItemPrice'; + I've seen a lot of these "making gil without crafting" or "making gil with combat job" guides during my time with the game. A lot of these videos and guides are fine, but in my opinion they neglect a lot of the late game and niche options that are available to players. -This post will attempt to be a somewhat comprehensive guide to making gil without having to level any crafting jobs (cause I get it, crafting is not for everyone). - \ No newline at end of file +This post will attempt to be a somewhat comprehensive guide/info sheet to making gil without having to level any crafting jobs (cause I get it, crafting is not for everyone). + +Keep in mind though that crafters are probably one of the most consistent methods of getting gil. There will be a lot more "instability" with these methods. + +# Grand Company Seals \ No newline at end of file diff --git a/src/styles/ffxiv-selector.css b/src/styles/ffxiv-selector.css new file mode 100644 index 0000000..efad540 --- /dev/null +++ b/src/styles/ffxiv-selector.css @@ -0,0 +1,72 @@ +.ffxiv-container { + background-color: #1a1a1a; + color: #e2c08d; + padding: 10px; + border: 2px solid #e2c08d; + border-radius: 10px; + font-family: 'Arial', serif; + max-width: 500px; + margin: auto; +} + +.ffxiv-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; +} + +.ffxiv-item-icon { + width: 50px; + height: 50px; +} + +.ffxiv-h1 { + font-size: 1.5em; + color: #e2c08d; + margin: 0; +} + +.ffxiv-table { + width: 100%; + border-collapse: collapse; +} + +.ffxiv-button { + background-color: #333; + color: #e2c08d; + border: 1px solid #e2c08d; + padding: 5px; + padding-left: 10px; + padding-right: 10px; + margin-left: 10px; + border-radius: 5px; + cursor: pointer; +} + +.ffxiv-table td { + padding: 5px; + border: 1px solid #e2c08d; +} + +.ffxiv-label { + font-size: 1em; +} + +.ffxiv-value { + font-size: 1em; +} + +.ffxiv-input { + background-color: #333; + color: #e2c08d; + border: 1px solid #e2c08d; + padding: 5px; + border-radius: 5px; + width: 100%; + box-sizing: border-box; +} + +.ffxiv-input::placeholder { + color: #e2c08d; +} \ No newline at end of file -- cgit v1.2.3 From 667f31cf0a74bfbf10a6c2a9346ab193a00deef9 Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Fri, 23 Aug 2024 16:27:09 -0700 Subject: write grand company seals section --- src/components/FFXIVItemPrice.tsx | 8 ++++---- src/content/blog/ffxiv-gil-making.mdx | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 5 deletions(-) (limited to 'src/components') diff --git a/src/components/FFXIVItemPrice.tsx b/src/components/FFXIVItemPrice.tsx index 8f265fc..2a6cab8 100644 --- a/src/components/FFXIVItemPrice.tsx +++ b/src/components/FFXIVItemPrice.tsx @@ -49,14 +49,14 @@ const FFXIVItemPrice: React.FC = ({ itemId = 5530, itemName - - - - + + + +
Daily Sale Velocity:{formatNumber(dailySaleVelocity)} items
Average Price/Item: {formatNumber(averageSalePrice)} gil
Daily Sale Velocity:{formatNumber(dailySaleVelocity)} items
Enter Quantity: diff --git a/src/content/blog/ffxiv-gil-making.mdx b/src/content/blog/ffxiv-gil-making.mdx index eb35a28..9cd993f 100644 --- a/src/content/blog/ffxiv-gil-making.mdx +++ b/src/content/blog/ffxiv-gil-making.mdx @@ -17,4 +17,35 @@ This post will attempt to be a somewhat comprehensive guide/info sheet to making Keep in mind though that crafters are probably one of the most consistent methods of getting gil. There will be a lot more "instability" with these methods. -# Grand Company Seals \ No newline at end of file +# Grand Company Seals +You can rack up Grand Company seals (or GC Seals) fairly quickly by completing "Expert Deliveries". This is where you can +cash in on useless old gear or dungeon drops. You can usually get around `2000` seals per piece of "high level dungeon" gear. + +Then you can spend these seals on certain items that are needed for crafting. In my opinion, most of these items net fairly low gil +but some commonly exchanged items are... +- Glamour Prisms +- Coke +- Potash +- Cordials + + +|As an example of how much these materials go for... | It's consistent but slow... | +|----------|----------| +| | | + +You can also try your luck by exchaning `20 000` seals for either a 3.0 or 4.0 `Materiel Coffer`. These drop random minions and +mounts from that particular expansion. + +Don't get your hopes up so quick though. A very vast majority of the minions are basically worthless on the marketboard. +The actual rare mounts and minions have some serious Japanese gacha game drop rates... + +Let's take the Night Pegasus Whistle as an example: + +> Based on the drop rate collected by the FFXIV Dalamud Plugin `Tracky`. +> ### [This item has a drop rate of roughly 0.03%](https://docs.google.com/spreadsheets/d/1VfncSL5gf9E7ehgND5nZgguUyUAmZiAMbQllLKcoxTQ/edit?gid=1530436115#gid=1530436115) + +The same story is true for all of the other rare mounts/minions. If you were to test your luck though I'd go for the 4.0 coffers since it beats +the 3.0 coffers in number of rare items which will give you a slight statistical edge. + +- Overall: Very slow but a good way to get rid of old gear. Don't bother specifically farming dungeons specifically for gear to turn in since the gil comes very slow + -- cgit v1.2.3 From 18835326bd8db10850456a95a763b8adecc3c967 Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Sat, 24 Aug 2024 03:56:06 -0700 Subject: ffxiv-gil-making: add dungeon section --- src/components/FFXIVItemPrice.tsx | 30 ++++++--- src/content/blog/ffxiv-gil-making.mdx | 116 +++++++++++++++++++++++++++++++--- src/styles/ffxiv-gil-making.css | 10 +++ 3 files changed, 139 insertions(+), 17 deletions(-) (limited to 'src/components') diff --git a/src/components/FFXIVItemPrice.tsx b/src/components/FFXIVItemPrice.tsx index 2a6cab8..bcf5900 100644 --- a/src/components/FFXIVItemPrice.tsx +++ b/src/components/FFXIVItemPrice.tsx @@ -13,6 +13,22 @@ const FFXIVItemPrice: React.FC = ({ itemId = 5530, itemName const [inputQuantity, setInputQuantity] = useState(0); const [potentialGil, setPotentialGil] = useState(0); + const fetchData = (attempt: number = 1) => { + fetch(`https://universalis.app/api/v2/aggregated/${selectedWorld}/${itemId}`) + .then(response => response.json()) + .then(data => { + const result = data.results[0]; + setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.world.quantity)); + setAverageSalePrice(Math.round(result.nq.averageSalePrice.world.price)); + }) + .catch(error => { + console.error(`Error fetching data (attempt ${attempt}):`, error); + if (attempt < 3) { + setTimeout(() => fetchData(attempt + 1), 5000); + } + }); + }; + useEffect(() => { const savedWorld = localStorage.getItem('selectedWorld'); if (savedWorld) { @@ -21,14 +37,7 @@ const FFXIVItemPrice: React.FC = ({ itemId = 5530, itemName setSelectedWorld('Midgardsormr'); } - fetch(`https://universalis.app/api/v2/aggregated/${selectedWorld}/${itemId}`) - .then(response => response.json()) - .then(data => { - const result = data.results[0]; - setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.world.quantity)); - setAverageSalePrice(Math.round(result.nq.averageSalePrice.world.price)); - }) - .catch(error => console.error('Error fetching data:', error)); + fetchData(); }, [itemId, selectedWorld]); const handleInputChange = (e: React.ChangeEvent) => { @@ -75,7 +84,10 @@ const FFXIVItemPrice: React.FC = ({ itemId = 5530, itemName
-
{selectedWorld} Marketboard Data provided by Universalis API
+ ); }; diff --git a/src/content/blog/ffxiv-gil-making.mdx b/src/content/blog/ffxiv-gil-making.mdx index 9cd993f..cbadd13 100644 --- a/src/content/blog/ffxiv-gil-making.mdx +++ b/src/content/blog/ffxiv-gil-making.mdx @@ -8,7 +8,7 @@ import FFXIVWorldSelector from '../../components/FFXIVWorldSelector'; import FFXIVItemPrice from '../../components/FFXIVItemPrice'; - + I've seen a lot of these "making gil without crafting" or "making gil with combat job" guides during my time with the game. A lot of these videos and guides are fine, but in my opinion they neglect a lot of the late game and niche options that are available to players. @@ -17,19 +17,119 @@ This post will attempt to be a somewhat comprehensive guide/info sheet to making Keep in mind though that crafters are probably one of the most consistent methods of getting gil. There will be a lot more "instability" with these methods. +I'll try and order these methods from my least to most favorite methods and leave a bit of a quick conclusion at the end. + +--- + +# Dungeons/Deep Dungeons/Variants +I've placed these into one category since all 3 of these are some form of "dungeon" content. However, do note that the gil you'll be making +from each of these methods is vastly different from one to another. + +## Regular Instanced Dungeons +
+ +

Lodestone Image of Saint Mocianne's Arboretum (Hard)

+
+ +In terms of regular dungeons, there isn't much that's worth farming. The only thing worth mentioning at all is farming for certain dungeon exclusive housing items. + +However, not all of them are worth farming since the drop rates between them vary. This means that there's really only a select few that still hold up on the marketboard. + +To find these you'll have to go down the [list of housing items](https://ffxiv.consolegameswiki.com/wiki/Housing_Items), see which ones are dungeon exclusive, and then check the marketboard + +If a recent dungeon has been released, try looking at the drop table to see if a housing item is available as well. + +Two items that I find are still fairly decent are the Verdant Partition from +Saint Mocianne's Arboretum (Hard) + and Alzadaal's Garden Lamp from Alzadaal's Legacy + +| A fair amount of gil if you can sell them | But drops are not guaranteed each run | +|----------|----------| +| | | + +- **Overall:** The drops are worth gil but rates aren't great. Options are also limited and sales don't happen very fast. A little more worth it +if you also turn in the dungeon gear for Grand Company Seals.but still not the best option. + +## Deep Dungeons +
+ +

Image of Heaven on High

+
+Deep Dungeons are also a bit of a mixed bag. You can certainly make money by doing them but the speed is not very fast (especially if you're farming solo). +All 3 of the currently available dungeons have some sort of exclusive glamour, minions, barding, mounts, etc. that you can get. + +Keep in mind to farm the higher floors (100+ for palace of the dead and 30+ for Heaven on High or Eureka Orthos), you'll need to enter as a +pre-made party. You could theoretically go in solo but you'll likely die unless you've taken the time to farm out your Deep Dungeon gear. + +If you do have a party, then I'd say that you should just go in for fun and try to reach the highest floor. Explore all the rooms and reap the rewards +along the way + +If you're solo farming, then its best in my opinion to just repeatedly farm floors 1-10 of each dungeon. You can get these done even without +queueing for a party and the rewards are still decent. + +In that case you'll be looking for some variant of the Bronze-trimmed Sack from whichever +deep dungeon you decide to take on. For example even the oldest deep dungeon, Palace of the Dead's bronze sacks still have high valued gear: + + + +## Variant Dungeons +
+ +

Image of Mount Rokkon

+
+A relatively new method introduced in Endwalker so you'll need to be level 90, completed the main story, and unlocked Variant dungeons. These are perfect for farming +since they are meant to be completed with 1-4 players of any role. + +Each variant dungeon has a set of exclusive glamours that you can exchange with currency earned from that dungeon. + +Using Mount Rokkon as an example, each run is around 25 minutes solo (assuming you don't die) and will net you around 3 Rokkon Potsherds +| Exchange for 18 Shards | Exchange for 9 Shards | +|----------|----------| +| | | + +> TIP: If you decide to run this and have all routes already completed, I'd recommend always taking the path that the NPC picks for you at the start +of the duty. +> +>This will give you 1 extra chest that drops some exclusive minions/furniture/items **(no additional currency)**. The items you get from these do +vary though, some are worth a lot and some are worth next to nothing. + +### Criterion +This is a bit of an add-on to variant dungeons. For those who've never seen it, it basically takes the bosses from all routes of the dungeon and mashes them together +into what you'd exepct from a traditional instanced dungeon. + +You'll also have to go in as a standard light party (2 DPS, 1 Tank, 1 Healer). Enemies hit harder and the bosses have more difficult mechanics. Because of this +players on North America use the Party Finder to find groups to run this content. + +You'll earn 4 of whatever currency the criterion dungeon uses which can be used to exchange for various items again. + +You'll really only have 2 options here since the materia is already outclasses by the 7.0 ones. So its either the mount for 100 (you can get it as a rare drop too!) +or the orchestrion roll for 8. + +Both will be worth a fair amount of gil on the marketboard with the orchstrion roll being `2-3 million` and the mount being `10+ million` + +![Rokkon Mount and Orchestrion](https://files.catbox.moe/vgbgsr.png) + +> WARNING! If you clear and unlock the Savage variant, you do not get same the currency for clearing Savage! +> +> You get some other currency that is used to exchange for a few untradeable furnishings or accessories. NOT WORTH in my opinion. + +- Overall: To be honest, this will be difficult to find a group to do solo since past criterions are generally dead content on the party finder. +It also takes a bit of time to learn the mechanics, but if you do get a group and run it every now and then its very decent gil even for just the orchestrion roll. +--- + # Grand Company Seals You can rack up Grand Company seals (or GC Seals) fairly quickly by completing "Expert Deliveries". This is where you can cash in on useless old gear or dungeon drops. You can usually get around `2000` seals per piece of "high level dungeon" gear. Then you can spend these seals on certain items that are needed for crafting. In my opinion, most of these items net fairly low gil but some commonly exchanged items are... -- Glamour Prisms -- Coke -- Potash -- Cordials +- Glamour Prism +- Coke +- Potash +- Cordial -|As an example of how much these materials go for... | It's consistent but slow... | +|As an example of how much these materials go for... | Not very much at all but there's always a market for it | |----------|----------| | | | @@ -41,11 +141,11 @@ The actual rare mounts and minions have some serious Japanese gacha game drop ra Let's take the Night Pegasus Whistle as an example: -> Based on the drop rate collected by the FFXIV Dalamud Plugin `Tracky`. +> Based on the drop rate collected by the FFXIV Dalamud Plugin [Tracky](https://github.com/Infiziert90/TrackyTrack). > ### [This item has a drop rate of roughly 0.03%](https://docs.google.com/spreadsheets/d/1VfncSL5gf9E7ehgND5nZgguUyUAmZiAMbQllLKcoxTQ/edit?gid=1530436115#gid=1530436115) The same story is true for all of the other rare mounts/minions. If you were to test your luck though I'd go for the 4.0 coffers since it beats the 3.0 coffers in number of rare items which will give you a slight statistical edge. -- Overall: Very slow but a good way to get rid of old gear. Don't bother specifically farming dungeons specifically for gear to turn in since the gil comes very slow +- **Overall:** Very slow but a good way to get rid of old gear. Don't bother specifically farming dungeons specifically for gear to turn in since the gil comes very slow diff --git a/src/styles/ffxiv-gil-making.css b/src/styles/ffxiv-gil-making.css index e69de29..e736a85 100644 --- a/src/styles/ffxiv-gil-making.css +++ b/src/styles/ffxiv-gil-making.css @@ -0,0 +1,10 @@ +.eorzeadb_link { + color: goldenrod; + text-decoration: none; + position: relative; +} + +.eorzeadb_link:hover { + color: darkgoldenrod; +} + -- cgit v1.2.3 From 16cfb642db302955bfde4ef79fcb9fd66114c5e5 Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Sat, 24 Aug 2024 01:59:43 -0700 Subject: ffxiv-gil-making: WIP Eureka --- src/components/FFXIVItemPrice.tsx | 34 +++++++-- src/content/blog/ffxiv-gil-making.mdx | 140 +++++++++++++++++++++++++++++++++- src/styles/ffxiv-gil-making.css | 8 ++ 3 files changed, 175 insertions(+), 7 deletions(-) (limited to 'src/components') diff --git a/src/components/FFXIVItemPrice.tsx b/src/components/FFXIVItemPrice.tsx index bcf5900..d65b3ca 100644 --- a/src/components/FFXIVItemPrice.tsx +++ b/src/components/FFXIVItemPrice.tsx @@ -12,14 +12,35 @@ const FFXIVItemPrice: React.FC = ({ itemId = 5530, itemName const [averageSalePrice, setAverageSalePrice] = useState(null); const [inputQuantity, setInputQuantity] = useState(0); const [potentialGil, setPotentialGil] = useState(0); + const [dataSource, setDataSource] = useState('world'); const fetchData = (attempt: number = 1) => { fetch(`https://universalis.app/api/v2/aggregated/${selectedWorld}/${itemId}`) .then(response => response.json()) .then(data => { - const result = data.results[0]; - setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.world.quantity)); - setAverageSalePrice(Math.round(result.nq.averageSalePrice.world.price)); + let result = data.results[0]; + try { + setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.world.quantity)); + setAverageSalePrice(Math.round(result.nq.averageSalePrice.world.price)); + setDataSource('world'); + } catch (error) { + try { + setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.dc.quantity)); + setAverageSalePrice(Math.round(result.nq.averageSalePrice.dc.price)); + setDataSource('dc'); + } catch (error) { + try { + setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.region.quantity)); + setAverageSalePrice(Math.round(result.nq.averageSalePrice.region.price)); + setDataSource('region'); + } catch (error) { + console.error('Error fetching data:', error); + if (attempt < 3) { + setTimeout(() => fetchData(attempt + 1), 5000); + } + } + } + } }) .catch(error => { console.error(`Error fetching data (attempt ${attempt}):`, error); @@ -53,7 +74,9 @@ const FFXIVItemPrice: React.FC = ({ itemId = 5530, itemName return (
-

{itemName}

+ +

{itemName}

+
{itemName}
@@ -85,7 +108,8 @@ const FFXIVItemPrice: React.FC = ({ itemId = 5530, itemName
diff --git a/src/content/blog/ffxiv-gil-making.mdx b/src/content/blog/ffxiv-gil-making.mdx index 7946c6a..89c642c 100644 --- a/src/content/blog/ffxiv-gil-making.mdx +++ b/src/content/blog/ffxiv-gil-making.mdx @@ -15,7 +15,7 @@ A lot of these videos and guides are fine, but in my opinion they neglect a lot This post will attempt to be a somewhat comprehensive guide/info sheet to making gil without having to level any crafting jobs (cause I get it, crafting is not for everyone). -Keep in mind though that crafters are probably one of the most consistent methods of getting gil. There will be a lot more "instability" with these methods. +Keep in mind though that crafters are probably one of the most consistent methods of getting gil. There will be a lot more "instability + RNG" with these methods. I'll try and order these methods from my least to most favorite methods and leave a bit of a quick conclusion at the end. @@ -159,6 +159,8 @@ the 3.0 coffers in number of rare items which will give you a slight statistical - **Overall:** Slow gil but very easy, and a great way to get some value out of old gear. Don't bother specifically farming dungeons specifically for gear to turn in since the gil comes very slow +--- + ## Variant Dungeons
@@ -181,4 +183,138 @@ of the duty. vary though, some are worth a lot and some are worth next to nothing. - **Overall:** Excellent method to farm a ton of gil if you're willing to put in the time. Pick up the pace and bring a few friends and you can -make quite a bit in a fair amount of time. So long as the glamours are still worth something on the marketboard of course. \ No newline at end of file +make quite a bit in a fair amount of time. So long as the glamours are still worth something on the marketboard of course. + +--- +# Eureka +The methods below all involve Eureka. If you're still new to Eureka then I'd reccomend maxing out your elemental level (level 60) before doing these methods +(although this is just a reccomendation and some still can be done without maxing). + +Notorious Monsters (NM) are essentially FATEs that spawn in Eureka zones. Its important to note that these generally have a 120 minute +cooldown per instance they are killed in, meaning they cannot spawn again until then (with the exception of Bunnies which will be touched upon later). + +NMs have a random chance of spawning when killing enemies of a specific type, some also require the weather to match a certain condition. + +Ask around in Eureka zones for a link to the tracker to see what's available and what's coming up, and join "prep groups" to see if you can +help spawn the NM. + +## Eureka Magicite Material +
+ +

Image of Eureka Pyros

+
+ +*The following method requires you to have reached Eureka Pyros or Eureka Hydatos* + +Eureka features a unique mechanic known as the "Magia Board". This is where you slot in "Magicite" to give yourself certain elemental +buffs while in Eureka zones. + +
+ +

Magia Board. Numeber of magicites shown in the middle

+
+ +To get the last 2 magicites for the board, you'll need to get rare materials from the last 2 Eureka zones, Pyros and Hydatos. + +**These have a chance of dropping when completing the NMs/FATEs listed below with full credit (Gold rating)** + +*For the 6th magicite the following materials are needed:* +| Material | FATE Name | Spawn Condition | +|----------|---------|----------| +| Lamebrix's Dice | Thirty Whacks | Killing Illuminati Escapees | +| Ying-Yang's Tissue | Haunter of the Dark | Killing Pyros Hecteyes | +| Skoll's Claw | Heaven's Warg | Blizzard Weather and Killing Pyros Shuck | + + > TIP 1: On some datacenters, Skoll and Ying-Yang are typically spawned and killed in succession + > + > TIP 2: Since skoll requires the weather to be Blizzards, this means that you will generally know in advanced when Skoll is spawnable using a weather tracker + > given that its not on cool down. It will usually spawn as soon as the weather turns over, as players have already "prepped" it in advance + > + > Because its predictable when Skoll will spawn, it will usually be instapulled so arrive early! + +*For the 7th magicite the following materials are needed* +| Material | FATE Name | Spawn Condition | +|----------|---------|----------| +| Molech's Horn | Bullheaded Berserker | Killing Val Nullchu | +| Goldemar's Horn | Duty-free | Killing Hydatos Wraith (Night) | +| Ceto's Claw | Stone-cold Killer | Hydatos Delphyne | + +Unlike the 6th magicite, these are pretty much ready to go whenever so long as they aren't on cool down. Players will spawn, prep, and kill these as soon as they're available. + +**Keep in mind that the drop rates on these are low! These are rare materials** + +These materials are always worth a pretty penny on the marketboard for the Eureka addicts who want Eureka best in slot. + + + +- **Overall:** While Skoll and Ying-Yang can be planned for, the other NMs are generally killed as soon as they spawn so you'll sort of have to just pop +in and out to see if they're up (or better yet if the window is open help spawn) +- Generally a pretty quick RNG method since kills are fast and you can potentially get a MAX WIN (drop) + +## Eureka Pagos: Cassie and Crab +*The follwing method requires you to be Elemental Level 35* + +Eureka Pagos offers 2 NMs that drop rare gear that can be sold on the marketboard. These items provide players in Eureka with additional stat bonuses, but +don't serve much purpose otherwise. + + + +Copycat Cassie is spawned by killing "Ametrats", but can only spawn when the weather is "Blizzards". + +- It usually doesn't spawn immedeately after the weather changes to Blizzards, so you'll probably have to help spawn it. Thankfully the mobs are right next to the arena. + +- The earrings only drop with full credit completion (Gold rating) so join a party! + +- Cassie will be instantly pulled so make sure you're in the area when it spawns + + + +King Artho is spawned by killing "Val Snipper", but can only spawn when the weather is "Fog" + +- Usually will spawn as soon as the weather changes to Fog, so make sure to arrive early. + +- The earrings only drop with full credit completion (Gold rating) and it dies extremely quickly so join a party beforehand + +- This item is **UNIQUE**, if you already have one then make sure you place it in your Saddlebag before entering Eureka: Pagos +otherwise you'll miss out on the ring if you happen to get it + +![Don't be like this](https://i.postimg.cc/jSSTk7Ck/f4px9e.png) + +[Don't be like this guy on Reddit](https://www.reddit.com/r/ffxiv/comments/xu3s76/psa_dont_use_blitzring_while_farming_pagos/) + +- **Overall:** A very predictable way of having a chance to make big gil. Set an alarm for when the weather changes to match the +conditions and hop into Eureka. + +# Eureka Bunnies WIP +*Minimum Elemental Level 20 required. But its best to be Elemental Level 35+* + +Eureka Bunnies are a special type of NM that don't require any weather condition or prep to spawn. The earliest bunny + +# Time Sensitive/Seasonal Things +These are a few things that are worth doing but are only available during certain periods of times. It doesn't necessarily mean they +can only be done during those times, but the gil you can make will be higher. + +## Secondary Tomestone Materials +- At the beginning of a new Raid tier + +Trade your "secondary tomestones" in for materials. The names of these vary from patch to patch, but I'm referring to the tomestones that doesn't +have a weekly cap and isn't Poetics. + +![Tomestone Menu](https://files.catbox.moe/7neqkx.png) + +As of writing this, the current "secondary tomestone" is `Tomestone of Aesthetics` + +You'll have to find where the NPC that exchanges these is located, right now in Dawntrail the NPC is in Solution Nine. + +![Current Aesthetics Tomestone Materials Shop Menu](https://files.catbox.moe/84395m.png) + +During the beginning of a new savage raid tier, people will be looking to purchase these materials to make the best +craftable gear. This would be a good time to farm these materials and sell them on the marketboard. + +However, the prices of these materials will drop as time goes on so its not always worth it to farm these. + +I'd say they usually go for around 2000 gil each but of course this wildly varies depending on the time of the patch. + +- **Overall:** Good gil but only during certain periods when craftable raid gear is needed. Still good to dump these tomes +using this method if you don't need it for anything else. + diff --git a/src/styles/ffxiv-gil-making.css b/src/styles/ffxiv-gil-making.css index e736a85..711b873 100644 --- a/src/styles/ffxiv-gil-making.css +++ b/src/styles/ffxiv-gil-making.css @@ -8,3 +8,11 @@ color: darkgoldenrod; } +.no-underline { + color: inherit; + text-decoration: none; +} + +.no-underline:hover { + text-decoration: underline; +} \ No newline at end of file -- cgit v1.2.3