EQEmu / Server

Open Source Fan-Based EverQuest Emulator Server project
https://docs.eqemu.io/
GNU General Public License v3.0
447 stars 415 forks source link

Guide for gating features #4357

Open ElrozBriggs opened 5 months ago

ElrozBriggs commented 5 months ago

--Different kinds of Gating Content Filters : -Gating NPC spawn points A good example for this would be an NPC in Cazic-Thule and Feerrott named "a lizard ritualist". There's 2 eras of Cazic-Thule, Pre and Post-Luclin. This Specific NPC doesn't start spawning until Velious-era when Stonebrunt Mountains are added. So From Vanilla --> Kunark, we have the Original-era Cazic-Thule, and this NPC doesn't exist. image Once Velious launches, this NPC starts spawning. When the Luclin-era Cazic-Thule revamp happens, this NPC stops spawning. In the Database this spawn point is gated to only spawn at min expansion 2 (velious), to max expansion 2 (velious). image Other NPC's in Cazic-Thule are generally gated to the Original version of the zone, min expansion 0 (vanilla), max expansion 2 (velious) image or the Luclin-era, min expansion 3 (luclin), max expansion 99 (the end of the server's timeline) image

-Gating NPC spawn groups Sometimes gating the spawn point isn't necessary, and just gating the spawn table works better. For instance, original era zone collects show a npc spawning on a specific location, but in later eras a new NPC gets added to that spawn group. In this example, "a giant scarab" spawned 100% of the time, but in luclin era, it was replaced with 3 versions of scarabs, which add up to 100% spawn. This shows a 200% spawn chance in the table, but the important thing is that the spawns add up to 100% in each era effected. image imageimageimageimage

-Gating Loot Tables Some NPCs had loot added in later expansions, the Luclin newbie armor quest items are a good example for this. Depending how the loot tables were added, sometimes individual items are gated, and sometimes an entire loot table is gated. In this example, the gray wolf in qeynos hills has 3 loot tables with the center table being gated to min expansion 3 (Luclin) , max expansion 99 (end of timeline) image In some cases, gating an individual item on a loot table is more accurate. In this example, the decaying skeletons only ever dropped 1 weapon maximum per kill (no evidence of one dual wielding). The Rusty Ulak and other h2h weapons were added with Luclin era, so there's 1 weapon loot table and only the ulak is gated to luclin+ image

-Gating via scripts (NPC Dialogue, mostly) In some cases, dialogue for NPCs changed over time, as some of them had quest chains that were expanded upon as expansions launched. A good example of this is "an iksar master" in Timorous Deep. During Kunark era, the highest iksar monk shackle quest was Shackle of Bronze. In Velious, the Shackle of Steel quest was added, and in Luclin, Shackle of Tynonnium and Whistling fists quests. In script form, the dialogue looks like this

function event_say(e)
    if(e.message:findi("hail")) then
        e.self:Emote("is humming and chanting softly. He seems oblivious to your presence.");
    elseif(e.message:findi("master rinmark")) then
        e.self:Emote("squints one eye open, then returns to his meditation.");
    elseif(e.message:findi("talon southpaw")) then
        e.self:Emote("waves his arms in the air. 'The great master. His soul is the wind. He speaks to us in words of thunder. He strikes Norrath with bolts of lightning. I seek to be as he is. I have traveled the globe in search of his fists. I have found only one. Another is said to be with [Gomoz]. I shall return it when I am finished with my seasons-long meditation or perhaps I shall find a monk to [return the hand to Cabilis].'");
    elseif(e.message:findi("Gomoz")) then
        e.self:Say("Disciple Gomoz was once Talon Southpaw's pupil. It is rumored that he has only one hand. Unfortunately, a horde of ogre raiders swiped his bones, along with others, from their place in Kurn's Tower. What those simple oafs plan to do with them is a mystery. Only one who has studied the arcane sciences could use them. They most likely used them as soup bones.");
    elseif(e.message:findi("return the hand to Cabilis")) then
        e.self:Emote("hands you an old tattered sack. 'This shall be your proof of allegiance. Prove that you are strong with an intact mandible of a skulking brutling and the claws of a burynai excavator. Prove that you are a monk of fist and tail with a sash of an exiled human monk and the sparring gloves of a goblin pit fighter. Combined, these items make the sack full. This will earn my trust and the hand.'");
        e.other:SummonCursorItem(17036); -- Item: Tattered Sack from Rinmark
    elseif(e.message:findi("assist old Rinmark in completing his rock garden")) then
        e.self:Emote("pours the pebbles into his pocket and hands the box to you. 'Take my box. Fill and combine within my box the following; a radiant meteorite, frontier fool's gold, petrified redwood, Rile's sand coin, sulfur stone, fragment of tektite, plains pebble, jade magma, heart of ice and an unholy coldstone. Return the full tin box to me and I shall reward you with a shackle of bronze.'");
        e.other:SummonCursorItem(17039); -- Item: Empty Tin Box
    elseif(e.message:findi("whistling fists")) then
        e.self:Say("The Whistling Fists are rumored to be magical instruments of destruction which can only be wielded by monks. The founder, Supreme Master Tynn, was the only lizard to ever gaze upon the weapon. He only spoke of it to his student Marthor. Marthor rarely spoke of it and when he did it was usually after a few flagons of Trog Brew. That is why many consider it to be babble.");
    elseif(eq.is_the_scars_of_velious_enabled()) then
        if(e.message:findi("student")) then
            e.self:Emote("hands you what appears to be the base of a key. 'This was delivered to me by a dying student. He collapsed just after handing it to me. He was accompanying a student of mine named Veltar. They were questing for the legendary Whistling Fists. The key is made of a metal I have never felt or heard of. Find him.'");
            e.other:SummonCursorItem(17040); -- Item: Part of a Large Key
        end
    elseif(eq.is_the_shadows_of_luclin_enabled()) then
        if(e.message:findi("test of patience") or e.message:findi("trial of patience")) then
            e.self:Say("So your time has finally come to be tested for the final rung. To show your patience you shall spar with me. When you have gained the insight and strategy to strike you will know when. Strike me too soon and you will perish, too late and I will be gone. Come at me when the time is right. Let us begin.");
            eq.unique_spawn(96318,0,0,e.self:GetX(),e.self:GetY(),e.self:GetZ(),e.self:GetHeading());
            eq.depop_with_timer();
        end
    end
end

If velious is enabled, the line of dialogue for Shackle of Steel quest starter works, if Luclin is enabled, the lines for Shackle of Tynonnium and Whistling Fists quest starters work, otherwise, all other dialogue lines will work.

-Gating Spells As expansions launched, NPC spellsets were updated and included the current eras spells. A good example for filtering spellsets would be Overking Bathezid in Chardok. He's a kunark-era wizard NPC who used Sunstrike as his most powerful nuke in Kunark. After Luclin launches, he begins using Garrison's Superior Sundering which is a much heavier damage spell and doesn't exist until Luclin-era. This is the generic default wizard spellset image Looking at Sunstrike on the left, and Garrison's Superior Sundering on the right imageimage

ElrozBriggs commented 5 months ago

-Using Content Flag instead of Expansion Gating Expansion gating sometimes is too liberal of a timeframe needed, and making more specific timeframes is better. This is when Content Flags are better than Expansion Flags. For instance, vanilla-era drops like Manastone. These can be controlled to drop without being relegated to an expansion. This is the evil eye's loot table image There are 2 main loot tables, each controlled to start and stop using a Content Flag. The Manastone table will be active when the "OldWorldDrops" are turned on image the Manastone stops dropping when that Content Flag is disabled, at that time, the other loot table with just the Bag of the Sewn Evil Eye will begin image

fryguy503 commented 5 months ago

I bet this would belong best in the docs:

https://docs.eqemu.io/ https://docs.eqemu.io/contributing/how-to-doc/