public static unsafe void MoveItem(byte* ptr, int Index_)
{
Silkroad.C_S.MOVE_ITEM* tmpPtr = (Silkroad.C_S.MOVE_ITEM*)ptr;
PacketWriter writer = new PacketWriter();
switch (tmpPtr->Type)
{
case 0:
int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);
Silkroad.Item_ SourceItem_ = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
Silkroad.Item_ DestinationItem_ = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Destination]]);
if (SourceItem_.ITEM_TYPE_NAME.Contains("FRPVP_VOUCHER"))
{
if (Player.Stats[Index_].Level >= 10 && CheckItemGender(SourceItem_, Index_))
{
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ANIMATION_CAPE);
writer.AppendDword(Player.General[Index_].UniqueID);
writer.AppendWord(0x102);
writer.AppendByte(0xA);
ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);
Timers.UsingItemTimer[Index_].Interval = 10000;
Player.Objects[Index_].SourceItemIndex = CharacterItemIndex[tmpPtr->Source];
Player.Objects[Index_].DestinationItemIndex = CharacterItemIndex[tmpPtr->Destination];
Timers.UsingItemTimer[Index_].Start();
}
else
{
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
writer.AppendWord(0x1002);
ServerSocket.Send(writer.getWorkspace(), Index_);
}
}
else
{
if (tmpPtr->Destination < 13)
{
if (!SourceItem_.ITEM_TYPE_NAME.Contains("ETC"))
{
if (!CheckItemGender(SourceItem_, Index_))
{
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
writer.AppendWord(0x1602);
ServerSocket.Send(writer.getWorkspace(), Index_);
return;
}
else if (!CheckItemLevel(SourceItem_, Index_))
{
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
writer.AppendWord(0x1002);
ServerSocket.Send(writer.getWorkspace(), Index_);
return;
}
if (tmpPtr->Destination == 6)
Player.General[Index_].WeaponType = SourceItem_.CLASS_C;
Silkroad.Item_ WeaponItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[6]]);
Console.WriteLine(WeaponItem.CLASS_C);
if (tmpPtr->Destination == 6 && DatabaseCore.Item.ItemId[CharacterItemIndex[7]] != 0 && (Player.General[Index_].WeaponType != 2 && Player.General[Index_].WeaponType != 3 && Player.General[Index_].WeaponType != 7 && Player.General[Index_].WeaponType != 10 && Player.General[Index_].WeaponType != 15))
{
byte unequipped = UnEnquipShield(Index_, CharacterItemIndex, CharacterItemIndex[7]);
if (unequipped != 255)
MoveItemToDatabase(CharacterItemIndex[7], unequipped, Player.General[Index_].CharacterName);
}
if (tmpPtr->Destination == 7 && DatabaseCore.Item.ItemId[CharacterItemIndex[6]] != 0 && (WeaponItem.CLASS_C != 2 && WeaponItem.CLASS_C != 3 && WeaponItem.CLASS_C != 7 && WeaponItem.CLASS_C != 10 && WeaponItem.CLASS_C != 15))
{
byte unequipped = UnEnquipWeapon(Index_, CharacterItemIndex, CharacterItemIndex[6]);
if (unequipped != 255)
MoveItemToDatabase(CharacterItemIndex[6], unequipped, Player.General[Index_].CharacterName);
}
EquipItem(Index_, CharacterItemIndex[tmpPtr->Source], CharacterItemIndex[tmpPtr->Destination]);
}
else
{
if (!(tmpPtr->Destination == 7 && (Player.General[Index_].WeaponType == 6 || Player.General[Index_].WeaponType == 12) && DatabaseCore.Item.ItemId[CharacterItemIndex[7]] != 0))
return;
}
}
if (tmpPtr->Source < 13)
UnEquipItem(Index_, CharacterItemIndex[tmpPtr->Source], CharacterItemIndex[tmpPtr->Destination]);
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
writer.AppendByte(1);
writer.AppendByte(tmpPtr->Type);
writer.AppendByte(tmpPtr->Source);
writer.AppendByte(tmpPtr->Destination);
writer.AppendWord(tmpPtr->Amount);
writer.AppendByte(0);
ServerSocket.Send(writer.getWorkspace(), Index_);
MoveItemToDatabase(CharacterItemIndex[tmpPtr->Source], CharacterItemIndex[tmpPtr->Destination], Player.General[Index_].CharacterName);
}
Stats.OnStatPacket(Index_);
break;
case 7:
CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);
int ItemIndex = Item.ItemAmount;
Item.General[ItemIndex].Pk2ID = DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]];
Item.General[ItemIndex].UniqueID = (uint)random.Next(76000000, 79999999);
Item.General[ItemIndex].Plus = DatabaseCore.Item.PlusValue[CharacterItemIndex[tmpPtr->Source]];
Item.General[ItemIndex].Durability = DatabaseCore.Item.Durability[CharacterItemIndex[tmpPtr->Source]];
Item.General[ItemIndex].Pickable = true;
Item.General[ItemIndex].Quantity = DatabaseCore.Item.Quantity[CharacterItemIndex[tmpPtr->Source]];
Item.Position[ItemIndex].XSector = Player.Position[Index_].XSector;
Item.Position[ItemIndex].YSector = Player.Position[Index_].YSector;
byte randomplace = (byte)random.Next(1, 7);
Item.Position[ItemIndex].X = Player.Position[Index_].X + randomplace;
Item.Position[ItemIndex].Z = Player.Position[Index_].Z;
Item.Position[ItemIndex].Y = Player.Position[Index_].Y + randomplace;
Item.General[ItemIndex].DroppedByUniqueId = Player.General[Index_].UniqueID;
Item.ItemAmount++;
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
writer.AppendByte(1);
writer.AppendByte(tmpPtr->Type);
writer.AppendByte(tmpPtr->Source);
ServerSocket.Send(writer.getWorkspace(), Index_);
Silkroad.Item_ tmpItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
byte[] tmpBuffer = new byte[0];
if (tmpItem.ITEM_TYPE_NAME.Contains("CH") || tmpItem.ITEM_TYPE_NAME.Contains("EU"))
{
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
writer.AppendByte(DatabaseCore.Item.PlusValue[CharacterItemIndex[tmpPtr->Source]]);
writer.AppendDword(Item.General[ItemIndex].UniqueID);
writer.AppendByte(Item.Position[ItemIndex].XSector);
writer.AppendByte(Item.Position[ItemIndex].YSector);
writer.AppendFloat(Item.Position[ItemIndex].X);
writer.AppendFloat(Item.Position[ItemIndex].X);
writer.AppendFloat(Item.Position[ItemIndex].Y);
writer.AppendWord(0xAAA6);
writer.AppendByte(0);
writer.AppendByte(0);
writer.AppendByte(6);
writer.AppendDword(Item.General[ItemIndex].DroppedByUniqueId);
tmpBuffer = writer.getWorkspace();
}
else if (tmpItem.ITEM_TYPE_NAME.Contains("ETC"))
{
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
writer.AppendDword(Item.General[ItemIndex].UniqueID);
writer.AppendByte(Item.Position[ItemIndex].XSector);
writer.AppendByte(Item.Position[ItemIndex].YSector);
writer.AppendFloat(Item.Position[ItemIndex].X);
writer.AppendFloat(Item.Position[ItemIndex].X);
writer.AppendFloat(Item.Position[ItemIndex].Y);
writer.AppendWord(0xAAA6);
writer.AppendByte(0);
writer.AppendByte(0);
writer.AppendByte(6);
writer.AppendDword(Item.General[ItemIndex].DroppedByUniqueId);
tmpBuffer = writer.getWorkspace();
}
for (int i = 0; i < Player.PlayersOnline; i++)
{
if (Player.General[i].CharacterID != 0)
{
if (Formula.CalculateDistance(Item.Position[ItemIndex], Player.Position[i]) <= 800)
{
ServerSocket.Send(tmpBuffer, i);
Player.Objects[i].SpawnedItemsIndex.Add(ItemIndex);
}
}
}
DatabaseCore.WriteQuery("UPDATE items SET itemid='0',plusvalue='0' ,durability='30' WHERE itemnumber='item{0}' AND owner='{1}'", tmpPtr->Source, Player.General[Index_].CharacterName);
Stats.OnStatPacket(Index_);
DeleteFromDatabase(CharacterItemIndex[tmpPtr->Source]);
break;
case 10:
if (Player.Stats[Index_].Gold != 0)
{
PacketReader reader = new PacketReader(ptr, 5);
reader.ModifyIndex(1);
uint goldamount = reader.ReadDword();
ItemIndex = Item.ItemAmount;
if (goldamount < 10000)
Item.General[ItemIndex].Pk2ID = 1;
else if (goldamount >= 10000 && goldamount <= 500000)
Item.General[ItemIndex].Pk2ID = 2;
else if (goldamount >= 500001)
Item.General[ItemIndex].Pk2ID = 3;
Item.General[ItemIndex].UniqueID = (uint)random.Next(76000000, 79999999);
Item.General[ItemIndex].Plus = 0;
Item.General[ItemIndex].Durability = 0;
Item.General[ItemIndex].Pickable = true;
Item.General[ItemIndex].Quantity = goldamount;
Item.Position[ItemIndex].XSector = Player.Position[Index_].XSector;
Item.Position[ItemIndex].YSector = Player.Position[Index_].YSector;
randomplace = (byte)random.Next(1, 7);
Item.Position[ItemIndex].X = Player.Position[Index_].X + randomplace;
Item.Position[ItemIndex].Z = Player.Position[Index_].Z;
Item.Position[ItemIndex].Y = Player.Position[Index_].Y + randomplace;
Item.General[ItemIndex].DroppedByUniqueId = Player.General[Index_].UniqueID;
Item.ItemAmount++;
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
if (goldamount < 10000)
writer.AppendDword(1);
else if (goldamount >= 10000 && goldamount <= 500000)
writer.AppendDword(2);
else if (goldamount >= 500001)
writer.AppendDword(3);
writer.AppendDword(goldamount);
writer.AppendDword(Item.General[ItemIndex].UniqueID);
writer.AppendByte(Item.Position[ItemIndex].XSector);
writer.AppendByte(Item.Position[ItemIndex].YSector);
writer.AppendFloat(Item.Position[ItemIndex].X);
writer.AppendFloat(Item.Position[ItemIndex].X);
writer.AppendFloat(Item.Position[ItemIndex].Y);
writer.AppendWord(0xDC72);
writer.AppendByte(0);
writer.AppendByte(0);
writer.AppendByte(6);
writer.AppendDword(0);
tmpBuffer = writer.getWorkspace();
for (int i = 0; i < Player.PlayersOnline; i++)
{
if (Player.General[i].CharacterID != 0)
{
if (Formula.CalculateDistance(Item.Position[ItemIndex], Player.Position[i]) <= 800)
{
ServerSocket.Send(tmpBuffer, i);
Player.Objects[i].SpawnedItemsIndex.Add(ItemIndex);
}
}
}
Player.Stats[Index_].Gold -= goldamount;
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_NEW_GOLD_AMOUNT);
writer.AppendByte(1);
writer.AppendLword(Player.Stats[Index_].Gold);
writer.AppendByte(0);
ServerSocket.Send(writer.getWorkspace(), Index_);
writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
writer.AppendByte(1);
writer.AppendByte(10);
writer.AppendDword(goldamount);
ServerSocket.Send(writer.getWorkspace(), Index_);
DatabaseCore.WriteQuery("UPDATE characters SET gold='{0}' WHERE name='{1}'", Player.Stats[Index_].Gold, Player.General[Index_].CharacterName);
}
break;
}
}