173 lines
4.1 KiB
Lua
173 lines
4.1 KiB
Lua
local UUID = require ('UUID')
|
|
local Position = require ('Position')
|
|
local Event = require ('Event')
|
|
local ObjectiveType = require('ObjectiveType')
|
|
|
|
local Monster = {}
|
|
|
|
function Monster.CreateWithVnum(vnum)
|
|
local monster =
|
|
{
|
|
Id = UUID.Generate(),
|
|
Vnum = vnum,
|
|
Position = Position.At(0, 0),
|
|
CanMove = true,
|
|
IsBoss = false,
|
|
IsTarget = false,
|
|
IsRandomPosition = false,
|
|
SpawnAfterTask = false,
|
|
SpawnAfterMobs = 0,
|
|
GoToBossPosition = Position.At(0, 0),
|
|
Drop = {},
|
|
Events = {},
|
|
Direction = 2,
|
|
CustomLevel = nil,
|
|
AtAroundMobId = nil,
|
|
AtAroundMobRange = nil,
|
|
Waypoints = {}
|
|
}
|
|
|
|
function monster.At(x, y)
|
|
monster.Position = Position.At(x, y)
|
|
return monster
|
|
end
|
|
|
|
function monster.Facing(dir)
|
|
monster.Direction = dir
|
|
return monster
|
|
end
|
|
|
|
function monster.FacingRandom()
|
|
monster.Direction = math.random(0, 7) -- semi-random, will reroll on script reload
|
|
return monster
|
|
end
|
|
|
|
function monster.WithCustomLevel(level)
|
|
monster.CustomLevel = level
|
|
return monster
|
|
end
|
|
|
|
function monster.AtRandomPosition()
|
|
monster.IsRandomPosition = true
|
|
return monster
|
|
end
|
|
|
|
local function AddEvent(trigger, event)
|
|
local events = monster.Events[trigger];
|
|
if (events == nil) then
|
|
events = {}
|
|
monster.Events[trigger] = events
|
|
end
|
|
|
|
table.insert(events, event)
|
|
|
|
return monster
|
|
end
|
|
|
|
function monster.OnDeath(events) -- "0"%
|
|
for k,v in pairs(events) do
|
|
AddEvent("OnDeath", v)
|
|
end
|
|
return monster
|
|
end
|
|
|
|
function monster.OnQuarterHp(events) -- 25%
|
|
for k,v in pairs(events) do
|
|
AddEvent("OnQuarterHp", v)
|
|
end
|
|
return monster
|
|
end
|
|
|
|
function monster.OnHalfHp(events) -- 50%
|
|
for k,v in pairs(events) do
|
|
AddEvent("OnHalfHp", v)
|
|
end
|
|
return monster
|
|
end
|
|
|
|
function monster.OnThreeFourthsHp(events) -- 75%
|
|
for k,v in pairs(events) do
|
|
AddEvent("OnThreeFourthsHp", v)
|
|
end
|
|
return monster
|
|
end
|
|
|
|
function monster.AsBoss()
|
|
monster.IsBoss = true
|
|
monster.IsTarget = true
|
|
monster.OnDeath({Event.IncreaseObjective(ObjectiveType.Monster)});
|
|
return monster
|
|
end
|
|
|
|
function monster.WithHpMultiplier(hpMultiplier)
|
|
monster.HpMultiplier = hpMultiplier
|
|
return monster
|
|
end
|
|
|
|
function monster.WithMpMultiplier(mpMultiplier)
|
|
monster.MpMultiplier = mpMultiplier
|
|
return monster
|
|
end
|
|
|
|
function monster.WithHpMpMultiplier(multiplier)
|
|
monster.HpMultiplier = multiplier
|
|
monster.MpMultiplier = multiplier
|
|
return monster
|
|
end
|
|
|
|
function monster.AsDungeonBoss()
|
|
monster.IsBoss = true
|
|
return monster
|
|
end
|
|
|
|
function monster.SpawnAfterTaskStart()
|
|
monster.SpawnAfterTask = true
|
|
return monster
|
|
end
|
|
|
|
function monster.SpawnAfterMobsKilled(amount)
|
|
monster.SpawnAfterMobs = amount
|
|
return monster
|
|
end
|
|
|
|
function monster.AsObjective()
|
|
monster.IsTarget = true
|
|
monster.OnDeath({Event.IncreaseObjective(ObjectiveType.Monster)});
|
|
return monster
|
|
end
|
|
|
|
function monster.AsTarget()
|
|
monster.IsTarget = true
|
|
return monster
|
|
end
|
|
|
|
function monster.WithMoveToPosition(x, y)
|
|
monster.GoToBossPosition = Position.At(x, y)
|
|
return monster
|
|
end
|
|
|
|
function monster.AddDrop(drop)
|
|
for k,v in pairs(drop) do
|
|
table.insert(monster.Drop, v)
|
|
end
|
|
|
|
return monster
|
|
end
|
|
|
|
function monster.AtAroundMob(mob, range)
|
|
monster.AtAroundMobId = mob.Id
|
|
monster.AtAroundMobRange = range
|
|
return monster
|
|
end
|
|
|
|
function monster.WithWaypoints(waypoints)
|
|
for k,v in pairs(waypoints) do
|
|
table.insert(monster.Waypoints, v)
|
|
end
|
|
return monster
|
|
end
|
|
|
|
return monster
|
|
end
|
|
|
|
return Monster;
|