示例#1
0
    public static void RemoveObject(WorldObject obj)
    {
        // Broadcast deletion to nearby players.
        foreach (Player player in GetVisiblePlayers(obj))
        {
            player.ChannelSend(new DeleteObject(obj));
        }

        // Remove from list and take necessary actions.
        if (obj.IsPlayer())
        {
            ((IDictionary <long, Player>)PLAYER_OBJECTS).Remove(obj.GetObjectId());
            // Store player.
            obj.AsPlayer().StoreMe();

            // Log world access.
            if (Config.LOG_WORLD)
            {
                LogManager.LogWorld("Player [" + obj.AsPlayer().GetName() + "] Account [" + obj.AsPlayer().GetClient().GetAccountName() + "] Left the world.");
            }
        }
        else
        {
            ((IDictionary <long, WorldObject>)GAME_OBJECTS).Remove(obj.GetObjectId());
        }
    }
    public ObjectInfoRequest(GameClient client, ReceivablePacket packet)
    {
        // Read data.
        long objectId = packet.ReadLong();

        // Get the acting player.
        Player player = client.GetActiveChar();
        // Send the information.
        List <WorldObject> objects = WorldManager.GetVisibleObjects(player);

        for (int i = 0; i < objects.Count; i++)
        {
            WorldObject obj = objects[i];
            if (obj.GetObjectId() == objectId)
            {
                if (obj.IsPlayer())
                {
                    client.ChannelSend(new PlayerInformation(obj.AsPlayer()));
                }
                else if (obj.IsNpc())
                {
                    client.ChannelSend(new NpcInformation(obj.AsNpc()));
                }

                // Send delayed animation update in case object was already moving.
                Task.Delay(1000).ContinueWith(task => SendAnimationInfo(client, obj));
                break;
            }
        }
    }
    public void DeleteMe()
    {
        // Remove from region.
        _region.RemoveObject(this);

        // Broadcast NPC deletion.
        DeleteObject        delete  = new DeleteObject(this);
        List <RegionHolder> regions = _region.GetSurroundingRegions();

        for (int i = 0; i < regions.Count; i++)
        {
            List <WorldObject> objects = regions[i].GetObjects();
            for (int j = 0; j < objects.Count; j++)
            {
                WorldObject nearby = objects[j];
                if (nearby != null && nearby.IsPlayer())
                {
                    nearby.AsPlayer().ChannelSend(delete);
                }
            }
        }

        // Set region to null.
        _region = null;
    }
    public static void AddObject(WorldObject obj)
    {
        if (obj.IsPlayer())
        {
            Player player = obj.AsPlayer();

            if (!PLAYER_OBJECTS.Contains(player))
            {
                lock (PLAYER_OBJECTS)
                {
                    PLAYER_OBJECTS.Add(player);
                }
                lock (ONLINE_CLIENTS)
                {
                    ONLINE_CLIENTS.Add(player.GetClient());
                }

                // Log world access.
                if (Config.LOG_WORLD)
                {
                    LogManager.LogWorld("Player [" + player.GetName() + "] Account [" + player.GetClient().GetAccountName() + "] Entered the world.");
                }
            }
        }
    }
    public static List <Player> GetVisiblePlayers(WorldObject obj)
    {
        List <Player>       result  = new List <Player>();
        List <RegionHolder> regions = obj.GetRegion().GetSurroundingRegions();

        for (int i = 0; i < regions.Count; i++)
        {
            List <WorldObject> objects = regions[i].GetObjects();
            for (int j = 0; j < objects.Count; j++)
            {
                WorldObject nearby = objects[j];
                if (!nearby.IsPlayer())
                {
                    continue;
                }
                if (nearby.GetObjectId() == obj.GetObjectId())
                {
                    continue;
                }
                if (obj.CalculateDistance(nearby) < MOVEMENT_BROADCAST_RADIUS)
                {
                    result.Add(nearby.AsPlayer());
                }
            }
        }
        return(result);
    }
    public static void RemoveObject(WorldObject obj)
    {
        // Broadcast deletion to nearby players.
        List <Player> players = GetVisiblePlayers(obj);

        for (int i = 0; i < players.Count; i++)
        {
            players[i].ChannelSend(new DeleteObject(obj));
        }

        // Remove from list and take necessary actions.
        if (obj.IsPlayer())
        {
            Player player = obj.AsPlayer();

            lock (PLAYER_OBJECTS)
            {
                PLAYER_OBJECTS.Remove(player);
            }

            // Store player.
            player.StoreMe();

            // Log world access.
            if (Config.LOG_WORLD && player.GetClient().GetActiveChar() != null)
            {
                LogManager.LogWorld("Player [" + player.GetName() + "] Account [" + player.GetClient().GetAccountName() + "] Left the world.");
            }
        }

        obj.GetRegion().RemoveObject(obj);
    }
    public void SetLocation(float posX, float posY, float posZ, float heading)
    {
        _location.Update(posX, posY, posZ, heading);

        // When changing location test for appropriate region.
        RegionHolder testRegion = WorldManager.GetRegion(this);

        if (!testRegion.Equals(_region))
        {
            if (_region != null)
            {
                // Remove this object from the region.
                _region.RemoveObject(this);

                // Broadcast change to players left behind when teleporting.
                if (_isTeleporting)
                {
                    DeleteObject        deleteObject = new DeleteObject(this);
                    List <RegionHolder> regions      = _region.GetSurroundingRegions();
                    for (int i = 0; i < regions.Count; i++)
                    {
                        List <WorldObject> objects = regions[i].GetObjects();
                        for (int j = 0; j < objects.Count; j++)
                        {
                            WorldObject nearby = objects[j];
                            if (nearby == this)
                            {
                                continue;
                            }
                            if (nearby.IsPlayer())
                            {
                                nearby.AsPlayer().ChannelSend(deleteObject);
                            }
                        }
                    }
                }
            }

            // Assign new region.
            _region = testRegion;
            _region.AddObject(this);

            // Send visible NPC information.
            // TODO: Exclude known NPCs?
            if (IsPlayer())
            {
                List <WorldObject> objects = WorldManager.GetVisibleObjects(this);
                for (int i = 0; i < objects.Count; i++)
                {
                    WorldObject nearby = objects[i];
                    if (!nearby.IsNpc())
                    {
                        continue;
                    }
                    AsPlayer().ChannelSend(new NpcInformation(nearby.AsNpc()));
                }
            }
        }
    }
    public static void AddObject(WorldObject obj)
    {
        if (obj.IsPlayer())
        {
            if (!PLAYER_OBJECTS.Values.Contains(obj.AsPlayer()))
            {
                lock (ONLINE_CLIENTS)
                {
                    ONLINE_CLIENTS.Add(obj.AsPlayer().GetClient());
                }
                PLAYER_OBJECTS.TryAdd(obj.GetObjectId(), obj.AsPlayer());

                // Log world access.
                if (Config.LOG_WORLD)
                {
                    LogManager.LogWorld("Player [" + obj.AsPlayer().GetName() + "] Account [" + obj.AsPlayer().GetClient().GetAccountName() + "] Entered the world.");
                }
            }
        }
    }