public void EndHeal() { StopHeal(); int healerNumber = -1, patientNumber = -1; bool playSound = true; bool checkSkills = false; SkillName primarySkill = GetPrimarySkill(Patient); SkillName secondarySkill = GetSecondarySkill(Patient); BaseCreature petPatient = Patient as BaseCreature; if (!Healer.Alive) { healerNumber = 500962; // You were unable to finish your work before you died. patientNumber = -1; playSound = false; } else if (!Healer.InRange(Patient, Bandage.Range)) { healerNumber = 500963; // You did not stay close enough to heal your target. patientNumber = -1; playSound = false; } else if (!Patient.Alive || petPatient?.IsDeadPet == true) { double healing = Healer.Skills[primarySkill].Value; double anatomy = Healer.Skills[secondarySkill].Value; double chance = (healing - 68.0) / 50.0 - Slips * 0.02; if ((checkSkills = healing >= 80.0 && anatomy >= 80.0) && chance > Utility.RandomDouble() || Core.SE && petPatient is FactionWarHorse && petPatient.ControlMaster == Healer ) //TODO: Dbl check doesn't check for faction of the horse here? { if (Patient.Map?.CanFit(Patient.Location, 16, false, false) != true) { healerNumber = 501042; // Target can not be resurrected at that location. patientNumber = 502391; // Thou can not be resurrected there! } else if (Patient.Region?.IsPartOf("Khaldun") == true) { healerNumber = 1010395; // The veil of death in this area is too strong and resists thy efforts to restore life. patientNumber = -1; } else { healerNumber = 500965; // You are able to resurrect your patient. patientNumber = -1; Patient.PlaySound(0x214); Patient.FixedEffect(0x376A, 10, 16); if (petPatient?.IsDeadPet == true) { Mobile master = petPatient.ControlMaster; if (master != null && Healer == master) { petPatient.ResurrectPet(); for (int i = 0; i < petPatient.Skills.Length; ++i) { petPatient.Skills[i].Base -= 0.1; } } else if (master?.InRange(petPatient, 3) == true) { healerNumber = 503255; // You are able to resurrect the creature. master.CloseGump <PetResurrectGump>(); master.SendGump(new PetResurrectGump(Healer, petPatient)); } else { bool found = false; List <Mobile> friends = petPatient.Friends; for (int i = 0; friends != null && i < friends.Count; ++i) { Mobile friend = friends[i]; if (friend.InRange(petPatient, 3)) { healerNumber = 503255; // You are able to resurrect the creature. friend.CloseGump <PetResurrectGump>(); friend.SendGump(new PetResurrectGump(Healer, petPatient)); found = true; break; } } if (!found) { healerNumber = 1049670; // The pet's owner must be nearby to attempt resurrection. } } } else { Patient.CloseGump <ResurrectGump>(); Patient.SendGump(new ResurrectGump(Patient, Healer)); } } } else { if (petPatient?.IsDeadPet == true) { healerNumber = 503256; // You fail to resurrect the creature. } else { healerNumber = 500966; // You are unable to resurrect your patient. } patientNumber = -1; } } else if (Patient.Poisoned) { Healer.SendLocalizedMessage(500969); // You finish applying the bandages. double healing = Healer.Skills[primarySkill].Value; double anatomy = Healer.Skills[secondarySkill].Value; double chance = (healing - 30.0) / 50.0 - Patient.Poison.Level * 0.1 - Slips * 0.02; if ((checkSkills = healing >= 60.0 && anatomy >= 60.0) && chance > Utility.RandomDouble()) { if (Patient.CurePoison(Healer)) { healerNumber = Healer == Patient ? -1 : 1010058; // You have cured the target of all poisons. patientNumber = 1010059; // You have been cured of all poisons. } else { healerNumber = -1; patientNumber = -1; } } else { healerNumber = 1010060; // You have failed to cure your target! patientNumber = -1; } } else if (BleedAttack.IsBleeding(Patient)) { healerNumber = 1060088; // You bind the wound and stop the bleeding patientNumber = 1060167; // The bleeding wounds have healed, you are no longer bleeding! BleedAttack.EndBleed(Patient, false); } else if (MortalStrike.IsWounded(Patient)) { healerNumber = Healer == Patient ? 1005000 : 1010398; patientNumber = -1; playSound = false; } else if (Patient.Hits == Patient.HitsMax) { healerNumber = 500967; // You heal what little damage your patient had. patientNumber = -1; } else { checkSkills = true; patientNumber = -1; double healing = Healer.Skills[primarySkill].Value; double anatomy = Healer.Skills[secondarySkill].Value; double chance = (healing + 10.0) / 100.0 - Slips * 0.02; if (chance > Utility.RandomDouble()) { healerNumber = 500969; // You finish applying the bandages. double min, max; if (Core.AOS) { min = anatomy / 8.0 + healing / 5.0 + 4.0; max = anatomy / 6.0 + healing / 2.5 + 4.0; } else { min = anatomy / 5.0 + healing / 5.0 + 3.0; max = anatomy / 5.0 + healing / 2.0 + 10.0; } double toHeal = min + Utility.RandomDouble() * (max - min); if (Patient.Body.IsMonster || Patient.Body.IsAnimal) { toHeal += Patient.HitsMax / 100.0; } if (Core.AOS) { toHeal -= toHeal * Slips * 0.35; // TODO: Verify algorithm } else { toHeal -= Slips * 4; } if (toHeal < 1) { toHeal = 1; healerNumber = 500968; // You apply the bandages, but they barely help. } Patient.Heal((int)toHeal, Healer, false); } else { healerNumber = 500968; // You apply the bandages, but they barely help. playSound = false; } } if (healerNumber != -1) { Healer.SendLocalizedMessage(healerNumber); } if (patientNumber != -1) { Patient.SendLocalizedMessage(patientNumber); } if (playSound) { Patient.PlaySound(0x57); } if (checkSkills) { Healer.CheckSkill(secondarySkill, 0.0, 120.0); Healer.CheckSkill(primarySkill, 0.0, 120.0); } }
public static BandageContext BeginHeal(Mobile healer, Mobile patient) { BaseCreature creature = patient as BaseCreature; if (patient is Golem) { healer.SendLocalizedMessage(500970); // Bandages cannot be used on that. } else if (creature?.IsAnimatedDead == true) { healer.SendLocalizedMessage(500951); // You cannot heal that. } else if (!patient.Poisoned && patient.Hits == patient.HitsMax && !BleedAttack.IsBleeding(patient) && creature?.IsDeadPet != true) { healer.SendLocalizedMessage(500955); // That being is not damaged! } else if (!patient.Alive && patient.Map?.CanFit(patient.Location, 16, false, false) != true) { healer.SendLocalizedMessage(501042); // Target cannot be resurrected at that location. } else if (healer.CanBeBeneficial(patient, true, true)) { healer.DoBeneficial(patient); bool onSelf = healer == patient; int dex = healer.Dex; double seconds; double resDelay = patient.Alive ? 0.0 : 5.0; if (onSelf) { if (Core.AOS) { seconds = 5.0 + 0.5 * ((double)(120 - dex) / 10); // TODO: Verify algorithm } else { seconds = 9.4 + 0.6 * ((double)(120 - dex) / 10); } } else { if (Core.AOS && GetPrimarySkill(patient) == SkillName.Veterinary) { seconds = 2.0; } else if (Core.AOS) { if (dex < 204) { seconds = 3.2 - Math.Sin((double)dex / 130) * 2.5 + resDelay; } else { seconds = 0.7 + resDelay; } } else { if (dex >= 100) { seconds = 3.0 + resDelay; } else if (dex >= 40) { seconds = 4.0 + resDelay; } else { seconds = 5.0 + resDelay; } } } BandageContext context = GetContext(healer); context?.StopHeal(); seconds *= 1000; context = new BandageContext(healer, patient, TimeSpan.FromMilliseconds(seconds)); m_Table[healer] = context; if (!onSelf) { patient.SendLocalizedMessage(1008078, false, healer.Name); // : Attempting to heal you. } healer.SendLocalizedMessage(500956); // You begin applying the bandages. return(context); } return(null); }
public virtual void Negate(Mobile m) { if (m == null || m.Deleted) { return; } if (m.Frozen) { m.Frozen = false; } if (m.Paralyzed) { m.Paralyzed = false; } if (m.Poisoned) { m.CurePoison(m); } if (BleedAttack.IsBleeding(m)) { BleedAttack.EndBleed(m, true); } if (MortalStrike.IsWounded(m)) { MortalStrike.EndWound(m); } PolymorphSpell.StopTimer(m); IncognitoSpell.StopTimer(m); DisguiseTimers.RemoveTimer(m); m.EndAction(typeof(PolymorphSpell)); m.EndAction(typeof(IncognitoSpell)); MeerMage.StopEffect(m, false); if (DebugMode || m.AccessLevel <= AccessLevel.Counselor) { m.RevealingAction(); m.DisruptiveAction(); } if (m.Target != null) { m.Target.Cancel(m, TargetCancelType.Overriden); } m.Spell = null; if (m.Combatant != null) { #if ServUO var c = m.Combatant as Mobile; #else var c = m.Combatant; #endif if (c != null && c.Combatant == m) { c.Combatant = null; c.Warmode = false; } m.Combatant = null; } if (m.Aggressed != null) { m.Aggressed.Clear(); } if (m.Aggressors != null) { m.Aggressors.Clear(); } m.Warmode = false; m.Criminal = false; m.Delta(MobileDelta.Noto); }