From 20b1ec18a93c1d8e917c7b95397e24b740d9b2f5 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 29 Mar 2020 13:33:27 -0400 Subject: [PATCH] DOH/DOL graphic support. Adding the rest of the missing item graphics for DOH/DOL weapons. Modified the equip script to also set the correct "special" graphics for the workbenches and such. --- Data/scripts/commands/EquipCommand.lua | 35 ++++- Data/sql/gamedata_items_graphics.sql | 180 ++++++++++++++++++++++- Map Server/Actors/Chara/Player/Player.cs | 105 +++++++------ 3 files changed, 267 insertions(+), 53 deletions(-) diff --git a/Data/scripts/commands/EquipCommand.lua b/Data/scripts/commands/EquipCommand.lua index 636f3124..75af2f10 100644 --- a/Data/scripts/commands/EquipCommand.lua +++ b/Data/scripts/commands/EquipCommand.lua @@ -153,6 +153,7 @@ function equipItem(player, equipSlot, item) player:GetEquipment():Set(equipSlot, item); + --EquipSlot -> GraphicSlot 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; @@ -168,12 +169,17 @@ function equipItem(player, equipSlot, item) elseif (equipSlot == EQUIPSLOT_LFINGER) then graphicSlot = GRAPHICSLOT_L_RINGFINGER; end + --Special cases for WVR and GSM. Offhand goes to the special offhand slot. + if (equipSlot == EQUIPSLOT_OFFHAND) then + if (gItem:IsWeaverWeapon() == true) then graphicSlot = GRAPHICSLOT_SPOFFHAND; end + if (gItem:IsGoldSmithWeapon() == true) then graphicSlot = GRAPHICSLOT_SPOFFHAND; end + 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); @@ -181,6 +187,33 @@ function equipItem(player, equipSlot, item) player:GraphicChange(GRAPHICSLOT_R_WRIST, item); player:GraphicChange(GRAPHICSLOT_L_WRIST, item); end + + --Special graphics for crafting classes + if (classId ~= nil) then + if (gItem:IsCarpenterWeapon()) then + player:GraphicChange(GRAPHICSLOT_SPMAINHAND, 898,4,0,0); + player:GraphicChange(GRAPHICSLOT_SPOFFHAND, 898,4,0,0); + elseif (gItem:IsBlackSmithWeapon()) then + player:GraphicChange(GRAPHICSLOT_SPMAINHAND, 899,1,0,0); + player:GraphicChange(GRAPHICSLOT_SPOFFHAND, 899,1,0,0); + elseif (gItem:IsArmorerWeapon()) then + player:GraphicChange(GRAPHICSLOT_SPMAINHAND, 899,2,0,0); + player:GraphicChange(GRAPHICSLOT_SPOFFHAND, 899,2,0,0); + elseif (gItem:IsGoldSmithWeapon()) then + player:GraphicChange(GRAPHICSLOT_SPMAINHAND, 898,1,0,0); + elseif (gItem:IsTannerWeapon()) then + player:GraphicChange(GRAPHICSLOT_SPMAINHAND, 898,3,0,0); + player:GraphicChange(GRAPHICSLOT_SPOFFHAND, 898,3,0,0); + elseif (gItem:IsWeaverWeapon()) then + player:GraphicChange(GRAPHICSLOT_SPMAINHAND, 000,0,0,0); + elseif (gItem:IsAlchemistWeapon()) then + player:GraphicChange(GRAPHICSLOT_SPMAINHAND, 900,1,0,0); + elseif (gItem:IsCulinarianWeapon()) then + player:GraphicChange(GRAPHICSLOT_SPMAINHAND, 900,2,0,0); + player:GraphicChange(GRAPHICSLOT_SPOFFHAND, 898,2,0,0); + end + end + end end diff --git a/Data/sql/gamedata_items_graphics.sql b/Data/sql/gamedata_items_graphics.sql index 7034bb50..a92229d4 100644 --- a/Data/sql/gamedata_items_graphics.sql +++ b/Data/sql/gamedata_items_graphics.sql @@ -11,7 +11,13 @@ /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- Dumping database structure for ffxiv_server +CREATE DATABASE IF NOT EXISTS `ffxiv_server` /*!40100 DEFAULT CHARACTER SET latin1 */; +USE `ffxiv_server`; + -- Dumping structure for table ffxiv_server.gamedata_items_graphics +DROP TABLE IF EXISTS `gamedata_items_graphics`; CREATE TABLE IF NOT EXISTS `gamedata_items_graphics` ( `catalogID` int(10) unsigned NOT NULL, `weaponId` int(10) unsigned NOT NULL, @@ -21,9 +27,9 @@ CREATE TABLE IF NOT EXISTS `gamedata_items_graphics` ( PRIMARY KEY (`catalogID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Dumping data for table ffxiv_server.gamedata_items_graphics: ~3,938 rows (approximately) +-- Dumping data for table ffxiv_server.gamedata_items_graphics: ~4,098 rows (approximately) /*!40000 ALTER TABLE `gamedata_items_graphics` DISABLE KEYS */; -REPLACE INTO `gamedata_items_graphics` (`catalogID`, `weaponId`, `equipmentId`, `variantId`, `colorId`) VALUES +INSERT INTO `gamedata_items_graphics` (`catalogID`, `weaponId`, `equipmentId`, `variantId`, `colorId`) VALUES (3910001, 396, 1, 20, 0), (3910005, 396, 1, 10, 0), (3910006, 396, 2, 30, 0), @@ -634,7 +640,7 @@ REPLACE INTO `gamedata_items_graphics` (`catalogID`, `weaponId`, `equipmentId`, (6020007, 688, 1, 11, 0), (6020008, 688, 1, 1, 0), (6020009, 688, 1, 11, 0), - (6020010, 688, 1, 20, 0), + (6020010, 688, 1, 30, 0), (6020011, 688, 1, 21, 0), (6020012, 688, 1, 2, 0), (6020014, 688, 1, 30, 0), @@ -690,12 +696,113 @@ REPLACE INTO `gamedata_items_graphics` (`catalogID`, `weaponId`, `equipmentId`, (6040015, 718, 2, 10, 0), (6040016, 720, 2, 0, 0), (6041001, 728, 1, 0, 0), - (6041002, 728, 1, 0, 0), - (6041003, 728, 1, 0, 0), - (7010001, 823, 1, 20, 0), + (6041002, 728, 1, 10, 0), + (6041003, 728, 1, 20, 0), + (6041004, 728, 1, 10, 0), + (6041005, 728, 1, 0, 0), + (6041006, 728, 1, 20, 0), + (6041007, 728, 1, 30, 0), + (6041008, 728, 1, 40, 0), + (6050001, 733, 1, 0, 0), + (6050002, 733, 1, 10, 0), + (6050003, 733, 1, 20, 0), + (6050004, 733, 3, 0, 0), + (6050005, 733, 2, 0, 0), + (6050006, 733, 1, 11, 0), + (6050007, 733, 1, 10, 0), + (6050008, 733, 2, 1, 0), + (6050009, 733, 1, 0, 0), + (6050010, 733, 1, 10, 0), + (6050011, 733, 2, 0, 0), + (6050012, 733, 3, 0, 0), + (6050013, 733, 2, 1, 0), + (6050014, 733, 3, 10, 0), + (6050015, 733, 1, 12, 0), + (6050016, 734, 2, 0, 0), + (6051001, 744, 1, 0, 0), + (6051002, 744, 1, 1, 0), + (6051003, 744, 1, 2, 0), + (6051004, 744, 1, 0, 0), + (6051005, 744, 1, 1, 0), + (6051006, 744, 1, 2, 0), + (6051007, 744, 1, 10, 0), + (6051008, 744, 1, 3, 0), + (6060001, 748, 1, 1, 0), + (6060002, 748, 1, 30, 0), + (6060003, 748, 1, 0, 0), + (6060004, 748, 1, 11, 0), + (6060005, 748, 1, 10, 0), + (6060006, 748, 1, 50, 0), + (6060007, 748, 1, 12, 0), + (6060008, 748, 1, 0, 0), + (6060009, 748, 1, 1, 0), + (6060010, 748, 1, 10, 0), + (6060011, 748, 1, 11, 0), + (6060012, 748, 1, 12, 0), + (6060013, 748, 1, 30, 0), + (6060014, 748, 1, 12, 0), + (6060015, 750, 1, 0, 0), + (6061001, 758, 1, 0, 0), + (6061002, 758, 1, 1, 0), + (6061003, 758, 1, 2, 0), + (6061004, 758, 1, 4, 0), + (6061005, 758, 1, 0, 0), + (6061006, 758, 1, 2, 0), + (6061007, 758, 1, 1, 0), + (6061008, 758, 1, 3, 0), + (6061009, 758, 1, 5, 0), + (6070001, 763, 1, 10, 0), + (6070002, 763, 1, 0, 0), + (6070003, 763, 1, 1, 0), + (6070004, 763, 1, 2, 0), + (6070005, 763, 2, 0, 0), + (6070006, 763, 4, 0, 0), + (6070007, 763, 1, 0, 0), + (6070008, 763, 3, 0, 0), + (6070009, 763, 1, 0, 0), + (6070010, 763, 1, 1, 0), + (6070011, 763, 1, 2, 0), + (6070012, 763, 2, 0, 0), + (6070013, 763, 4, 0, 0), + (6070014, 763, 5, 0, 0), + (6070015, 763, 3, 0, 0), + (6070016, 764, 5, 0, 0), + (6071001, 773, 1, 0, 0), + (6071002, 773, 1, 1, 0), + (6071003, 773, 1, 2, 0), + (6071004, 773, 1, 0, 0), + (6071005, 773, 1, 1, 0), + (6071006, 773, 1, 2, 0), + (6071007, 773, 1, 20, 0), + (6071008, 773, 1, 3, 0), + (6080001, 778, 1, 40, 0), + (6080002, 778, 1, 0, 0), + (6080003, 778, 1, 10, 0), + (6080004, 778, 1, 13, 0), + (6080005, 778, 2, 0, 0), + (6080006, 778, 3, 0, 0), + (6080007, 778, 1, 20, 0), + (6080008, 778, 1, 11, 0), + (6080009, 778, 1, 0, 0), + (6080010, 778, 1, 10, 0), + (6080011, 778, 2, 0, 0), + (6080012, 778, 3, 0, 0), + (6080013, 778, 1, 20, 0), + (6080014, 778, 2, 1, 0), + (6080015, 778, 1, 14, 0), + (6080016, 779, 2, 0, 0), + (6081001, 788, 1, 0, 0), + (6081002, 788, 1, 1, 0), + (6081003, 788, 1, 10, 0), + (6081004, 788, 1, 0, 0), + (6081005, 788, 1, 1, 0), + (6081006, 788, 1, 2, 0), + (6081007, 788, 1, 10, 0), + (6081008, 788, 1, 3, 0), + (7010001, 823, 1, 0, 0), (7010002, 823, 1, 1, 0), (7010003, 823, 1, 2, 0), - (7010004, 823, 1, 20, 0), + (7010004, 823, 1, 0, 0), (7010005, 823, 1, 20, 0), (7010006, 823, 2, 0, 0), (7010007, 823, 2, 0, 0), @@ -708,6 +815,65 @@ REPLACE INTO `gamedata_items_graphics` (`catalogID`, `weaponId`, `equipmentId`, (7010015, 823, 2, 0, 0), (7010016, 823, 2, 1, 0), (7010017, 823, 3, 10, 0), + (7010101, 833, 1, 0, 0), + (7010102, 833, 1, 1, 0), + (7010103, 833, 1, 0, 0), + (7010104, 833, 1, 1, 0), + (7010105, 833, 1, 2, 0), + (7010106, 833, 1, 10, 0), + (7010107, 833, 1, 10, 0), + (7010108, 833, 1, 0, 0), + (7010109, 833, 1, 3, 0), + (7020001, 838, 1, 0, 0), + (7020002, 838, 1, 20, 0), + (7020003, 838, 2, 0, 0), + (7020004, 838, 1, 10, 0), + (7020005, 838, 3, 0, 0), + (7020006, 838, 3, 10, 0), + (7020007, 838, 3, 0, 0), + (7020008, 838, 1, 11, 0), + (7020009, 838, 1, 0, 0), + (7020010, 838, 1, 10, 0), + (7020011, 838, 2, 0, 0), + (7020012, 838, 3, 10, 0), + (7020013, 838, 1, 11, 0), + (7020014, 838, 2, 1, 0), + (7020015, 838, 4, 0, 0), + (7020016, 838, 3, 30, 0), + (7020101, 848, 1, 0, 0), + (7020102, 848, 1, 1, 0), + (7020103, 848, 1, 2, 0), + (7020104, 848, 1, 0, 0), + (7020105, 848, 1, 1, 0), + (7020106, 848, 1, 2, 0), + (7020107, 848, 1, 10, 0), + (7020108, 848, 1, 0, 0), + (7020109, 848, 1, 3, 0), + (7030001, 853, 1, 10, 0), + (7030002, 853, 1, 20, 0), + (7030003, 853, 2, 1, 0), + (7030004, 853, 1, 0, 0), + (7030005, 853, 1, 11, 0), + (7030006, 853, 2, 0, 0), + (7030007, 853, 2, 1, 0), + (7030008, 853, 3, 0, 0), + (7030009, 853, 1, 10, 0), + (7030010, 853, 1, 0, 0), + (7030011, 853, 2, 0, 0), + (7030012, 853, 1, 10, 0), + (7030013, 853, 3, 0, 0), + (7030014, 853, 2, 10, 0), + (7030015, 853, 2, 30, 0), + (7030016, 853, 2, 50, 0), + (7030101, 863, 1, 0, 0), + (7030102, 863, 1, 1, 0), + (7030103, 863, 1, 2, 0), + (7030104, 863, 1, 0, 0), + (7030105, 863, 1, 1, 0), + (7030106, 863, 1, 2, 0), + (7030107, 863, 1, 10, 0), + (7030108, 863, 1, 0, 0), + (7030109, 863, 1, 3, 0), (8010001, 0, 3, 0, 0), (8010002, 0, 3, 1, 0), (8010003, 0, 3, 4, 0), diff --git a/Map Server/Actors/Chara/Player/Player.cs b/Map Server/Actors/Chara/Player/Player.cs index 78633c0a..32d124da 100644 --- a/Map Server/Actors/Chara/Player/Player.cs +++ b/Map Server/Actors/Chara/Player/Player.cs @@ -983,6 +983,66 @@ namespace Meteor.Map.Actors } + public void GraphicChange(int slot, InventoryItem invItem) + { + if (invItem == null) + appearanceIds[slot] = 0; + else + { + ItemData item = Server.GetItemGamedata(invItem.itemId); + + if (item is EquipmentItem) + { + EquipmentItem eqItem = (EquipmentItem)item; + + uint mixedVariantId; + + if (eqItem.graphicsWeaponId == 0) + mixedVariantId = ((eqItem.graphicsVariantId & 0x1F) << 5) | eqItem.graphicsColorId; + else + mixedVariantId = eqItem.graphicsVariantId; + + uint graphicId = + (eqItem.graphicsWeaponId & 0x3FF) << 20 | + (eqItem.graphicsEquipmentId & 0x3FF) << 10 | + (mixedVariantId & 0x3FF); + + appearanceIds[slot] = graphicId; + } + + //Handle offhand + if (slot == MAINHAND && item is WeaponItem) + { + WeaponItem wpItem = (WeaponItem)item; + + uint graphicId = + (wpItem.graphicsOffhandWeaponId & 0x3FF) << 20 | + (wpItem.graphicsOffhandEquipmentId & 0x3FF) << 10 | + (wpItem.graphicsOffhandVariantId & 0x3FF); + + if (graphicId != 0) + appearanceIds[SetActorAppearancePacket.OFFHAND] = graphicId; + } + + //Handle ALC offhand special case + if (slot == OFFHAND && item is WeaponItem && item.IsAlchemistWeapon()) + { + WeaponItem wpItem = (WeaponItem)item; + + uint graphicId = + ((wpItem.graphicsWeaponId + 1) & 0x3FF) << 20 | + (wpItem.graphicsEquipmentId & 0x3FF) << 10 | + (wpItem.graphicsVariantId & 0x3FF); + + if (graphicId != 0) + appearanceIds[SetActorAppearancePacket.SPOFFHAND] = graphicId; + } + } + + Database.SavePlayerAppearance(this); + BroadcastPacket(CreateAppearancePacket(), true); + } + public void SendAppearance() { BroadcastPacket(CreateAppearancePacket(), true); @@ -1166,51 +1226,6 @@ namespace Meteor.Map.Actors QueuePackets(packets); } - public void GraphicChange(int slot, InventoryItem invItem) - { - if (invItem == null) - appearanceIds[slot] = 0; - else - { - ItemData item = Server.GetItemGamedata(invItem.itemId); - - if (item is EquipmentItem) - { - EquipmentItem eqItem = (EquipmentItem)item; - - uint mixedVariantId; - - if (eqItem.graphicsWeaponId == 0) - mixedVariantId = ((eqItem.graphicsVariantId & 0x1F) << 5) | eqItem.graphicsColorId; - else - mixedVariantId = eqItem.graphicsVariantId; - - uint graphicId = - (eqItem.graphicsWeaponId & 0x3FF) << 20 | - (eqItem.graphicsEquipmentId & 0x3FF) << 10 | - (mixedVariantId & 0x3FF); - - appearanceIds[slot] = graphicId; - } - - //Handle offhand - if (slot == MAINHAND && item is WeaponItem) - { - WeaponItem wpItem = (WeaponItem)item; - - uint graphicId = - (wpItem.graphicsOffhandWeaponId & 0x3FF) << 20 | - (wpItem.graphicsOffhandEquipmentId & 0x3FF) << 10 | - (wpItem.graphicsOffhandVariantId & 0x3FF); - - appearanceIds[SetActorAppearancePacket.OFFHAND] = graphicId; - } - } - - Database.SavePlayerAppearance(this); - BroadcastPacket(CreateAppearancePacket(), true); - } - public void SetRepairRequest(byte type) { charaWork.eventSave.repairType = type;