public bool Prepare(Creature creature, Skill skill, Packet packet)
{
var materials = new List<ProductionMaterial>();
var stitches = new List<Point>();
var stage = (Stage)packet.GetByte();
var propEntityId = packet.GetLong();
var unkInt1 = packet.GetInt();
var existingItemEntityId = packet.GetLong();
var finishId = packet.GetInt();
if (stage == Stage.Progression)
{
// Materials
if (!this.ReadMaterials(creature, packet, out materials))
return false;
}
else if (stage == Stage.Finish)
{
// Stitches
if (!this.ReadStitches(creature, packet, out stitches))
return false;
}
else
{
Send.ServerMessage(creature, Localization.Get("Stage error, please report."));
Log.Error("Tailoring: Unknown progress stage '{0}'.", stage);
return false;
}
// Check tools
if (!CheckTools(creature))
{
Send.MsgBox(creature, Localization.Get("You need a Tailoring Kit in your right hand\nand a Sewing Pattern in your left."));
return false;
}
// Check if ready for completion
if (stage == Stage.Progression && existingItemEntityId != 0)
{
// Check item
var item = creature.Inventory.GetItem(existingItemEntityId);
if (item == null)
{
Log.Warning("Tailoring.Complete: Creature '{0:X16}' tried to work on non-existent item.", creature.EntityId);
return false;
}
// Check item progress
if (item.MetaData1.GetFloat(ProgressVar) == 1)
{
var rnd = RandomProvider.Get();
// Get manual
var manualId = creature.Magazine.MetaData1.GetInt("FORMID");
var manualData = AuraData.ManualDb.Find(ManualCategory.Tailoring, manualId);
if (manualData == null)
{
Log.Error("Tailoring.Complete: Manual '{0}' not found.", manualId);
Send.ServerMessage(creature, Localization.Get("Failed to look up pattern, please report."));
return false;
}
// Get items to decrement
var requiredMaterials = manualData.GetFinish(finishId).Materials;
List<ProductionMaterial> toDecrement;
if (!this.GetItemsToDecrement(creature, Stage.Finish, manualData, requiredMaterials, materials, out toDecrement))
return false;
// Decrement mats
this.DecrementMaterialItems(creature, toDecrement, rnd);
// Start minigame
var xOffset = (short)rnd.Next(30, 50);
var yOffset = (short)rnd.Next(20, 30);
var deviation = new byte[6];
var deviation2 = (byte)(skill.Info.Rank < SkillRank.R9 ? 4 : 2);
for (int i = 0; i < deviation.Length; ++i)
deviation[i] = (byte)rnd.Next(0, deviation2 + 1);
Send.TailoringMiniGame(creature, item, xOffset, yOffset, deviation, deviation2);
// Save offsets for complete
creature.Temp.TailoringMiniGameX = xOffset;
creature.Temp.TailoringMiniGameY = yOffset;
return false;
}
}
// Skill training
if (skill.Info.Rank == SkillRank.Novice)
skill.Train(1); // Use the skill.
Send.Echo(creature, Op.SkillUse, packet);
skill.State = SkillState.Used;
return true;
}