public void HandleIncoming(Byte[] data)
{
if (nsa != null)
{
nsa.AppendPacketIn(data);
}
PacketReader p = null;
switch (data[0])
{
case 0x34: // Keep Alive
keepalive = Server.tickcount.ElapsedMilliseconds;
break;
//Identifiy
/* case 0x37:
// for (int x = 0; x < 40; x++)
// {
// SendPacket(new CreateSlotMagic(new MagicSpell((byte)(x+81), "Hii", 1, 1, (byte)x, library.MagicType.Casted)).Compile());
// }
int y = 14;
byte sprite = 0;
for (int x = 0; x < 255; x++)
{
Thread.Sleep(100);
if (x != 0 && x % 19 == 0)
{
y += 3;
x -= 19;
}
// SendPacket(new CreateMonster(new Monster(3, (short)(x+23),(short)y,"village.map", sprite.ToString(), sprite, 0), Serial.NewMobile).Compile());
sprite++;
}
break;*/
case 0x3A: //find
if (player.Map == "Loen")
{
var slot = data[1] + 40 + (12 * player.BankTab);
var itemtofind = World.NewItems.Where(xe => xe.Value.ParSer == player.Serial && xe.Value.InvSlot == slot).FirstOrDefault();
if (itemtofind.Value != null)
{
if (player.GetFreeSlot() != -1)
{
SendPacket(new DeleteEntrustSlot((byte)data[1]).Compile());
itemtofind.Value.InvSlot = player.GetFreeSlot();
SendPacket(new AddItemToInventory2(itemtofind.Value).Compile());
}
}
}
break;
case 0x36: //Entrust
if (player.Map == "Loen")
{
var itemtoentrust = World.NewItems.Where(xe => xe.Value.ParSer == player.Serial && xe.Value.InvSlot == data[1]).FirstOrDefault();
if (itemtoentrust.Value != null)
{
SendPacket(new DeleteItemSlot((byte)itemtoentrust.Value.InvSlot).Compile());
itemtoentrust.Value.InvSlot = player.FreeBankSlot;
SendPacket(new AddItemToEntrust(itemtoentrust.Value).Compile());
}
}
break;
case 0x35: //sell
if (player.Map == "Loen")
{
var itemtosell = World.NewItems.Where(xe => xe.Value.ParSer == player.Serial && xe.Value.InvSlot == data[1]).FirstOrDefault();
if (itemtosell.Value != null && itemtosell.Value.SellPrice > 0)
{
player.Gold += (uint)itemtosell.Value.SellPrice;
itemtosell.Value.Delete(player);
}
}
break;
//Cast
// 3D-00-00-01-00-00-00-0A-00-09-00
case 0x3D:
case 0x19:
case 0x18:
if (LKCamelot.Server.tickcount.ElapsedMilliseconds - player.CastSpeed > LastCast)
{
LastCast = LKCamelot.Server.tickcount.ElapsedMilliseconds;
p = new PacketReader(data, data.Count(), true);
int spellslot = p.ReadInt16();
if (player.MagicLearned.Count() < spellslot)
return;
int castonid = p.ReadInt32();
short castx = p.ReadInt16();
short casty = p.ReadInt16();
script.spells.Spell castspell = player.MagicLearned.Where(xe => xe.Slot == spellslot).FirstOrDefault();
if (castspell == null) return;
castHandler.HandleCast(data[0], castspell, player, castonid, castx, casty);
}
break;
//Attack
case 0x17:
if (LKCamelot.Server.tickcount.ElapsedMilliseconds - player.AttackSpeed > LastAttack)
{
LastAttack = LKCamelot.Server.tickcount.ElapsedMilliseconds;
World.SendToAll(new QueDele(player.Serial, player.Map, new SwingAnimationChar(player.Serial, player.Face).Compile()));
combatHandler.HandleMelee(player, data[1]);
}
break;
//NPC Shop
case 0x45:
var npclook = World.NewNpcs.Where(xe => xe.Key == data[1]).FirstOrDefault();
if (npclook.Value != null)
{
if (npclook.Value.Name == "Loen")
{
SendPacket(new SpawnShopGump2(npclook.Value.Gump).Compile());
}
if (npclook.Value.Name == "Arnold")
{
SendPacket(new SpawnShopGump2(npclook.Value.Gump).Compile());
}
if (npclook.Value.Name == "Employee")
{
SendPacket(new SpawnShopGump2(npclook.Value.Gump).Compile());
}
if (npclook.Value.Name == "Boy")
{
SendPacket(new SpawnShopGump2(npclook.Value.Gump).Compile());
}
}
break;
case 0x2B: //2B-03-00-00-00-01-00-04-00-4D-65-6E-75-00
p = new PacketReader(data, data.Count(), true);
var npcid = p.ReadInt32();
var buyslot = p.ReadByte();
var npcitself = World.NewNpcs.Where(xe => xe.Key == npcid).FirstOrDefault();
if (npcitself.Value != null)
npcitself.Value.Buy(player, buyslot);
break;
//Inventory
case 0x00: //use
if (data[1] == 0)
return;
var itemu = World.NewItems.Where(xe => xe.Value.m_Parent == player
&& xe.Value.InvSlot == data[1]).FirstOrDefault();
if (itemu.Value != null)
itemu.Value.Use(player);
break;
case 0x20: //drop
var item = World.NewItems.Where(xe => xe.Value.m_Parent == player
&& xe.Value.InvSlot == data[1]).FirstOrDefault();
if (item.Value != null)
item.Value.Drop(player);
break;
case 0x1F: //pickup
var item1 = World.NewItems.Where(xe => xe.Value.m_Map != null
&& xe.Value.m_Map == player.Map
&& xe.Value.Loc.X == player.X && xe.Value.Loc.Y == player.Y)
.FirstOrDefault();
if (item1.Value != null)
item1.Value.PickUp(player);
break;
case 0x1E: //equip Use
// case 0x36:
var eitem = World.NewItems.Where(xe => xe.Value.m_Parent == player
&& xe.Value.InvSlot == data[1]).FirstOrDefault();
if (eitem.Value != null)
{
if (eitem.Value is script.item.BaseArmor || eitem.Value is script.item.BaseWeapon)
eitem.Value.Equip(player);
if (eitem.Value is script.item.BaseSpellbook)
eitem.Value.Use(player);
if (eitem.Value is script.item.BasePotion)
eitem.Value.Use(player);
}
break;
case 0x23://unequip
var uitem = World.NewItems.Where(xe => xe.Value.m_Parent == player
&& xe.Value.InvSlot == (data[1] + 25)).FirstOrDefault();
if (uitem.Value != null)
uitem.Value.Unequip(player, data[1] + 25);
break;
case 0x25: //swap items
var item11 = World.NewItems.Where(xe => xe.Value.ParSer == player.Serial && xe.Value.InvSlot == data[1]).FirstOrDefault().Value;
int sss = 0;
if (data.Count() > 3)
sss = data[3];
var target1 = World.NewItems.Where(xe => xe.Value.ParSer == player.Serial && xe.Value.InvSlot == sss).FirstOrDefault().Value;
player.SwapItems(item11, target1, sss);
break;
case 0x24: //drag,drop
var itemdragdrop = World.NewItems.Where(xe => xe.Value.ParSer == player.Serial && xe.Value.InvSlot == data[1]).FirstOrDefault().Value;
if (itemdragdrop != null)
{
p = new PacketReader(data, data.Count(), false);
var targetid = p.ReadInt32();
script.item.Item targeti = null;
World.NewItems.TryGetValue(targetid, out targeti);
if (targeti != null)
{
string fail = "Refining failed.";
string succ = "Refining success.";
if ((itemdragdrop is script.item.Zel && targeti is script.item.BaseArmor)
|| (itemdragdrop is script.item.Dai && targeti is script.item.BaseWeapon))
{
if (targeti.TryUpgrade())
{
castHandler.CreateMagicEffect(targeti.Loc, targeti.m_Map, 42);
SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)succ.Count(), succ).Compile());
SendPacket(new DeleteObject(targeti.m_Serial).Compile());
SendPacket(new CreateItemGround2(targeti, targeti.m_Serial).Compile());
}
else
{
castHandler.CreateMagicEffect(targeti.Loc, targeti.m_Map, 56);
SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)fail.Count(), fail).Compile());
}
itemdragdrop.Delete(player);
}
}
if (targetid == 4)
{
if (itemdragdrop.Name == "Promote Life Drug" && AronStage == 4)
{
AronStage = 1;
itemdragdrop.Delete(player);
string achat = "[Aron]: Are you ready for the promotion?";
SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)achat.Count(), achat).Compile());
}
if (itemdragdrop.Name == "Promote Magic Drug" && AronStage == 4)
{
AronStage = 2;
itemdragdrop.Delete(player);
string achat = "[Aron]: Are you ready for the promotion?";
SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)achat.Count(), achat).Compile());
}
}
}
break;
//Chat message
case 0x16:
p = new PacketReader(data, data.Count(), false);
var str = p.ReadString();
var str2 = str.Split(' ');
if (Util.ContainsUnicodeCharacter(str))
{
var x = 1;
}
HandleChat(str2, str);
break;
//Movement
case 0x14:
player.Face = data[1];
World.SendToAll(new QueDele(player.Serial, player.Map, new ChangeFace(player.Serial, player.Face).Compile()));
break;
case 0x15:
if (Server.tickcount.ElapsedMilliseconds - player.lastmove < 150)
{
return;
}
long totalwalk = 0;
foreach (var loc in walktrace)
{
totalwalk += loc;
}
// if(player.Name == "SIR")
// Console.WriteLine(string.Format("{0},{1} {2}", px, py, Server.tickcount.ElapsedMilliseconds));
if (Server.tickcount.ElapsedMilliseconds - player.lastmove > player.m_MoveSpeed)
{
p = new PacketReader(data, data.Count(), true);
player.Face = p.ReadInt16();
var px = p.ReadInt16();
var py = p.ReadInt16();
walktrace.Add(Server.tickcount.ElapsedMilliseconds - player.lastmove);
player.lastmove = Server.tickcount.ElapsedMilliseconds;
/*
if (walktrace.Count > 3 && totalwalk < 1600)
{
SendPacket(new MoveSpriteWalkChar(player.Serial, player.Face, player.X, player.Y).Compile());
return;
}
while (walktrace.Count > 4)
walktrace.Remove(walktrace.ElementAt(0));
*/
if (World.Dist2d(new Point2D(px, py), player.m_Loc) > 3)
{
SendPacket(new MoveSpriteWalkChar(player.Serial, player.Face, player.X, player.Y).Compile());
return;
}
player.X = px;
player.Y = py;
World.SendToAll(new QueDele(player.Serial, player.Map, new MoveSpriteWalkChar(player.Serial, player.Face,
player.X, player.Y).Compile()));
parseFace();
}
else
{
SendPacket(new MoveSpriteWalkChar(player.Serial, player.Face, player.X, player.Y).Compile());
}
break;
//Stats
case 0x2C:
player.AddStat(ref player.m_Str);
SendPacket(new UpdateCharStats(player).Compile());
break;
case 0x2D:
player.AddStat(ref player.m_Men);
SendPacket(new UpdateCharStats(player).Compile());
break;
case 0x2E:
player.AddStat(ref player.m_Dex);
SendPacket(new UpdateCharStats(player).Compile());
break;
case 0x2F:
player.AddStat(ref player.m_Vit);
SendPacket(new UpdateCharStats(player).Compile());
break;
case 0x03: //Login
var result = TryLogin(data);
switch (result[0])
{
case '1':
var puser2 = result.Remove(0, 1).Split(',');
player = handler.add.Where(xe => xe.Value.Name == puser2[0]).FirstOrDefault().Value;
player.client = this;
player.loggedIn = true;
LoadPlayer();
SendPacket(new CloseLogin().Compile());
break;
case '2':
SendPacket(new WrongPass().Compile());
break;
case '3':
SendPacket(new WrongID().Compile());
break;
case '4': //invalid chars
SendPacket(new WrongID().Compile());
break;
case '5':
SendPacket(new AlreadyOnline().Compile());
break;
case '6':
player = new Player(this);
player.CreateBeginner(result.Remove(0, 1));
firstlogin = true;
LoadPlayer();
player.Pass = Cryption.CreateSaltedSHA256(player.Pass, player.Name);
try
{
handler.add.TryAdd(player.Name, player);
var touch = handler.add.Where(xe => xe.Key == player.Name).FirstOrDefault();
touch.Value.client = this;
touch.Value.loggedIn = true;
// BinaryIO.SavePlayer(player);
// World.DBConnect.InsertPlayer(player);
}
catch
{
Console.WriteLine("failed to insert new player");
}
SendPacket(new CloseLogin().Compile());
break;
}
break;
case 0x49: //delete magic
var magdelslot = data[1];
player.DeleteMagic(magdelslot);
break;
case 0x26: //swap magic
if (data.Count() < 4)
player.SwapMagic(data[1], 0);
else
player.SwapMagic(data[1], data[3]);
break;
case 0xff:
SendPacket(new PlayMusic(1000).Compile());
if (true) //Login
{
// SendPacket(new CloseLogin().Compile());
// SendPacket(new LoadWorld(1, 0x12, 0x12, new byte[] { 00, 04, 00, 00, 00, 00, 00, 00, 00, 03 },
// 01, 01, 00, 03, 04, 00, 00,
// new byte[] { 0x69, 0x70, 0x69, 0x67, 0x6d, 0x79, 0x31, 0x2e, 0x6d, 0x61, 0x70, 00 }).Format());
break;
}
}
}
static object WriteLock = new object();