full purification and refinary
just convert for you source
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace Project_Terror_v2.Game.MsgServer
{
public class MsgItemExtra
{
public class Artefacts
{
public const byte Refinary = 0,
Purification = 1;
}
public enum Typing : uint
{
RefinaryAdding = 2,
PermanentRefinery = 3,
StabilizationEffectRefined = 4,
PurificationEffect = 5,
PurificationAdding = 6,
ExpireTime = 7,
StabilizationEffectPurification = 9
}
public struct Purification
{
public uint ItemUID;
public Typing Typ;
public uint PurificationItemID;
public uint PurificationLevel;
/// <summary>
/// In minutes.
/// </summary>
public uint PurificationDuration;
public DateTime AddedOn;
private bool Available;
public int SecoundsLeft
{
get
{
if (PurificationDuration != 0)
{
TimeSpan span1 = new TimeSpan(AddedOn.AddSeconds(PurificationDuration).Ticks);
TimeSpan span2 = new TimeSpan(DateTime.Now.Ticks);
int secondsleft = (int)(span1.TotalSeconds - span2.TotalSeconds);
if (secondsleft > 0)
{
Available = true;
return secondsleft;
}
else
Available = false;
}
else if (PurificationItemID > 1000)
Available = true;
return 0;
}
}
public bool InLife
{
get
{
int secount = SecoundsLeft;//to create time
return Available;
}
}
}
public struct Refinery
{
public uint ItemUID;
public Typing Typ;
public uint EffectID;
public uint EffectLevel;
public uint EffectPercent;
/// <summary>
/// In minutes.
/// </summary>
public uint EffectDuration;
public DateTime AddedOn;
public bool Available;
public int SecoundsLeft
{
get
{
if (EffectDuration != 0)
{
TimeSpan span1 = new TimeSpan(AddedOn.AddSeconds(EffectDuration).Ticks);
TimeSpan span2 = new TimeSpan(DateTime.Now.Ticks);
int secondsleft = (int)(span1.TotalSeconds - span2.TotalSeconds);
if (secondsleft > 0)
{
Available = true;
return secondsleft;
}
else
Available = false;
}
else if (EffectID > 1000)
Available = true;
return 0;
}
}
public bool InLife
{
get
{
int secount = SecoundsLeft;//verified create time
return Available;
}
}
}
public List<Purification> Purifications;
public List<Refinery> Refinerys;
public MsgItemExtra()
{
Purifications = new List<Purification>();
Refinerys = new List<Refinery>();
}
public Typing Typ;
private unsafe byte* Data;
public unsafe void CreateArray()
{
byte[] buffer = new byte[16 + 28 * Refinerys.Count + 28 * Purifications.Count];
fixed (byte* buff = buffer)
{
*(ushort*)(buff) = (ushort)(buffer.Length - 8);
*(ushort*)(buff + 2) = GamePackets.ExtraItem;
*(uint*)(buff + 4) = (uint)(Refinerys.Count + Purifications.Count);
byte offset = 8;
foreach (var item in Purifications)
{
*(Purification*)(buff + offset) = item;
*(int*)(buff + offset + 20) = item.SecoundsLeft;
offset += 28;
}
foreach (var item in Refinerys)
{
*(Refinery*)(buff + offset) = item;
*(int*)(buff + offset + 20) = item.SecoundsLeft;
offset += 28;
}
*(ulong*)(buff + buffer.Length - 8) = ServerSockets.Packet.TqPacket;
Data = buff;
}
}
public unsafe byte* GetArray()
{
return Data;
}
[PacketAttribute(GamePackets.Stabilization)]
public unsafe static void Stabilization(Client.GameClient client, ServerSockets.Packet packet)
{
uint Mode = *(uint*)(packet.Array + 4);
uint ItemUID = *(uint*)(packet.Array + 8);
uint Count = *(uint*)(packet.Array + 12);
switch (Mode)
{
case Artefacts.Refinary:
{
Game.MsgServer.MsgGameItem Item;
if (client.TryGetItem(ItemUID, out Item))
{
if (!Item.Refinary.InLife) return;
if (Item.Refinary.EffectID == 0) return;
uint procent = 0;
Queue<Game.MsgServer.MsgGameItem> items = new Queue<Game.MsgServer.MsgGameItem>();
for (ushort count = 16; count <= 12 + Count * 4; count += 4)
{
uint stoneUID = *(uint*)(packet.Array + count);
Game.MsgServer.MsgGameItem stones;
if (client.Inventory.TryGetItem(stoneUID, out stones))
{
if (stones.Item.ITEM_ID == 723694)
procent += 10;
if (stones.Item.ITEM_ID == 723695)
procent += 100;
items.Enqueue(stones);
}
}
if (procent >= Database.ItemType.RefineryStabilizationPoints((byte)Item.Refinary.EffectLevel))
{
Item.Refinary.EffectDuration = 0;
Item.Refinary.Typ = Typing.StabilizationEffectRefined;
MsgItemExtra effect = new MsgItemExtra();
effect.Refinerys.Add(Item.Refinary);
effect.CreateArray();
client.Send(effect.GetArray());
Item.Item.Mode = Role.Flags.ItemMode.Update;
Item.Send(client);
uint count_remover = (uint)items.Count;
for (byte x = 0; x < count_remover; x++)
client.Inventory.Update(items.Dequeue(), Role.Instance.AddMode.REMOVE);
}
}
break;
}
case Artefacts.Purification:
{
Game.MsgServer.MsgGameItem Item;
if (client.TryGetItem(ItemUID, out Item))
{
if (!Item.Purification.InLife) return;
if (Item.Purification.PurificationItemID == 0) return;
uint procent = 0;
Queue<Game.MsgServer.MsgGameItem> items = new Queue<Game.MsgServer.MsgGameItem>();
for (ushort count = 16; count <= 12 + Count * 4; count += 4)
{
uint stoneUID = *(uint*)(packet.Array + count);
Game.MsgServer.MsgGameItem stones;
if (client.Inventory.TryGetItem(stoneUID, out stones))
{
if (stones.Item.ITEM_ID == 723694)
procent += 10;
if (stones.Item.ITEM_ID == 723695)
procent += 100;
items.Enqueue(stones);
}
}
if (procent >= Database.ItemType.PurifyStabilizationPoints((byte)Item.Purification.PurificationLevel))
{
Item.Purification.PurificationDuration = 0;
Item.Purification.Typ = Typing.StabilizationEffectPurification;
MsgItemExtra effect = new MsgItemExtra();
effect.Purifications.Add(Item.Purification);
effect.CreateArray();
client.Send(effect.GetArray());
Item.Item.Mode = Role.Flags.ItemMode.Update;
Item.Send(client);
uint count_remover = (uint)items.Count;
for (byte x = 0; x < count_remover; x++)
client.Inventory.Update(items.Dequeue(), Role.Instance.AddMode.REMOVE);
}
}
break;
}
}
}
[PacketAttribute(GamePackets.AddExtra)]
public unsafe static void AddExtra(Client.GameClient client, ServerSockets.Packet packet)
{
uint Mode = *(uint*)(packet.Array + 4);
uint ItemUID = *(uint*)(packet.Array + 8);
uint ItemArtfact = *(uint*)(packet.Array + 12);
if (ItemUID == ItemArtfact)
return;
switch (Mode)
{
case Artefacts.Refinary:
{
Game.MsgServer.MsgGameItem Item, Artefact;
if (client.TryGetItem(ItemUID, out Item) && client.Inventory.TryGetItem(ItemArtfact, out Artefact))
{
if (Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.Bottle
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.Garment
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.Fan
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.Tower
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.RidingCrop
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.SteedMount
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.LeftWeaponAccessory
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.RightWeaponAccessory)
return;
var BaseAddingItem = Database.Server.RifineryItems[Artefact.Item.ITEM_ID];
if (Database.ItemType.ItemPosition(Item.Item.ITEM_ID) != BaseAddingItem.ForItemPosition)
return;
Item.Refinary = new Refinery();
Item.Refinary.AddedOn = DateTime.Now;
Item.Refinary.Available = true;
Item.Refinary.ItemUID = ItemUID;
Item.Refinary.EffectLevel = BaseAddingItem.Level;
Item.Refinary.EffectDuration = 7 * 24 * 60 * 60;
Item.Refinary.EffectID = Artefact.Item.ITEM_ID;
Item.Refinary.EffectPercent = BaseAddingItem.Procent;
Item.Item.Mode = Role.Flags.ItemMode.Update;
Item.Send(client);
client.Equipment.QueryEquipment(client.Equipment.Alternante);
client.Inventory.Update(Artefact, Role.Instance.AddMode.REMOVE);
}
break;
}
case Artefacts.Purification:
{
Game.MsgServer.MsgGameItem Item, Artefact;
if (client.TryGetItem(ItemUID, out Item) && client.Inventory.TryGetItem(ItemArtfact, out Artefact))
{
if (Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.Bottle
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.Garment
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.Fan
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.Tower
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.RidingCrop
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.SteedMount
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.LeftWeaponAccessory
|| Database.ItemType.ItemPosition(Item.Item.ITEM_ID) == (ushort)Role.Flags.ConquerItem.RightWeaponAccessory)
return;
var PurifyInformation = Database.Server.ItemsBase[Artefact.Item.ITEM_ID];
var ItemInformation = Database.Server.ItemsBase[Item.Item.ITEM_ID];
if (PurifyInformation.PurificationLevel > 0)
{
if (ItemInformation.Level >= PurifyInformation.Level)
{
if (client.Inventory.Contain(1088001, (byte)PurifyInformation.PurificationMeteorNeed))
{
client.Inventory.Remove(1088001, (byte)PurifyInformation.PurificationMeteorNeed);
Item.Purification = new Purification();
Item.Purification.AddedOn = DateTime.Now;
Item.Purification.ItemUID = ItemUID;
Item.Purification.PurificationLevel = PurifyInformation.PurificationLevel;
Item.Purification.PurificationDuration = 7 * 24 * 60 * 60;
Item.Purification.PurificationItemID = Artefact.Item.ITEM_ID;
Item.Purification.Typ = Typing.PurificationEffect;
MsgItemExtra effect = new MsgItemExtra();
effect.Purifications.Add(Item.Purification);
effect.CreateArray();
client.Send(effect.GetArray());
Item.Item.Mode = Role.Flags.ItemMode.Update;
Item.Send(client);
client.Inventory.Update(Artefact, Role.Instance.AddMode.REMOVE);
if(Item.Item.Position != 0)
client.Equipment.QueryEquipment(client.Equipment.Alternante);
}
}
}
}
break;
}
}
}
}
}
for send
Code:
if (Purification.ItemUID != 0 || Refinary.ItemUID != 0)
{
MsgItemExtra extra = new MsgItemExtra();
if (Purification.InLife)
{
Purification.Typ = MsgItemExtra.Typing.PurificationAdding;
extra.Purifications.Add(Purification);
}
if (Refinary.InLife)
{
Refinary.Typ = MsgItemExtra.Typing.RefinaryAdding;
if (Refinary.EffectDuration == 0)
Refinary.Typ = MsgItemExtra.Typing.PermanentRefinery;
extra.Refinerys.Add(Refinary);
}
extra.CreateArray();
client.Send(extra.GetArray());
}