public void Complete(Creature creature, Skill skill, Packet packet)
{
var positionId = packet.GetLong();
var unkInt1 = packet.GetInt();
var unkInt2 = packet.GetInt();
var propId = PropId;
// Check location
var pos = new Position(positionId);
var validLocation = IsValidRegion(creature.Region) && IsValidPosition(creature, pos);
if (validLocation)
{
// Handle items
if (skill.Info.Id == SkillId.Campfire)
{
// Check Firewood, the client should stop the player long before Complete.
if (creature.Inventory.Count(creature.Temp.FirewoodItemId) < FirewoodCost)
throw new ModerateViolation("Used Campfire without Firewood.");
// Remove Firewood
creature.Inventory.Remove(creature.Temp.FirewoodItemId, FirewoodCost);
}
else
{
// Check kit
var item = creature.Inventory.GetItem(creature.Temp.CampfireKitItemEntityId);
if (item == null)
throw new ModerateViolation("Used CampfireKit with invalid kit.");
propId = this.GetPropId(item); // Change the prop ID based on what campfire kit was used
// Reduce kit
creature.Inventory.Decrement(item);
}
// Set up Campfire
var effect = (skill.Info.Rank < SkillRank.RB ? "campfire_01" : "campfire_02");
var prop = new Prop(propId, creature.RegionId, pos.X, pos.Y, MabiMath.ByteToRadian(creature.Direction), 1); // Logs
prop.State = "single";
if (prop.Data.Id != HalloweenPropId)
prop.Xml.SetAttributeValue("EFFECT", effect); // Fire effect
prop.DisappearTime = DateTime.Now.AddMinutes(this.GetDuration(skill.Info.Rank, creature.RegionId)); // Disappear after x minutes
// Temp data for Rest
prop.Temp.CampfireSkillRank = skill.RankData;
if (skill.Info.Id == SkillId.Campfire)
prop.Temp.CampfireFirewood = AuraData.ItemDb.Find(creature.Temp.FirewoodItemId);
creature.Region.AddProp(prop);
// Training
if (skill.Info.Id == SkillId.Campfire && skill.Info.Rank == SkillRank.Novice)
skill.Train(1); // Use Campfire.
}
// Complete
Send.SkillComplete(creature, skill.Info.Id, positionId, unkInt1, unkInt2);
}