public void CharacterLife()
{
int x = 1;
bool change = false;
if (Session.Character.Hp == 0 && Session.Character.LastHealth.AddSeconds(2) <= DateTime.Now)
{
Session.Character.Mp = 0;
Session.SendPacket(Session.Character.GenerateStat());
Session.Character.LastHealth = DateTime.Now;
}
else
{
WearableInstance amulet = Session.Character.Inventory.LoadBySlotAndType<WearableInstance>((byte)EquipmentType.Amulet, InventoryType.Wear);
if (Session.Character.LastEffect.AddSeconds(5) <= DateTime.Now && amulet != null)
{
if (amulet.ItemVNum == 4503 || amulet.ItemVNum == 4504)
{
Session.CurrentMap?.Broadcast(Session.Character.GenerateEff(amulet.Item.EffectValue + (Session.Character.Class == ClassType.Adventurer ? 0 : (byte)Session.Character.Class - 1)), Session.Character.MapX, Session.Character.MapY);
}
else
{
Session.CurrentMap?.Broadcast(Session.Character.GenerateEff(amulet.Item.EffectValue), Session.Character.MapX, Session.Character.MapY);
}
Session.Character.LastEffect = DateTime.Now;
}
if ((Session.Character.LastHealth.AddSeconds(2) <= DateTime.Now) || (Session.Character.IsSitting && Session.Character.LastHealth.AddSeconds(1.5) <= DateTime.Now))
{
Session.Character.LastHealth = DateTime.Now;
if (Session.HealthStop)
{
Session.HealthStop = false;
return;
}
if (Session.Character.LastDefence.AddSeconds(2) <= DateTime.Now && Session.Character.LastSkillUse.AddSeconds(2) <= DateTime.Now && Session.Character.Hp > 0)
{
if (x == 0)
{
x = 1;
}
if (Session.Character.Hp + Session.Character.HealthHPLoad() < Session.Character.HPLoad())
{
change = true;
Session.Character.Hp += Session.Character.HealthHPLoad();
}
else
{
if (Session.Character.Hp != (int)Session.Character.HPLoad())
{
change = true;
}
Session.Character.Hp = (int)Session.Character.HPLoad();
}
if (x == 1)
{
if (Session.Character.Mp + Session.Character.HealthMPLoad() < Session.Character.MPLoad())
{
Session.Character.Mp += Session.Character.HealthMPLoad();
change = true;
}
else
{
if (Session.Character.Mp != (int)Session.Character.MPLoad())
{
change = true;
}
Session.Character.Mp = (int)Session.Character.MPLoad();
}
}
if (change)
{
Session.SendPacket(Session.Character.GenerateStat());
}
}
}
if (Session.Character.UseSp)
{
if (Session.Character.LastSpGaugeRemove <= new DateTime(0001, 01, 01, 00, 00, 00))
Session.Character.LastSpGaugeRemove = DateTime.Now;
if (Session.Character.LastSkillUse.AddSeconds(15) >= DateTime.Now && Session.Character.LastSpGaugeRemove.AddSeconds(1) <= DateTime.Now)
{
SpecialistInstance specialist = Session.Character.Inventory.LoadBySlotAndType<SpecialistInstance>((byte)EquipmentType.Sp, InventoryType.Wear);
byte spType = 0;
if ((specialist.Item.Morph > 1 && specialist.Item.Morph < 8) || (specialist.Item.Morph > 9 && specialist.Item.Morph < 16))
spType = 3;
else if (specialist.Item.Morph > 16 && specialist.Item.Morph < 29)
spType = 2;
else if (specialist.Item.Morph == 9)
spType = 1;
if (Session.Character.SpPoint >= spType)
{
Session.Character.SpPoint -= spType;
}
else if (Session.Character.SpPoint < spType && Session.Character.SpPoint != 0)
{
spType -= (byte)Session.Character.SpPoint;
Session.Character.SpPoint = 0;
Session.Character.SpAdditionPoint -= spType;
}
else if (Session.Character.SpPoint == 0 && Session.Character.SpAdditionPoint >= spType)
{
Session.Character.SpAdditionPoint -= spType;
}
else if (Session.Character.SpPoint == 0 && Session.Character.SpAdditionPoint < spType)
{
Session.Character.SpAdditionPoint = 0;
double currentRunningSeconds = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds;
if (Session.Character.UseSp)
{
Session.Character.LastSp = currentRunningSeconds;
if (Session != null && Session.HasSession)
{
if (Session.Character.IsVehicled)
{
return;
}
Logger.Debug(specialist.ItemVNum.ToString(), Session.SessionId);
Session.Character.UseSp = false;
Session.Character.LoadSpeed();
Session.SendPacket(Session.Character.GenerateCond());
Session.SendPacket(Session.Character.GenerateLev());
Session.Character.SpCooldown = 30;
if (Session.Character?.SkillsSp != null)
{
foreach (CharacterSkill ski in Session.Character.SkillsSp.GetAllItems().Where(s => !s.CanBeUsed()))
{
short time = ski.Skill.Cooldown;
double temp = (ski.LastUse - DateTime.Now).TotalMilliseconds + time * 100;
temp /= 1000;
Session.Character.SpCooldown = temp > Session.Character.SpCooldown ? (int)temp : Session.Character.SpCooldown;
}
}
Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("STAY_TIME"), Session.Character.SpCooldown), 11));
Session.SendPacket($"sd {Session.Character.SpCooldown}");
Session.CurrentMap?.Broadcast(Session.Character.GenerateCMode());
Session.CurrentMap?.Broadcast(Session.Character.GenerateGuri(6, 1), Session.Character.MapX, Session.Character.MapY);
// ms_c
Session.SendPacket(Session.Character.GenerateSki());
Session.SendPackets(Session.Character.GenerateQuicklist());
Session.SendPacket(Session.Character.GenerateStat());
Session.SendPacket(Session.Character.GenerateStatChar());
Observable.Timer(TimeSpan.FromMilliseconds(Session.Character.SpCooldown * 1000))
.Subscribe(
o =>
{
Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("TRANSFORM_DISAPPEAR"), 11));
Session.SendPacket("sd 0");
});
}
}
}
Session.SendPacket(Session.Character.GenerateSpPoint());
Session.Character.LastSpGaugeRemove = DateTime.Now;
}
}
}
}