Skip to content

Conversation

@slashtangent
Copy link
Contributor

@slashtangent slashtangent commented Jan 4, 2026

I affirm:

  • I understand that if I do not agree to the following points by completing the checkboxes my PR will be ignored.
  • I understand I should leave resolving conversations to the LandSandBoat team so that reviewers won't miss what was said.
  • I have read and understood the Contributing Guide and the Code of Conduct.
  • I have tested my code and the things my code has changed since the last commit in the PR and will test after any later commits.

What does this pull request do?

Converts the quest "Community Service" to IF.
Makes the quest retail accurate.
Updates Vhana Ehgaklywha's path to be retail accurate.

Notes

There is a lot going on here so I'll try and explain the best I can.

The quest is flaggable between 1800 and 2300 once per day.
Only 1 player per night can flag the quest.
If a player flags the quest literally no other player can flag the quest.
If the player completes the quest more than once after the 2nd time they are offered a KI.
If they turn down the KI they can only get offered it again by completing the quest again.
The player can talk to Zauko once per day during the day to get rid of the KI.
After the quest player has TURNED IN the quest it will then display that player's name to any other player who talks to Zauko that night. This is passed as a string. Shoutout to @0x05010705 for that logic.
This will not display to the player who completed the quest they will only get cs 113 para 0.
If a player has the KI and is in LJ when 1800 hits they get a message in chat that Zauko is recruiting a player.
If the player has the KI and talks to Zauko once per day (during the time you can't flag the quest) Zauko will ask if they want to remove the KI.

Steps to test these changes

Wait until 1800 in game and talk to Zauko.
Light all the lamps.
Talk to Zauko to complete the quest.

Captures

https://drive.google.com/drive/folders/1R-_DEIlUuyRX7D-1-Vpa2IrgZsuNCwh6?usp=sharing

zoneObject.onGameHour = function(zone)
local vanadielHour = VanadielHour()
local playerOnQuestId = GetServerVariable('[JEUNO]CommService')
local zaukoId = GetNPCByID(ID.npc.ZAUKO)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

zauko
zaukoId implies its the ID of the "zauko" entity

end,

[131] = function(player, csid, option, npc)
local zoneId = player:getZone()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

zone
zoneId implies a zone ID not the whole zone object

if option == 1 then
lightLamp(npc, player, quest, zoneId)
end
end,
Copy link
Contributor

@Xaver-DaRed Xaver-DaRed Jan 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could also just the remaining logic to lightLamp() function and remove quite a lot of repeated code.

}

-- Lights the lamps
local lightLamp = function(npc, player, q, zone)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q Are we charging by character used again?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

local function lightLamp(player, npc, quest, option)

Then first thing: check if option is NOT 1 and return immediately if it is.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q because I can't use quest due to I think it is ghosting? I can't recall the exact vocab word for it at the moment. q just made sense as a shortened version of quest.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

questObject
communityQuest
thisQuest
There were many options to make clear what q is.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't have enough money banked to buy more letters, Ryan. I didn't want to spin the wheel again and land on bankrupt.


if lampVar ~= 0 then
return quest:progressEvent(123, lampVar, 3)
end
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is lampCs not reurning a value directly? Why set the values in a var to then fetch the var?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right I should just use localvars. I've been working on this dumb quest for days and my brain is fried.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, you dont need to set a single variable.

local function lampStatus(player, npc, questObject)
    local hour         = VanadielHour()
    local date         = VanadielUniqueDay()
    local timer        = questObject:getVar(player, 'Timer')
    local npcAnimation = npc:getAnimation()

    if questObject:getVar(player, 'Prog', 1) then
        if
            (timer == date and hour >= 18) or -- Same day flagged
            (timer == date + 1 and hour < 1)  -- Day after it was flagged
        then
            if npcAnimation == xi.anim.OPEN_DOOR then
                return 2
            elseif npcAnimation == xi.anim.CLOSE_DOOR then
                return 1
            end
        elseif
            (timer > date + 1) or
            (timer == date + 1 and hour >= 1)
        then
            return 3
        end
    elseif npcAnimation == xi.anim.OPEN_DOOR then
        return 5
    end
end

q:setVar(player, 'Option', 5) -- The lamp is lit.
return
end
end
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, arent there like 10 lamps? Are we really storing values for all of them in the same quest variable?

@Xaver-DaRed
Copy link
Contributor

I'm gonna be honest: This doesnt read like you wrote it, at all.
I've read quite a lot of your work to know by now.

@slashtangent
Copy link
Contributor Author

The bitpacking functions were written by @0x05010705 thus why he's co-authored on the pr. I'm too dumb to write anything like that.

Co-Authored-By: 0x05010705 <47504230+0x05010705@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants