Exemplo n.º 1
0
 public void AddPacketList(Client client, PacketList packetList)
 {
     foreach (TcpPacket packet in packetList.Packets)
     {
         AddPacket(client, packet);
     }
 }
Exemplo n.º 2
0
 public void AddPacket(Client client, TcpPacket packet, bool skipCaching)
 {
     if (client != null && packet != null)
     {
         if (!cachingEnabled || skipCaching)
         {
             // Caching is disabled, add directly to the client's packetlist
             lock (lockObject)
             {
                 int        index      = HitList.IndexOfKey(client);
                 PacketList packetList = null;
                 if (index == -1)
                 {
                     packetList = new PacketList();
                     HitList.Add(client, packetList);
                 }
                 else
                 {
                     packetList = HitList.ValueByIndex(index);
                 }
                 packetList.AddPacket(packet);
             }
         }
         else
         {
             // Caching is enabled, add to the cache
             hitListCache.AddCacheItem(new object[] { PacketHitListTargets.Client, client, packet });
         }
     }
 }
Exemplo n.º 3
0
 public void AddPacketList(Client client, PacketList packetList)
 {
     foreach (TcpPacket packet in packetList.Packets) {
         AddPacket(client, packet);
     }
 }
Exemplo n.º 4
0
        public void AddPacket(Client client, TcpPacket packet, bool skipCaching)
        {
            if (client != null && packet != null) {
                if (!cachingEnabled || skipCaching) {
                    // Caching is disabled, add directly to the client's packetlist
                    lock (lockObject) {
                        int index = HitList.IndexOfKey(client);
                        PacketList packetList = null;
                        if (index == -1) {
                            packetList = new PacketList();
                            HitList.Add(client, packetList);
                        } else {
                            packetList = HitList.ValueByIndex(index);
                        }
                        packetList.AddPacket(packet);
                    }
                } else {
                    // Caching is enabled, add to the cache
                    hitListCache.AddCacheItem(new object[] { PacketHitListTargets.Client, client, packet });
                }

            }
        }
Exemplo n.º 5
0
 public static void AppendPlayerDir(Client client, PacketList packetList)
 {
     packetList.AddPacket(CreatePlayerDir(client));
 }
Exemplo n.º 6
0
 public static void SendDataTo(Client client, PacketList packetList)
 {
     SendDataTo(client, packetList.CombinePackets(), false, false, true);
 }
Exemplo n.º 7
0
        internal static void ProcessMovement(Client client, Enums.Direction direction, Enums.Speed speed, bool critical)
        {
            PacketHitList hitlist = null;
            PacketHitList.MethodStart(ref hitlist);
            try {
                Player player = client.Player;

                IMap map = player.GetCurrentMap();

                map.ProcessingPaused = false;

                int X = player.X;
                int Y = player.Y;

                if (!NetworkManager.IsPlaying(client)) {
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                if (Ranks.IsDisallowed(client, Enums.Rank.Moniter) || client.Player.ProtectionOff) {
                    player.Hunted = true;
                    PacketBuilder.AppendHunted(client, hitlist);
                }

                PacketList packetListToOthers = new PacketList();

                #region Mobility Checking

                if (player.MovementLocked) {
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketBuilder.AppendOwnXY(client, hitlist);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                if (player.LoadingStory) {
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketBuilder.AppendOwnXY(client, hitlist);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                if (player.Dead) {
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketBuilder.AppendOwnXY(client, hitlist);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                if (player.GetActiveRecruit().StatusAilment == Enums.StatusAilment.Freeze || player.GetActiveRecruit().StatusAilment == Enums.StatusAilment.Sleep) {
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketBuilder.AppendOwnXY(client, hitlist);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;

                }

                player.Direction = direction;
                PacketBuilder.AppendPlayerDir(client, packetListToOthers);
                //PacketBuilder.AppendPlayerDirExcept(client, hitlist);

                //if (player.GetActiveRecruit().StatusAilment == Enums.StatusAilment.Paralyze && speed > Enums.Speed.Walking) {
                //    PacketBuilder.AppendOwnXY(client, hitlist);
                //    PacketHitList.MethodEnded(ref hitlist);
                //    return;

                //}

                if (player.SpeedLimit < speed && player.Map.Tile[player.X, player.Y].Type != Enums.TileType.Slippery) {
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketBuilder.AppendOwnXY(client, hitlist);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                if (player.Map.Tile[player.X, player.Y].Type == Enums.TileType.Slow && (Enums.Speed)player.Map.Tile[player.X, player.Y].Data2 > speed) {
                    int mobilityList = map.Tile[player.X, player.Y].Data1;
                    for (int i = 0; i < 16; i++) {
                        if (mobilityList % 2 == 1 && !client.Player.GetActiveRecruit().Mobility[i]) {
                            if (critical) {
                                PacketBuilder.AppendPlayerLock(client, hitlist, false);
                            }
                            PacketBuilder.AppendOwnXY(client, hitlist);
                            PacketHitList.MethodEnded(ref hitlist);
                            return;
                        }
                        mobilityList /= 2;
                    }
                }

                #endregion Mobility Checking

                #region X/Y Checking
                if (map.MaxX <= 0)
                    map.MaxX = 19;
                if (map.MaxY <= 0)
                    map.MaxY = 14;

                if (player.X > map.MaxX) {
                    player.X = map.MaxX;
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketBuilder.AppendOwnXY(client, hitlist);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }
                if (player.Y > map.MaxY) {
                    player.Y = map.MaxY;
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketBuilder.AppendOwnXY(client, hitlist);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }
                if (player.X < 0) {
                    player.X = 0;
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketBuilder.AppendOwnXY(client, hitlist);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }
                if (player.Y < 0) {
                    player.Y = 0;
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketBuilder.AppendOwnXY(client, hitlist);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }
                #endregion

                #region Block Checking

                switch (direction) {
                    case Enums.Direction.Up:
                        if (player.Y > 0) {
                            if (IsBlocked(client, map, player.X, player.Y - 1) == false) {
                                if (map.Tile[player.X, player.Y - 1].Type != Enums.TileType.Key && map.Tile[player.X, player.Y - 1].Type != Enums.TileType.Door) {
                                    player.Y -= 1;
                                    PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                } else {
                                    if (map.Tile[player.X, player.Y - 1].DoorOpen == true) {
                                        player.Y -= 1;
                                        PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                    } else {
                                        if (critical) {
                                            PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                        }
                                        PacketBuilder.AppendOwnXY(client, hitlist);
                                        PacketHitList.MethodEnded(ref hitlist);
                                        return;
                                    }
                                }
                            } else {
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketBuilder.AppendOwnXY(client, hitlist);
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            }
                        } else {
                            if (SeamlessWorldHelper.IsMapSeamless(map, Enums.MapID.Up)) {
                                SeamlessWorldHelper.SwitchSeamlessMaps(client, map.Up, player.X, Constants.MAX_MAP_Y);
                                PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            } else if (map.Up > 0) {
                                Messenger.PlayerWarp(client, map.Up, player.X, Constants.MAX_MAP_Y);
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            }
                        }
                        break;
                    case Enums.Direction.Down:
                        if (player.Y < map.MaxY) {
                            if (IsBlocked(client, map, player.X, player.Y + 1) == false) {
                                if (map.Tile[player.X, player.Y + 1].Type != Enums.TileType.Key && map.Tile[player.X, player.Y + 1].Type != Enums.TileType.Door) {
                                    player.Y += 1;
                                    PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                } else {
                                    if (map.Tile[player.X, player.Y + 1].DoorOpen == true) {
                                        player.Y += 1;
                                        PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                    } else {
                                        if (critical) {
                                            PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                        }
                                        PacketBuilder.AppendOwnXY(client, hitlist);
                                        PacketHitList.MethodEnded(ref hitlist);
                                        return;
                                    }
                                }
                            } else {
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketBuilder.AppendOwnXY(client, hitlist);
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            }
                        } else {
                            if (SeamlessWorldHelper.IsMapSeamless(map, Enums.MapID.Down)) {
                                SeamlessWorldHelper.SwitchSeamlessMaps(client, map.Down, player.X, 0);
                                PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            } else if (map.Down > 0) {
                                Messenger.PlayerWarp(client, map.Down, player.X, 0);
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            }
                        }
                        break;
                    case Enums.Direction.Left:
                        if (player.X > 0) {
                            if (IsBlocked(client, map, player.X - 1, player.Y) == false) {
                                if (map.Tile[player.X - 1, player.Y].Type != Enums.TileType.Key && map.Tile[player.X - 1, player.Y].Type != Enums.TileType.Door) {
                                    player.X -= 1;
                                    PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                } else {
                                    if (map.Tile[player.X - 1, player.Y].DoorOpen == true) {
                                        player.X -= 1;
                                        PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                    } else {
                                        if (critical) {
                                            PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                        }
                                        PacketBuilder.AppendOwnXY(client, hitlist);
                                        PacketHitList.MethodEnded(ref hitlist);
                                        return;
                                    }
                                }
                            } else {
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketBuilder.AppendOwnXY(client, hitlist);
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            }
                        } else {
                            if (SeamlessWorldHelper.IsMapSeamless(map, Enums.MapID.Left)) {
                                SeamlessWorldHelper.SwitchSeamlessMaps(client, map.Left, Constants.MAX_MAP_X, player.Y);
                                PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            } else if (map.Left > 0) {
                                Messenger.PlayerWarp(client, map.Left, Constants.MAX_MAP_X, player.Y);
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            }
                        }
                        break;
                    case Enums.Direction.Right:
                        if (player.X < map.MaxX) {
                            if (IsBlocked(client, map, player.X + 1, player.Y) == false) {
                                if (map.Tile[player.X + 1, player.Y].Type != Enums.TileType.Key && map.Tile[player.X + 1, player.Y].Type != Enums.TileType.Door) {
                                    player.X += 1;
                                    PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                } else {
                                    if (map.Tile[player.X + 1, player.Y].DoorOpen == true) {
                                        player.X += 1;
                                        PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                    } else {
                                        if (critical) {
                                            PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                        }
                                        PacketBuilder.AppendOwnXY(client, hitlist);
                                        PacketHitList.MethodEnded(ref hitlist);
                                        return;
                                    }
                                }
                            } else {
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketBuilder.AppendOwnXY(client, hitlist);
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            }
                        } else {
                            if (SeamlessWorldHelper.IsMapSeamless(map, Enums.MapID.Right)) {
                                SeamlessWorldHelper.SwitchSeamlessMaps(client, map.Right, 0, player.Y);
                                PacketBuilder.AppendPlayerMove(client, hitlist, direction, speed);
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            } else if (map.Right > 0) {
                                Messenger.PlayerWarp(client, map.Right, 0, player.Y);
                                if (critical) {
                                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                                }
                                PacketHitList.MethodEnded(ref hitlist);
                                return;
                            }
                        }
                        break;
                }
                #endregion

                player.RefreshSeenCharacters(hitlist);

                #region More Collision Checking

                //if (map.Tile[player.X, player.Y].Players.Players == null) {
                //    map.Tile[player.X, player.Y].Players.Players = new List<string>();
                //}
                //if (map.Tile[player.X, player.Y].Players.Players.Contains(client.Player.CharID) == false) {
                //    map.Tile[player.X, player.Y].Players.PlayerCount += 1;
                //    map.Tile[player.X, player.Y].Players.Players.Add(client.Player.CharID);
                //}
                //if (map.Tile[player.X, player.Y].Players.PlayerCount > 1) {
                //    map.Tile[player.X, player.Y].Players.LastPlayer = map.Tile[player.X, player.Y].Players.Players[map.Tile[player.X, player.Y].Players.Players.Count - 2];
                //    map.Tile[player.X, player.Y].Players.HasPlayer = true;
                //    PlayerCollide(client, map.Tile[player.X, player.Y].Players);
                //}
                //if (map.Tile[player.X, player.Y].Players.Players.Count == 1) {
                //    map.Tile[player.X, player.Y].Players.LastPlayer = "";
                //}

                {
                    Client lastCollision = null;
                    int collisionCounter = 0;
                    foreach (Client i in map.GetClients()) {
                        if (i != client) {
                            if (i.Player.X == client.Player.X && i.Player.Y == client.Player.Y) {
                                lastCollision = i;
                                collisionCounter++;
                            }
                        }
                    }
                    if (lastCollision != null) {
                        PlayerCollide(client, lastCollision, collisionCounter);
                    }
                }

                #endregion

                Scripting.ScriptManager.InvokeSub("OnStep", map, client.Player.GetActiveRecruit(), speed, hitlist);

                // Trigger event checking
                for (int i = 0; i < player.TriggerEvents.Count; i++) {
                    switch (player.TriggerEvents[i].Trigger) {
                        case Events.Player.TriggerEvents.TriggerEventTrigger.SteppedOnTile: {
                                if (player.TriggerEvents[i].CanInvokeTrigger()) {
                                    player.TriggerEvents[i].InvokeTrigger();
                                }
                            }
                            break;
                        case Events.Player.TriggerEvents.TriggerEventTrigger.StepCounter: {
                                ((Events.Player.TriggerEvents.StepCounterTriggerEvent)player.TriggerEvents[i]).StepsCounted++;
                                if (player.TriggerEvents[i].CanInvokeTrigger()) {
                                    player.TriggerEvents[i].InvokeTrigger();
                                }
                            }
                            break;
                    }
                }

                #region Tile Checks

                //healing tiles code
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Heal) {
                    //if (!player.PK) {
                    player.SetHP(player.GetMaxHP());
                    hitlist.AddPacket(client, PacketBuilder.CreateBattleMsg("The entire team was fully healed!", Text.BrightGreen));
                    //} else {
                    //    hitlist.AddPacket(client, PacketBuilder.CreateBattleMsg("Outlaws can't use healing tiles!", Text.BrightRed));
                    //}
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                //Check for kill tile, and if so kill them
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Kill) {
                    player.SetHP(0);
                    Messenger.PlayerMsg(client, "You have fainted!", Text.BrightRed);

                    Scripting.ScriptManager.InvokeSub("OnDeath", client, Enums.KillType.Tile);

                    player.SetHP(player.GetMaxHP());
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                //check for doors
                if (player.X + 1 <= map.MaxX) {
                    if (map.Tile[player.X + 1, player.Y].Type == Enums.TileType.Door) {
                        X += 1;
                        Y = player.Y;

                        if (map.Tile[X, Y].DoorOpen == false) {
                            map.Tile[X, Y].DoorOpen = true;
                            map.Tile[X, Y].DoorTimer = Core.GetTickCount();

                            hitlist.AddPacketToMap(map, TcpPacket.CreatePacket("mapkey", X.ToString(), Y.ToString(), "1"));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("door.wav"));
                        }
                    }
                }
                if (player.X - 1 <= map.MaxX && player.X - 1 > -1) {
                    if (map.Tile[player.X - 1, player.Y].Type == Enums.TileType.Door) {
                        X -= 1;
                        Y = player.Y;

                        if (map.Tile[X, Y].DoorOpen == false) {
                            map.Tile[X, Y].DoorOpen = true;
                            map.Tile[X, Y].DoorTimer = Core.GetTickCount();

                            hitlist.AddPacketToMap(map, TcpPacket.CreatePacket("mapkey", X.ToString(), Y.ToString(), "1"));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("door.wav"));
                        }
                    }
                }
                if (player.Y - 1 <= map.MaxY && player.Y - 1 > -1) {
                    if (map.Tile[player.X, player.Y - 1].Type == Enums.TileType.Door) {
                        X = player.X;
                        Y -= 1;

                        if (map.Tile[X, Y].DoorOpen == false) {
                            map.Tile[X, Y].DoorOpen = true;
                            map.Tile[X, Y].DoorTimer = Core.GetTickCount();

                            hitlist.AddPacketToMap(map, TcpPacket.CreatePacket("mapkey", X.ToString(), Y.ToString(), "1"));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("door.wav"));
                        }
                    }
                }
                if (player.Y + 1 <= map.MaxY) {
                    if (map.Tile[player.X, player.Y + 1].Type == Enums.TileType.Door) {
                        X = player.X;
                        Y += 1;

                        if (map.Tile[X, Y].DoorOpen == false) {
                            map.Tile[X, Y].DoorOpen = true;
                            map.Tile[X, Y].DoorTimer = Core.GetTickCount();

                            hitlist.AddPacketToMap(map, TcpPacket.CreatePacket("mapkey", X.ToString(), Y.ToString(), "1"));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("door.wav"));
                        }
                    }
                }

                // Check to see if the tile is a warp tile, and if so warp them
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Warp) {
                    int mapNum = map.Tile[player.X, player.Y].Data1;
                    X = map.Tile[player.X, player.Y].Data2;
                    Y = map.Tile[player.X, player.Y].Data3;
                    bool xyWarp = false;
                    if (player.Map.MapType == Enums.MapType.Standard) {
                        if (((Map)player.Map).MapNum == mapNum) {
                            xyWarp = true;
                        }
                    } else if (player.Map.MapType == Enums.MapType.Instanced) {
                        if (((InstancedMap)player.Map).MapBase == mapNum) {
                            xyWarp = true;
                        }
                    }
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    if (xyWarp) {
                        Messenger.PlayerXYWarp(client, X, Y);
                    } else {
                        Messenger.PlayerWarp(client, mapNum, X, Y);
                    }

                    return;
                }

                // Check for key trigger open
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.KeyOpen) {
                    X = map.Tile[player.X, player.Y].Data1;
                    Y = map.Tile[player.X, player.Y].Data2;

                    if (map.Tile[X, Y].Type == Enums.TileType.Key & map.Tile[X, Y].DoorOpen == false) {
                        map.Tile[X, Y].DoorOpen = true;
                        map.Tile[X, Y].DoorTimer = Core.GetTickCount();

                        hitlist.AddPacketToMap(map, TcpPacket.CreatePacket("mapkey", X.ToString(), Y.ToString(), "1"));
                        if (map.Tile[player.X, player.Y].String1.Trim() == "") {
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleMsg("A path was opened!", Text.White));
                        } else {
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleMsg(map.Tile[player.X, player.Y].String1.Trim(), Text.White));
                        }
                        hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("key.wav"));
                        PacketHitList.MethodEnded(ref hitlist);
                        return;
                    }
                }

                // Check for shop
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Shop) {
                    if (map.Tile[player.X, player.Y].Data1 > 0) {

                        Messenger.SendShopMenu(client, map.Tile[player.X, player.Y].Data1);
                    } else {
                        Messenger.PlayerMsg(client, "There is no shop here.", Text.BrightRed);
                    }
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                // Check for guild shop
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Guild) {
                    if (client.Player.GuildAccess > 0) {
                        //manage or view guild
                        Messenger.SendGuildMenu(client);
                    } else {
                        //register guild
                        if (client.Player.ExplorerRank >= Guilds.GuildManager.MIN_RANK) {
                            hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("Guilds can be created for " + Guilds.GuildManager.CREATE_PRICE + " " + Items.ItemManager.Items[1].Name + " per founder.", Text.Yellow));
                            Messenger.SendGuildCreation(client);
                        } else {
                            hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("Register a guild here.  You can create a guild when your explorer rank is " + Guilds.GuildManager.MIN_RANK + " or higher.", Text.Green));
                        }
                    }
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                // Check for Link Shop
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.LinkShop) {
                    int priceItem = map.Tile[player.X, player.Y].Data1;
                    int priceAmount = map.Tile[player.X, player.Y].Data2;
                    bool earlierEvo = (map.Tile[player.X, player.Y].Data3 == 1);
                    Messenger.SendRecallMenu(client, earlierEvo);
                    if (priceItem > 0) {

                        if (Items.ItemManager.Items[priceItem].StackCap <= 0 && Items.ItemManager.Items[priceItem].Type != Enums.ItemType.Currency) {
                            hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("Moves will be taught in exchange for a " + Items.ItemManager.Items[priceItem].Name + ".", Text.Yellow));
                        } else if (priceAmount > 0) {
                            hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("Moves will be taught in exchange for " + priceAmount + " " + Items.ItemManager.Items[priceItem].Name + ".", Text.Yellow));
                        }
                    }
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                // Check if player stepped on sprite changing tile
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.SpriteChange) {
                    if (player.GetActiveRecruit().Sprite == map.Tile[player.X, player.Y].Data1) {
                        hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("You already have this sprite!", Text.BrightRed));
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                        PacketHitList.MethodEnded(ref hitlist);
                        return;
                    } else {
                        if (map.Tile[player.X, player.Y].Data2 == 0) {
                            hitlist.AddPacket(client, TcpPacket.CreatePacket("spritechange", "0"));
                        } else {
                            if (ItemManager.Items[map.Tile[player.X, player.Y].Data2].Type == Enums.ItemType.Currency) {
                                hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("This sprite will cost you " + map.Tile[player.X, player.Y].Data3 + " " + ItemManager.Items[map.Tile[player.X, player.Y].Data2].Name.Trim() + "!", Text.Yellow));
                            } else {
                                hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("This sprite will cost you a " + ItemManager.Items[map.Tile[player.X, player.Y].Data2].Name.Trim() + "!", Text.Yellow));
                            }
                            hitlist.AddPacket(client, TcpPacket.CreatePacket("spritechange", "1"));
                        }
                    }
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                // Check if player stepped on notice tile
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Notice) {
                    if (map.Tile[player.X, player.Y].String1.Trim() != "") {
                        hitlist.AddPacket(client, PacketBuilder.CreateChatMsg(map.Tile[player.X, player.Y].String1.Trim(), Text.Black));
                    }
                    if (map.Tile[player.X, player.Y].String2.Trim() != "") {
                        hitlist.AddPacket(client, PacketBuilder.CreateChatMsg(map.Tile[player.X, player.Y].String2.Trim(), Text.Grey));
                    }
                    hitlist.AddPacketToMap(map, TcpPacket.CreatePacket("sound", map.Tile[player.X, player.Y].String3));
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                // Check if player stepped on sound tile
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Sound) {
                    hitlist.AddPacketToMap(map, TcpPacket.CreatePacket("sound", map.Tile[player.X, player.Y].String1));
                    if (critical) {
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    }
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                //Check if player stepped on a scripted tile
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Scripted) {
                    Scripting.ScriptManager.InvokeSub("ScriptedTile", map, client.Player.GetActiveRecruit(), map.Tile[player.X, player.Y].Data1, map.Tile[player.X, player.Y].String1, map.Tile[player.X, player.Y].String2, map.Tile[player.X, player.Y].String3, hitlist);
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                // Check if player stepped on Bank tile
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Bank) {
                    Messenger.OpenBank(client);
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Assembly) {
                    Messenger.SendAllRecruits(client);
                    Messenger.OpenAssembly(client);
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }
                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Evolution) {
                    EvolutionManager.StartEvolution(player);
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                if (map.Tile[player.X, player.Y].Type == Enums.TileType.Story) {
                    StoryManager.PlayStory(client, map.Tile[player.X, player.Y].Data1);
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                if (map.Tile[player.X, player.Y].Type == Enums.TileType.MissionBoard) {
                    Messenger.OpenMissionBoard(client);
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketHitList.MethodEnded(ref hitlist);
                    return;
                }

                if (map.Tile[player.X, player.Y].Type == Enums.TileType.RDungeonGoal) {
                    if (client.Player.PartyID == null) {

                        RDungeonMap rmap = map as RDungeonMap;
                        if (rmap != null) {
                            RDungeon dungeon = RDungeonManager.RDungeons[rmap.RDungeonIndex];
                            int floor = rmap.RDungeonFloor;
                            if (dungeon.Floors[floor].GoalType == Enums.RFloorGoalType.NextFloor) {
                                if (floor + 1 < dungeon.Floors.Count) {
                                    player.WarpToRDungeon(rmap.RDungeonIndex, floor + 1);
                                } else {
                                    //client.Player.dungeonIndex = -1;
                                    //client.Player.dungeonFloor = -1;
                                    hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("You have completed the dungeon!", Text.Yellow));
                                    Messenger.PlayerWarp(client, Settings.Crossroads, Settings.StartX, Settings.StartY);
                                }
                            } else if (dungeon.Floors[floor].GoalType == Enums.RFloorGoalType.Map) {
                                //client.Player.dungeonIndex = -1;
                                //client.Player.dungeonFloor = -1;
                                Messenger.PlayerWarp(client, dungeon.Floors[floor].GoalMap, dungeon.Floors[floor].GoalX, dungeon.Floors[floor].GoalY);
                            } else {
                                Scripting.ScriptManager.InvokeSub("RDungeonScriptGoal", client, dungeon.Floors[floor].GoalMap, dungeon.Floors[floor].GoalX, dungeon.Floors[floor].GoalY);
                            }
                        }
                        PacketBuilder.AppendPlayerLock(client, hitlist, false);
                        PacketHitList.MethodEnded(ref hitlist);
                        return;
                    } else {
                        bool warp = true;
                        Party party = PartyManager.FindPlayerParty(client);
                        IMap sourceMap = client.Player.Map;
                        foreach (Client member in party.GetOnlineMemberClients()) {
                            if (/*!member.Player.Dead && */member.Player.MapID == client.Player.MapID && (member.Player.X != client.Player.X || member.Player.Y != client.Player.Y)) {
                                warp = false;
                            }
                        }

                        if (warp) {
                            RDungeonMap rmap = map as RDungeonMap;
                            foreach (Client member in party.GetOnlineMemberClients()) {
                                if (member.Player.Map != sourceMap) continue;
                                if (rmap != null) {
                                    RDungeon dungeon = RDungeonManager.RDungeons[rmap.RDungeonIndex];
                                    int floor = rmap.RDungeonFloor;
                                    if (dungeon.Floors[floor].GoalType == Enums.RFloorGoalType.NextFloor) {
                                        if (floor + 1 < dungeon.Floors.Count) {
                                            member.Player.WarpToRDungeon(rmap.RDungeonIndex, floor + 1);
                                        } else {
                                            //client.Player.dungeonIndex = -1;
                                            //client.Player.dungeonFloor = -1;
                                            hitlist.AddPacket(member, PacketBuilder.CreateChatMsg("You have completed the dungeon!", Text.Yellow));
                                            Messenger.PlayerWarp(member, Settings.Crossroads, Settings.StartX, Settings.StartY);
                                        }
                                    } else if (dungeon.Floors[floor].GoalType == Enums.RFloorGoalType.Map) {
                                        //client.Player.dungeonIndex = -1;
                                        //client.Player.dungeonFloor = -1;
                                        Messenger.PlayerWarp(member, dungeon.Floors[floor].GoalMap, dungeon.Floors[floor].GoalX, dungeon.Floors[floor].GoalY);
                                    } else {
                                        //client.Player.dungeonIndex = -1;
                                        //client.Player.dungeonFloor = -1;
                                        Scripting.ScriptManager.InvokeSub("RDungeonScriptGoal", member, dungeon.Floors[floor].GoalMap, dungeon.Floors[floor].GoalX, dungeon.Floors[floor].GoalY);
                                    }
                                }
                            }
                            PacketBuilder.AppendPlayerLock(client, hitlist, false);
                            PacketHitList.MethodEnded(ref hitlist);
                            return;
                        } else {
                            hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("All surviving players on the floor must be on the goal in order to continue.", Text.WhiteSmoke));
                            PacketBuilder.AppendPlayerLock(client, hitlist, false);
                            PacketHitList.MethodEnded(ref hitlist);
                            return;
                        }
                    }
                }

                for (int i = client.Player.ActiveGoalPoints.Count - 1; i >= 0; i--) {
                    bool missionComplete = false;
                    if (player.X == client.Player.ActiveGoalPoints[i].GoalX && player.Y == client.Player.ActiveGoalPoints[i].GoalY) {
                        switch (player.JobList.JobList[client.Player.ActiveGoalPoints[i].JobListIndex].Mission.MissionType) {
                            case Enums.MissionType.Rescue: {
                                    missionComplete = true;
                                }
                                break;
                            case Enums.MissionType.ItemRetrieval: {
                                    int itemVal = player.HasItem(player.JobList.JobList[client.Player.ActiveGoalPoints[i].JobListIndex].Mission.Data1);
                                    if (itemVal > 0) {
                                        player.TakeItem(player.JobList.JobList[client.Player.ActiveGoalPoints[i].JobListIndex].Mission.Data1, 1);
                                        missionComplete = true;
                                    } else {
                                        missionComplete = false;
                                        hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("You've reached the target Pokémon!  But you don't have the requested item...", Text.Grey));
                                    }
                                    //else {
                                    //    missionComplete = false;
                                    //    hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("You don't have enough " + ItemManager.Items[player.ActiveMission.WonderMail.Data1].Name + "!", Text.BrightRed));
                                    //}
                                }
                                break;
                            case Enums.MissionType.Escort: {
                                    if (player.IsInTeam(-2 - client.Player.ActiveGoalPoints[i].JobListIndex)) {
                                        player.RemoveFromTeam(player.FindTeamSlot(-2 - client.Player.ActiveGoalPoints[i].JobListIndex));
                                        missionComplete = true;
                                    } else {
                                        missionComplete = false;
                                        hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("You've reached the target Pokémon!  But you don't have the escort with you...", Text.Grey));
                                    }
                                }
                                break;
                        }
                    }
                    if (missionComplete) {
                        client.Player.HandleMissionComplete(client.Player.ActiveGoalPoints[i].JobListIndex);
                        client.Player.ActiveGoalPoints.RemoveAt(i);
                        break;
                    }
                }

                //if (player.ActiveMission != null) {
                //    if (Generator.IsGoalMap(player.ActiveMission.WonderMail, map) && player.X == player.ActiveMission.GoalX && player.Y == player.ActiveMission.GoalY) {
                //        bool missionComplete = false;
                //        switch (player.ActiveMission.WonderMail.MissionType) {
                //            case Enums.MissionType.Rescue: {
                //                    missionComplete = true;
                //                }
                //                break;
                //            case Enums.MissionType.ItemRetrieval: {
                //                    int itemVal = player.HasItem(player.ActiveMission.WonderMail.Data1);
                //                    if (itemVal > 0 && itemVal >= player.ActiveMission.WonderMail.Data2) {
                //                        player.TakeItem(player.ActiveMission.WonderMail.Data2, player.ActiveMission.WonderMail.Data2);
                //                        missionComplete = true;
                //                    } else {
                //                        missionComplete = false;
                //                        hitlist.AddPacket(client, PacketBuilder.CreateChatMsg("You don't have enough " + ItemManager.Items[player.ActiveMission.WonderMail.Data1].Name + "!", Text.BrightRed));
                //                    }
                //                }
                //                break;
                //            case Enums.MissionType.Escort: {
                //                    if (player.IsInTeam(-2)) {
                //                        player.RemoveFromTeam(player.FindTeamSlot(-2), false);
                //                        missionComplete = true;
                //                    } else {
                //                        missionComplete = false;
                //                    }
                //                }
                //                break;
                //        }
                //        if (missionComplete) {
                //            client.Player.HandleMissionComplete();
                //        }
                //        PacketHitList.MethodEnded(ref hitlist);
                //        return;
                //    }
                //} else if (Program.ClassMan.mMissions.mMissions[player.mActiveMission].MissionType == Enums.MissionType.ItemRetrieval) {
                //    if (mapNum == Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data1 && player.mX == Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data2 && player.mY == Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data3) {
                //        int itemVal = player.HasItem(Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data4);
                //        if (itemVal > 0 && itemVal >= Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data5) {
                //            player.TakeItem(Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data4, Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data5);
                //            if (Program.ClassMan.mMissions.mMissions[player.mActiveMission].EndStory != 0) {
                //                Program.ClassMan.mStories.PlayStory(client, Program.ClassMan.mMissions.mMissions[player.mActiveMission].EndStory - 1);
                //            } else {
                //                Messenger.PlayerMsg(client, "You have completed the mission!", Text.Yellow);
                //            }
                //            if (player.mMissions.ContainsKey(player.mActiveMission)) {
                //                player.mMissions[player.mActiveMission] = true;
                //            } else {
                //                player.mMissions.Add(player.mActiveMission, true);
                //            }
                //            CXmlAttributes attrib = new CXmlAttributes();
                //            attrib.Add("completed", "True");
                //            player.mMissionsXML.SaveNode("mission" + player.mActiveMission, "MissionData", attrib);
                //            if (Program.ClassMan.mMissions.mMissions[player.mActiveMission].RewardItem != 0) {
                //                player.GiveItem(Program.ClassMan.mMissions.mMissions[player.mActiveMission].RewardItem, Program.ClassMan.mMissions.mMissions[player.mActiveMission].RewardCount);
                //            }
                //            if (Globals.Scripting == true) {
                //                Program.ClassMan.mScripts.InvokeSub("OnMissionComplete", client, player.mActiveMission);
                //            }
                //            player.mActiveMission = -1;
                //            Messenger.SendDataTo(client, "MISSIONCOMPLETE" + TcpManager.SEP_CHAR + TcpManager.END_CHAR);
                //        } else {
                //            Messenger.PlayerMsg(client, "You dont have enough " + ItemManager.Items[Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data4].Name.Trim() + "!", Text.BrightRed);
                //        }
                //    }
                //}
                //    } else if (Program.ClassMan.mMissions.mMissions[player.mActiveMission].MissionType == Enums.MissionType.Escort) {
                //        if (mapNum == Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data1 && player.mX == Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data2 && player.mY == Program.ClassMan.mMissions.mMissions[player.mActiveMission].Data3) {
                //            if (player.IsInTeam(-2)) {
                //                if (Program.ClassMan.mMissions.mMissions[player.mActiveMission].EndStory != 0) {
                //                    Program.ClassMan.mStories.PlayStory(client, Program.ClassMan.mMissions.mMissions[player.mActiveMission].EndStory - 1);
                //                } else {
                //                    Messenger.PlayerMsg(client, "You have completed the mission!", Text.Yellow);
                //                }
                //                if (player.mMissions.ContainsKey(player.mActiveMission)) {
                //                    player.mMissions[player.mActiveMission] = true;
                //                } else {
                //                    player.mMissions.Add(player.mActiveMission, true);
                //                }
                //                CXmlAttributes attrib = new CXmlAttributes();
                //                attrib.Add("completed", "True");
                //                player.mMissionsXML.SaveNode("mission" + player.mActiveMission, "MissionData", attrib);
                //                if (Program.ClassMan.mMissions.mMissions[player.mActiveMission].RewardItem != 0) {
                //                    player.GiveItem(Program.ClassMan.mMissions.mMissions[player.mActiveMission].RewardItem, Program.ClassMan.mMissions.mMissions[player.mActiveMission].RewardCount);
                //                }
                //                if (Globals.Scripting == true) {
                //                    Program.ClassMan.mScripts.InvokeSub("OnMissionComplete", client, player.mActiveMission);
                //                }
                //                player.mActiveMission = -1;
                //                Messenger.SendDataTo(client, "MISSIONCOMPLETE" + TcpManager.SEP_CHAR + TcpManager.END_CHAR);
                //                player.RemoveFromTeam(player.FindTeamSlot(-2));
                //            }
                //        }
                //    }
                //}
                //}
                #endregion

                if (critical) {
                    PacketBuilder.AppendPlayerLock(client, hitlist, false);
                    PacketBuilder.AppendOwnXY(client, hitlist);
                }

            } catch (Exception ex) {
                Exceptions.ErrorLogger.WriteToErrorLog(ex, "Player movement processing, Index: " + client.Player.CharID + " Direction: " + direction.ToString() + " Speed: " + speed.ToString() + " Map: " + client.Player.MapID + " X: " + client.Player.X.ToString() + " Y: " + client.Player.Y.ToString());
            }
            PacketHitList.MethodEnded(ref hitlist);
        }