Files
NatiBot/SLBot/bot/GUI/frmMap.cs
2014-09-04 04:26:22 +01:00

322 lines
13 KiB
C#

/***************************************************************************
The Disc Image Chef
----------------------------------------------------------------------------
Filename : frmMap.cs
Version : 1.0.326
Author(s) : Natalia Portillo
Component : NatiBot
Revision : r326
Last change by : Natalia Portillo
Date : 2010/01/01
--[ License ] --------------------------------------------------------------
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
----------------------------------------------------------------------------
Copyright (C) 2008-2014 Claunia.com
****************************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using OpenMetaverse;
using System.Drawing.Imaging;
using System.Net;
using System.Timers;
using System.Diagnostics;
using OpenMetaverse.Imaging;
using OpenMetaverse.Assets;
namespace bot.GUI
{
public partial class frmMap : Form
{
private SecondLifeBot _client;
// = new GridClient();
private UUID _MapImageID;
private Image _MapLayer;
private int px = 128;
private int py = 128;
private Simulator sim;
private Point mouse_offset;
public frmMap(SecondLifeBot Client)
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(Program.CurrentDomain_UnhandledException);
InitializeComponent();
this._client = Client;
this.sim = this._client.Network.CurrentSim;
this._client.Grid.CoarseLocationUpdate += new EventHandler<CoarseLocationUpdateEventArgs>(this.Grid_CoarseLocationUpdate);
this._client.Network.SimChanged += new EventHandler<SimChangedEventArgs>(this.Network_SimChanged);
btnTeleport.Text = bot.Localization.clResourceManager.getText("frmMap.btnTeleport");
lblSelectedPosition.Text = bot.Localization.clResourceManager.getText("frmMap.lblSelectedPosition");
lblMapDownloading.Text = bot.Localization.clResourceManager.getText("frmMap.lblMapDownloading");
this.btnClose.Image = bot.Localization.clResourceManager.getNoLanguageButton("btnClose.idle");
this.btnClose.ButtonBitmap = bot.Localization.clResourceManager.getNoLanguageButton("btnClose.idle");
this.btnClose.OnMouseClickBitmap = bot.Localization.clResourceManager.getNoLanguageButton("btnClose.onclick");
this.btnClose.OnMouseOverBitmap = bot.Localization.clResourceManager.getNoLanguageButton("btnClose.onhover");
this.btnTeleport.ButtonBitmap = bot.Localization.clResourceManager.getButton("frmFriends.btnTeleport.idle");
this.btnTeleport.Image = bot.Localization.clResourceManager.getButton("frmFriends.btnTeleport.idle");
this.btnTeleport.OnMouseClickBitmap = bot.Localization.clResourceManager.getButton("frmFriends.btnTeleport.onclick");
this.btnTeleport.OnMouseOverBitmap = bot.Localization.clResourceManager.getButton("frmFriends.btnTeleport.onhover");
this.Icon = bot.Localization.clResourceManager.getIcon();
this.BackgroundImage = bot.Localization.clResourceManager.getWindow("frmMap");
}
private void Assets_OnImageReceived(TextureRequestState image, AssetTexture texture)
{
if (texture.AssetID == this._MapImageID)
{
ManagedImage nullImage;
OpenJPEG.DecodeToImage(texture.AssetData, out nullImage, out _MapLayer);
this.BeginInvoke((MethodInvoker)delegate
{
this.UpdateMiniMap(sim);
});
}
}
private void Network_SimChanged(object sender, SimChangedEventArgs e)
{
this.BeginInvoke((MethodInvoker)delegate
{
this.GetMap();
});
}
private void GetMap()
{
GridRegion region;
if (this._MapLayer == null || this.sim != this._client.Network.CurrentSim)
{
this.sim = this._client.Network.CurrentSim;
this.lblSim.Text = String.Format(bot.Localization.clResourceManager.getText("frmMap.lblSim"), this.sim.Name, this.sim.SimVersion.Remove(0, 18));
this.Text = String.Format(bot.Localization.clResourceManager.getText("frmMap.Text"), this.sim.Name);
if (this._client.Grid.GetGridRegion(this._client.Network.CurrentSim.Name, GridLayerType.Objects, out region))
{
_MapImageID = region.MapImageID;
this._client.Assets.RequestImage(_MapImageID, ImageType.Baked, this.Assets_OnImageReceived);
}
}
else
{
this.UpdateMiniMap(sim);
}
}
private void UpdateMiniMap(Simulator sim)
{
if (this.InvokeRequired)
this.BeginInvoke((MethodInvoker)delegate
{
this.UpdateMiniMap(sim);
});
else
{
Bitmap bmp = this._MapLayer == null ? new Bitmap(256, 256) : (Bitmap)this._MapLayer.Clone();
Graphics g = Graphics.FromImage(bmp);
if (this._MapLayer == null)
{
g.Clear(this.BackColor);
g.FillRectangle(Brushes.White, 0f, 0f, 256f, 256f);
this.lblMapDownloading.Visible = true;
}
else
{
this.lblMapDownloading.Visible = false;
}
// Rollback change from 9.2.1
if (!this.sim.AvatarPositions.ContainsKey(this._client.Self.AgentID))
return;
//if (sim.PositionIndexYou == -1 || sim.PositionIndexYou >= sim.AvatarPositions.Count) return;
int i = 0;
// Rollback change from 9.2.1
Vector3 myPos = this.sim.AvatarPositions[this._client.Self.AgentID];
//Vector3 myPos = sim.AvatarPositions[sim.PositionIndexYou];
// Rollback change from 9.2.1
this._client.Network.CurrentSim.AvatarPositions.ForEach(
delegate(KeyValuePair<UUID, Vector3> pos)
{
int x = (int)pos.Value.X;
int y = 255 - (int)pos.Value.Y;
if (pos.Key != this._client.Self.AgentID)
{
//if (myPos.Z - (pos.Z * 4) > 5)
if (myPos.Z - pos.Value.Z > 20)
{
Point[] points = new Point[3] { new Point(x - 4, y + 4), new Point(x + 4, y + 4), new Point(x, y - 4) };
g.FillPolygon(Brushes.DarkRed, points);
g.DrawPolygon(new Pen(Brushes.Red, 1), points);
}
else if (myPos.Z - pos.Value.Z > -21 && myPos.Z - pos.Value.Z < 21)
{
Rectangle rect = new Rectangle((int)Math.Round(pos.Value.X, 0) - 2, 255 - ((int)Math.Round(pos.Value.Y, 0) - 2), 7, 7);
g.FillEllipse(Brushes.LightGreen, rect);
g.DrawEllipse(new Pen(Brushes.Green, 1), rect);
}
else
{
Rectangle rect = new Rectangle((int)Math.Round(pos.Value.X, 0) - 2, 255 - ((int)Math.Round(pos.Value.Y, 0) - 2), 7, 7);
g.FillRectangle(Brushes.MediumBlue, rect);
g.DrawRectangle(new Pen(Brushes.Red, 1), rect);
}
}
else
{
Rectangle myrect = new Rectangle((int)Math.Round(this._client.Self.SimPosition.X, 0) - 2, 255 - ((int)Math.Round(this._client.Self.SimPosition.Y, 0) - 2), 7, 7);
g.FillEllipse(new SolidBrush(Color.Yellow), myrect);
g.DrawEllipse(new Pen(Brushes.Red, 3), myrect);
}
i++;
}
);
myPos = this._client.Self.SimPosition;
//myPos = sim.AvatarPositions[this._client.Self.AgentID];
i = 0;
g.DrawImage(bmp, 0, 0);
picMap.Image = bmp;
picMap.Cursor = Cursors.Cross;
g.Dispose();
string strInfo = string.Format(bot.Localization.clResourceManager.getText("frmMap.lblAvatars"), this._client.Network.CurrentSim.AvatarPositions.Count);
lblAvatars.Text = strInfo;
strInfo = string.Format("{0}/{1}/{2}/{3}", this._client.Network.CurrentSim.Name,
Math.Round(this._client.Self.SimPosition.X, 0),
Math.Round(this._client.Self.SimPosition.Y, 0),
Math.Round(this._client.Self.SimPosition.Z, 0));
this.txtSLUrl.Text = "http://slurl.com/secondlife/" + strInfo;
;
}
}
private void Grid_CoarseLocationUpdate(object sencder, CoarseLocationUpdateEventArgs e)
{
this.BeginInvoke((MethodInvoker)delegate
{
this.UpdateMiniMap(e.Simulator);
});
}
private void frmMapClient_Load(object sender, EventArgs e)
{
this.GetMap();
Vector3 apos = this._client.Self.SimPosition;
float aZ = apos.Z;
//printMap();
nudX.Value = 128;
nudY.Value = 128;
nudZ.Value = (decimal)aZ;
}
private void btnTeleport_Click(object sender, EventArgs e)
{
try
{
this._client.Netcom.Teleport(this._client.Network.CurrentSim.Name, new Vector3((float)nudX.Value, (float)nudY.Value, (float)nudY.Value));
}
catch (Exception ex)
{
MessageBox.Show(bot.Localization.clResourceManager.getText("frmMap.TeleportError"), "Natibot");
return;
}
}
private void world_MouseUp(object sender, MouseEventArgs e)
{
px = e.X;
py = 255 - e.Y;
nudX.Value = (decimal)px;
nudY.Value = (decimal)py;
nudZ.Value = (decimal)10;
this.PlotSelected(e.X, e.Y);
btnTeleport.Enabled = true;
}
private void PlotSelected(int x, int y)
{
this.UpdateMiniMap(sim);
Bitmap map = (Bitmap)picMap.Image;
Graphics g = Graphics.FromImage(map);
Rectangle selectedrect = new Rectangle(x - 2, y - 2, 10, 10);
g.DrawEllipse(new Pen(Brushes.Red, 2), selectedrect);
this.picMap.Image = map;
g.Dispose();
}
private void frmMapClient_FormClosing(object sender, FormClosingEventArgs e)
{
this._client.Grid.CoarseLocationUpdate -= this.Grid_CoarseLocationUpdate;
this._client.Network.SimChanged -= this.Network_SimChanged;
}
private void frmMapClient_Enter(object sender, EventArgs e)
{
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
void frmMap_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouse_offset.X, mouse_offset.Y);
this.Location = mousePos; //move the form to the desired location
}
}
void frmMap_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
mouse_offset = new Point(-e.X, -e.Y);
}
}
}