/// <summary> /// Prepares the skill, called after entering the MML, /// goes straight to Use. /// </summary> /// <param name="creature"></param> /// <param name="skill"></param> /// <param name="packet"></param> public bool Prepare(Creature creature, Skill skill, Packet packet) { var scrollId = packet.GetLong(); var title = packet.GetString(); var author = packet.GetString(); var mml = packet.GetString(); var song = packet.GetString(); // [180300, NA166 (18.09.2013)] Singing var hidden = packet.GetByte(); // bool, but the meta data is a byte // Get item var item = creature.Inventory.GetItem(scrollId); if (item == null) goto L_Fail; // Get all parts of the MML (Melody, Haromony 1+2) var mmlParts = mml.Split(','); // Check lengths if (mml.Length > MmlMaxLength || song.Length > MmlMaxLength) goto L_Fail; // Total if (mmlParts.Length > 0 && mmlParts[0].Length > skill.RankData.Var1) goto L_Fail; // Melody if (mmlParts.Length > 1 && mmlParts[1].Length > skill.RankData.Var2) goto L_Fail; // Harmony 1 if (mmlParts.Length > 2 && mmlParts[2].Length > skill.RankData.Var3) goto L_Fail; // Harmony 2 // Score level = Musical Knowledge rank var level = SkillRank.Novice; var knowledge = creature.Skills.Get(SkillId.MusicalKnowledge); if (knowledge != null) level = knowledge.Info.Rank; // Update item and send skill complete from Complete creature.Skills.Callback(SkillId.Composing, () => { // Skill training if (skill.Info.Rank == SkillRank.Novice) skill.Train(1); // Try the skill. // Scroll information item.MetaData1.SetString("TITLE", title); item.MetaData1.SetString("AUTHOR", author); item.MetaData1.SetString("SCORE", MabiZip.Compress(mml)); item.MetaData1.SetString("SCSING", MabiZip.Compress(song)); // [180300, NA166 (18.09.2013)] Singing item.MetaData1.SetByte("HIDDEN", hidden); item.MetaData1.SetShort("LEVEL", (short)level); // Update Send.ItemUpdate(creature, item); Send.SkillCompleteEntity(creature, skill.Info.Id, item.EntityId); }); // Finish Send.SkillUseEntity(creature, skill.Info.Id, scrollId); skill.State = SkillState.Used; return true; L_Fail: return false; }
public void Complete(Creature creature, Skill skill, Packet packet) { var str = packet.GetString(); var dict = new MabiDictionary(str); var hwEntityId = dict.GetLong("ITEMID"); if (hwEntityId == 0) goto L_End; var hw = creature.Inventory.GetItemSafe(hwEntityId); if (!hw.HasTag("/large_blessing_potion/")) goto L_End; // TODO: Check loading time var items = creature.Inventory.GetEquipment(); foreach (var item in items) { var blessable = (item.HasTag("/equip/") && !item.HasTag("/not_bless/")); if (blessable) item.OptionInfo.Flags |= ItemFlags.Blessed; } creature.Inventory.Decrement(hw, 1); Send.ItemBlessed(creature, items); L_End: Send.UseMotion(creature, 14, 0); Send.SkillComplete(creature, skill.Info.Id, str); }
public void Start(Creature creature, Skill skill, Packet packet) { // Get parameters var stringParam = packet.NextIs(PacketElementType.String); var dict = new MabiDictionary(); byte unkByte = 0; if (stringParam) dict.Parse(packet.GetString()); else unkByte = packet.GetByte(); // Run skill var result = this.Start(creature, skill, dict); if (result == StartStopResult.Fail) { Send.SkillStartSilentCancel(creature, skill.Info.Id); return; } skill.Activate(SkillFlags.InUse); Send.StatUpdate(creature, StatUpdateType.Private, Stat.Mana, Stat.Stamina); if (stringParam) Send.SkillStart(creature, skill, dict.ToString()); else Send.SkillStart(creature, skill, unkByte); }
public bool Prepare(Creature creature, Skill skill, Packet packet) { var dict = packet.GetString(); Send.SkillUse(creature, skill.Info.Id, dict); return true; }
public void Start(Creature creature, Skill skill, Packet packet) { // Check mana and stamina if (!this.CheckMana(creature, skill)) { Send.SystemMessage(creature, Localization.Get("Insufficient Mana")); Send.SkillStartSilentCancel(creature, skill.Info.Id); return; } if (!this.CheckStamina(creature, skill)) { Send.SystemMessage(creature, Localization.Get("Insufficient Stamina")); Send.SkillStartSilentCancel(creature, skill.Info.Id); return; } // Get parameters var stringParam = packet.NextIs(PacketElementType.String); var dict = new MabiDictionary(); byte unkByte = 0; if (stringParam) dict.Parse(packet.GetString()); else unkByte = packet.GetByte(); // Run skill var result = this.Start(creature, skill, dict); if (result == StartStopResult.Fail) { Send.SkillStartSilentCancel(creature, skill.Info.Id); return; } skill.Activate(SkillFlags.InUse); // Use mana/stamina this.UseMana(creature, skill); this.UseStamina(creature, skill); Send.StatUpdate(creature, StatUpdateType.Private, Stat.Mana, Stat.Stamina); if (stringParam) Send.SkillStart(creature, skill, dict.ToString()); else Send.SkillStart(creature, skill, unkByte); }
public void Stop(Creature creature, Skill skill, Packet packet) { var stringParam = packet.NextIs(PacketElementType.String); var dict = new MabiDictionary(); byte unkByte = 0; if (stringParam) dict.Parse(packet.GetString()); else if (packet.NextIs(PacketElementType.Byte)) unkByte = packet.GetByte(); var result = this.Stop(creature, skill, dict); skill.Deactivate(SkillFlags.InUse); if (result == StartStopResult.Fail) Send.SkillStopSilentCancel(creature, skill.Info.Id); else if (stringParam) Send.SkillStop(creature, skill, dict.ToString()); else Send.SkillStop(creature, skill, unkByte); }
public void Complete(Creature creature, Skill skill, Packet packet) { var str = packet.GetString(); var dict = new MabiDictionary(str); var hwEntityId = dict.GetLong("ITEMID"); if (hwEntityId == 0) goto L_End; var hw = creature.Inventory.GetItemSafe(hwEntityId); if (!hw.HasTag("/large_blessing_potion/")) goto L_End; // TODO: Check loading time var items = creature.Inventory.GetEquipment(a => a.IsBlessable); creature.Bless(items); creature.Inventory.Decrement(hw, 1); L_End: Send.UseMotion(creature, 14, 0); Send.SkillComplete(creature, skill.Info.Id, str); }