Beispiel #1
0
            public static LongVector Add(LongVector v0, LongVector v1)
            {
                var rtn = new Vector4[v0.Vector4s.Length];

                for (var i = 0; i < v0.Vector4s.Length; i++)
                {
                    rtn[i] = Vector4.Add(v0.Vector4s[i], v1.Vector4s[i]);
                }
                return(new LongVector(rtn, v0.Lng));
            }
Beispiel #2
0
 public Particle(BinaryReader reader)
 {
     position = new LongVector(reader);
     velocity = new FloatVector(reader);
     color    = new FloatVector(reader);
     alpha    = reader.ReadSingle();
     size     = reader.ReadSingle();
     count    = reader.ReadInt32();
     type     = reader.ReadInt32();
     spread   = reader.ReadSingle();
     unknown  = reader.ReadInt32();
 }
Beispiel #3
0
 public Hit(BinaryReader reader)
 {
     attacker  = reader.ReadInt64();
     target    = reader.ReadInt64();
     damage    = reader.ReadSingle();
     critical  = reader.ReadInt32();
     stuntime  = reader.ReadInt32();
     paddingA  = reader.ReadInt32();
     position  = new LongVector(reader);
     direction = new FloatVector(reader);
     isYellow  = reader.ReadByte();
     type      = (DamageType)reader.ReadByte();
     showlight = reader.ReadByte();
     paddingB  = reader.ReadByte();
 }
Beispiel #4
0
 public StaticEntity(BinaryReader reader)
 {
     chunkX   = reader.ReadInt32();
     chunkY   = reader.ReadInt32();
     id       = reader.ReadInt32();
     paddingA = reader.ReadInt32();
     type     = reader.ReadInt32();
     paddingB = reader.ReadInt32();
     position = new LongVector(reader);
     rotation = reader.ReadInt32();
     size     = new FloatVector(reader);
     closed   = reader.ReadInt32();
     time     = reader.ReadInt32();
     unknown  = reader.ReadInt32();
     paddingC = reader.ReadInt32();
     guid     = reader.ReadInt64();
 }
Beispiel #5
0
 public Shoot(BinaryReader reader)
 {
     attacker   = reader.ReadInt64();
     chunkX     = reader.ReadInt32();
     chunkY     = reader.ReadInt32();
     unknownA   = reader.ReadInt32();
     paddingA   = reader.ReadInt32();
     position   = new LongVector(reader);
     unknownV   = new IntVector(reader);
     velocity   = new FloatVector(reader);
     legacyDMG  = reader.ReadSingle();
     unknownB   = reader.ReadSingle();
     scale      = reader.ReadSingle();
     mana       = reader.ReadSingle();
     particles  = reader.ReadSingle();
     skill      = reader.ReadInt32();
     projectile = reader.ReadInt32();
     paddingB   = reader.ReadInt32();
     unknownC   = reader.ReadSingle();
     unknownD   = reader.ReadSingle();
 }
Beispiel #6
0
            unsafe public static float Dot(LongVector v0, LongVector v1)
            {
                var tmp = new LongVector(v0.Lng);

                fixed(float *p = &tmp.Vector4s[0].X)
                fixed(Vector4 * vvv0 = &v0.Vector4s[0])
                fixed(Vector4 * vvv1 = &v1.Vector4s[0])
                {
                    float *  pp  = p;
                    Vector4 *vv0 = vvv0;
                    Vector4 *vv1 = vvv1;

                    for (var i = 0; i < v0.Vector4s.Length; i++)
                    {
                        *pp++ = Vector4.Dot(*vv0++, *vv1++);
                    }
                }
                //float sum = 0;
                //foreach (var t in tmp)
                //    sum += t;
                return(tmp.Sum());
            }
Beispiel #7
0
            unsafe private static void Main(string[] args)
            {
                var arr = new float[1001];

                for (var i = 0; i < arr.Length; i++)
                {
                    arr[i] = i;
                }
                var arr2 = new float[1001];

                for (var i = 0; i < arr.Length; i++)
                {
                    arr2[i] = i + 1;
                }


                var sw = new Stopwatch();

                var lv  = new LongVector(arr);
                var lv2 = new LongVector(arr2);

                LongVector tmp;

                float[] tmpa;
                float   sum = 0;

                sw.Start();

                for (var i = 0; i < 1000000; i++)
                {
                    //       tmpa= Arra.add(arr, arr2);
                    //        sum = Arra.dot(arr, arr2); //1002001 3.34334E+08

                    //    tmp = LongVector.Add(lv, lv2); 3.34334E+08
                    sum = LongVector.Dot(lv, lv2);
                }
                sw.Stop();
                Console.WriteLine(sw.ElapsedMilliseconds);
            }
Beispiel #8
0
 // Converter: longVector v2 = longVector.FromVector( v1 );
 public static LongVector FromVector(LongVector that)
 {
     return(new LongVector(that));
 }
Beispiel #9
0
 // Constructor: longVector v2 = new longVector( v1 );
 public LongVector(LongVector that) : base()
 {
     this.CopyFromArray(that.ToArray()); return;
 }
Beispiel #10
0
        public EntityUpdate(BinaryReader reader)
        {
            byte[] uncompressed = Zlib.Decompress(reader.ReadBytes(reader.ReadInt32()));

            MemoryStream stream = new MemoryStream(uncompressed);
            BinaryReader r      = new BinaryReader(stream);

            guid = r.ReadInt64();
            var bitfield = r.ReadInt64();

            if (Tools.GetBit(bitfield, 0))
            {
                position = new LongVector(r);
            }
            if (Tools.GetBit(bitfield, 1))
            {
                rotation = new FloatVector(r);
            }
            if (Tools.GetBit(bitfield, 2))
            {
                velocity = new FloatVector(r);
            }
            if (Tools.GetBit(bitfield, 3))
            {
                acceleration = new FloatVector(r);
            }
            if (Tools.GetBit(bitfield, 4))
            {
                extraVel = new FloatVector(r);
            }
            if (Tools.GetBit(bitfield, 5))
            {
                viewportPitch = r.ReadSingle();
            }
            if (Tools.GetBit(bitfield, 6))
            {
                physicsFlags = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 7))
            {
                hostility = r.ReadByte();
            }
            if (Tools.GetBit(bitfield, 8))
            {
                entityType = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 9))
            {
                mode = r.ReadByte();
            }
            if (Tools.GetBit(bitfield, 10))
            {
                modeTimer = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 11))
            {
                combo = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 12))
            {
                lastHitTime = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 13))
            {
                appearance = new Appearance(r);
            }
            if (Tools.GetBit(bitfield, 14))
            {
                entityFlags = r.ReadInt16();
            }
            if (Tools.GetBit(bitfield, 15))
            {
                roll = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 16))
            {
                stun = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 17))
            {
                slow = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 18))
            {
                ice = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 19))
            {
                wind = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 20))
            {
                showPatchTime = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 21))
            {
                entityClass = r.ReadByte();
            }
            if (Tools.GetBit(bitfield, 22))
            {
                specialization = r.ReadByte();
            }
            if (Tools.GetBit(bitfield, 23))
            {
                charge = r.ReadSingle();
            }
            if (Tools.GetBit(bitfield, 24))
            {
                unused24 = new FloatVector(r);
            }
            if (Tools.GetBit(bitfield, 25))
            {
                unused25 = new FloatVector(r);
            }
            if (Tools.GetBit(bitfield, 26))
            {
                rayHit = new FloatVector(r);
            }
            if (Tools.GetBit(bitfield, 27))
            {
                HP = r.ReadSingle();
            }
            if (Tools.GetBit(bitfield, 28))
            {
                MP = r.ReadSingle();
            }
            if (Tools.GetBit(bitfield, 29))
            {
                block = r.ReadSingle();
            }
            if (Tools.GetBit(bitfield, 30))
            {
                multipliers = new Multipliers(r);
            }
            if (Tools.GetBit(bitfield, 31))
            {
                unused31 = r.ReadByte();
            }
            if (Tools.GetBit(bitfield, 32))
            {
                unused32 = r.ReadByte();
            }
            if (Tools.GetBit(bitfield, 33))
            {
                level = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 34))
            {
                XP = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 35))
            {
                parentOwner = r.ReadInt64();
            }
            if (Tools.GetBit(bitfield, 36))
            {
                unused36 = r.ReadInt64();
            }
            if (Tools.GetBit(bitfield, 37))
            {
                powerBase = r.ReadByte();
            }
            if (Tools.GetBit(bitfield, 38))
            {
                unused38 = r.ReadInt32();
            }
            if (Tools.GetBit(bitfield, 39))
            {
                unused39 = new IntVector(r);
            }
            if (Tools.GetBit(bitfield, 40))
            {
                spawnPos = new LongVector(r);
            }
            if (Tools.GetBit(bitfield, 41))
            {
                unused41 = new IntVector(r);
            }
            if (Tools.GetBit(bitfield, 42))
            {
                unused42 = r.ReadByte();
            }
            if (Tools.GetBit(bitfield, 43))
            {
                consumable = new Item(r);
            }
            if (Tools.GetBit(bitfield, 44))
            {
                equipment = new Item[13];
                for (int i = 0; i < 13; i++)
                {
                    equipment[i] = new Item(r);
                }
            }
            if (Tools.GetBit(bitfield, 45))
            {
                name = new string(r.ReadChars(16));
                name = name.Substring(0, name.IndexOf("\0"));
            }
            if (Tools.GetBit(bitfield, 46))
            {
                skillDistribution = new SkillDistribution(r);
            }
            if (Tools.GetBit(bitfield, 47))
            {
                manaCubes = r.ReadInt32();
            }
        }
Beispiel #11
0
 public void Filter(EntityUpdate previous)
 {
     if (position != null)
     {
         if (Math.Abs(position.x - previous.position.x) < 100000 &&
             Math.Abs(position.y - previous.position.y) < 100000 &&
             Math.Abs(position.z - previous.position.z) < 100000)
         {
             position = null;
         }
     }
     rotation = null;
     if (velocity != null)
     {
         if (Math.Abs(velocity.z - previous.velocity.z) < 2)
         {
             velocity = null;
         }
     }
     if (acceleration != null)
     {
         if (Math.Abs(acceleration.x - previous.acceleration.x) < 10 &&
             Math.Abs(acceleration.y - previous.acceleration.y) < 10 &&
             Math.Abs(acceleration.z - previous.acceleration.z) < 10)
         {
             acceleration = null;
         }
     }
     if (extraVel != null)
     {
         if (Math.Abs(extraVel.x) < 1 &&
             Math.Abs(extraVel.y) < 1 &&
             Math.Abs(extraVel.z) < 1)
         {
             extraVel = null;
         }
     }
     viewportPitch = null;
     physicsFlags  = null;
     if (modeTimer != null && modeTimer > 100)
     {
         previous.modeTimer = modeTimer;//necessary for rayhit filtering
         modeTimer          = null;
     }
     lastHitTime = null;
     if (roll != null && !(roll > 500))
     {
         roll = null;
     }
     if (stun != null && stun < previous.stun)
     {
         stun = null;
     }
     if (slow != null && slow < previous.slow)
     {
         slow = null;
     }
     if (ice != null && ice < previous.ice)
     {
         ice = null;
     }
     if (wind != null && wind < previous.wind)
     {
         wind = null;
     }
     showPatchTime = null;
     if (charge != null)
     {
         if (Math.Abs((float)(charge - previous.charge)) < 0.1f)
         {
             charge = null;
         }
     }
     unused24 = null;
     unused25 = null;
     if (rayHit != null)
     {
         if (previous.mode == 0 || previous.modeTimer > 1500 || //current could be null
             (Math.Abs(rayHit.x - previous.rayHit.x) < 1.5f &&
              Math.Abs(rayHit.y - previous.rayHit.y) < 1.5f &&
              Math.Abs(rayHit.z - previous.rayHit.z) < 1.5f))
         {
             rayHit = null;
         }
     }
     MP                = null;
     multipliers       = null;
     unused31          = null;
     unused32          = null;
     XP                = null;
     unused36          = null;
     powerBase         = null;
     unused38          = null;
     unused39          = null;
     spawnPos          = null;
     unused41          = null;
     unused42          = null;
     skillDistribution = null;
     manaCubes         = null;
 }
Beispiel #12
0
        static void ProcessPacket(int packetid)
        {
            switch (packetid)
            {
            case 0:
                #region entityUpdate
                var entityUpdate = new EntityUpdate(reader);
                if (players.ContainsKey(entityUpdate.guid))
                {
                    var previous = players[entityUpdate.guid];
                    if (entityUpdate.modeTimer == 0)
                    {
                        if ((entityUpdate.mode == Mode.FireExplosion_After || (entityUpdate.mode == null && previous.mode == Mode.FireExplosion_After)) && previous.modeTimer < 1000)
                        {
                            firespammers[entityUpdate.guid]++;
                            switch (firespammers[entityUpdate.guid])
                            {
                            case 1:        //nothing
                                break;

                            case 2:        //warn
                                new ChatMessage {
                                    message = "/pm #" + entityUpdate.guid + " stop spamming fire explosion, its a bannable abuse"
                                }.Write(writer);
                                break;

                            default:        //kick
                                new ChatMessage {
                                    message = "/kick #" + entityUpdate.guid + " firespamming (black_bot)"
                                }.Write(writer);
                                break;
                            }
                        }
                        else
                        {
                            //firespammers[entityUpdate.guid] = 0;
                        }
                    }
                    entityUpdate.Merge(players[entityUpdate.guid]);
                }
                else
                {
                    players.Add(entityUpdate.guid, entityUpdate);
                }
                if (entityUpdate.MP > 1f)
                {
                    new ChatMessage {
                        message = "/kick #" + entityUpdate.guid + " MP lock (black_bot)"
                    }.Write(writer);
                }
                if (entityUpdate.name != null)
                {
                    Console.ForegroundColor = ConsoleColor.DarkGreen;
                    //Console.WriteLine(entityUpdate.guid + ": " + entityUpdate.name);
                }

                if (false && players[entityUpdate.guid].name.ToLower() == "²@blackrock")
                {
                    maloxGuid = entityUpdate.guid;
                    var    opplayer = new EntityUpdate();
                    var    x        = players[entityUpdate.guid].position.x - players[personalGuid].position.x;
                    var    y        = players[entityUpdate.guid].position.y - players[personalGuid].position.y;
                    double distance = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
                    if (distance > 65536 * 40)
                    {
                        var follow = new EntityUpdate {
                            position = players[entityUpdate.guid].position,
                            guid     = personalGuid
                        };
                        follow.Write(writer);
                    }
                    if (entityUpdate.modeTimer < 50)
                    {
                        var shoot = new Shoot()
                        {
                            attacker   = personalGuid,
                            chunkX     = (int)players[personalGuid].position.x / 0x1000000,
                            chunkY     = (int)players[personalGuid].position.y / 0x1000000,
                            position   = players[personalGuid].position,
                            particles  = 1f,
                            mana       = 1f,
                            scale      = 5f,
                            projectile = ProjectileType.Arrow,
                        };
                        shoot.position.x = players[maloxGuid].position.x + (long)(players[maloxGuid].rayHit.x * 0x10000);
                        shoot.position.y = players[maloxGuid].position.y + (long)(players[maloxGuid].rayHit.y * 0x10000);
                        shoot.position.z = players[maloxGuid].position.z + (long)((players[maloxGuid].rayHit.z + 15) * 0x10000);

                        shoot.velocity.z = -40f;

                        //shoot.velocity.x = (float)players[maloxGuid].position.x / 0x10000f + players[maloxGuid].rayHit.x - (float)players[personalGuid].position.x / 0x10000f;
                        //shoot.velocity.y = (float)players[maloxGuid].position.y / 0x10000f + players[maloxGuid].rayHit.y - (float)players[personalGuid].position.y / 0x10000f;


                        //shoot.velocity.z = (float)players[maloxGuid].position.z / 0x10000f + players[maloxGuid].rayHit.z - (float)players[personalGuid].position.z / 0x10000f;
                        int range = 10;
                        shoot.position.x -= (range - 1) / 2 * 0x10000;
                        shoot.position.y -= (range - 1) / 2 * 0x10000;
                        for (int i = 0; i < range; i++)
                        {
                            for (int j = 0; j < range; j++)
                            {
                                shoot.Write(writer);
                                shoot.position.x += 0x10000;
                            }
                            shoot.position.x -= range * 0x10000;
                            shoot.position.y += 0x10000;
                        }
                    }
                }
                goto case 2;    //break;

                #endregion
            case 2:
                #region complete
                var antiTimeout = new EntityUpdate()
                {
                    guid        = personalGuid,
                    position    = players[personalGuid].position,
                    lastHitTime = (int)swLasthittime.ElapsedMilliseconds
                };
                antiTimeout.Write(writer);
                break;

                #endregion
            case 4:
                #region serverupdate
                var serverUpdate = new ServerUpdate(reader);
                foreach (var hit in serverUpdate.hits)
                {
                    if (hit.attacker == hit.target)
                    {
                        continue;
                    }
                    Console.WriteLine(hit.attacker + " attacked " + hit.target + " with " + hit.damage);
                    if (hit.damage > 500f && players[hit.attacker].entityClass == EntityClass.Rogue)
                    {
                        SendMessage("/kick #" + hit.attacker + " shuriken glitch (black_bot)");
                    }
                    if (hit.target == personalGuid)
                    {
                        swLasthittime.Restart();
                        if (players[personalGuid].HP <= 0)
                        {
                            continue;
                        }
                        players[personalGuid].HP -= hit.damage / 2;
                        var life = new EntityUpdate()
                        {
                            guid        = personalGuid,
                            HP          = players[personalGuid].HP,
                            lastHitTime = (int)swLasthittime.ElapsedMilliseconds
                        };
                        life.Write(writer);
                        if (players[personalGuid].HP <= 0)
                        {
                            SendMessage("/firework");
                            life.HP          = players[personalGuid].HP = 3000f;
                            life.lastHitTime = 0;
                            life.Write(writer);
                            swLasthittime.Restart();
                        }
                    }
                }
                foreach (var chunkItemData in serverUpdate.chunkItems)
                {
                    var c = new Chunk()
                    {
                        x = chunkItemData.chunkX, y = chunkItemData.chunkY
                    };
                    if (!drops.ContainsKey(c))
                    {
                        drops.Add(c, chunkItemData.droppedItems);
                    }
                    else
                    {
                        drops[c] = chunkItemData.droppedItems;
                    }
                }
                break;

                #endregion
            case 5:
                #region time
                var time = new Time(reader);
                break;

                #endregion
            case 10:
                #region chat
                var  chatMessage = new ChatMessage(reader, true);
                long sender      = (long)chatMessage.sender;
                if (sender == 0)
                {
                    Console.ForegroundColor = ConsoleColor.DarkGray;
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    Console.Write(players[sender].name + ": ");
                    Console.ForegroundColor = ConsoleColor.White;
                }
                Console.WriteLine(chatMessage.message);
                switch (chatMessage.message.ToLower())
                {
                case ".heal_me":
                case ".kill_me":
                    SendMessage("/pm #" + sender + " This command is no longer available");
                    break;

                case ".stun_me":
                    new Hit {
                        attacker  = personalGuid,
                        target    = sender,
                        damage    = 0f,
                        critical  = true,
                        stuntime  = 10000,
                        showlight = true,
                        position  = players[sender].position
                    }.Write(writer);
                    SendMessage("/pm #" + sender + " have fun sticking to the ground for 10 seconds :P");
                    break;

                case ".shutdown":
                    if (chatMessage.message == ".shutdOWN")
                    {
                        SendMessage("goodbye");
                        Task.Delay(250).Wait();
                        Environment.Exit(0);
                    }
                    else
                    {
                        SendMessage("no permission");
                    }
                    break;

                case ".clear":
                    foreach (var kvp in drops)
                    {
                        for (int i = 0; i < kvp.Value.Count; i++)
                        {
                            var pickup = new EntityAction()
                            {
                                type   = ActionType.PickUp,
                                chunkX = kvp.Key.x,
                                chunkY = kvp.Key.y,
                                index  = i,
                                item   = kvp.Value[i].item,
                            };
                            pickup.Write(writer);
                            pickup.Write(writer);
                        }
                    }
                    //SendMessage(".\n\n\n\n\n\n\n\n\n\n.");
                    break;

                case ".items":
                    #region items
                    double timePassed = swCooldown.ElapsedMilliseconds / 1000f;
                    if (timePassed < 30f)
                    {
                        SendMessage("/pm #" + sender + " command is on cooldown (30sec)");
                        break;
                    }
                    bool fullyGeared = true;
                    var  pl          = players[sender];
                    for (int i = 1; i < 9; i++)
                    {
                        if (pl.equipment[i].level < pl.level || pl.equipment[i].rarity != ItemRarity.Legendary)
                        {
                            fullyGeared = false;
                            break;
                        }
                    }
                    if (pl.equipment[10].type == 0 || pl.equipment[11].type == 0)
                    {
                        fullyGeared = false;
                    }
                    if (fullyGeared)
                    {
                        SendMessage("/pm #" + chatMessage.sender + " you already have maximum gear, don't spam items.");
                        break;
                    }
                    swCooldown.Restart();

                    var port = new EntityUpdate {
                        position = players[sender].position,
                        guid     = personalGuid
                    };
                    port.Write(writer);
                    players[personalGuid].position = port.position;

                    var items = new List <Item>();

                    var rng = new Random();
                    for (byte i = 3; i <= 9; i++)
                    {
                        items.Add(new Item()
                        {
                            type     = (ItemType)i,
                            modifier = rng.Next(0x7FFFFFFF),
                            rarity   = ItemRarity.Legendary,
                            level    = (short)players[sender].level
                        });
                    }
                    items[5].material = (ItemMaterial)rng.Next(11, 12);
                    items[6].material = (ItemMaterial)rng.Next(11, 12);
                    items.Add(items[6]);
                    ItemMaterial armorMaterial;
                    switch (players[sender].entityClass)
                    {
                    case EntityClass.Warrior:
                        //items[0].subtype = 0;
                        items[0].material = ItemMaterial.Iron;
                        for (int i = 0; i < 6; i++)
                        {
                            items.Add(new Item()
                            {
                                type     = ItemType.Weapon,
                                material = ItemMaterial.Iron,
                                modifier = rng.Next(0x7FFFFFFF),
                                rarity   = ItemRarity.Legendary,
                                level    = (short)players[sender].level
                            });
                        }
                        items[8].subtype  = 1;
                        items[9].subtype  = 2;
                        items[10].subtype = 13;
                        items[11].subtype = 15;
                        items[12].subtype = 16;
                        items[13].subtype = 17;

                        armorMaterial = ItemMaterial.Iron;
                        break;

                    case EntityClass.Ranger:
                        items[0].subtype  = 6;
                        items[0].material = ItemMaterial.Wood;
                        for (int i = 0; i < 2; i++)
                        {
                            items.Add(new Item()
                            {
                                type     = ItemType.Weapon,
                                material = ItemMaterial.Wood,
                                modifier = rng.Next(0x7FFFFFFF),
                                rarity   = ItemRarity.Legendary,
                                level    = (short)players[sender].level
                            });
                        }
                        items[8].subtype = 7;
                        items[9].subtype = 8;

                        armorMaterial = ItemMaterial.Linen;
                        break;

                    case EntityClass.Mage:
                        items[0].subtype  = 10;
                        items[0].material = ItemMaterial.Wood;
                        for (int i = 0; i < 3; i++)
                        {
                            items.Add(new Item()
                            {
                                type     = ItemType.Weapon,
                                material = (ItemMaterial)rng.Next(11, 12),
                                modifier = rng.Next(0x7FFFFFFF),
                                rarity   = ItemRarity.Legendary,
                                level    = (short)players[sender].level
                            });
                        }

                        items[8].subtype  = 11;
                        items[8].material = ItemMaterial.Wood;
                        items[9].subtype  = 12;
                        items[10].subtype = 12;

                        armorMaterial = ItemMaterial.Silk;
                        break;

                    case EntityClass.Rogue:
                        items[0].subtype  = 3;
                        items[0].material = ItemMaterial.Iron;
                        for (int i = 0; i < 2; i++)
                        {
                            items.Add(new Item()
                            {
                                type     = ItemType.Weapon,
                                material = ItemMaterial.Iron,
                                modifier = rng.Next(0x7FFFFFFF),
                                rarity   = ItemRarity.Legendary,
                                level    = (short)players[sender].level
                            });
                        }
                        items[8].subtype = 4;
                        items[9].subtype = 5;

                        armorMaterial = ItemMaterial.Cotton;
                        break;

                    default:
                        goto case EntityClass.Warrior;
                    }
                    for (int i = 1; i <= 4; i++)
                    {
                        items[i].material = armorMaterial;
                    }

                    items.Add(new Item {
                        type     = ItemType.Special,
                        material = ItemMaterial.Wood,
                    });

                    var drop = new EntityAction {
                        type = ActionType.Drop
                    };
                    foreach (var that in items)
                    {
                        drop.item = that;
                        drop.Write(writer);
                    }
                    SendMessage("items delivered");
                    #endregion
                    break;

                case ".come_here":
                    var port2 = new EntityUpdate {
                        position = players[sender].position,
                        guid     = personalGuid
                    };
                    port2.Write(writer);
                    break;

                case ".info":
                case ".help":
                    SendMessage("hi " + players[sender].name + "! I am a computer controlled player, created by Malox and @Blackrock. I can do various stuff, type .commands for more");
                    break;

                case ".commands":
                    SendMessage(".info .commands .items .countdown come_here .stun_me .69 .restart .come_here");
                    break;

                case ".countdown":
                    Task.Factory.StartNew(Countdown);
                    break;

                case ".killall":
                    if (chatMessage.message == ".kiLLaLL")
                    {
                        foreach (var p in players.Values)
                        {
                            if (p.guid < 1000 && p.guid > 2)
                            {
                                new EntityUpdate {
                                    position = p.position,
                                    guid     = personalGuid
                                }.Write(writer);
                                Task.Delay(100).Wait();
                                new Hit {
                                    attacker = personalGuid,
                                    target   = p.guid,
                                    damage   = 10000f,
                                }.Write(writer);
                                Task.Delay(100).Wait();
                            }
                        }
                    }
                    else
                    {
                        SendMessage("haha you wish!");
                    }
                    break;

                case ".69":
                    new EntityUpdate {
                        position = players[sender].position,
                        guid     = personalGuid
                    }.Write(writer);

                    var sixtynine = new Hit {
                        attacker  = personalGuid,
                        target    = sender,
                        damage    = 138f,     //-0.2f,
                        critical  = true,
                        showlight = true,
                        position  = players[sender].position
                    };
                    for (int i = 0; i < 30; i++)
                    {
                        sixtynine.damage *= -1;
                        sixtynine.Write(writer);
                        Task.Delay(50).Wait();
                    }
                    break;

                case ".derp":        // ".idontevenknow":
                    if (chatMessage.message == ".dERp")
                    {
                        var tele = new EntityUpdate {
                            position = new LongVector()
                            {
                                z = players[sender].position.z
                            },
                            guid = personalGuid
                        };

                        var dropperino = new EntityAction {
                            type = ActionType.Drop,
                            item = new Item()
                            {
                                type     = ItemType.PetFood, //1,
                                subtype  = 19,               //1,
                                material = 0,
                                level    = 1,
                            },
                        };
                        for (int i = 0; i < 25; i++)
                        {
                            for (int j = 0; j < 25; j++)
                            {
                                tele.position.x = players[sender].position.x + (i * 90000);
                                tele.position.y = players[sender].position.y + (j * 90000);
                                tele.Write(writer);
                                dropperino.Write(writer);
                            }
                        }
                    }
                    else
                    {
                        SendMessage("no permission");
                    }
                    break;

                case ".restart":
                    SendMessage("I'll be right back");
                    throw new Exception();

                case ".boost":
                    if (chatMessage.message == ".bOOst")
                    {
                        var dayum = new Hit {
                            attacker  = personalGuid,
                            target    = sender,
                            damage    = -10000f,
                            critical  = true,
                            showlight = true,
                            position  = players[sender].position
                        };
                        for (int i = 0; i < 30; i++)
                        {
                            dayum.Write(writer);
                            SendMessage("/firework");
                            Task.Delay(50).Wait();
                        }
                    }
                    else
                    {
                        SendMessage("no permission");
                    }
                    break;

                case ".ping":
                    SendMessage("pong!");
                    break;

                default:
                    break;
                }
                if (chatMessage.message.Contains("change") && chatMessage.message.Contains("team") && chatMessage.sender != personalGuid)
                {
                    SendMessage("./team_join red/blue");
                }
                break;

                #endregion
            case 15:
                #region mapseed
                var mapSeed = new MapSeed(reader);
                break;

                #endregion
            case 16:
                #region join
                var join = new Join(reader);
                personalGuid = join.guid;
                var playerstats = new EntityUpdate()
                {
                    position = new LongVector()
                    {
                        x = 550299161554,    //8020800000,
                        y = 550289388106,    //8020800000,
                        z = 6296719,
                    },
                    rotation      = new FloatVector(),
                    velocity      = new FloatVector(),
                    acceleration  = new FloatVector(),
                    extraVel      = new FloatVector(),
                    viewportPitch = 0,
                    physicsFlags  = 0b00000000_00000000_00000000_00010001,   //17
                    hostility     = 0,
                    entityType    = EntityType.HumanMale,
                    mode          = 0,
                    modeTimer     = 0,
                    combo         = 0,
                    lastHitTime   = 0,
                    appearance    = new EntityUpdate.Appearance()
                    {
                        character_size = new FloatVector()
                        {
                            x = 0.9600000381f,
                            y = 0.9600000381f,
                            z = 2.160000086f
                        },
                        head_model      = 1249,
                        hair_model      = 1265,
                        hand_model      = 431,
                        foot_model      = 432,
                        body_model      = 1,
                        tail_model      = -1,
                        shoulder2_model = -1,
                        wings_model     = -1,
                        head_size       = 1.00999999f,
                        body_size       = 1f,
                        hand_size       = 1f,
                        foot_size       = 0.9800000191f,
                        shoulder2_size  = 1f,
                        weapon_size     = 0.9499999881f,
                        tail_size       = 0.8000000119f,
                        shoulder_size   = 1f,
                        wings_size      = 1f,
                        body_offset     = new FloatVector()
                        {
                            z = -5f
                        },
                        head_offset = new FloatVector()
                        {
                            y = 0.5f,
                            z = 5f
                        },
                        hand_offset = new FloatVector()
                        {
                            x = 6f,
                        },
                        foot_offset = new FloatVector()
                        {
                            x = 3f,
                            y = 1f,
                            z = -10.5f
                        },
                        back_offset = new FloatVector()
                        {
                            y = -8f,
                            z = 2f
                        },
                    },
                    entityFlags    = 0b00000000_00000000_00000000_00100000, //64
                    roll           = 0,
                    stun           = 0,
                    slow           = 0,
                    ice            = 0,
                    wind           = 0,
                    showPatchTime  = 0,
                    entityClass    = EntityClass.Warrior,
                    specialization = 1,
                    charge         = 0,
                    unused24       = new FloatVector(),
                    unused25       = new FloatVector(),
                    rayHit         = new FloatVector(),
                    HP             = 3000f,
                    MP             = 0,
                    block          = 1,
                    multipliers    = new EntityUpdate.Multipliers()
                    {
                        HP          = 100,
                        attackSpeed = 1,
                        damage      = 1,
                        armor       = 1,
                        resi        = 1,
                    },
                    unused31          = 0,
                    unused32          = 0,
                    level             = 500,
                    XP                = 0,
                    parentOwner       = 0,
                    unused36          = 0,
                    powerBase         = 0,
                    unused38          = 0,
                    unused39          = new IntVector(),
                    spawnPos          = new LongVector(),
                    unused41          = new IntVector(),
                    unused42          = 0,
                    consumable        = new Item(),
                    equipment         = new Item[13],
                    name              = "@BLACK_BOT",
                    skillDistribution = new EntityUpdate.SkillDistribution()
                    {
                        ability1 = 5,
                        ability2 = 5,
                        ability3 = 5,
                    },
                    manaCubes = 0,
                };
                for (int i = 0; i < 13; i++)
                {
                    playerstats.equipment[i] = new Item()
                    {
                    };
                }
                var e = playerstats.equipment;
                e[1].type     = ItemType.Amulet;
                e[1].modifier = 3;
                e[1].rarity   = ItemRarity.Legendary;
                e[1].material = ItemMaterial.Silver;
                e[1].level    = 647;

                e[2].type     = ItemType.Chest;
                e[2].modifier = 63;
                e[2].rarity   = ItemRarity.Epic;
                e[2].material = ItemMaterial.Iron;
                e[2].level    = 647;

                e[3].type     = ItemType.Boots;
                e[3].modifier = 63;
                e[3].rarity   = ItemRarity.Legendary;
                e[3].material = ItemMaterial.Iron;
                e[3].level    = 647;

                e[4].type     = ItemType.Gloves;
                e[4].modifier = 0;
                e[4].rarity   = ItemRarity.Legendary;
                e[4].material = ItemMaterial.Iron;
                e[4].level    = 647;

                e[5].type     = ItemType.Shoulder;
                e[5].modifier = 84;
                e[5].rarity   = ItemRarity.Epic;
                e[5].material = ItemMaterial.Iron;
                e[5].level    = 647;

                e[6].type     = ItemType.Weapon;
                e[6].subtype  = 2;
                e[6].modifier = -67;
                e[6].rarity   = ItemRarity.Epic;
                e[6].material = ItemMaterial.Iron;
                e[6].level    = 647;

                e[7] = e[6];

                playerstats.Write(writer);
                swLasthittime.Start();
                players.Add(personalGuid, playerstats);

                SendMessage("/login " + password);
                SendMessage("/trail 0 0 0");
                SendMessage("online (version 3.4.1)");
                break;

                #endregion
            case 17:     //serving sending the right version if yours is wrong
                #region version
                var version = new ProtocolVersion(reader);
                break;

                #endregion
            case 18:
                #region server full
                //empty
                break;

                #endregion
            default:
                Console.WriteLine(string.Format("unknown packet id: {0}", packetid));
                break;
            }
        }
Beispiel #13
0
 public static void Teleport(LongVector destination)
 {
     memory.WriteLong(EntityStart + 0x10, destination.x);
     memory.WriteLong(EntityStart + 0x18, destination.y);
     memory.WriteLong(EntityStart + 0x20, destination.z);
 }
Beispiel #14
0
 public Shoot()
 {
     position = new LongVector();
     unknownV = new IntVector();
     velocity = new FloatVector();
 }
Beispiel #15
0
        static void ProcessPacket(int packetid)
        {
            switch (packetid)
            {
            case 0:
                #region entityUpdate
                var entityUpdate = new EntityUpdate(reader);
                if (players.ContainsKey(entityUpdate.guid))
                {
                    entityUpdate.Merge(players[entityUpdate.guid]);
                }
                else
                {
                    players.Add(entityUpdate.guid, entityUpdate);
                }
                if (players[entityUpdate.guid].name == "malox")
                {
                    maloxGuid = entityUpdate.guid;
                    var    x        = players[entityUpdate.guid].position.x - players[personalGuid].position.x;
                    var    y        = players[entityUpdate.guid].position.y - players[personalGuid].position.y;
                    double distance = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
                    if (distance > 65536 * 40)
                    {
                        var follow = new EntityUpdate {
                            position = players[entityUpdate.guid].position,
                            guid     = personalGuid
                        };
                        follow.Write(writer);
                    }
                    if (entityUpdate.modeTimer < 50)
                    {
                        var shoot = new Shoot()
                        {
                            attacker   = personalGuid,
                            chunkX     = (int)players[personalGuid].position.x / 0x1000000,
                            chunkY     = (int)players[personalGuid].position.y / 0x1000000,
                            position   = players[personalGuid].position,
                            particles  = 1f,
                            mana       = 1f,
                            scale      = 1f,
                            projectile = 0,
                        };
                        shoot.position.x = players[maloxGuid].position.x + (long)(players[maloxGuid].rayHit.x * 0x10000);
                        shoot.position.y = players[maloxGuid].position.y + (long)(players[maloxGuid].rayHit.y * 0x10000);
                        shoot.position.z = players[maloxGuid].position.z + (long)((players[maloxGuid].rayHit.z + 15) * 0x10000);

                        shoot.velocity.z = -40f;

                        //shoot.velocity.x = (float)players[maloxGuid].position.x / 0x10000f + players[maloxGuid].rayHit.x - (float)players[personalGuid].position.x / 0x10000f;
                        //shoot.velocity.y = (float)players[maloxGuid].position.y / 0x10000f + players[maloxGuid].rayHit.y - (float)players[personalGuid].position.y / 0x10000f;


                        //shoot.velocity.z = (float)players[maloxGuid].position.z / 0x10000f + players[maloxGuid].rayHit.z - (float)players[personalGuid].position.z / 0x10000f;
                        int range = 20;
                        shoot.position.x -= (range - 1) / 2 * 0x10000;
                        shoot.position.y -= (range - 1) / 2 * 0x10000;
                        for (int i = 0; i < range; i++)
                        {
                            for (int j = 0; j < range; j++)
                            {
                                shoot.Write(writer);
                                shoot.position.x += 0x10000;
                            }
                            shoot.position.x -= range * 0x10000;
                            shoot.position.y += 0x10000;
                        }
                    }
                }
                break;

                #endregion
            case 2:
                #region complete
                new EntityUpdate()
                {
                    lastHitTime = (int)stopWatch.ElapsedMilliseconds
                }.Write(writer);
                break;

                #endregion
            case 4:
                #region serverupdate
                var serverUpdate = new ServerUpdate(reader);
                foreach (var hit in serverUpdate.hits)
                {
                    if (hit.target == personalGuid)
                    {
                        stopWatch.Restart();
                        players[personalGuid].HP -= hit.damage;
                        var life = new EntityUpdate()
                        {
                            HP = players[personalGuid].HP,
                        };

                        life.Write(writer);
                        if (players[personalGuid].HP <= 0)
                        {
                            life.HP = 1623f;
                            life.Write(writer);
                        }
                    }
                }
                break;

                #endregion
            case 5:
                #region time
                var time = new Time(reader);
                break;

                #endregion
            case 10:
                #region chat
                var chatMessage = new ChatMessage(reader, true);
                if (chatMessage.sender == 0)
                {
                    Console.ForegroundColor = ConsoleColor.DarkGray;
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    Console.Write(players[chatMessage.sender].name + ": ");
                    Console.ForegroundColor = ConsoleColor.White;
                }
                Console.WriteLine(chatMessage.message);
                if (chatMessage.message == "!give_me_items")
                {
                    var port = new EntityUpdate {
                        position = players[chatMessage.sender].position,
                        guid     = personalGuid
                    };
                    port.Write(writer);
                    players[personalGuid].position = port.position;

                    var items = new List <Item>();

                    var rng = new Random();
                    for (byte i = 3; i <= 9; i++)
                    {
                        items.Add(new Item()
                        {
                            type     = i,
                            modifier = rng.Next(0x7FFFFFFF),
                            rarity   = 4,
                            level    = (short)players[chatMessage.sender].level
                        });
                    }
                    items[5].material = (byte)rng.Next(11, 12);
                    items[6].material = (byte)rng.Next(11, 12);
                    items.Add(items[6]);
                    byte armorMaterial;
                    switch (players[chatMessage.sender].entityClass)
                    {
                    case 0:         //warrior
                        //items[0].subtype = 0;
                        items[0].material = 1;
                        for (int i = 0; i < 6; i++)
                        {
                            items.Add(new Item()
                            {
                                type     = 3,
                                material = 1,
                                modifier = rng.Next(0x7FFFFFFF),
                                rarity   = 4,
                                level    = (short)players[chatMessage.sender].level
                            });
                        }
                        items[8].subtype  = 1;
                        items[9].subtype  = 2;
                        items[10].subtype = 13;
                        items[11].subtype = 15;
                        items[12].subtype = 16;
                        items[13].subtype = 17;

                        armorMaterial = 1;
                        break;

                    case 1:         //mage
                        items[0].subtype  = 10;
                        items[0].material = 2;
                        for (int i = 0; i < 3; i++)
                        {
                            items.Add(new Item()
                            {
                                type     = 3,
                                material = (byte)rng.Next(11, 12),
                                modifier = rng.Next(0x7FFFFFFF),
                                rarity   = 4,
                                level    = (short)players[chatMessage.sender].level
                            });
                        }

                        items[8].subtype  = 11;
                        items[8].material = 2;
                        items[9].subtype  = 12;
                        items[10].subtype = 12;

                        armorMaterial = 25;
                        break;


                    case 2:         //ranger
                        items[0].subtype  = 6;
                        items[0].material = 2;
                        for (int i = 0; i < 2; i++)
                        {
                            items.Add(new Item()
                            {
                                type     = 3,
                                material = 2,
                                modifier = rng.Next(0x7FFFFFFF),
                                rarity   = 4,
                                level    = (short)players[chatMessage.sender].level
                            });
                        }
                        items[8].subtype = 7;
                        items[9].subtype = 8;

                        armorMaterial = 26;
                        break;

                    case 3:         //rogue
                        items[0].subtype  = 3;
                        items[0].material = 1;
                        for (int i = 0; i < 2; i++)
                        {
                            items.Add(new Item()
                            {
                                type     = 3,
                                material = 1,
                                modifier = rng.Next(0x7FFFFFFF),
                                rarity   = 4,
                                level    = (short)players[chatMessage.sender].level
                            });
                        }
                        items[8].subtype = 4;
                        items[9].subtype = 5;

                        armorMaterial = 27;
                        break;

                    default:
                        goto case 0;
                    }
                    for (int i = 1; i <= 4; i++)
                    {
                        items[i].material = armorMaterial;
                    }

                    foreach (var that in items)
                    {
                        var drop = new EntityAction {
                            type = (int)Database.ActionType.drop,
                            item = that
                        };
                        drop.Write(writer);
                    }

                    //item = new Item {
                    //    type = 3, // 3 = weapon
                    //    rarity = 4, // 4 = legendary
                    //    level = 647,
                    //    material = 1
                    //}
                }
                else if (chatMessage.message == "!come_here")
                {
                    var port = new EntityUpdate {
                        position = players[chatMessage.sender].position,
                        guid     = personalGuid
                    };
                    port.Write(writer);
                }

                break;

                #endregion
            case 15:
                #region mapseed
                var mapSeed = new MapSeed(reader);
                break;

                #endregion
            case 16:
                #region join
                var join = new Join(reader);
                personalGuid = join.guid;

                var playerstats = new EntityUpdate()
                {
                    position      = new LongVector(),
                    rotation      = new FloatVector(),
                    velocity      = new FloatVector(),
                    acceleration  = new FloatVector(),
                    extraVel      = new FloatVector(),
                    viewportPitch = 0,
                    physicsFlags  = 0b00000000_00000000_00000000_00010001,   //17
                    hostility     = 0,
                    entityType    = 0,
                    mode          = 0,
                    modeTimer     = 0,
                    combo         = 0,
                    lastHitTime   = 0,
                    appearance    = new Appearance()
                    {
                        character_size = new FloatVector()
                        {
                            x = 0.9600000381f,
                            y = 0.9600000381f,
                            z = 2.160000086f
                        },
                        head_model      = 1236,
                        hair_model      = 1280,
                        hand_model      = 430,
                        foot_model      = 432,
                        body_model      = 1,
                        tail_model      = -1,
                        shoulder2_model = -1,
                        wings_model     = -1,
                        head_size       = 1.00999999f,
                        body_size       = 1f,
                        hand_size       = 1f,
                        foot_size       = 0.9800000191f,
                        shoulder2_size  = 1f,
                        weapon_size     = 0.9499999881f,
                        tail_size       = 0.8000000119f,
                        shoulder_size   = 1f,
                        wings_size      = 1f,
                        body_offset     = new FloatVector()
                        {
                            z = -5f
                        },
                        head_offset = new FloatVector()
                        {
                            y = 0.5f,
                            z = 5f
                        },
                        hand_offset = new FloatVector()
                        {
                            x = 6f,
                        },
                        foot_offset = new FloatVector()
                        {
                            x = 3f,
                            y = 1f,
                            z = -10.5f
                        },
                        back_offset = new FloatVector()
                        {
                            y = -8f,
                            z = 2f
                        },
                    },
                    entityFlags    = 0b00000000_00000000_00000000_00100000, //64
                    roll           = 0,
                    stun           = 0,
                    slow           = 0,
                    ice            = 0,
                    wind           = 0,
                    showPatchTime  = 0,
                    entityClass    = 2,
                    specialization = 0,
                    charge         = 0,
                    unused24       = new FloatVector(),
                    unused25       = new FloatVector(),
                    rayHit         = new FloatVector(),
                    HP             = 1623f,
                    MP             = 0,
                    block          = 1,
                    multipliers    = new Multipliers()
                    {
                        HP          = 100,
                        attackSpeed = 1,
                        damage      = 1,
                        armor       = 1,
                        resi        = 1,
                    },
                    unused31          = 0,
                    unused32          = 0,
                    level             = 500,
                    XP                = 0,
                    parentOwner       = 0,
                    unused36          = 0,
                    powerBase         = 0,
                    unused38          = 0,
                    unused39          = new IntVector(),
                    spawnPos          = new LongVector(),
                    unused41          = new IntVector(),
                    unused42          = 0,
                    consumable        = new Item(),
                    equipment         = new Item[13],
                    name              = "ET_bot",
                    skillDistribution = new SkillDistribution()
                    {
                        ability1 = 5,
                        ability2 = 5,
                        ability3 = 5,
                    },
                    manaCubes = 0,
                };
                for (int i = 0; i < 13; i++)
                {
                    playerstats.equipment[i] = new Item();
                }
                playerstats.Write(writer);
                stopWatch.Start();
                players.Add(personalGuid, playerstats);
                break;

                #endregion
            case 17:     //serving sending the right version if yours is wrong
                #region version
                var version = new ProtocolVersion(reader);
                break;

                #endregion
            case 18:
                #region server full
                //empty
                break;

                #endregion
            default:
                Console.WriteLine(string.Format("unknown packet id: {0}", packetid));
                break;
            }
        }