Exemplo n.º 1
0
        public override SkillResults Prepare(MabiCreature creature, MabiSkill skill, MabiPacket packet, uint castTime)
        {
            var itemId = packet.GetLong();
            var title = packet.GetString();
            var author = packet.GetString();
            var mml = packet.GetString();
            var singing = packet.GetString(); // [180300, NA166 (18.09.2013)] Singing
            var hidden = packet.GetByte();

            var item = creature.GetItem(itemId);
            if (item == null)
                return SkillResults.Failure;

            var mmlParts = mml.Split(',');

            // Check total score length
            if (mml.Length > MMLMaxLength)
                return SkillResults.Failure;
            // Melody length
            if (mmlParts[0].Length > skill.RankInfo.Var1)
                return SkillResults.Failure;
            // Harmony 1 length
            if (mmlParts.Length > 1 && mmlParts[1].Length > skill.RankInfo.Var2)
                return SkillResults.Failure;
            // Harmony 2 length
            if (mmlParts.Length > 2 && mmlParts[2].Length > skill.RankInfo.Var3)
                return SkillResults.Failure;

            creature.Temp.SkillItem1 = item;

            var level = SkillRank.Novice;

            // Score level = Musical Knowledge rank
            var knowledge = creature.Skills.Get(SkillConst.MusicalKnowledge);
            if (knowledge != null)
                level = knowledge.Rank;

            item.Tags.SetString("TITLE", title);
            item.Tags.SetString("AUTHOR", author);
            item.Tags.SetString("SCORE", MabiZip.Compress(mml));
            item.Tags.SetString("SCSING", ""); // [180300, NA166 (18.09.2013)] Singing
            item.Tags.SetByte("HIDDEN", hidden);
            item.Tags.SetShort("LEVEL", (ushort)level);

            Send.SkillUse(creature.Client, creature, skill.Id, itemId);

            return SkillResults.Okay;
        }
        public override SkillResults Start(MabiCreature creature, MabiSkill skill, MabiPacket packet)
        {
            // Usually the second parameter is an empty string,
            // but if it's not empty it seems to be tags.
            var parameter = (packet != null && packet.GetElementType() == ElementType.String ? packet.GetString() : null);
            var tags = new MabiTags(parameter);

            var result = this.Start(creature, skill, tags);

            Send.SkillStart(creature, skill.Id, parameter);

            return result;
        }
Exemplo n.º 3
0
        public override SkillResults Stop(MabiCreature creature, MabiSkill skill, MabiPacket packet)
        {
            var parameter = (packet != null && packet.GetElementType() == ElementType.String ? packet.GetString() : null);

            var result = this.Stop(creature, skill);

            if (parameter != null)
                Send.SkillStop(creature, skill.Id, parameter);
            else
                Send.SkillStop(creature, skill.Id, 1);

            return result;
        }
        public override SkillResults Stop(MabiCreature creature, MabiSkill skill, MabiPacket packet)
        {
            // Sometimes the second stop parameter is a byte,
            // possibly when canceling by moving (eg Rest).
            // The client doesn't really seem to care about what we send back though...
            var parameter = (packet != null && packet.GetElementType() == ElementType.String ? packet.GetString() : null);
            var tags = new MabiTags(parameter);

            var result = this.Stop(creature, skill, tags);

            if (parameter != null)
                Send.SkillStop(creature, skill.Id, parameter);
            else
                Send.SkillStop(creature, skill.Id, 1);

            return result;
        }
Exemplo n.º 5
0
        public override SkillResults Prepare(MabiCreature creature, MabiSkill skill, MabiPacket packet, uint castTime)
        {
            // Check item id parameter
            var parameters = packet.GetString();
            var itemOId = MabiTags.Fetch<ulong>("ITEMID", parameters);
            if (itemOId == 0)
                return SkillResults.Failure;

            // Check item
            var item = creature.Inventory.GetItem(itemOId);
            if (item == null)
                return SkillResults.Failure;

            creature.Temp.SkillItem1 = item;

            Send.SkillReady(creature.Client, creature, skill.Id, "");

            return SkillResults.Okay;
        }
Exemplo n.º 6
0
        public void LoadFromPacket(MabiPacket packet)
        {
            Type = packet.GetInt();
            Name = packet.GetString();
            Level = (Type == 1) ? packet.GetString() : "";
            Info = (Type == 1) ? packet.GetString() : "";
            Password = packet.GetString();
            MaxSize = packet.GetInt();

            // TODO: PartyBoard Support
            /*
            PartyBoard = packet.GetByte();
            005 [..............01] Byte   : 1
            006 [0000000000000000] Long   : 0
            007 [0000000400000000] Long   : 17179869184
            008 [................] String :
            009 [..............46] Byte   : 70
            010 [..............00] Byte   : 0
            011 [..............00] Byte   : 0
            012 [................] String :
            013 [................] String : Unrestricted
            014 [................] String : Unrestricted
            015 [................] String :
            016 [............0000] Short  : 0
            017 [........00000000] Int      : 0
            018 [........00000000] Int      : 0
            019 [........00000000] Int      : 0
            020 [..............01] Byte   : 1
            */
        }
Exemplo n.º 7
0
    private void HandleMoonGateUse(WorldClient client, MabiPacket packet)
    {
        var character = client.GetCreatureOrNull(packet.Id) as MabiPC;
        if(character == null)
            goto L_Fail;

        var source = packet.GetString();
        var target = packet.GetString();

        // Check gates
        MoonGate sGate, tGate;
        _gates.TryGetValue(source, out sGate);
        _gates.TryGetValue(target, out tGate);
        if (sGate == null || tGate == null || sGate.Prop.State == "closed")
            goto L_Fail;

        // Check range to source
        if (character.Region != sGate.Region || !WorldManager.InRange(character, sGate.X, sGate.Y, 1000))
            goto L_Fail;

        // Check if char has target
        if (!character.Keywords.Contains(tGate.KeywordId) && !_freeRoaming && !character.Keywords.Contains(10142))
            goto L_Fail;

        client.Warp(tGate.Region, tGate.X, tGate.Y);

        client.Send(new MabiPacket(Op.MoonGateUseR, client.Character.Id).PutByte(true));
        return;

        L_Fail:
        client.Send(new MabiPacket(Op.MoonGateUseR, client.Character.Id).PutByte(false));
    }