User Tools

Site Tools

en


kitanois_dungeon_framework

Kitanoi's Dungeon Framework


Requirements

Requires KitanoiFuncs - Free on the store

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.


What this addon is

This is a framework to allow you to create your own profiles for dungeons. The premise is, you provide the data for the final destination, any loot you want, and any interacts required, and any specific avoids needed. My avoidance code is always running and and will handle general avoidance (telegraphed attacks).

There should be no expectation that dungeons will be just given out, created by me, or shared by others. I do have a sharing area on my Discord where you can see profiles that have been shared.

Please also note, that not all dungeons / trials / raids will be possible to complete with this addon. If a mechanic isn't detected by either Minion or Argus then there is nothing that can be done for the mechanic.

Clicking the download icon in the addon will download the following:

  • 15 Satasha - no loot - synced
  • 24 Toto-rak - no loot - synced
  • 32 Brayflox - no loot - synced
  • 38 Cutter's Cry - no loot - synced
  • 41 Stone Vigil - no loot - synced
  • 47 Aurum Vale - no loot - synced
  • 51 Dusk Vigil - no loot - synced
  • 55 The Aery - loot - synced
  • 57 The Vault - synced
  • 63 Shisui of the Violet Tides - loot - synced
  • 63 Shisui of the Violet Tides - loot - unsynced
  • 80 Heroes' Gauntlet - loot

Currently Available on Discord (may require mesh download)

  • 16 Tam-Tara Deepcroft - no loot - synced
  • 60 The Antitower - no loot - synced
  • 60 The Antitower - loot - synced
  • 71 Holminster Switch - loot
  • Story - The Oracle of Light

Note that profiles are easily changed and created using the profile options below. For instance, you could add loot to any of the dungeons above, or change them from synced to unsyned.

A reason why I will not include public made profiles in my addon by default is there is a chance that custom meshes may be required, so they would be included in the Discord post.

If you notice that your run count is being reduced too quickly, for instance twice a run, it could be due to any addon desynthesizing or extracting materia or any actions used out of combat such as Peleton that could interrupt the interact with the exit.

Profiles need to be set on all characters. Set the run counter to be the same on all characters as well, this is so that in the event of a DC. All characters keep the same counter and can continue after a leader change.

The addon will only queue up if you meet the party size requirements for the duty. Unsynced(undersized) party is excluded from this check.


UI

Green: Refreshes the list of available profiles.

Orange: List of profiles you have - only shows the list after pressing green.

Blue: Sets the selected dungeon. Must have pressed green and orange first.

Run Counter: amount of runs you wish to do.

Enable Dungeon: Enables the profile.

Dungeon: Data of the profile you have loaded. Once you load a profile it is stored and remembered through log out.

Clear Dungeon: Clears the dungeon data.

Open Folder: Opens the folder where profiles are stored, new profiles should be added to this folder.

Recorder: When enabled, it stores the data of any casts of your targets. When you disable, the file is saved.

Open Folder: Opens the folder where Recorder exports to.

Each time you make a change to a profile, you must click Green, make sure the profile is selected, then press blue. This ensures the newest version is loaded.


API

Example Profile:

local tbl = {
	name = "Stone Vigil synced no loot",
	dutyid = 168,
	objectivedestinations = {
		[1] = {objective = 1, pos = {x = 0.58, y = 0.09, z = 112.31}},
		[2] = {objective = 2, pos = {x = 49.50, y = 4, z = -79.79}},
		[3] = {objective = 3, pos = {x = -0.00, y = 0.01, z = -265.70}},

	},
	forcemeleerange = {1677},
	queuetype = 1,
	interactdistance = 20,
	enemytargetdistance = 15,
	tankat = {
		[1] = {contentid = 1677, frompercent = 100, topercent = 95, pos = {x = 0.05, y = 0.01, z = 107.83}, desc = "tank first boss away from party from 100-95%"},
	},
	hasbuff = {
	},
	interacts = {
		[1] = {contentid = 2001880, priority = 1, req = {objective = 3, complete = false}, priority = 1, type = "strongroom gate"}, 
	},
	avoidentity= {
        [1] = {contentid= 1678, radius = 6},
        },
        incombatinteract= {
		[1] = {interactid= "2001884;2001885;2001886", req = {castingid = 1028, desc = "isegbind casting"}, type= "interact", who = "closest", desc = "berthas"},
        },	
	prioritytarget = {
	},
	puddledata= {
		[1] = {castid = 1023, radius= 5, duration = 60, desc = "ice puddle left by isebind"},
		[2] = {castid = 1024, radius= 6, duration = 60, desc = "ice puddle left by isebind while flying"},
        },
	advancedavoid = {
	},
	overheadmarkers = {
	},
}
return tbl

dutyid - [int][required] This is the localmapid of the dungeon you wish to run.

dutyid = 616,
d(Player.localmapid)
  • can be obtained by entering the dungeon and typing the above code snippet into the console.

mesh - [string][optional] The name of the mesh you want to use, or blank.

name = "Shisui of the Violet Tides",

objectivedestinations - [table][required] - The positions of each objective. If the dungeon is linear, you can define each objective as the same position. Ensure there is an entry for the correct amount of objectives in the dungeon.

	objectivedestinations = {
		[1] = {objective = 1, pos = {x = 21.91, y = 7.10, z = 27.38}},
		[2] = {objective = 2, pos = {x = 114.30, y = -3.155, z = -24.09}},
		[3] = {objective = 3, pos = {x = -13.54, y = 5.74, z = -91.40}},
		[4] = {objective = 4, pos = {x = -113.26, y = -1.069, z = -53.45}},
		[5] = {objective = 5, pos = {x= -13.3, y= 35.67, z= -237.70}},
	},
  • due to only using a single destination point, you must ensure the mesh you are using is correctly meshed and includes all necessary OMCs.

queuetype - [int][required] - 1: synced, 2: unsynced

queuetype = 2,

bossids - [table][optional] - Expects contentid. Will force melee range above 90% HP on those targets.

bossids = {6241,6237},

interacts - [table][required*] - *Required when you want to loot or interact with anything.

	interacts = {
		[1] = {contentid = 897, priority = 2, type = "loot"},
		[2] = {contentid = 893, priority = 2, type = "loot"},
		[3] = {contentid = 894, priority = 1, type = "loot"},
		[4] = {contentid = 898, priority = 1, type = "loot"},
		[5] = {contentid = 895, priority = 2, type = "loot"},
		[6] = {contentid = 896, priority = 3, type = "loot"},
		[7] = {contentid = 899, priority = 4, type = "loot"},  
                [8] = {contentid = 1004346, priority = 1, req = {objective = 1, complete = false}, type = "brayflox longstop - get first key"}, 

	},
  • contentid - contentid of the interactable object
  • priority - if you need to get a key then open a door, set the key as priority 1 and the door as priority 2.
  • type - this is just a description for your reference.
  • req [table][required] both objective and complete are required if using this. This will make it so this interact only happens if objective is met.

prioritytarget - [table][optional]

	prioritytarget = {
		[1] = {contentid = 6238, priority = 1, type = "first boss scorpion"},
		[2] = {contentid = 6244, priority = 2, type = "last boss sharks"},
		[3] = {contentid = 6245, priority = 3, type = "something"},
        },
  • contentid - contentid of the priority target
  • priority - if two or more priority targets will be alive at the same time, set the priority accordingly.
  • type - this is just a description for your reference.

hasbuff - [table][optional] - Handles specific mechanics when a buff is detected on the player. Two modes available.

  • move - As in the example above, after you get the old debuff on the second boss of Shisui, you want to move away from the chest to avoid opening it again before it is needed.
  • interact - Useful in areas such as Aurum Vale first boss where you need to interact with the fruit to remove the debuff.
	hasbuff = { [1] = {type = "move", buffid = 123, pos = {x=2,y=1,z=2}}
		    [2] = {type = "interact" interactid = 123456, stacksrequired = 2}
	},

advancedavoid - [table][optional]

	advancedavoid = {
		[1] = {castingid = 545454, type = "los", args = {entityone = 8787887, entitytwo = 78787878, dist = 10}},
		[2] = {castingid = 998899, type = "singlefixed", pos = {[1] = {x=1,y=2,z=3}}},
		[3] = {castingid = 12587, type = "faceaway"},
		[4] = {castingid = 8058, type = "multifixed", pos = {[1] = {x=-9.98,y=27.4,z=-198.46},[2] = {x=-10.02,y=27.4,z=-218.2},[3] = {x=9.93,y=27.4,z=-218.25},[4] = {x=10.04,y=27.4,z=-198.2}}},
                [5] = {castingid = 5557, type = "moveinfront"},
                [6] = {castingid = 5557, type = "movebehind"},
                [7] = {castingid = 20999, type = "movetoentity", entitylist = "contentid=9511,maxdistance30", targetable = false, desc = "last boss blue pool"},
                [8] = {castingid = 16777, type = "setdistance", dist = 2, desc = "pendulum"},
	},
  • los - Line of Sight. Provide the entity casting (entityone), and the entityid of what you wish to hide behind, a meteor for instance (entitytwo) and a distance behind entitytwo to be.) Will clear target.
  • singlefixed - Useful for stacking or where there is no risk stacking characters together to avoid.
  • faceaway - Faceaway from the cast.
  • multifixed - Need to spread during a cast, provide the positions for each character (4 for a 4 person dungeon, and 8 for a trial / raid)
  • moveinfront - image below
  • movebehind - image below
  • moveleftofenemy - image below
  • moverightofenemy - image below
  • movefrontleftofenemy - image below
  • movefrontrightofenemy - image below
  • setdistance - moves to a set distance away from the targeted enemy when it starts casting the spell. Will clear target.
  • castingid tends to be the channelingid seen in minions dev scanner.

Using these options, you will move to the point specified around your targeted enemy. Useful for spinning attacks.

overheadmarkers - [table][optional] Will be able to specify markers and types and whether to stack or spread.

	overheadmarkers = {
	[1] = {id = 123, 
               contentid = "6237",
               desc= "spread", 
               type = "move", 
               detectwho = "me", 
               pos =  {[1] = {x=-9.98,y=27.4,z=-198.46},[2] = {x=-10.02,y=27.4,z=-218.2},[3] = {x=9.93,y=27.4,z=-218.25},[4] = {x=10.04,y=27.4,z=-198.2}}, 
               returnpos = {[1] = {x=-1.98,y=27.4,z=-118.46},[2] = {x=-1.02,y=27.4,z=-208.2},[3] = {x=3.93,y=27.4,z=-248.25},[4] = {x=7.04,y=27.4,z=-178.2}}, 
               timetoreturn = 5},
	[2] = {id = 124, 
               contentid = "6237",
               desc= "stack", 
               type = "move", 
               detectwho = "any",
               timetoreturn = 5},	
        },
  • desc: is just a description and not required
  • contentid: [string] to link the overhead marker to a boss. This is for instances where multiple bosses use the same marker ids. If using multiple ids, separate them with a semi colon.
  • type: currently just supports move, possibly in the future will add others as people tell me if any others are necessary. spread, you need to provide the positions to spread to, stack will move to the character with the stack marker.
  • detectwho: me - only detects for the individual character and handle it is the marker is on them, any will detect the marker on any player and do the mechanic whether or not they have a marker. any is designed for stacking, whereas me is for spreading.
  • pos [table] individual positions for each character as shown above, in 8 man content you'd need to provide 8 positions.
  • returnpos [table][required] individual positions for each character as shown above, in 8 man content you'd need to provide 8 positions. This is the point to return to after spreading for markers. Useful for when puddles are left.
  • timetoreturn [int][required] in seconds to wait before returning to returnpos

useactions [table][optional] Will attempt to use duty actions. Options for target are “target” and “me” and enemypos (like cannons)

    useaction = {
        [1] = {actiontree = 1, actionid = 9823, target = "target", contentid = 6909, desc = "shatterstone"},
        [2] = {actiontree = 1, actionid = 9824, target = "target", contentid = 6909, desc = "shatterstone"},
        [3] = {actiontree = 1, actionid = 12257, target = "enemypos", contentid = 297, desc = "cannon in castrum meridianum"},
    },
    
  • contentid can be multiple for enemypos, use a string separated by ; - eg. “1234;5478;5478;6985” - the nearest entity will be used for the position.

Can use the following in the console to find actions:

KitanoiFuncs.FindAction(str)

Replace str with the action name inside of “ - case doesn't matter

enemytargetdistance [int][optional] set this to the distance you wish the radius around the tank (or solo) character to be checked when trying to target enemies. If you are finding a nav issue whereas your character runs passed a boss, increase this number until you stop running past. If this option isn't used, the default distance is 30.

enemytargetdistance = 30,

prioritytargetdistance [int][optional] distance to search for priority targets. If this option isn't used, the default distance is 30.

prioritytargetdistance = 30,

interactdistance [int][optional] distance to search for interacts (loot,keys,doors). This only works for out of combat interacts. In combat interacts like those used with hasbuff has a distance of 50 regardless. If this option isn't used, the default distance is 30.

interactdistance = 30,

requeuetimer [int][optional] Time required after leaving a dungeon before requeuing. If this option isn't used, the default distance is 15.

requeuetimer = 30,

meshchange [table][optional] Will change mesh based on below options. Will revert to default / selected mesh when a loading screen is detected. This is useful for fights such as titan where the platform shrinks at certain %.

  • percent [int/float]- when your target it below the % specified
  • castid [int]- when an enemy is casting a certain spell (channelingid)
  • newmesh [string] - name of the mesh you wish to change to.
  • reverttimer [int][optional] - revert to original mesh after this many seconds.
    meshchange = {
        [1] = {type = "percent", percent = 50, newmesh = "The Naval - Smallest", desc = "switch to smallest platform"},
        [2] = {type = "castid", castid = 1234, newmesh = "This that t'other", reverttimer = 20, desc = "specific avoidance requirement"},
    },

togglewalk [table][optional] useful when you need precise navigation such as in Dohn Mheg. When inside of the polygon and on the specified mesh, walking will be enabled. If not on the specified mesh, or outside of the polygon, normal running speed it used.

  • polygon - for a triangle, provide 3 points, square 4, complex shapes any number of points.
  • meshname - current mesh name must match this before the walk takes effect.
    togglewalk = {
        [1] = {polygon= {[1] = {x = 12, z = 21}, [2] = {x = 21, z = 12}, [3] = {x = 38, z = 38}}, meshname = "The Naval - Smallest, desc = "switch to smallest platform"},
    },

excludeavoid [table][optional] Way to stop my avoidance avoiding some aoes, such as those that are part of a stack marker. channelingid of each cast separated by a comma.

    excludeavoid = {1,2,3,4,5}

tankat [table][optional] Allows you to specify a position, % from and % to to tank at that position. This is useful if you need to be able to move the boss at certain %. This will only work for tanks, or those who are at the top of the aggro list.

    tankat= {
        [1] = {contentid = 12345, frompercent = 100, topercent = 95, pos = {x = 1, y = 2, z = 3}, desc = "tank boss 12345 at this pos from 100-95%"},
    },
  • contentid [required] contentid of the enemy
  • frompercent [required] should be the higher %
  • topercent [required] should be the lower %
  • pos [required] position to tank at

puddledata [table][optional] Specify spells that leave puddles on the floor. Provide the channelingid, radius, and duration. This will tell my avoidance system to not avoid into this puddle.

    puddledata= {
        [1] = {castid = 12345, radius= 5, duration = 15, type = "player", desc = "puddle left by boss 2 when casting super fire move at player"},
        [2] = {castid = 15545, radius= 5, duration = 15, type = "ground", desc = "puddle that appears at random points on ground"},
    },

pullenemyoutofpuddle [bool][optional] Used in combination with puddledata. Useful for the final boss of Brayflox Longstop to pull Aiatar out of the puddles. Isn't perfect, but is successful.

pullenemyoutofpuddle = true,

incombatinteract [table][optional]

    incombatinteract= {
        [1] = {interactid= 12345, type= "interact", req = {castingid = 1208, desc = "isegbind casting"}, who = "closest", desc = "interact with something"},
        [2] = {interactid= "12345;8484;4984", type= "interact", who = "closest", desc = "interact with something"},
        [3] = {interactid= 54345, type= "move", who = "closest", buffid = 90, pos = {x = 1, y = 2, z = 3}, dist = 15, action = {type = 1, actionid = 24}, desc = "interact and move with something"},
    },
  • contentid - contentid of the entity you need to interact with
  • type - interact: just interact - move: interact and move to a point
  • who - closest: only the person closest to the interact will perform the action - all: all characters will attempt to interact
  • action - used when you need to place an item after moving. type is which tree the action is in, actionid is the actionid
  • pos - place to move to and use action (place item)
  • dist - radius around pos that you can place the item
  • buffid - this is needed to trigger the move to pos
  • desc - decription for your reference
  • req [table][optional] castingid and desc

avoidentity[table][optional] - Used to avoid moving entities, like those on the second boss in Stone Vigil. Set the radius slightly larger than where the aoe is.

    avoidentity= {
        [1] = {contentid= 12345, radius = 5},
    },

forcemeleerange[table][optional]

    forcemeleerange= {12345,65421,47811}
  • contentid separated by a comma.

tethers - handles tethers

	tethers = {
		[1] = {id = 12, type = "avoid", radius = 16, who = "entityone", duration = 6, desc = "First Boss Jumps"},
		[2] = {id = 12, type = "avoid", radius = 16, who = "entitytwo", duration = 6, desc = "First Boss jumps"},
		[3] = {id = 17, type = "move", priority = 1, pos = {[1] = {[1] = {x = -458.90, y = 1.19, z = -531.26}, [2] = {x = -441.77, y = 0, z = -532.75},}, [2] = {[1] = {x = -458.90, y = 1.19, z = -531.26}, [2] = {x = -441.77, y = 0, z = -532.75},}, [3] = {[1] = {x = -458.90, y = 1.19, z = -531.26}, [2] = {x = -441.77, y = 0, z = -532.75},}, [4] = {[1] = {x = -458.90, y = 1.19, z = -531.26}, [2] = {x = -441.77, y = 0, z = -532.75},}}, desc = "Second Boss normal tether"},
		[4] = {id = 79, type = "move", priority = 2, pos = {[1] = {[1] = {x = -462.99, y = -2.38, z = -544.31}, [2] = {x = -436.37, y = 2.38, z = -543.47},}, [2] = {[1] = {x = -467.53, y = 2.38, z = -537.02}, [2] = {x = -431.78, y = 0, z = -535.72},}, [3] = {[1] = {x = -467.04, y = -1.19, z = -525.08}, [2] = {x = -431.71, y = -1.19, z = -527.03},}, [4] = {[1] = {x = -463.28, y = -1.19, z = -517.52}, [2] = {x = -435.81, y = 0, z = -518.89},}}, desc = "Second Boss red tether"},

	},
  • id: tether id
  • type: avoid: area around the entity that is tethered needs to be avoided. stack: stack with other entity
  • radius: combined with avoid - radius around entity to not avoid into.
  • who: entityone / entitytwo: one tether from, two tether to.
  • pos: table with any number of positions you want to use. It will check each position isn't in an aoe / puddle(if defined) and move to the first one it finds. Format of the table is : PosTable = { Character1 = {data}, Character2 = {}}

limitbreak

	limitbreak = {
		[1] = {contentid = 9505, percent = 15, level = 1, type = "melee"},
		[2] = {contentid = 9511, percent = 15, level = 2, type = "melee"},
	},
  • contentid of enemy you wish to use the LB on, must be targeting it.
  • percent - will be used when the target is equal or below this number
  • level - what level of LB should be used
  • type - melee, ranged, magic, tank, healer

type [optional] only required for story mode dungeon. If making a regular duty profile, omit this option.

        type = "story",

Available Options:

  • duty
  • story

tankswap [optional][table]

	tankswap = {9999,4444},

castid or channelingid when you wish to tank swap. Ideally you want to turn autostances off in your skill profiles / acr and use the below option as well and let the addon handle tank stances.

autotankstance [optional][bool]

	autotankstance= true,

Only useful in dungeons where multiple tanks are in use. Ensure auto tank stances are turned off in skill profiles / acrs.


Coming Soon

Sprint Handling - Will add the option to define areas where to use sprint, polygons / circle and radius.

Keep close enough to healer - A way to keep you close enough to the healer so you can be cured, while staying in combat range of your target.

Ignore Target - Option to allow you to ignore targets.


Requests for functions

I will not be taking requests to create bespoke functions for specific mechanics. I will however, where possible, make a general function that could be used to meet the requirement. All functions I create are designed to work in a wide variety of dungeons.

Any requests for functions will need at minimum the following information: (This information is used to see the mechanic you need handling, but will be still be adhearing to the first point made above.)

Dungeon Name

Boss Name

Action Name

Expectations / How to handle it


Support

kitanois_dungeon_framework.txt · Last modified: 2021/01/04 01:42 by kitanoi