mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-20 11:47:48 +00:00
215 lines
8 KiB
Lua
215 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:GetItemPackage(0):GetItemAtSlot(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);
|
|
|
|
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
|
|
|
|
--Load gearset for new class and begin class change
|
|
if (classId ~= nil) then
|
|
loadGearset(player, classId);
|
|
player:DoClassChange(classId);
|
|
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
|