Skip to content

Commit a77c758

Browse files
authored
Merge pull request #9713 from Skold177/Pulling_The_Strings
[lua] ENM Pulling the Strings framework
2 parents 1fef1bb + 6ecd7d7 commit a77c758

3 files changed

Lines changed: 199 additions & 7 deletions

File tree

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
-----------------------------------
2+
-- Pulling the Strings
3+
-- Level 60 ENM
4+
-- !addkeyitem SHAFT_GATE_OPERATING_DIAL
5+
-----------------------------------
6+
local mineshaftID = zones[xi.zone.MINE_SHAFT_2716]
7+
-----------------------------------
8+
9+
local content = Battlefield:new({
10+
zoneId = xi.zone.MINE_SHAFT_2716,
11+
battlefieldId = xi.battlefield.id.PULLING_THE_STRINGS,
12+
maxPlayers = 1,
13+
levelCap = 60,
14+
allowSubjob = false,
15+
experimental = true,
16+
timeLimit = utils.minutes(15),
17+
index = 3,
18+
entryNpc = '_0d0',
19+
exitNpcs = { '_0d1', '_0d2', '_0d3' },
20+
requiredKeyItems = { xi.ki.SHAFT_GATE_OPERATING_DIAL, message = mineshaftID.text.SNAPS_IN_TWO, },
21+
grantXP = 2000,
22+
armouryCrates =
23+
{
24+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 1,
25+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 8,
26+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 15,
27+
},
28+
})
29+
30+
-----------------------------------
31+
-- Registration Gate - DNC, SCH, GEO and RUN cannot run this ENM
32+
-----------------------------------
33+
function content:onEntryEventUpdate(player, csid, option, npc)
34+
if not player:hasStatusEffect(xi.effect.BATTLEFIELD) then
35+
local job = player:getMainJob()
36+
37+
if job >= xi.job.DNC then
38+
player:updateEvent(xi.battlefield.returnCode.REQS_NOT_MET)
39+
player:setLocalVar('noPosUpdate', 1)
40+
return 0
41+
end
42+
end
43+
44+
return Battlefield.onEntryEventUpdate(self, player, csid, option, npc)
45+
end
46+
47+
-----------------------------------
48+
-- Initialize Battlefield
49+
-----------------------------------
50+
function content:onBattlefieldInitialize(battlefield)
51+
-- We store the initiators job to determine which type of fantoccini model to use and to determine the type of loot comes from the armoury crate.
52+
local initiatorJob = GetPlayerByID(battlefield:getInitiator()):getMainJob() or xi.job.WAR
53+
54+
battlefield:setLocalVar('initiatorJob', initiatorJob)
55+
56+
Battlefield.onBattlefieldInitialize(self, battlefield)
57+
end
58+
59+
-----------------------------------
60+
-- Battlefield Groups
61+
-----------------------------------
62+
content.groups =
63+
{
64+
{
65+
mobIds =
66+
{
67+
{
68+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN,
69+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 2,
70+
},
71+
72+
{
73+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 7,
74+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 9,
75+
},
76+
77+
{
78+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 14,
79+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 16,
80+
},
81+
},
82+
allDeath = utils.bind(content.handleAllMonstersDefeated, content),
83+
},
84+
85+
{
86+
mobIds =
87+
{
88+
{
89+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 3, -- Funguar, Lizard
90+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 4, -- Wyvern
91+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 5, -- Avatar
92+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 6, -- Automaton
93+
},
94+
95+
{
96+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 10, -- Funguar, Lizard
97+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 11, -- Wyvern
98+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 12, -- Avatar
99+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 13, -- Automaton
100+
},
101+
102+
{
103+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 17, -- Funguar, Lizard
104+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 18, -- Wyvern
105+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 19, -- Avatar
106+
mineshaftID.mob.MOBLIN_FANTOCCINIMAN + 20, -- Automaton
107+
},
108+
},
109+
spawned = false,
110+
},
111+
}
112+
113+
-----------------------------------
114+
-- Loot Tables
115+
-----------------------------------
116+
local lootTables =
117+
{
118+
[ 1] = xi.item.JANIZARY_EARRING,
119+
[ 2] = xi.item.COUNTER_EARRING,
120+
[ 3] = xi.item.HEALING_FEATHER,
121+
[ 4] = xi.item.SPIRIT_LANTERN,
122+
[ 5] = xi.item.SANATION_RING,
123+
[ 6] = xi.item.ASSASSINS_RING,
124+
[ 7] = xi.item.VIAL_OF_REFRESH_MUSK,
125+
[ 8] = xi.item.TACTICAL_RING,
126+
[ 9] = xi.item.PACIFIST_RING,
127+
[10] = xi.item.GETSUL_RING,
128+
[11] = xi.item.DEADEYE_EARRING,
129+
[12] = xi.item.GAMUSHARA_EARRING,
130+
[13] = xi.item.NARUKO_EARRING,
131+
[14] = xi.item.BAG_OF_WYVERN_FEED,
132+
[15] = xi.item.ASTRAL_POT,
133+
[16] = xi.item.DEATH_CHAKRAM,
134+
[17] = xi.item.CORSAIR_BULLET_POUCH,
135+
[18] = { xi.item.ATTUNER, xi.item.TACTICAL_PROCESSOR, xi.item.DRUM_MAGAZINE, xi.item.EQUALIZER, xi.item.TARGET_MARKER, xi.item.MANA_CHANNELER, xi.item.ERASER, xi.item.SMOKE_SCREEN },
136+
}
137+
138+
local function getLootPool(battlefield)
139+
-- Get loot table based on job. PUP gets a chance to drop an additional attachment.
140+
local key = battlefield:getLocalVar('initiatorJob')
141+
local lootPool = lootTables[key]
142+
local bonusLootPool = nil
143+
144+
if type(lootPool) == 'table' then
145+
lootPool = utils.randomEntry(lootPool)
146+
-- 20 percent chance to drop an additional attachment if the initiator is a PUP.
147+
if key == xi.job.PUP and math.random(100) <= 20 then
148+
local bonusAttachment = lootTables[key]
149+
if type(bonusAttachment) == 'table' then
150+
bonusLootPool = utils.randomEntry(bonusAttachment)
151+
end
152+
end
153+
end
154+
155+
-- Build loot table.
156+
local lootTable =
157+
{
158+
{
159+
{ itemId = xi.item.SACK_OF_LITTLE_WORM_MULCH, weight = 10000 },
160+
},
161+
162+
{
163+
{ itemId = xi.item.NONE, weight = 5000 },
164+
{ itemId = lootPool, weight = 5000 },
165+
},
166+
}
167+
168+
if bonusLootPool then
169+
table.insert(lootTable,
170+
{
171+
{ itemId = bonusLootPool, weight = 10000 },
172+
})
173+
end
174+
175+
return lootTable or content.loot
176+
end
177+
178+
function content:handleOpenArmouryCrate(player, npc)
179+
npcUtil.openCrate(npc, function()
180+
local battlefield = player:getBattlefield()
181+
local lootPool = getLootPool(battlefield)
182+
183+
self:handleLootRolls(battlefield, lootPool, npc, player:getMod(xi.mod.MOGHANCEMENT_GIL_BONUS_P))
184+
battlefield:setStatus(xi.battlefield.status.WON)
185+
186+
return true
187+
end)
188+
end
189+
190+
return content:register()

scripts/enum/item.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,6 +1219,7 @@ xi.item =
12191219
SPOOL_OF_RED_GRASS_THREAD = 1828,
12201220
SQUARE_OF_RED_GRASS_CLOTH = 1829,
12211221
SACK_OF_LUGWORM_SAND = 1830,
1222+
SACK_OF_LITTLE_WORM_MULCH = 1831,
12221223
BROKEN_HUME_FISHING_ROD = 1832,
12231224
BROKEN_HALCYON_FISHING_ROD = 1833,
12241225
SABER_SHOOT = 1837,

scripts/zones/Mine_Shaft_2716/IDs.lua

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,14 @@ zones[xi.zone.MINE_SHAFT_2716] =
3535
},
3636
mob =
3737
{
38-
BUGBBY = GetFirstID('Bugbby'),
39-
BUGBOY = GetFirstID('Bugboy'),
40-
CHEKOCHUK = GetFirstID('Chekochuk'),
41-
MOVAMUQ = GetFirstID('Movamuq'),
42-
SWIPOSTIK = GetFirstID('Swipostik'),
43-
TRIKOTRAK = GetFirstID('Trikotrak'),
44-
HUME_AUTOMATON = GetFirstID('Hume_Automaton'),
38+
BUGBBY = GetFirstID('Bugbby'),
39+
BUGBOY = GetFirstID('Bugboy'),
40+
CHEKOCHUK = GetFirstID('Chekochuk'),
41+
HUME_AUTOMATON = GetFirstID('Hume_Automaton'),
42+
MOBLIN_FANTOCCINIMAN = GetFirstID('Moblin_Fantocciniman'),
43+
MOVAMUQ = GetFirstID('Movamuq'),
44+
SWIPOSTIK = GetFirstID('Swipostik'),
45+
TRIKOTRAK = GetFirstID('Trikotrak'),
4546
},
4647
npc =
4748
{

0 commit comments

Comments
 (0)