Beispiel #1
0
        // Holy Grail ftw
        public static void useItem(Character chr, Item item, byte usingIndex, InPacket p)
        {
            MartialClient c = chr.getAccount().mClient;
            ItemData itemData = ItemDataCache.Instance.getItemData(item.getItemID());
            Boolean shouldDecrease = false;
            string determined = null;
            int determiner = 0;
            if(itemData.getIsStackable()) shouldDecrease = true;
            else
            {
                if(itemData.getTimeToExpire() == 0)
                    shouldDecrease = true;
            }

            // well.. we don't care if it's handled by server.. let's just remove them & f**k haterz! qq
            if(shouldDecrease)
                if(!chr.getInventory().decrementItem(usingIndex))
                {
                    Console.WriteLine("something went wrong with decrement..");
                    return;
                }

            switch(itemData.getCategory())
            {
                case 1001: // healingz
                {
                    if(itemData.getHealHP() > 0 || itemData.getHealMana() > 0 || itemData.getHealStamina() > 0)
                        StaticPackets.releaseHealPacket(chr, (int)(chr.getCurHP() + itemData.getHealHP()), (short)(chr.getCurMP() + itemData.getHealMana()), (short)(chr.getCurSP() + itemData.getHealStamina()));
                    break;
                }
                case 1002: // skillz o.o
                {
                    StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "If you'd like to learn any skill, go to skills list and press CTRL+LMB.");
                    break;
                }
                case 1003: // teleport
                {
                    if(chr.getMap() == itemData.getTeleportMap() || chr.getMap() != itemData.getTeleportMap() && itemData.getSpecialEffect() != 0)
                        CharacterFunctions.setPlayerPosition(chr, itemData.getTeleportX(), itemData.getTeleportY(), (short)itemData.getTeleportMap());
                    break;
                }
                case 1007: // reset skills
                {
                    chr.getSkills().resetAll();
                    chr.getSkillBar().getSkillBar().Clear();
                    break;
                }
                case 1011: // effect potions
                {
                    chr.setEffect((byte)itemData.getSpecialEffect());
                    break;
                }
                case 1012: // tae potion
                {
                    break;
                }
                case 1013: // faction change
                {
                    if(chr.getFaction() == 0)
                        return;

                    chr.setFaction(chr.getFaction() == 1 ? (byte)2 : (byte)1);
                    break;
                }
                case 1015: // chuk amulet
                {
                    determiner = BitConverter.ToInt32(p.ReadBytes(4), 0);
                    if(determiner == 0) return;
                    ItemData determinedItem = ItemDataCache.Instance.getItemData(determiner);
                    if(determinedItem == null || determinedItem.getCategory() != 1003 || (determiner < 212100146 && determiner > 212100164 && determiner != 212100185 && determiner != 212100187))
                    {
                        Console.WriteLine("I CAN'T TURN 10 INTO 20 CHICKENZ");
                        return;
                    }
                    CharacterFunctions.setPlayerPosition(chr, determinedItem.getTeleportX(), determinedItem.getTeleportY(), (short)determinedItem.getTeleportMap());
                    break;
                }
                case 1016: // karma amulet
                {
                    chr.setKarmaMessagingTimes((short)(chr.getKarmaMessagingTimes()+1));
                    break;
                }
                case 1020: // name changer
                {
                    p.Skip(4);
                    string charName = MiscFunctions.obscureString(p.ReadString(16));
                    if(charName.Length < 3 || Regex.Replace(charName, "[^A-Za-z0-9]+", "") != charName || MySQLTool.NameTaken(charName))
                    {
                        StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "Wrong input " + charName + ".");
                        return;
                    }

                    chr.setName(charName);
                    determined = charName;

                    CharacterFunctions.refreshCharacterForTheWorld(chr);
                    break;
                }
                case 1021: // face changer
                {
                    chr.setFace((byte)itemData.getSpecialEffect());
                    break;
                }
                case 1024:
                {
                    // yy..?
                    break;
                }
                case 1031: // red castle
                {
                    determiner = BitConverter.ToInt32(p.ReadBytes(4), 0);
                    if(determiner == 0) return;
                    ItemData determinedItem = ItemDataCache.Instance.getItemData(determiner);
                    if(determinedItem == null || determinedItem.getCategory() != 56 || ((determiner < 273001255 && determiner > 273001257) && determiner != 283000472 && determiner != 283000543 && determiner != 283000575 && determiner != 283000614 && determiner != 283000934 && determiner != 283001078 && determiner != 283001373 && determiner != 283001376))
                    {
                        Console.WriteLine("I CAN'T TURN 10 INTO 20 CHICKENZ");
                        return;
                    }
                    CharacterFunctions.setPlayerPosition(chr, determinedItem.getTeleportX(), determinedItem.getTeleportY(), (short)determinedItem.getTeleportMap());
                    break;
                }
                default:
                {
                    StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "Feature not implemented yet");
                    return;
                }
            }

            OutPacket op = new OutPacket(52);
            op.WriteInt(52);
            op.WriteShort(0x04);
            op.WriteShort(0x05);
            op.WriteInt(140328705);
            op.WriteInt(chr.getuID());
            op.WriteShort(0x01);
            op.WriteByte(0x01);
            op.WriteByte(usingIndex);
            op.WriteInt(item.getQuantity());
            op.WriteInt(793149441);
            op.WriteInt(/*determiner > 0 ? determiner : 0*/);
            op.WritePaddedString(determined, 17);
            op.WriteByte(0x90);
            op.WriteByte(0xd2);
            op.WriteByte(0x2a);
            c.WriteRawPacket(op.ToArray());

            OutPacket ops = new OutPacket(40);
            ops.WriteInt(40);
            ops.WriteShort(0x05);
            ops.WriteShort(0x05);
            ops.WriteInt(779458561);
            ops.WriteInt(chr.getuID());
            ops.WriteInt(item.getItemID());
            ops.WritePaddedString(determined, 17);
            ops.WriteByte(0x9e);
            ops.WriteByte(0x0f);
            ops.WriteByte(0xbf);
            WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), ops.ToArray());
        }
Beispiel #2
0
        protected override void OnPacket(byte[] packet)
        {
            Console.WriteLine(BitConverter.ToString(packet));
            using (InPacket p = new InPacket(packet))
            {
                short opcode = 0;

                if(packet.Length >= 4) {
                    opcode = (short)((int)((packet[0] & 0xFF) * 666) + (int)(packet[2] & 0xFF));
                    if(packet[3] != 0x00)
                        opcode = 1;
                }

                if(m_processor == null)
                    return;

                PacketHandler handler = null;
                handler = m_processor[opcode];

                if (handler != null)
                {
                    p.Skip(4);
                    handler(this, p);
                }
                else
                {
                    Logger.WriteLog(Logger.LogTypes.Warning, "[{0}] Unhandled packet from {1}: {2}.", m_processor.Label, Label, opcode);
                }
            }
        }
Beispiel #3
0
        public static void Movement(MartialClient c, InPacket p)
        {
            if(c.getAccount().activeCharacter == null)
            {
                Logger.LogCheat(Logger.HackTypes.NullActive, c, "Hooked Movement with null of activeCharacter");
                c.Close();
                return;
            }

            Character chr = c.getAccount().activeCharacter;

            p.Skip(4);
            byte[] locationToX = p.ReadBytes(4);
            byte[] locationToY = p.ReadBytes(4);
            p.Skip(1);
            byte movingMode = p.ReadByte();
            MoveCharacterPacket.HandleMovement(chr, locationToX, locationToY, movingMode);
        }
Beispiel #4
0
        public static void ShortcutBar(MartialClient c, InPacket p)
        {
            if(c.getAccount().activeCharacter == null)
            {
                Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook bar skill while not being ingame.");
                c.Close();
                return;
            }

            Character chr = c.getAccount().activeCharacter;

            byte barIndex = p.ReadByte();
            byte actionID = p.ReadByte();
            p.Skip(2);
            int thingID = p.ReadInt();

            OutPacket op = new OutPacket(24);
            op.WriteInt(24);
            op.WriteShort(4);
            op.WriteShort(17);
            op.WriteInt(135595521);
            op.WriteInt(chr.getuID());
            op.WriteShort(1);
            op.WriteByte(barIndex);
            op.WriteByte(actionID);
            op.WriteInt(thingID);

            if(actionID >= 1 && actionID <= 4)
            {
                chr.getSkillBar().addToSkillBar(barIndex, thingID);
            }
            else if(actionID == 6)
            {
                chr.getSkillBar().addToSkillBar(barIndex, thingID + 256);
            }
            else if(actionID == 0)
            {
                chr.getSkillBar().removeFromSkillBar(barIndex);
            }
            else if(actionID == 5)
            {
                chr.getSkillBar().addToSkillBar(barIndex, thingID + 512);
            }

            c.WriteRawPacket(op.ToArray());
        }
Beispiel #5
0
        public static void CastSkill(MartialClient c, InPacket p)
        {
            if(c.getAccount().activeCharacter == null)
            {
                Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook cast skill while not being ingame.");
                c.Close();
                return;
            }

            Character chr = c.getAccount().activeCharacter;

            byte skillBarNumber = p.ReadByte();
            byte skillActivationType = p.ReadByte();
            p.Skip(14);
            byte chartargets = p.ReadByte();
            p.Skip(1);
            byte mobtargets = p.ReadByte();
            if((chartargets + mobtargets) > 8)
                return;
            p.Skip(1);
            int[] targetIds = new int[chartargets + mobtargets];
            for(int i = 0;i < targetIds.Length;i++)
            {
                targetIds[i] = p.ReadInt();
            }
            System.Console.WriteLine("{0} | {1} | {2} | {3} | {4}", skillBarNumber, skillActivationType, chartargets, mobtargets, string.Join(",", targetIds));

            //skillpckt1 is a packet of skilleffects e.g. buffs
            byte[] skillpckt1 = SkillPackets.getSkillEffectOnCharPacket(chr);
            //skillpckt2 is a packet of skill activation, different IDs and DMG
            byte[] skillpckt2 = new byte[52];
            //just for medi and turbo
            byte[] skillpckt3 = new byte[28];

            //SkillID
            byte[] skillid;
            int skillIDInt = SkillDataCache.Instance.getSkillIDFromCast(chr, (byte)(skillBarNumber));
            int skillidNoFake = skillIDInt;
            skillid = BitTools.intToByteArray(skillIDInt);

            //SkillMaster.canCastSkill(cur, skillidInt);
            SkillData skill = SkillDataCache.Instance.getSkill(skillIDInt);

            if(skill == null)
            {
                System.Console.WriteLine("Skill was null");
                return;
            }

            if(skill.getTargets() < chartargets + mobtargets)
            {
                System.Console.WriteLine("tried to hit moar than poss");
                return;
            }

            //TURBO AND MEDI
            if(skill.getTypeSpecific() == 6 || skill.getTypeSpecific() == 7)
            {
                if(skill.getTypeSpecific() == 6)
                {
                    skillpckt3 = SkillPackets.getMediPacket(chr, skillIDInt, skillActivationType);
                }
                else
                {
                    skillpckt3 = SkillPackets.getTurboPacket(chr, skillIDInt, skillActivationType == (byte)0xc8);
                    //if(skillActivationType == (byte)0xc8) chr.setTurboSpeed(((CastableSkill)skill).getSpeed());
                    //else chr.setTurboSpeed(0);
                }

                c.WriteRawPacket(skillpckt3);
                WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), skillpckt3);
                return;
            }

            //TARGETS
            int targets = chartargets + mobtargets;

            //COSTS
            chr.setCurHP(chr.getCurHP() - skill.getHealCost());
            chr.setCurMP((short)(chr.getCurMP() - skill.getManaCost()));
            chr.setCurSP((short)(chr.getCurSP() - skill.getStaminaCost()));

            Fightable target;

            //GET MAXIMUM CASTERS DMG
            int dmgInt = SkillDataCache.Instance.skillCastDmgCalculations(chr, skillIDInt);
            int totalDmg;
            int dmgType;

            //GET MAIN SKILL PACKET
            skillpckt2 = SkillPackets.getCastSkillPacket(chr, targets, skillidNoFake, skillActivationType);

            //ADD TARGET STUFF TO THE PACKET
            for(int aoe = 0;aoe < targets;aoe++)
            {
                //GET TARGET
                byte[] targetByteB = BitTools.intToByteArray(targetIds[aoe]);

                target = WMap.Instance.getGrid(chr.getMap()).getFightableNear(chr.getArea(), BitTools.byteArrayToInt(targetByteB));
                if(target == null)
                    continue;

                //check for distance
                //canCastToTarget((Location)chr, (Location)target);

                totalDmg = dmgInt;

                //DECREASE DMG BY DEF
                dmgType = SkillDataCache.Instance.skillCastDmgTypeCalculations(chr, target, skill.getTypeSpecific() == 2);
                totalDmg -= target.getDef();

                //CRIT
                if(dmgType == 2 || dmgType == 5)
                    totalDmg += chr.getCritDmg();

                //DMG TYPE FACTOR
                totalDmg *= (int)(SkillDataCache.Instance.getDmgFactorByType(dmgType) * SkillDataCache.Instance.getDmgFactorByClass(chr));

                if(totalDmg < 0) totalDmg = 0;

                //ATK THE TARGET FINALLY
                target.recDamage(chr.getuID(), totalDmg);

                int targetId = BitTools.byteArrayToInt(targetByteB);

                //COMPLETE THE TARGET IN THE PACKAGE
                skillpckt2 = SkillPackets.completeCastSkillPacket(skillpckt2, aoe, targetId, target.getCurHP(), target.getCurMP(), -totalDmg, chartargets, dmgType);

                if(chartargets > 0)
                    chartargets--;
            }

            //send skill packet to other players
            WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), skillpckt2);

            //send skill packet to client
            c.WriteRawPacket(skillpckt2);

            //effects on char
            c.WriteRawPacket(skillpckt1);
            return;
        }
Beispiel #6
0
        public static void ViewInventory(MartialClient c, InPacket p)
        {
            if(c.getAccount().activeCharacter == null)
            {
                Logger.LogCheat(Logger.HackTypes.NullActive, c, "Hooked viewInventory with null of activeCharacter");
                c.Close();
                return;
            }

            Character chr = c.getAccount().activeCharacter;

            OutPacket op = new OutPacket(28);
            op.WriteInt(28);
            op.WriteShort(0x04);
            op.WriteShort(0x1e);
            op.WriteInt(0x01);
            op.WriteInt(chr.getuID());
            op.WriteShort(0x01);
            op.WriteByte(0xf8);
            op.WriteByte(0x01);

            p.Skip(4);

            op.WriteBytes(p.ReadBytes(4));
            op.WriteByte(0x9e);
            op.WriteByte(0x0f);
            op.WriteByte(0xbf);
            c.WriteRawPacket(op.ToArray());
        }
Beispiel #7
0
        public static void UseItem(MartialClient c, InPacket p)
        {
            if(c.getAccount().activeCharacter == null)
            {
                Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook useItem while not being ingame.");
                c.Close();
                return;
            }

            Character chr = c.getAccount().activeCharacter;

            p.Skip(1);
            byte usingIndex = p.ReadByte();
            Item item = chr.getInventory().getItemBySeqIndexing(usingIndex);
            if(item == null)
            {
                Logger.LogCheat(Logger.HackTypes.Items, c, "Tried to use not existing item.");
                return;
            }

            ItemData itemData = ItemDataCache.Instance.getItemData(item.getItemID());

            if(!itemData.getClassUsable()[chr.getcClass() - 1])
            {
                Console.WriteLine("not for teh class..");
                return;
            }

            if(itemData.getMinLvl() > chr.getLevel() || itemData.getMaxLvl() < chr.getLevel())
            {
                Console.WriteLine("not for yar level..");
                return;
            }

            if(itemData.getFaction() != 0 && chr.getFaction() != itemData.getFaction())
            {
                Console.WriteLine("not for yah faction..");
                return;
            }

            p.Skip(2);
            MainItemUsage.useItem(chr, item, usingIndex, p);
        }