class VisitCommand : ICommand
{
public string Command { get { return "visit"; } }
public int RequiredRank { get { return 2; } }
public bool TryJoin(Player player, GlobalPlayerData iPlayerData, World world, Player i)
{
if (!iPlayerData.Solo)
{
if (!iPlayerData.UsingGroup)
{
player.Client.Reconnect(new ReconnectPacket()
{
Host = "",
Port = 2050,
GameId = world.Id,
Name = world.Name,
Key = Empty<byte>.Array,
});
return true;
}
else
{
foreach (var o in iPlayerData.JGroup)
{
if (o.Value == player.Client.Account.Name.ToLower())
{
player.Client.Reconnect(new ReconnectPacket()
{
Host = "",
Port = 2050,
GameId = world.Id,
Name = world.Name,
Key = Empty<byte>.Array,
});
return true;
}
}
player.SendInfo("Not in " + i.Client.Account.Name + "'s group!");
return true;
}
}
else
{
player.SendInfo("Player is going solo!");
return true;
}
}
public void Execute(Player player, string[] args)
{
string name = string.Join(" ", args.ToArray()).Trim();
try
{
GlobalPlayerData PlayerData = PlayerDataList.GetData(player.Client.Account.Name);
foreach (var w in RealmManager.Worlds)
{
World world = w.Value;
if (w.Key != 0)
{
foreach (var i in world.Players)
{
if (i.Value.Client.Account.Name.ToLower() == name.ToLower())
{
GlobalPlayerData iPlayerData = PlayerDataList.GetData(i.Value.Client.Account.Name);
if (!(player.Client.Account.Rank > 3))
{
if (world.Name != "Vault")
{
if (world.Name != "Guild Hall")
{
TryJoin(player, iPlayerData, world, i.Value); return;
}
else
{
if ((world as GuildHall).Guild == player.Guild)
{
TryJoin(player, iPlayerData, world, i.Value); return;
}
else
{
player.SendInfo("Player is in " + i.Value.Guild + "'s guild hall!");
return;
}
}
}
else
{
if (world.Name == "Vault")
{
player.SendInfo("Player is in Vault!");
return;
}
else if (world.Name == "Guild Hall")
{
player.SendInfo("Player is in Guild Hall!");
return;
}
else
{
if (!iPlayerData.UsingGroup)
{
player.Client.Reconnect(new ReconnectPacket()
{
Host = "",
Port = 2050,
GameId = world.Id,
Name = i.Value.Name + "'s Vault",
Key = Empty<byte>.Array,
});
return;
}
else
{
foreach (var o in iPlayerData.JGroup)
{
if (o.Value == player.Client.Account.Name.ToLower())
{
player.Client.Reconnect(new ReconnectPacket()
{
Host = "",
Port = 2050,
GameId = world.Id,
Name = i.Value.Name + "'s Vault",
Key = Empty<byte>.Array,
});
return;
}
}
player.SendInfo("Not in " + i.Value.Client.Account.Name + "'s group!");
return;
}
}
}
}
else
{
player.Client.Reconnect(new ReconnectPacket()
{
Host = "",
Port = 2050,
GameId = world.Id,
Name = i.Value.Owner.Name,
Key = Empty<byte>.Array,
});
return;
}
}
}
}
}
player.SendHelp("Use /visit <playername>");
}
catch
{
player.SendInfo("Unexpected error in command!");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System****;
using db;
using wServer.realm.entities;
using System.Collections.Concurrent;
namespace wServer.realm.worlds
{
public class Vault : World
{
public Vault(bool isLimbo, ClientProcessor psr = null)
{
Id = VAULT_ID;
Name = "Bank";
Background = 2;
if (!(IsLimbo = isLimbo))
{
base.FromWorldMap(typeof(RealmManager).Assembly.GetManifestResourceStream("wServer.realm.worlds.vault.wmap"));
Init(psr);
}
}
ConcurrentDictionary<Tuple<Container, VaultChest>, int> vaultChests = new ConcurrentDictionary<Tuple<Container, VaultChest>, int>();
ClientProcessor psr;
Account acc;
void Init(ClientProcessor psr)
{
this.psr = psr;
this.acc = psr.Account;
List<IntPoint> vaultChestPosition = new List<IntPoint>();
IntPoint spawn = new IntPoint(0, 0);
int w = Map.Width;
int h = Map.Height;
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++)
{
var tile = Map[x, y];
if (tile.Region == TileRegion.Spawn)
spawn = new IntPoint(x, y);
else if (tile.Region == TileRegion.Vault)
vaultChestPosition.Add(new IntPoint(x, y));
}
vaultChestPosition.Sort((x, y) => Comparer<int>.Defaul*****mpare(
(x.X - spawn.X) * (x.X - spawn.X) + (x.Y - spawn.Y) * (x.Y - spawn.Y),
(y.X - spawn.X) * (y.X - spawn.X) + (y.Y - spawn.Y) * (y.Y - spawn.Y)));
var chests = psr.Account.Vault.Chests;
for (int i = 0; i < chests.Count; i++)
{
Container con = new Container(0x0504, null, false);
var inv = chests[i].Items.Select(_ => _ == -1 ? null : (XmlDatas.ItemDescs.ContainsKey((short)_) ? XmlDatas.ItemDescs[(short)_] : null)).ToArray();
for (int j = 0; j < 8; j++)
con.Inventory[j] = inv[j];
con.Move(vaultChestPosition[0].X + 0.5f, vaultChestPosition[0].Y + 0.5f);
EnterWorld(con);
vaultChestPosition.RemoveAt(0);
vaultChests[new Tuple<Container, VaultChest>(con, chests[i])] = con.UpdateCount;
}
foreach (var i in vaultChestPosition)
{
SellableObject x = new SellableObject(0x0505);
x.Move(i.X + 0.5f, i.Y + 0.5f);
EnterWorld(x);
}
}
public void AddChest(VaultChest chest, Entity original)
{
Container con = new Container(0x0504, null, false);
var inv = chest.Items.Select(_ => _ == -1 ? null : (XmlDatas.ItemDescs.ContainsKey((short)_) ? XmlDatas.ItemDescs[(short)_] : null)).ToArray();
for (int j = 0; j < 8; j++)
con.Inventory[j] = inv[j];
con.Move(original.X, original.Y);
LeaveWorld(original);
EnterWorld(con);
vaultChests[new Tuple<Container, VaultChest>(con, chest)] = con.UpdateCount;
}
public override World GetInstance(ClientProcessor psr)
{
return RealmManager.AddWorld(new Vault(false, psr));
}
public override void Tick(RealmTime time)
{
base.Tick(time);
foreach (var i in vaultChests)
{
if (i.Key.Item1.UpdateCount > i.Value)
{
try
{
i.Key.Item2._Items = Utils.GetCommaSepString(i.Key.Item1.Inventory.Take(8).Select(_ => _ == null ? -1 : _.ObjectType).ToArray());
new Database().SaveChest(acc, i.Key.Item2);
vaultChests[i.Key] = i.Key.Item1.UpdateCount;
}
catch
{
//Do NOT make anything happen here..
//This catch continues on endlessly
}
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System****;
using db;
using wServer.realm.entities;
using System.Collections.Concurrent;
namespace wServer.realm.worlds
{
public class Vault : World
{
public Vault(bool isLimbo, ClientProcessor psr = null)
{
Id = VAULT_ID;
Name = "Bank";
Background = 2;
if (!(IsLimbo = isLimbo))
{
base.FromWorldMap(typeof(RealmManager).Assembly.GetManifestResourceStream("wServer.realm.worlds.vault.wmap"));
Init(psr);
}
}
ConcurrentDictionary<Tuple<Container, VaultChest>, int> vaultChests = new ConcurrentDictionary<Tuple<Container, VaultChest>, int>();
ClientProcessor psr;
Account acc;
void Init(ClientProcessor psr)
{
this.psr = psr;
this.acc = psr.Account;
List<IntPoint> vaultChestPosition = new List<IntPoint>();
IntPoint spawn = new IntPoint(0, 0);
int w = Map.Width;
int h = Map.Height;
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++)
{
var tile = Map[x, y];
if (tile.Region == TileRegion.Spawn)
spawn = new IntPoint(x, y);
else if (tile.Region == TileRegion.Vault)
vaultChestPosition.Add(new IntPoint(x, y));
}
vaultChestPosition.Sort((x, y) => Comparer<int>.Defaul*****mpare(
(x.X - spawn.X) * (x.X - spawn.X) + (x.Y - spawn.Y) * (x.Y - spawn.Y),
(y.X - spawn.X) * (y.X - spawn.X) + (y.Y - spawn.Y) * (y.Y - spawn.Y)));
var chests = psr.Account.Vault.Chests;
for (int i = 0; i < chests.Count; i++)
{
Container con = new Container(0x0504, null, false);
var inv = chests[i].Items.Select(_ => _ == -1 ? null : (XmlDatas.ItemDescs.ContainsKey((short)_) ? XmlDatas.ItemDescs[(short)_] : null)).ToArray();
for (int j = 0; j < 8; j++)
con.Inventory[j] = inv[j];
con.Move(vaultChestPosition[0].X + 0.5f, vaultChestPosition[0].Y + 0.5f);
EnterWorld(con);
vaultChestPosition.RemoveAt(0);
vaultChests[new Tuple<Container, VaultChest>(con, chests[i])] = con.UpdateCount;
}
foreach (var i in vaultChestPosition)
{
SellableObject x = new SellableObject(0x0505);
x.Move(i.X + 0.5f, i.Y + 0.5f);
EnterWorld(x);
}
}
public void AddChest(VaultChest chest, Entity original)
{
Container con = new Container(0x0504, null, false);
var inv = chest.Items.Select(_ => _ == -1 ? null : (XmlDatas.ItemDescs.ContainsKey((short)_) ? XmlDatas.ItemDescs[(short)_] : null)).ToArray();
for (int j = 0; j < 8; j++)
con.Inventory[j] = inv[j];
con.Move(original.X, original.Y);
LeaveWorld(original);
EnterWorld(con);
vaultChests[new Tuple<Container, VaultChest>(con, chest)] = con.UpdateCount;
}
public override World GetInstance(ClientProcessor psr)
{
return RealmManager.AddWorld(new Vault(false, psr));
}
public override void Tick(RealmTime time)
{
base.Tick(time);
foreach (var i in vaultChests)
{
if (i.Key.Item1.UpdateCount > i.Value)
{
try
{
i.Key.Item2._Items = Utils.GetCommaSepString(i.Key.Item1.Inventory.Take(8).Select(_ => _ == null ? -1 : _.ObjectType).ToArray());
new Database().SaveChest(acc, i.Key.Item2);
vaultChests[i.Key] = i.Key.Item1.UpdateCount;
}
catch
{
//Do NOT make anything happen here..
//This catch continues on endlessly
}
}
}
}
}
}
if (!(player.Client.Account.Rank > 3))
{
if (world.Name != "Vault")
{
if (world.Name != "Guild Hall")
{
TryJoin(player, iPlayerData, world, i.Value); return;
}
else
{
if ((world as GuildHall).Guild == player.Guild)
{
TryJoin(player, iPlayerData, world, i.Value); return;
}
else
{
player.SendInfo("Player is in " + i.Value.Guild + "'s guild hall!");
return;
}
}
}
else
{
if (world.Name == "Vault")
{
player.SendInfo("Player is in Vault!");
return;
}
else if (world.Name == "Guild Hall")
{
player.SendInfo("Player is in Guild Hall!");
return;
}
else
{
if (!iPlayerData.UsingGroup)
{
player.Client.Reconnect(new ReconnectPacket()
{
Host = "",
Port = 2050,
GameId = world.Id,
Name = i.Value.Name + "'s Vault",
Key = Empty<byte>.Array,
});
return;
}
else
{
foreach (var o in iPlayerData.JGroup)
{
if (o.Value == player.Client.Account.Name.ToLower())
{
player.Client.Reconnect(new ReconnectPacket()
{
Host = "",
Port = 2050,
GameId = world.Id,
Name = i.Value.Name + "'s Vault",
Key = Empty<byte>.Array,
});
return;
}
}
player.SendInfo("Not in " + i.Value.Client.Account.Name + "'s group!");
return;
}
}
}
}
else
{
player.Client.Reconnect(new ReconnectPacket()
{
Host = "",
Port = 2050,
GameId = world.Id,
Name = i.Value.Owner.Name,
Key = Empty<byte>.Array,
});
return;
}
if (!(player.Client.Account.Rank > 3))
