This is an old revision of the document!
- Trust & Duty Support
- Dungeons using 4 bots or undersized where available
All duty support dungeons are supported upto The Lunar Subterrane.
Opening KitanoiFuncs & KDF
Capping Weekly Tomestones
Levelling Quick Start
MSQ Integration
All jobs are supported.
*As of 7.0, updates are ongoing to get all in a working order again.
KDF fully integrates with Latty's MSQ profiles and can take control to complete the dungeons using Duty Support. Any duty that was added to the Duty Support system after patch 6.3 requires the KDF Quest Expansion 1 to be automatically completed while questing.
There are a number of solo MSQ duties that are also included that are not automatically completed by the quest profiles.
With the KDF Quest Expansion 1, quest integration is expanded to Sebbs' class quests, and MSQ+Class Quests cannot be run together.
Undersized : Unrestricted Party : 解除限制 : 制限解除
Synced : Regular Duty : 通常任务 : 通常コンテンツ
Trust : 亲信战友
Squadron : 冒险者分队 : 冒険者小隊
Built In : 内建
No Duty Finder Support - Ever.
Requires 4 botted accounts for synced 4 man dungeons.
Requires 8 botted accounts for synced 8 man dungeons.
Requires at least 1 botted account for unsynced dungeons.
Requires 1 botted account for story mode solo dungeons - trust dungeons - squadrons
FPS - each instance should be 25 fps minimum. Some fights will cause the fps to drop calculating safe spots and 25fps is sufficient even with the drop.
Lower fps you will have issues.
Tasks happen in the following order:
NPC Repair > GC exchange > Item Puchase
lua conditions must always return boolean. Start the condition with return
reactions = { [1] = { cause = "return KitanoiFuncs.ScanForCaster2(16659) and ((ActionList:Get(1,7548).usable and not ActionList:Get(1,7548).isoncd) or (ActionList:Get(1,7559).usable and not ActionList:Get(1,7559).isoncd))", effect = "if (ActionList:Get(1,7548).usable and not ActionList:Get(1,7548).isoncd) then ActionList:Get(1,7548):Cast(Player) end if (ActionList:Get(1,7559).usable and not ActionList:Get(1,7559).isoncd) then ActionList:Get(1,7559):Cast(Player) end ", name = "KB immunity", }, },
Example to stop you attacking until you react a destination:
local objpullloc = { [1] = {x=1,y=2,z=3}, } local nextobj = KitanoiFuncs.GetFirstNotCompleted() if (Player.incombat and nextobj~=10 and objpullloc[nextobj] ~= nil and math.distance2d(Player.pos,objpullloc[nextobj])>5 and KitanoiFuncs.HowManyAOES() == 0) then return true end
Example from Sogigak on Discord to make larger pulls:
function customfunction() local DiedOrDungeonStart = math.distance2d(Player.pos, { x = 163.33, y = 0.1, z = 80.07 }) < 10 if BigPull == nil or DiedOrDungeonStart then BigPull = { [1] = false, [2] = false } end local PullPositions = { [1] = { objective = 1, pos = { x = 44.26, y = -8.58, z = 32.19 } }, [2] = { objective = 2, pos = { x = -123.84, y = -30.66, z = -164.22 } } } if KitanoiFuncs.GetFirstNotCompleted() == 1 and Player.incombat and not BigPull[1] and KitanoiFuncs.HowManyAOES() == 0 then local PullPosition = PullPositions[1].pos; if math.distance2d(Player.pos, PullPosition ) > 5 then Player:MoveTo(PullPosition.x, PullPosition.y, PullPosition.z) KitanoiSettings.avoidingtime = Now() + 10000 gACREnabled = false; return else BigPull[1] = true gACREnabled = true return end end if KitanoiFuncs.GetFirstNotCompleted() == 3 and Player.incombat and not BigPull[2] and KitanoiFuncs.HowManyAOES() == 0 then local PullPosition = PullPositions[2].pos; if math.distance2d(Player.pos, PullPosition) > 5 then Player:MoveTo(PullPosition.x, PullPosition.y, PullPosition.z) KitanoiSettings.avoidingtime = Now() + 10000 gACREnabled = false; return else BigPull[2] = true gACREnabled = true return end end end
This replaces advancedavoid where you need abilities to be used. For anything else, use advancedavoid.
If scanning for a cast, please use:
KitanoiFuncs.ScanForCaster2(ID,maxtimer,mintimer,returntbl) --channels local channelexample = KitanoiFuncs.ScanForCaster2(1234) -- returns bool if any entity is currently channeling 1234 local channelexample2 = KitanoiFuncs.ScanForCaster2(1234,nil,nil,true) -- returns table of all entities currently channeling 1234 KitanoiFuncs.ScanForCast2(ID,maxtimer,mintimer,returntbl) --instant casts local castexample = KitanoiFuncs.ScanForCast2(1234,2) --returns bool if any entity has cast 1234 in the past 2 seconds local castexample2 = KitanoiFuncs.ScanForCast2(1234,2,nil,true) --returns table of any entitie that have cast 1234 in the past 2 seconds
timeline = { [1] = { contentids = "1234;4321", --semicolon separated contentids starttime = 1000, --time in milliseconds that the code should run endtime = 3000, --time in milliseconds that the code should stop running luacode = "Player:MoveTo(x,y,z) KitanoiSettings.avoidingtime = Now()", }, [2] = { contentids = "1234;4321", --semicolon separated contentids starttime = 25000, --time in milliseconds that the code should run endtime = 30000, --time in milliseconds that the code should stop running luacode = "Player:MoveTo(x,y,z) KitanoiSettings.avoidingtime = Now()", }, },
Uses KitanoiSettings.InCombatTimer for starttime and endtime
TimeSince(KitanoiSettings.InCombatTimer)
syncon = { [1] = { details = "sync combat timer to 190 seconds on annihilation cast", cause = "return KitanoiFuncs.ScanForCast2(33024,1)", time = 190000, } },
This syncs KitanoiSettings.InCombatTimer to the time specified when the cause returns true
TimeSince(KitanoiSettings.InCombatTimer)
customgui = [[ GUI:Text('Testing The Custom GUI') if (test1==nil) then test1 = 1 end test1,changed = GUI:InputInt('##test1',test1) if (test2==nil) then test2 = 1 end test2, changed = GUI:RadioButton('Random 1##test21', test2,1) GUI:SameLine() test2, changed = GUI:RadioButton('Random 2##test22', test2,2) if (test3==nil) then test3 = "" end test3,changed = GUI:InputText("Search##test3",test3) if (test4i == nil) then test4i = 1 end test4c = {"none","one","two","three"} test4i, changed = GUI:Combo("", test4i, test4c) GUI:Button("Some Button") ]],
Showing dungeons from your code inside of KDF:
https://wiki.mmominion.com/doku.php?id=kdf_3rd_party