1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-20 19:57:46 +00:00
project-meteor-server/data/scripts/commands/EquipCommand.lua
yogurt b8d6a943aa Combat changes and bug fixes
Added the combo and proc systems
Added scripts for most weaponskill and spells as well as some abilities and status effects
Added support for multihit attacks
Added AbilityState for abilities
Added hiteffects that change based on an attack's parameters
Added positionals

Changed how targeting works for battlecommands

Fixed bug that occurred when moving or swapping hotbar commands
Fixed bug that occurred when losing status effects
2018-02-15 13:20:46 -06:00

214 lines
8 KiB
Lua

--[[
EquipCommand Script
Notes:
Gearset activating could be optimized a bit more by doing the item packets in one go.
The param "invActionInfo" has the vars: actorId, unknown, slot, and inventoryType.
The param "itemDBIds" has the vars: item1 and item2.
--]]
EQUIPSLOT_MAINHAND = 0;
EQUIPSLOT_OFFHAND = 1;
EQUIPSLOT_THROWINGWEAPON = 4;
EQUIPSLOT_PACK = 5;
EQUIPSLOT_POUCH = 6;
EQUIPSLOT_HEAD = 8;
EQUIPSLOT_UNDERSHIRT = 9;
EQUIPSLOT_BODY = 10;
EQUIPSLOT_UNDERGARMENT = 11;
EQUIPSLOT_LEGS = 12;
EQUIPSLOT_HANDS = 13;
EQUIPSLOT_FEET = 14;
EQUIPSLOT_WAIST = 15;
EQUIPSLOT_NECK = 16;
EQUIPSLOT_EARS = 17;
EQUIPSLOT_WRIST = 19;
EQUIPSLOT_RFINGER = 21;
EQUIPSLOT_LFINGER = 22;
GRAPHICSLOT_MAINHAND = 5;
GRAPHICSLOT_OFFHAND = 6;
GRAPHICSLOT_SPMAINHAND = 7;
GRAPHICSLOT_SPOFFHAND = 8;
GRAPHICSLOT_THROWING = 9;
GRAPHICSLOT_PACK = 10;
GRAPHICSLOT_POUCH = 11;
GRAPHICSLOT_HEAD = 12;
GRAPHICSLOT_BODY = 13;
GRAPHICSLOT_LEGS = 14;
GRAPHICSLOT_HANDS = 15;
GRAPHICSLOT_FEET = 16;
GRAPHICSLOT_WAIST = 17;
GRAPHICSLOT_NECK = 18;
GRAPHICSLOT_R_EAR = 19;
GRAPHICSLOT_L_EAR = 20;
GRAPHICSLOT_R_WRIST = 21;
GRAPHICSLOT_L_WRIST = 22;
GRAPHICSLOT_R_RINGFINGER = 23;
GRAPHICSLOT_L_RINGFINGER = 24;
GRAPHICSLOT_R_INDEXFINGER = 25;
GRAPHICSLOT_L_INDEXFINGER = 26;
function onEventStarted(player, actor, triggerName, invActionInfo, param1, param2, param3, param4, param5, param6, param7, equipSlot, itemDBIds)
equipSlot = equipSlot-1;
--Equip Item
if (invActionInfo ~= nil) then
item = player:GetInventory(0):GetItemBySlot(invActionInfo.slot);
equipItem(player, equipSlot, item);
player:SendAppearance();
--Unequip Item
else
item = player:GetEquipment():GetItemAtSlot(equipSlot);
if (unequipItem(player, equipSlot, item) == true) then --Returns true only if something changed (didn't error out)
player:SendAppearance();
end
end
player:EndEvent();
end
function loadGearset(player, classId)
player:GetEquipment():ToggleDBWrite(false);
local gearset = player:GetGearset(classId);
if gearset == nil then
return;
end
for slot = 0, 34 do
if (slot ~= EQUIPSLOT_MAINHAND and slot ~= EQUIPSLOT_UNDERSHIRT and slot ~= EQUIPSLOT_UNDERGARMENT) then
itemAtSlot = player:GetEquipment():GetItemAtSlot(slot);
itemAtGearsetSlot = gearset[slot];
if (itemAtSlot ~= nil or itemAtGearsetSlot ~= nil) then
if (itemAtSlot ~= nil and itemAtGearsetSlot == nil) then
unequipItem(player, slot, itemAtSlot);
elseif (itemAtSlot == nil and itemAtGearsetSlot ~= nil) then
equipItem(player, slot, itemAtGearsetSlot);
elseif (itemAtGearsetSlot.uniqueId ~= itemAtSlot.uniqueId) then
unequipItem(player, slot, itemAtSlot);
equipItem(player, slot, itemAtGearsetSlot)
end
end
end
end
player:GetEquipment():ToggleDBWrite(true);
end
function equipItem(player, equipSlot, item)
if (item ~= nil) then
local classId = nil;
local worldMaster = GetWorldMaster();
local gItem = GetItemGamedata(item.itemId);
--If it's the mainhand, begin class change based on weapon
if (equipSlot == EQUIPSLOT_MAINHAND) then
if (gItem:IsNailWeapon()) then classId = 2;
elseif (gItem:IsSwordWeapon()) then classId = 3;
elseif (gItem:IsAxeWeapon()) then classId = 4;
elseif (gItem:IsBowWeapon()) then classId = 7;
elseif (gItem:IsLanceWeapon()) then classId = 8;
elseif (gItem:IsThaumaturgeWeapon()) then classId = 22;
elseif (gItem:IsConjurerWeapon()) then classId = 23;
elseif (gItem:IsCarpenterWeapon()) then classId = 29;
elseif (gItem:IsBlackSmithWeapon()) then classId = 30;
elseif (gItem:IsArmorerWeapon()) then classId = 31;
elseif (gItem:IsGoldSmithWeapon()) then classId = 32;
elseif (gItem:IsTannerWeapon()) then classId = 33;
elseif (gItem:IsWeaverWeapon()) then classId = 34;
elseif (gItem:IsAlchemistWeapon()) then classId = 35;
elseif (gItem:IsCulinarianWeapon()) then classId = 36;
elseif (gItem:IsMinerWeapon()) then classId = 39;
elseif (gItem:IsBotanistWeapon()) then classId = 40;
elseif (gItem:IsFishingWeapon()) then classId = 41;
end
if (classId ~= nil) then
player:SendGameMessage(player, worldMaster, 30103, 0x20, 0, 0, player, classId);
player:PrepareClassChange(classId);
end
end
--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;
elseif (equipSlot == EQUIPSLOT_OFFHAND) then graphicSlot = GRAPHICSLOT_OFFHAND;
elseif (equipSlot == EQUIPSLOT_THROWINGWEAPON) then graphicSlot = GRAPHICSLOT_THROWING;
elseif (equipSlot == EQUIPSLOT_PACK) then graphicSlot = GRAPHICSLOT_PACK;
elseif (equipSlot == EQUIPSLOT_HEAD) then graphicSlot = GRAPHICSLOT_HEAD;
elseif (equipSlot == EQUIPSLOT_BODY) then graphicSlot = GRAPHICSLOT_BODY;
elseif (equipSlot == EQUIPSLOT_LEGS) then graphicSlot = GRAPHICSLOT_LEGS;
elseif (equipSlot == EQUIPSLOT_HANDS) then graphicSlot = GRAPHICSLOT_HANDS;
elseif (equipSlot == EQUIPSLOT_FEET) then graphicSlot = GRAPHICSLOT_FEET;
elseif (equipSlot == EQUIPSLOT_WAIST) then graphicSlot = GRAPHICSLOT_WAIST;
elseif (equipSlot == EQUIPSLOT_RFINGER) then graphicSlot = GRAPHICSLOT_RFINGER;
elseif (equipSlot == EQUIPSLOT_LFINGER) then graphicSlot = GRAPHICSLOT_LFINGER;
end
--Graphic Slot was set, otherwise it's a special case
if (graphicSlot ~= nil) then
player:GraphicChange(graphicSlot, item);
elseif (gItem:IsNailWeapon()) then
player:GraphicChange(GRAPHICSLOT_MAINHAND, item);
player:GraphicChange(GRAPHICSLOT_OFFHAND, item);
elseif (equipSlot == EQUIPSLOT_EARS) then
player:GraphicChange(GRAPHICSLOT_R_EAR, item);
player:GraphicChange(GRAPHICSLOT_L_EAR, item);
end
end
end
function unequipItem(player, equipSlot, item)
worldMaster = GetWorldMaster();
if (item ~= nil and (equipSlot == EQUIPSLOT_MAINHAND or equipSlot == EQUIPSLOT_UNDERSHIRT or equipSlot == EQUIPSLOT_UNDERGARMENT)) then
player:SendGameMessage(player, worldMaster, 30730, 0x20, equipSlot+1, item.itemId, item.quality, 0, 0, 1); --Unable to unequip
elseif (item ~= nil) then
player:SendGameMessage(player, worldMaster, 30602, 0x20, equipSlot+1, item.itemId, item.quality, 0, 0, 1); --Item Removed
player:GetEquipment():Unequip(equipSlot);
if (equipSlot == EQUIPSLOT_BODY) then --Show Undershirt
item = player:GetEquipment():GetItemAtSlot(EQUIPSLOT_UNDERSHIRT);
player:GraphicChange(GRAPHICSLOT_BODY, item);
elseif (equipSlot == EQUIPSLOT_LEGS) then --Show Undergarment
item = player:GetEquipment():GetItemAtSlot(EQUIPSLOT_UNDERGARMENT);
player:GraphicChange(GRAPHICSLOT_LEGS, item);
elseif (equipSlot == EQUIPSLOT_HANDS) then player:GraphicChange(15, 0, 1, 0, 0);
elseif (equipSlot == EQUIPSLOT_FEET) then player:GraphicChange(16, 0, 1, 0, 0);
else
if (equipSlot == EQUIPSLOT_MAINHAND) then player:GraphicChange(GRAPHICSLOT_MAINHAND, nil);
elseif (equipSlot == EQUIPSLOT_OFFHAND) then player:GraphicChange(GRAPHICSLOT_OFFHAND, nil);
elseif (equipSlot == EQUIPSLOT_THROWINGWEAPON) then player:GraphicChange(GRAPHICSLOT_THROWING, nil);
elseif (equipSlot == EQUIPSLOT_PACK) then player:GraphicChange(GRAPHICSLOT_PACK, nil);
elseif (equipSlot == EQUIPSLOT_HEAD) then player:GraphicChange(GRAPHICSLOT_HEAD, nil);
elseif (equipSlot == EQUIPSLOT_WAIST) then player:GraphicChange(GRAPHICSLOT_WAIST, nil);
elseif (equipSlot == EQUIPSLOT_EARS) then player:GraphicChange(GRAPHICSLOT_L_EAR, nil); player:GraphicChange(GRAPHICSLOT_R_EAR, nil);
elseif (equipSlot == EQUIPSLOT_RFINGER) then player:GraphicChange(GRAPHICSLOT_RFINGER, nil);
elseif (equipSlot == EQUIPSLOT_LFINGER) then player:GraphicChange(GRAPHICSLOT_LFINGER, nil);
end
end
return true;
end
end