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;
            }
        }
    }
Exemplo n.º 2
0
    private void BroadcastAndReceiveInfo(Player player)
    {
        // Send and receive visible object information.
        PlayerInformation playerInfo = new PlayerInformation(player);
        List <Player>     players    = WorldManager.GetVisiblePlayers(player);

        for (int i = 0; i < players.Count; i++)
        {
            Player nearby = players[i];
            // Send the information to the current player.
            player.ChannelSend(new PlayerInformation(nearby));
            // Send information to the other player as well.
            nearby.ChannelSend(playerInfo);
        }

        // Send nearby NPC information.
        List <WorldObject> objects = WorldManager.GetVisibleObjects(player);

        for (int i = 0; i < objects.Count; i++)
        {
            WorldObject nearby = objects[i];
            if (!nearby.IsNpc())
            {
                continue;
            }
            player.ChannelSend(new NpcInformation(nearby.AsNpc()));
        }
    }
    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 Handle(Player player)
    {
        // Gather information.
        WorldObject target = player.GetTarget();

        if (target == null)
        {
            ChatManager.SendSystemMessage(player, "You must select a target.");
            return;
        }
        Npc npc = target.AsNpc();

        if (npc == null)
        {
            ChatManager.SendSystemMessage(player, "You must select an NPC.");
            return;
        }

        // Log admin activity.
        SpawnHolder    npcSpawn    = npc.GetSpawnHolder();
        LocationHolder npcLocation = npcSpawn.GetLocation();

        if (Config.LOG_ADMIN)
        {
            LogManager.LogAdmin(player.GetName() + " used command /delete " + npc + " " + npcLocation);
        }

        // Delete NPC.
        npc.DeleteMe();

        // Send player success message.
        int npcId = npc.GetNpcHolder().GetNpcId();

        ChatManager.SendSystemMessage(player, "You have deleted " + npcId + " from " + npcLocation);

        // Store in database.
        try
        {
            MySqlConnection con = DatabaseManager.GetConnection();
            MySqlCommand    cmd = new MySqlCommand(SPAWN_DELETE_QUERY, con);
            cmd.Parameters.AddWithValue("npc_id", npcId);
            cmd.Parameters.AddWithValue("x", npcLocation.GetX());
            cmd.Parameters.AddWithValue("y", npcLocation.GetY());
            cmd.Parameters.AddWithValue("z", npcLocation.GetZ());
            cmd.Parameters.AddWithValue("heading", npcLocation.GetHeading());
            cmd.Parameters.AddWithValue("respawn_delay", npcSpawn.GetRespawnDelay());
            cmd.ExecuteNonQuery();
            con.Close();
        }
        catch (Exception e)
        {
            LogManager.Log(e.ToString());
        }
    }