Merge branch 'ai-open' into develop

# Conflicts:
#	FFXIVClassic Lobby Server/Database.cs
#	FFXIVClassic Map Server/Database.cs
#	FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
#	FFXIVClassic Map Server/actors/chara/player/Inventory.cs
#	FFXIVClassic Map Server/actors/chara/player/Player.cs
#	FFXIVClassic Map Server/dataobjects/Session.cs
#	FFXIVClassic World Server/Server.cs
This commit is contained in:
Filip Maj 2019-05-04 20:13:29 -04:00
commit 1e4a1cf263
402 changed files with 20078 additions and 1348 deletions

View file

@ -0,0 +1,19 @@
require ("global")
require ("utils")
--[[
AttackWeaponSkill Script
Finds the correct weaponskill subscript to fire when a weaponskill actor is activated.
--]]
local attackMagicHandlers = {
}
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Ability(command.actorId, targetActor);
player:endEvent();
end

View file

@ -0,0 +1,5 @@
require("global")
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
end

View file

@ -8,15 +8,13 @@ Switches between active and passive mode states
--]]
function onEventStarted(player, command, triggerName)
if (player:GetState() == 0) then
player:ChangeState(2);
elseif (player:GetState() == 2) then
player:ChangeState(0);
function onEventStarted(player, command, triggerName)
if (player.currentMainState == 0x0000) then
player.Engage(0, 0x0002);
elseif (player.currentMainState == 0x0002) then
player.Disengage(0x0000);
end
player:endEvent();
sendSignal("playerActive");
end
end;

View file

@ -0,0 +1,20 @@
require ("global")
require ("utils")
--[[
AttackWeaponSkill Script
Finds the correct weaponskill subscript to fire when a weaponskill actor is activated.
--]]
local attackMagicHandlers = {
}
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Ability(command.actorId, targetActor);
player:endEvent();
end

View file

@ -0,0 +1,19 @@
require ("global")
require ("utils")
--[[
AttackWeaponSkill Script
Finds the correct weaponskill subscript to fire when a weaponskill actor is activated.
--]]
local attackMagicHandlers = {
}
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Cast(command.actorId, targetActor);
player:endEvent();
end;

View file

@ -9,80 +9,6 @@ Finds the correct weaponskill subscript to fire when a weaponskill actor is acti
--]]
local function handlePummel(player, target)
player:SendMessage(0x20, "", "DOING PUMMEL!!!!");
params = {};
params.range = 10.0;
params.recast = 10;
params.hpCost = 0;
params.mpCost = 0;
params.tpCost = 1000;
params.targetType = 2;
params.canCrit = true;
params.animationId = 0x12312312;
end
local function handleSkullSunder(player)
player:SendMessage(0x20, "", "DOING SKULL SUNDER!!!!");
end
local weaponskillHandlers = {
[0xA0F069E6] = handlePummel,
[0xA0F069E7] = nil,
[0xA0F069E8] = nil,
[0xA0F069E9] = nil,
[0xA0F069EA] = nil,
[0xA0F069EB] = nil,
[0xA0F069EC] = nil,
[0xA0F069ED] = nil,
[0xA0F069EE] = nil,
[0xA0F069EF] = nil,
[0xA0F06A0E] = nil,
[0xA0F06A0F] = nil,
[0xA0F06A10] = nil,
[0xA0F06A11] = nil,
[0xA0F06A12] = nil,
[0xA0F06A13] = nil,
[0xA0F06A14] = nil,
[0xA0F06A15] = nil,
[0xA0F06A16] = nil,
[0xA0F06A17] = nil,
[0xA0F06A36] = nil,
[0xA0F06A37] = handleSkullSunder,
[0xA0F06A38] = nil,
[0xA0F06A39] = nil,
[0xA0F06A3A] = nil,
[0xA0F06A3B] = nil,
[0xA0F06A3C] = nil,
[0xA0F06A3D] = nil,
[0xA0F06A3E] = nil,
[0xA0F06A3F] = nil,
[0xA0F06A5C] = nil,
[0xA0F06A5D] = nil,
[0xA0F06A5E] = nil,
[0xA0F06A60] = nil,
[0xA0F06A61] = nil,
[0xA0F06A62] = nil,
[0xA0F06A63] = nil,
[0xA0F06A64] = nil,
[0xA0F06A85] = nil,
[0xA0F06A86] = nil,
[0xA0F06A87] = nil,
[0xA0F06A88] = nil,
[0xA0F06A89] = nil,
[0xA0F06A8A] = nil,
[0xA0F06A8B] = nil,
[0xA0F06A8C] = nil,
[0xA0F06A8D] = nil,
[0xA0F06A8E] = nil,
[0xA0F06A8F] = nil
}
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
--Are they in active mode?
@ -92,27 +18,9 @@ function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, ta
return;
end
--Does the target exist
target = player:getZone():FindActorInArea(targetActor);
if (target == nil) then
player:SendGameMessage(GetWorldMaster(), 30203, 0x20);
player:endEvent();
return;
end
--Are you too far away?
if (getDistanceBetweenActors(player, target) > 7) then
player:SendGameMessage(GetWorldMaster(), 32539, 0x20);
player:endEvent();
return;
end
if (weaponskillHandlers[command.actorId] ~= nil) then
weaponskillHandlers[command.actorId](player);
else
player:SendMessage(0x20, "", "That weaponskill is not implemented yet.");
end
player:endEvent();
end
if not player.aiContainer.IsEngaged() then
player.Engage(targetActor);
end;
player.WeaponSkill(command.actorId, targetActor);
player:endEvent();
end;

View file

@ -0,0 +1,6 @@
function onEventStarted(player, caller, commandRequest, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
player:SetCurrentJob(17);
player:EndEvent();
end

View file

@ -0,0 +1,5 @@
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Cast(command.actorId, targetActor);
player:endEvent();
end

View file

@ -0,0 +1,5 @@
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Cast(command.actorId, targetActor);
player:endEvent();
end

View file

@ -0,0 +1,26 @@
require ("global")
require ("utils")
--[[
AttackWeaponSkill Script
Finds the correct weaponskill subscript to fire when a weaponskill actor is activated.
--]]
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
--Are they in active mode?
if (player:GetState() != 2) then
player:SendGameMessage(GetWorldMaster(), 32503, 0x20);
player:endEvent();
return;
end
if not player.aiContainer.IsEngaged() then
player.Engage(targetActor);
end;
player.WeaponSkill(command.actorId, targetActor);
player:endEvent();
end;

View file

@ -0,0 +1,5 @@
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Cast(command.actorId, targetActor);
player:endEvent();
end

View file

@ -0,0 +1,85 @@
require ("global")
--player: Player that called this command
--equipAbilityWidget: Widget that calls this command
--triggername: Event Starter ?
--slot: Which slot the ability will go into
--commandid: command being equipped
function onEventStarted(player, equipAbilityWidget, triggername, slot, commandid, unkown, arg1, arg2, arg3, arg4, arg5, arg6)
local worldManager = GetWorldManager();
local ability = worldManager:GetBattleCommand(commandid);
--Equip
if (commandid > 0) then
--[[]]
--Can the player equip any more cross class actions
if (player.charaWork.parameterTemp.otherClassAbilityCount[0] >= player.charaWork.parameterTemp.otherClassAbilityCount[1]) then
--"You cannot set any more actions."
player:SendGameMessage(GetWorldMaster(), 30720, 0x20, 0, 0);
player:endEvent();
return;
end
--Is the player high enough level in that class to equip the ability
if (player.charaWork.battleSave.skillLevel[ability.job - 1] < ability.level) then
--"You have not yet acquired that action."
player:SendGameMessage(GetWorldMaster(), 30742, 0x20, 0, 0);
player:endEvent();
return;
end
local oldSlot = player:FindFirstCommandSlotById(commandid);
local isEquipped = oldSlot < player.charaWork.commandBorder + 30;
--If slot is 0, find the first open slot
if (slot == 0) then
--If the ability is already equipped and slot is 0, then it can't be equipped again
--If the slot isn't 0, it's a move or a swap command
if (isEquipped == true) then
--"That action is already set to an action slot."
player:SendGameMessage(GetWorldMaster(), 30719, 0x20, 0);
player:endEvent();
return;
end
slot = player:FindFirstCommandSlotById(0) - player.charaWork.commandBorder;
--If the first open slot is outside the hotbar, then the hotbar is full
if(slot >= 30) then
--"You cannot set any more actions."
player:SendGameMessage(Server.GetWorldManager().GetActor(), 30720, 0x20, 0);
player:endEvent();
return;
end
else
slot = slot - 1;
end
if(isEquipped == true) then
player:SwapAbilities(oldSlot, slot + player.charaWork.commandBorder);
else
local tslot = slot + player.charaWork.commandBorder;
player:EquipAbility(player.GetCurrentClassOrJob(), commandid, tslot, true);
end
--Unequip
elseif (commandid == 0) then
commandid = player.charaWork.command[slot + player.charaWork.commandBorder - 1];
ability = worldManager.GetBattleCommand(commandid);
--Is the ability a part of the player's current class?
--This check isn't correct because of jobs having different ids
local classId = player:GetCurrentClassOrJob();
local jobId = player:ConvertClassIdToJobId(classId);
if(ability.job == classId or ability.job == jobId) then
--"Actions of your current class or job cannot be removed."
player:SendGameMessage(GetWorldMaster(), 30745, 0x20, 0, 0);
elseif (commandid != 0) then
player:UnequipAbility(slot);
end
end
player:endEvent();
end

View file

@ -145,6 +145,12 @@ function equipItem(player, equipSlot, item)
--Item Equipped message
player:SendGameMessage(player, worldMaster, 30601, 0x20, equipSlot+1, item.itemId, item.quality, 0, 0, 1);
--Load gearset for new class and begin class change
if (classId ~= nil) then
loadGearset(player, classId);
player:DoClassChange(classId);
end
player:GetEquipment():Equip(equipSlot, item);
if (equipSlot == EQUIPSLOT_MAINHAND and gItem:IsNailWeapon() == false) then graphicSlot = GRAPHICSLOT_MAINHAND;
@ -170,14 +176,7 @@ function equipItem(player, equipSlot, item)
elseif (equipSlot == EQUIPSLOT_EARS) then
player:GraphicChange(GRAPHICSLOT_R_EAR, item);
player:GraphicChange(GRAPHICSLOT_L_EAR, item);
end
--Load gearset for new class and begin class change
if (classId ~= nil) then
loadGearset(player, classId);
player:DoClassChange(classId);
end
end
end
end

View file

@ -0,0 +1,7 @@
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Cast(command.actorId, targetActor);
player:endEvent();
end

View file

@ -0,0 +1,5 @@
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Cast(command.actorId, targetActor);
player:endEvent();
end

View file

@ -0,0 +1,15 @@
require ("global")
require ("utils")
--[[
AttackWeaponSkill Script
Finds the correct weaponskill subscript to fire when a weaponskill actor is activated.
--]]
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Ability(command.actorId, targetActor);
player:endEvent();
end;

View file

@ -0,0 +1,19 @@
require ("global")
require ("utils")
--[[
AttackWeaponSkill Script
Finds the correct weaponskill subscript to fire when a weaponskill actor is activated.
--]]
local attackMagicHandlers = {
}
function onEventStarted(player, command, triggerName, arg1, arg2, arg3, arg4, targetActor, arg5, arg6, arg7, arg8)
player.Cast(command.actorId, targetActor);
player:endEvent();
end;

View file

@ -91,7 +91,7 @@ function onEventStarted(player, actor, triggerName, isTeleport)
local choice, isInn = callClientFunction(player, "delegateCommand", actor, "eventConfirm", true, false, player:GetHomePointInn(), player:GetHomePoint(), false);
if (choice == 1) then
player:PlayAnimation(0x4000FFB);
player:SendGameMessage(worldMaster, 34104, 0x20);
player:SendGameMessage(worldMaster, 34104, 0x20);
if (isInn) then
--Return to Inn
if (player:GetHomePointInn() == 1) then
@ -107,7 +107,14 @@ function onEventStarted(player, actor, triggerName, isTeleport)
if (destination ~= nil) then
randoPos = getRandomPointInBand(destination[2], destination[4], 3, 5);
rotation = getAngleFacing(randoPos.x, randoPos.y, destination[2], destination[4]);
--bandaid fix for returning while dead, missing things like weakness and the heal number
if (player:GetHP() == 0) then
player:SetHP(player.GetMaxHP());
player:ChangeState(0);
player:PlayAnimation(0x01000066);
end
GetWorldManager():DoZoneChange(player, destination[1], nil, 0, 2, randoPos.x, destination[3], randoPos.y, rotation);
end
end
end

View file

@ -0,0 +1,18 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27164: Swift Aegis Boon
if caster.HasTrait(27164) then
ability.recastTimeMs = ability.recastTimeMs - 15000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,22 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
skill.statusMagnitude = 4;
--27242: Enhanced Barrage: Adds an additional attack to barrage ( 4 -> 5 )
if caster.HasTrait(27242) then
skill.statusMagnitude = 5;
end
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--Only the bard gets the Battle Voice effect
if caster == target then
actionContainer.AddAction(caster.statusEffects.AddStatusForBattleAction(223253, 1, 0, 30));
end
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27205: Enhanced Berserk: Increases the effect of Berserk by 20%
if caster.HasTrait(27205) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27121: Enhanced Blindside
if caster.HasTrait(27121) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,43 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27362: Enhanced Blissful Mind
if caster.HasTrait(27362) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--Blissful Mind
--223228: Blissful Mind
--223242: Fully Blissful Mind
local buff = caster.statusEffects.GetStatusEffectById(223228) or caster.statusEffects.GetStatusEffectById(223242);
--If we have a buff then Blissful Mind removes that buff and restores MP. Otherwise, it adds the Blissful Mind effect
if buff ~= nil then
local amount = buff.GetExtra();
local remAction = caster.statusEffects.RemoveStatusEffectForBattleAction(buff, 30329);
caster.AddMP(amount);
actionContainer.AddMPAction(caster.actorId, 33007, amount);
actionContainer.AddAction(remAction);
else
--Blissful mind takes 25% of CURRENT HP and begins storing MP up to that point, at which point the buff changes to indicate its full
local amount = caster.GetHP() * 0.25;
caster.DelHP(amount);
skill.statusMagnitude = amount;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end
end;

View file

@ -0,0 +1,24 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27283: Enhanced Blood for Blood: Increases damage dealt to enemies by B4B by 25%
if caster.HasTrait(27283) then
ability.statusTier = 2;
end
--27284: Swift Blood for Blood: Reduces recast time of B4B by 15 seconds
if caster.HasTrait(27284) then
ability.recastTimeMs = ability.recastTimeMs - 15000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27202: Swift Bloodbath
if caster.HasTrait(27202) then
ability.recastTimeMs = ability.recastTimeMs - 15000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,18 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27245: Swift Chameleon
if caster.HasTrait(27245) then
ability.recastTimeMs = ability.recastTimeMs - 60000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
target.hateContainer.UpdateHate(caster, -840);
end;

View file

@ -0,0 +1,15 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--8032701: Fighter's Gauntlets: Reduces Collusion cooldown by 10 seconds
if caster.HasItemEquippedInSlot(8032701, 13) then
skill.recastTimeMs = skill.recastTimeMs - 10000;
end
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,24 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--This is for the "Cover" effect the caster receives.
local coverTier = 1
--8032701: Gallant Surcoat: Enhances Cover
if caster.HasItemEquippedInSlot(8032701, 10) then
coverTier = 2;
end
actionContainer.AddAction(caster.statusEffects.AddStatusForBattleAction(223063, coverTier, skill.statusDuration));
--Apply Covered to target
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27320: Swift Dark Seal
if caster.HasTrait(27320) then
ability.recastTimeMs = ability.recastTimeMs - 30000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27244: Enhanced Decoy: Renders Decoy capable of evading melee attacks
if caster.HasTrait(27244) then
ability.statusId = 223238;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,17 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, skill)
return 0;
end;
function onAbilityStart(caster, target, skill)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,20 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--8051401: Gallant Cuisses
if caster.HasItemEquippedInSlot(8051401, 12) then
ability.statusTier = 2;
end
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,16 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,24 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--Need a better way to do this
for i = 223212,223217 do
local remAction = caster.statusEffects.RemoveStatusEffectForBattleAction(i, 30329)
if remAction ~= nil then
actionContainer.AddAction(remAction);
skill.statusTier = 2;
break;
end
end
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,16 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--How to do enmity?
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27203: Enhanced Outmaneuver
if caster.HasTrait(27203) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27321: Enhanced Excruciate: Increases critical rate bonus from Excruciate.
if caster.HasTrait(27321) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27123: Enhanced Featherfoot
if caster.HasTrait(27123) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27124: Enhanced Fists of Earth
if caster.HasTrait(27125) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27124: Enhanced Fists of Fire
if caster.HasTrait(27124) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,27 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27161: Enhanced Flash: Adds Blind effect to flash
if caster.HasTrait(27161) then
ability.statusChance = 1;
end
--27162: Enhanced Flash II: Expands Flash to affect enemies near target
if caster.HasTrait(27162) then
ability.aoeTarget = TargetFindAOEType.Circle;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
action.enmity = 400;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27201: Swift Foresight
if caster.HasTrait(27201) then
ability.recastTimeMs = ability.recastTimeMs - 15000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,28 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27245: Swift Chameleon
if caster.HasTrait(27245) then
ability.recastTimeMs = ability.recastTimeMs - 60000;
end
return 0;
end;
--Get all targets with hate on caster and spread 1140 enmity between them.
function onSkillFinish(caster, target, skill, action, actionContainer)
--[[
local enemies = caster.GetTargetsWithHate()
local enmity = 1140 / enemies.Count
for enemy in enemies do
enemy.hateContainer.updateHate(enmity);
end]]
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27240: Enhanced Hawks Eye
--Increases accuracy gained by 50%. (Hawks Eye normally gives 12.5% of your accuracy, Traited it gives 18.75%)
if caster.HasTrait(27240) then
ability.statusTier = 2
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,17 @@
require("global");
require("ability");
require("modifiers");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--Take off 1/3 of attack delay. Not sure if this is the exact amount HF reduces by
action.statusMagnitude = 0.33 * caster.GetMod(modifiersGlobal.AttackDelay);
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,29 @@
require("global");
require("Ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27280: Enhanced Invigorate: Increases duration of Invigorate by 15 seconds
if caster.HasTrait(27280) then
ability.statusDuration = ability.statusDuration + 15;
end
--Drachen Mail: Increases Invigorate TP tick from 100 to 120.
local magnitude = 100;
--8032704: Drachen Mail
if caster.HasItemEquippedInSlot(8032704, 10) then
magnitude = 120;
end
ability.statusMagnitude = magnitude;
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,17 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27285: Enhanced Keen Flurry: Reduces recast time of WS used during KF by 50%
if caster.HasTrait(27285) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,53 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27282: Enhanced Life Surge: Increases effect of Life Surge by 20%
if caster.HasTrait(27282) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--Need a better way to do this
--223212: Power Surge I
--223213: Power Surge II
--223212: Power Surge III
--No message is sent when PS is removed by Life Surge
caster.statusEffects.RemoveStatusEffect(223212, true);
caster.statusEffects.RemoveStatusEffect(223213, true);
caster.statusEffects.RemoveStatusEffect(223214, true);
--Using this ability moves to the next LS buff
local removeId = 0;
--223215: Life Surge I
--223216: Life Surge II
--223217: Life Surge III
if caster.statusEffects.HasStatusEffect(223215) then
removeId = 223215;
skill.statusId = 223216;
skill.statusTier = 2;
elseif caster.statusEffects.HasStatusEffect(223216) then
removeId = 223216;
skill.statusId = 223217;
skill.statusTier = 3;
elseif caster.statusEffects.HasStatusEffect(223217) then
effect = caster.statusEffects.GetStatusEffectById(223217)
effect.RefreshTime();
skill.statusId = 223217;
end
if not (removeId == 0) then
--caster.statusEffects.RemoveStatusEffect(removeId, true);
caster.statusEffects.ReplaceEffect(caster.statusEffects.GetStatusEffectById(removeId), skill.statusId, skill.statusTier, skill.statusMagnitude, skill.statusDuration);
end
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,20 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--For some reason, light shot's hitNum is always 1 (or 0, idk), even with barrage.
--If you set the hitnum like any other multi-hit WS it will play the animation repeatedly.
action.hitNum = 1;
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27322: Swift Dark Seal
if caster.HasTrait(27322) then
ability.recastTimeMs = ability.recastTimeMs - 30000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27164: Enhanced Outmaneuver
if caster.HasTrait(27164) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27323: Enhanced Parsimony: Increases MP gained from Parsimony by 25%
if caster.HasTrait(27323) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,24 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27281: Enhanced Power Surge: Increases effect of Power Surge by 50%
if caster.HasTrait(27281) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--Need a better way to do this
actionContainer.AddAction(caster.statusEffects.RemoveStatusEffectForBattleAction(223215));
actionContainer.AddAction(caster.statusEffects.RemoveStatusEffectForBattleAction(223216));
actionContainer.AddAction(caster.statusEffects.RemoveStatusEffectForBattleAction(223217));
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,21 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27200: Enhanced Provoke: Adds Attack Down effect to Provoke.
if caster.HasTrait(27200) then
ability.statusChance = 1.0;
end
return 0;
end;
--http://forum.square-enix.com/ffxiv/threads/47393-Tachi-s-Guide-to-Paladin-%28post-1.22b%29
function onSkillFinish(caster, target, skill, action, actionContainer)
action.enmity = 750;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,29 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--QS gives 300 TP by default.
skill.statusMagnitude = 300;
--I'm assuming that with raging strikes, that increases to 500.
--and traited that increases again to 750 (or 450 without RS)
if caster.statusEffects.HasStatusEffect(223221) then
actionContainer.AddAction(caster.statusEffects.RemoveStatusEffectForBattleAction(223221));
skill.statusMagnitude = 500;
end
--27241: Enhanced Quelling Strike: Increases TP gained from QS by 50%
if caster.HasTrait(27241) then
skill.statusMagnitude = skill.statusMagnitude * 1.5;
end
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27243: Enhanced Raging Strike: Increases effect of Raging Strike by 50%
if caster.HasTrait(27241) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27204: Enhanced Rampage
if caster.HasTrait(27204) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,27 @@
require("global");
require("ability");
require("battleutils")
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27163: Enhanced Rampart:Expands rampart to affect party members
if caster.HasTrait(27163) then
ability.aoeType = TargetFindAOEType.Circle;
end
return 0;
end;
--http://forum.square-enix.com/ffxiv/threads/47393-Tachi-s-Guide-to-Paladin-%28post-1.22b%29
--180 enmity per member that has enmity on the current enemy
--Need to figure out enmity system
function onSkillFinish(caster, target, skill, action, actionContainer)
action.enmity = 180;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,15 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27360: Swift Sacred Prism: Reduces recast by 30 seconds
if caster.HasTrait(27360) then
ability.recastTimeMs = ability.recastTimeMs - 30000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,43 @@
require("global");
require("modifiers");
require("utils")
--require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
--http://forum.square-enix.com/ffxiv/threads/51208-2nd-wind-modifier
--The primary modifier for SW is class level.
--There are three other factors that contribute to SW:
-- PGL's SW trait, which increases potency by 25%.
-- A bonus from INT (2INT=1HP)
-- An additional random integer (580 at level 50. +/- 3%)
function onSkillFinish(caster, target, skill, action, actionContainer)
--Base amount seems to be 0.215x^2 - 0.35x + 60
--^ this isn't totally correct
local amount = (0.215 * math.pow(caster.GetLevel(), 2)) - (0.35 * caster.GetLevel()) + 60;
--Heals can vary by up to 3.5%
amount = math.Clamp(amount * (0.965 + (math.random() * 0.07)), 0, 9999);
--PGL gets an INT bonus for Second Wind
if caster.GetClass() == 2 then
amount = amount + caster.GetMod(modifiersGlobal.Intelligence) / 2;
end;
--27120: Enhanced Second Wind
if caster.HasTrait(27120) then
amount = amount * 1.25;
end;
action.amount = amount;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27160: Enhanced Sentinel
if caster.HasTrait(27160) then
ability.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27361: Swift Shroud of Saints
if caster.HasTrait(27361) then
ability.recastTimeMs = ability.recastTimeMs - 60000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--27122: Swift Taunt: Reduces recast time by 15 seconds.
if caster.HasTrait(27121) then
ability.recastTimeMs = ability.recastTimeMs - 15000;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,20 @@
require("global");
require("ability");
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--Is this before or after status is gained?
--Will probably need to switch to a flag for this because it might include more than just these 3 effects.
actionContainer.AddAction(caster.statusEffects.RemoveStatusEffectForBattleAction(228011));
actionContainer.AddAction(caster.statusEffects.RemoveStatusEffectForBattleAction(228013));
actionContainer.AddAction(caster.statusEffects.RemoveStatusEffectForBattleAction(228021));
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,22 @@
require("global");
require("ability");
require("battleutils")
function onAbilityPrepare(caster, target, ability)
return 0;
end;
function onAbilityStart(caster, target, ability)
--8032703: Fighter's Cuirass: Enhances Vengeance
if caster.HasItemEquippedInSlot(8032703, 10) then
skill.statusTier = 2;
end
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,29 @@
require("global");
properties = {
permissions = 0,
parameters = "sss",
description =
[[
Adds target to party
]]
}
function onTrigger(player, argc)
local sender = "[addtoparty] ";
if player then
if player.target then
print("hi")
local id = player.target.actorId
print("hi")
player.currentParty:AddMember(id);
player.target.currentParty = player.currentParty;
print("hi")
else
print(sender.." no target")
end
else
print(sender.." no player");
end;
end;

View file

@ -0,0 +1,29 @@
require("global");
properties = {
permissions = 0,
parameters = "sssss",
description =
[[
Adds experience <qty> to player or <targetname>.
!giveexp <qty> |
!giveexp <qty> <targetname> |
]],
}
function onTrigger(player, argc, commandId, animationId, textId, effectId, amount)
local sender = "[battleaction] ";
if player then
cid = tonumber(commandId) or 0;
aid = tonumber(animationId) or 0;
tid = tonumber(textId) or 0;
print(effectId)
eid = tonumber(effectId) or 0;
amt = tonumber(amount) or 0;
player:DoBattleActionAnimation(cid, aid, tid, eid, amt);
else
print(sender.."unable to add experience, ensure player name is valid.");
end;
end;

View file

@ -0,0 +1,34 @@
require("global");
properties = {
permissions = 0,
parameters = "s",
description =
[[
Equips <commandid> in the first open slot without checking if you can.
!eaction <commandid>
]],
}
function onTrigger(player, argc, commandid)
local sender = "[eaction] ";
print(commandid);
if name then
if lastName then
player = GetWorldManager():GetPCInWorld(name.." "..lastName) or nil;
else
player = GetWorldManager():GetPCInWorld(name) or nil;
end;
end;
if player then
classid = player:GetCurrentClassOrJob();
commandid = tonumber(commandid) or 0;
local added = player:EquipAbilityInFirstOpenSlot(classid, commandid);
else
print(sender.."unable to add command, ensure player name is valid.");
end;
end;

View file

@ -0,0 +1,31 @@
require("global");
require("bit32");
properties = {
permissions = 0,
parameters = "iiii",
description =
[[
effect
]],
}
function onTrigger(player, argc, effectId, magnitude, tick, duration)
local messageId = MESSAGE_TYPE_SYSTEM_ERROR;
local sender = "effect";
if player then
player.AddHP(100000);
player.DelHP(500);
effectId = tonumber(effectId) or 223180;
magnitude = tonumber(magnitude) or 700;
tick = tonumber(tick) or 3;
duration = tonumber(duration) or 360;
while player.statusEffects.HasStatusEffect(effectId) do
player.statusEffects.RemoveStatusEffect(effectId);
end;
player.statusEffects.AddStatusEffect(effectId, magnitude, tick, duration);
end;
end;

View file

@ -0,0 +1,35 @@
require("global");
properties = {
permissions = 0,
parameters = "sss",
description =
[[
Adds experience <qty> to player or <targetname>.
!giveexp <qty> |
!giveexp <qty> <targetname> |
]],
}
function onTrigger(player, argc, qty, name, lastName)
local sender = "[giveexp] ";
if name then
if lastName then
player = GetWorldManager():GetPCInWorld(name.." "..lastName) or nil;
else
player = GetWorldManager():GetPCInWorld(name) or nil;
end;
end;
if player then
currency = 1000001;
qty = tonumber(qty) or 1;
location = INVENTORY_CURRENCY;
actionList = player:AddExp(qty, player.charaWork.parameterSave.state_mainSkill[0], 0);
player:DoBattleAction(0, 0, actionList);
else
print(sender.."unable to add experience, ensure player name is valid.");
end;
end;

View file

@ -21,9 +21,13 @@ function onTrigger(player, argc, slot, wId, eId, vId, cId)
cId = tonumber(cId) or 0;
if player and argc > 0 then
player:GraphicChange(slot, wId, eId, vId, cId);
if argc > 2 then
player:GraphicChange(slot, wId, eId, vId, cId);
player:SendMessage(messageID, sender, string.format("Changing appearance on slot %u", slot));
else
player:GraphicChange(slot, wId);
end
player:SendAppearance();
player:SendMessage(messageID, sender, string.format("Changing appearance on slot %u", slot));
else
player:SendMessage(messageID, sender, "No parameters sent! Usage: "..properties.description);
end;

View file

@ -0,0 +1,25 @@
require("global");
properties = {
permissions = 0,
parameters = "s",
description =
[[
Changes appearance for equipment with given parameters.
!graphic <slot> <wID> <eID> <vID> <vID>
]],
}
function onTrigger(player, argc, appearanceId)
local messageID = MESSAGE_TYPE_SYSTEM_ERROR;
local sender = "[setappearance] ";
app = tonumber(appearanceId) or 0;
player:SendMessage(messageID, sender, string.format("appearance %u", app));
if player and player.target then
player.target.ChangeNpcAppearance(app);
player:SendMessage(messageID, sender, string.format("appearance %u", app));
end;
end;

View file

@ -0,0 +1,21 @@
require("global");
properties = {
permissions = 0,
parameters = "sss",
description =
[[
Adds experience <qty> to player or <targetname>.
!giveexp <qty> |
!giveexp <qty> <targetname> |
]],
}
function onTrigger(player, argc, jobId)
local sender = "[setjob] ";
jobId = tonumber(jobId)
if player then
player:SetCurrentJob(jobId);
end;
end;

View file

@ -0,0 +1,33 @@
require("global");
properties = {
permissions = 0,
parameters = "sss",
description =
[[
Sets player or <targetname>'s maximum hp to <hp> and heals them to full.
!setmaxhp <hp> |
!setmaxhp <hp> <targetname>
]],
}
function onTrigger(player, argc, hp, name, lastName)
local sender = "[setmaxhp] ";
if name then
if lastName then
player = GetWorldManager():GetPCInWorld(name.." "..lastName) or nil;
else
player = GetWorldManager():GetPCInWorld(name) or nil;
end;
end;
if player then
hp = tonumber(hp) or 1;
location = INVENTORY_CURRENCY;
player:hpstuff(hp);
else
print(sender.."unable to add experience, ensure player name is valid.");
end;
end;

View file

@ -0,0 +1,33 @@
require("global");
properties = {
permissions = 0,
parameters = "sss",
description =
[[
Sets player or <targetname>'s maximum hp to <hp> and heals them to full.
!setmaxhp <hp> |
!setmaxhp <hp> <targetname>
]],
}
function onTrigger(player, argc, hp, name, lastName)
local sender = "[setmaxhp] ";
if name then
if lastName then
player = GetWorldManager():GetPCInWorld(name.." "..lastName) or nil;
else
player = GetWorldManager():GetPCInWorld(name) or nil;
end;
end;
if player then
hp = tonumber(hp) or 1;
location = INVENTORY_CURRENCY;
player:hpstuff(hp);
else
print(sender.."unable to add experience, ensure player name is valid.");
end;
end;

View file

@ -0,0 +1,18 @@
require("global");
properties = {
permissions = 0,
parameters = "ss",
description =
[[
Sets a modifier of player
!setmod <modId> <modVal> |
]],
}
function onTrigger(player, argc, modId, modVal)
local sender = "[setmod] ";
local mod = tonumber(modId)
local val = tonumber(modVal)
player:SetMod(mod, val);
end;

View file

@ -0,0 +1,18 @@
require("global");
properties = {
permissions = 0,
parameters = "sss",
description =
[[
Adds experience <qty> to player or <targetname>.
!giveexp <qty> |
!giveexp <qty> <targetname> |
]],
}
function onTrigger(player, argc, procid)
local sender = "[giveexp] ";
local pid = tonumber(procid)
player:SetProc(pid, true);
end;

View file

@ -0,0 +1,24 @@
require("global");
properties = {
permissions = 0,
parameters = "s",
description =
[[
Changes appearance for equipment with given parameters.
!graphic <slot> <wID> <eID> <vID> <vID>
]],
}
function onTrigger(player, argc, size)
local messageID = MESSAGE_TYPE_SYSTEM_ERROR;
local sender = "[setappearance] ";
s = tonumber(size) or 0;
if player and player.target then
player.target.appearanceIds[0] = s;
player.target.zone.BroadcastPacketAroundActor(player.target, player.target.CreateAppearancePacket());
end;
end;

View file

@ -0,0 +1,24 @@
require("global");
properties = {
permissions = 0,
parameters = "s",
description =
[[
Changes appearance for equipment with given parameters.
!graphic <slot> <wID> <eID> <vID> <vID>
]],
}
function onTrigger(player, argc, state)
local messageID = MESSAGE_TYPE_SYSTEM_ERROR;
local sender = "[setstate] ";
local s = tonumber(state);
local actor = GetWorldManager():GetActorInWorld(player.currentTarget) or nil;
if player and actor then
actor:ChangeState(s);
wait(0.8);
player:SendMessage(0x20, "", "state: "..s);
end;
end;

View file

@ -0,0 +1,27 @@
require("global");
properties = {
permissions = 0,
parameters = "sss",
description =
[[
Sets player or <targetname>'s maximum tp to <tp> and heals them to full.
!setmaxtp <tp> |
!setmaxtp <tp> <targetname>
]],
}
function onTrigger(player, argc, tp)
local sender = "[setmaxtp] ";
if player then
tp = tonumber(tp) or 0;
location = INVENTORY_CURRENCY;
player:SetTP(tp);
else
print(sender.."unable to add experience, ensure player name is valid.");
end;
end;

View file

@ -6,7 +6,7 @@ properties = {
description = "Spawns a actor",
}
function onTrigger(player, argc, actorClassId)
function onTrigger(player, argc, actorClassId, width, height)
if (actorClassId == nil) then
player:SendMessage(0x20, "", "No actor class id provided.");
@ -24,7 +24,16 @@ function onTrigger(player, argc, actorClassId)
if (actorClassId ~= nil) then
zone = player:GetZone();
actor = zone:SpawnActor(actorClassId, "test", pos[0], pos[1], pos[2], pos[3]);
local w = tonumber(width) or 0;
local h = tonumber(height) or 0;
printf("%f %f %f", x, y, z);
--local x, y, z = player.GetPos();
for i = 0, w do
for j = 0, h do
actor = zone:SpawnActor(actorClassId, "test", pos[0] + (i - (w / 2) * 3), pos[1], pos[2] + (j - (h / 2) * 3), pos[3]);
actor.SetAppearance(1001149)
end
end
end
if (actor == nil) then

View file

@ -0,0 +1,192 @@
require("global");
require("modifiers");
properties = {
permissions = 0,
parameters = "ssss",
description =
[[
yolo
]],
}
local quests =
{
[111807] = { level = 25, weight = 4, rewardexp = 1080 },
[110868] = { level = 50, weight = 4, rewardexp = 4400 },
[111603] = { level = 22, weight = 5, rewardexp = 1100 },
[111602] = { level = 22, weight = 5, rewardexp = 1100 },
[111420] = { level = 45, weight = 5, rewardexp = 4450 },
[110811] = { level = 18, weight = 6, rewardexp = 780 },
[110814] = { level = 18, weight = 6, rewardexp = 780 },
[110707] = { level = 25, weight = 6, rewardexp = 1620 },
[110682] = { level = 34, weight = 6, rewardexp = 3180 },
[111202] = { level = 35, weight = 6, rewardexp = 3360 },
[111222] = { level = 35, weight = 6, rewardexp = 3360 },
[111302] = { level = 35, weight = 6, rewardexp = 3360 },
[111223] = { level = 40, weight = 6, rewardexp = 4260 },
[110819] = { level = 45, weight = 6, rewardexp = 5340 },
[111224] = { level = 45, weight = 6, rewardexp = 5340 },
[111225] = { level = 45, weight = 6, rewardexp = 5340 },
[110867] = { level = 45, weight = 6, rewardexp = 5340 },
[110869] = { level = 45, weight = 6, rewardexp = 5340 },
[110708] = { level = 45, weight = 6, rewardexp = 5340 },
[110627] = { level = 45, weight = 6, rewardexp = 5340 },
[111434] = { level = 50, weight = 6, rewardexp = 6600 },
[110850] = { level = 1, weight = 7, rewardexp = 40 },
[110851] = { level = 1, weight = 7, rewardexp = 40 },
[110841] = { level = 20, weight = 7, rewardexp = 1120 },
[110642] = { level = 20, weight = 7, rewardexp = 1120 },
[110840] = { level = 20, weight = 7, rewardexp = 1120 },
[110727] = { level = 21, weight = 7, rewardexp = 1401 },
[111221] = { level = 30, weight = 7, rewardexp = 2661 },
[111241] = { level = 30, weight = 7, rewardexp = 2661 },
[110687] = { level = 28, weight = 9, rewardexp = 2970 },
[110016] = { level = 34, weight = 50, rewardexp = 26500 },
[110017] = { level = 38, weight = 50, rewardexp = 32500 },
[110019] = { level = 46, weight = 50, rewardexp = 46000 }
};
local expTable = {
570, -- 1
700,
880,
1100,
1500,
1800,
2300,
3200,
4300,
5000, -- 10
5900,
6800,
7700,
8700,
9700,
11000,
12000,
13000,
15000,
16000, -- 20
20000,
22000,
23000,
25000,
27000,
29000,
31000,
33000,
35000,
38000, -- 30
45000,
47000,
50000,
53000,
56000,
59000,
62000,
65000,
68000,
71000, -- 40
74000,
78000,
81000,
85000,
89000,
92000,
96000,
100000,
100000,
110000 -- 50
};
local commandCost = {
["raise"] = 150,
["cure"] = 40,
["cura"] = 100,
["curaga"] = 150,
};
-- stone: (1, 9) (5, 12) (10, )
-- cure: (1, 5) (5, 6) (10, )
-- aero: (1, 9) (5, 12) (10, )
-- protect: (1, 9) (5, 12) (10, )
--[[
function onTrigger(player, argc, id, level, weight)
id = tonumber(id) or 111807;
level = tonumber(level) or quests[id].level;
weight = tonumber(weight) or quests[id].weight;
local messageId = MESSAGE_TYPE_SYSTEM_ERROR;
local sender = "yolo";
if id == 1 then
return
end
local message = calcSkillPoint(player, level, weight);
if player then
player.SendMessage(messageId, sender, string.format("calculated %s | expected %s", message, quests[id].rewardexp));
end;
printf("calculated %s | expected %s", message, quests[id].rewardexp);
end;
]]
function onTrigger(player, argc, width, height, blockCount)
local messageId = MESSAGE_TYPE_SYSTEM_ERROR;
local sender = "yolo";
if player then
if false then
local effectId = 223004;
player.statusEffects.RemoveStatusEffect(effectId);
player.statusEffects.AddStatusEffect(effectId, 1, 0, 5);
return;
end;
local pos = player:GetPos();
local x = tonumber(pos[0]);
local y = tonumber(pos[1]);
local z = tonumber(pos[2]);
local rot = tonumber(pos[3]);
local zone = pos[4];
local w = tonumber(width) or 0;
local h = tonumber(height) or 0;
local blocks = tonumber(blockCount) or 0;
printf("%f %f %f", x, y, z);
--local x, y, z = player.GetPos();
for b = 0, blocks do
for i = 0, w do
for j = 0, h do
local actor = player.GetZone().SpawnActor(2104001, 'ass', x + (i * 1), y, z + (j * 1), rot, 0, 0, true);
actor.ChangeNpcAppearance(2200905);
actor.SetMaxHP(5000);
actor.SetHP(5000);
actor.SetMod(modifiersGlobal.HasShield, 1);
actor.SetMod(modifiersGlobal.AttackRange, 3);
actor.SetMod(modifiersGlobal.Speed, 5);
actor.SetMobMod(mobModifiersGlobal.Roams, 1);
actor.SetMobMod(mobModifiersGlobal.RoamDelay, 3);
actor.moveState = 3;
end
end
x = x + 500
end
return;
end
end;
function calculateCommandCost(player, skillName, level)
if skillName and level and commandCost[skillName] then
return math.ceil((8000 + (level - 70) * 500) * (commandCost[skillName] * 0.001));
end;
return 1;
end
function calcSkillPoint(player, lvl, weight)
weight = weight / 100
return math.ceil(expTable[lvl] * weight)
end

View file

@ -0,0 +1,19 @@
require("global");
properties = {
permissions = 0,
parameters = "",
description =
[[
Get the amount of actors in this zone.
!zonecount
]]
}
function onTrigger(player, argc)
local message = tostring(player.zone.GetAllActors().Count);
player.SendMessage(0x20, "", message);
end

View file

@ -0,0 +1,22 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--calculate damage
action.amount = skill.basePotency;
action.statusMagnitude = 15;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
--Try to apply status effect
action.TryStatus(caster, target, skill, actionContainer, true);
end;

View file

@ -0,0 +1,33 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
--Increased damage and conversion to single target
function onCombo(caster, target, spell)
spell.aoeType = 0;
spell.potency = spell.potency * 1.5;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--Dispels an effect on each target.
local effects = target.statusEffects.GetStatusEffectsByFlag2(16); --lose on dispel
if effects != nil then
target.statusEffects.RemoveStatusEffect(effects[0]);
end;
--calculate damage
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
--Try to apply status effect
action.TryStatus(caster, target, skill, actionContainer, true);
end;

View file

@ -0,0 +1,57 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, skill)
return 0;
end;
function onMagicStart(caster, target, skill)
--Ballad gives 20 MP a tick at 50
--BV gives 40 MP per tick
--Formula seems to be 0.8 * level - 20, not sure why BV gives 71 at 50 then
local mpPerTick = (0.8 * caster.GetLevel()) - 20;
--8032705: Choral Shirt: Enhances Ballad of Magi
--With Choral Shirt, Ballad gives 26 mp a tick. It could be a flat 6 or multiply by 1.3
--Because minuet seemed like a normal addition I'm assuming this is too
if caster.HasItemEquippedInSlot(8032705, 10) then
mpPerTick = mpPerTick + 6;
end
--223253: Battle Voice
--Battle Voice doubles effect of songs
if caster.statusEffects.HasStatusEffect(223253) then
mpPerTick = mpPerTick * 2;
--Set status tier so we can check it later when BV falls off
skill.statusTier = 2;
end
skill.statusMagnitude = mpPerTick;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--223224: Swiftsong
--223255: Paeon of War
--223256: Minuet of Rigor
--
local oldSong;
local swiftSong = target.statusEffects.GetStatusEffectById(223224);
local paeon = target.statusEffects.GetStatusEffectById(223255);
local minuet = target.statusEffects.GetStatusEffectById(223256);
if swiftSong and swiftSong.GetSource() == caster then
oldSong = swiftSong;
elseif paeon and paeon.GetSource() == caster then
oldSong = paeon;
elseif minuet and minuet.GetSource() == caster then
oldSong = minuet;
elseif ballad and ballad.GetSource() == caster then
oldSong = ballad;
end
if oldSong then
target.statusEffects.RemoveStatusEffect(oldSong);
end
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,21 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--calculate damage
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
--Try to apply status effect
action.TryStatus(caster, target, skill, actionContainer, true);
end;

View file

@ -0,0 +1,20 @@
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--calculate damage
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
--Try to apply status effect
action.TryStatus(caster, target, skill, actionContainer, true);
end;

View file

@ -0,0 +1,26 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
--Increased damage with lesser current hp
function onCombo(caster, target, spell)
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--calculate damage
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
--Try to apply status effect
action.TryStatus(caster, target, skill, actionContainer, true);
end;

View file

@ -0,0 +1,21 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--http://forum.square-enix.com/ffxiv/threads/41900-White-Mage-A-Guide
--2.5 HP per Healing Magic Potency
--0.5 HP per MND
--this is WITH WHM AF chest, don't know formula without AF. AF seems to increase healing by 7-10%?
action.amount = 2.5 * caster.GetMod(modifiersGlobal.MagicHeal) + 0.5 * (caster.GetMod(modifiersGlobal.Mind));
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,19 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
--Idea: add way to sort list of targets by hp here?
function onMagicStart(caster, target, spell)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--calculate damage
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,37 @@
require("global");
require("magic");
require("modifiers");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
--http://forum.square-enix.com/ffxiv/threads/41900-White-Mage-A-Guide
function onSkillFinish(caster, target, skill, action, actionContainer)
--Non-CNJ
--1.10 per HMP
--0 per MND
local hpPerHMP = 1.10;
local hpPerMND = 0;
--CNJ
--With AF:
--1.25 HP per Healing Magic Potency
--0.25 HP per MND
--This is WITH AF chest. Without is lower. AF is ~7-10% increase apparently
--I'm guessing without AF hpPerHMP will be 1.1?
if (caster.GetClass() == 23) then
hpPerHMP = 1.25;
hpPerMND = 0.25;
end
action.amount = hpPerHMP * caster.GetMod(modifiersGlobal.MagicHeal) + hpPerMND * (caster.GetMod(modifiersGlobal.Mind));
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,21 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--calculate damage
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
--Try to apply status effect
action.TryStatus(caster, target, skill, actionContainer, true);
end;

View file

@ -0,0 +1,23 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
--Increased Damage and reduced recast time in place of stun
function onCombo(caster, target, spell)
spell.castTimeMs = spell.castTimeMs / 2;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--calculate damage
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,23 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
--Increased critical damage
function onCombo(caster, target, spell)
spell.castTimeMs = spell.castTimeMs / 2;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--calculate damage
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

View file

@ -0,0 +1,18 @@
require("global");
require("magic");
function onMagicPrepare(caster, target, spell)
return 0;
end;
function onMagicStart(caster, target, spell)
return 0;
end;
function onSkillFinish(caster, target, skill, action, actionContainer)
--calculate damage
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end;

Some files were not shown because too many files have changed in this diff Show more