protected override void OnTarget(Mobile m, object targ) { if (m_Bandage.Deleted || m_Bandage.Amount < 1) { return; } m.RevealingAction(); int id; bool found = false; if (targ is LandTarget) { id = (targ as LandTarget).TileID; for (int i = 0; i < WaterTiles_Land.Length / 2; i++) { if (id >= WaterTiles_Land[i, 0] && id <= WaterTiles_Land[i, 1]) { found = true; break; } } } else if (targ is Item || targ is StaticTarget) { if (targ is Item) { id = (targ as Item).ItemID; } else { id = (targ as StaticTarget).ItemID; } for (int i = 0; i < WaterTiles_Static.Length / 2; i++) { if (id >= WaterTiles_Static[i, 0] && id <= WaterTiles_Static[i, 1]) { found = true; break; } } } if (found) { m.AddToBackpack(new Bandage(m_Bandage.Amount)); m.SendMessage("You wash {0} bloody bandage{1} and put the clean bandage{1} in your pack.", m_Bandage.Amount != 1 ? m_Bandage.Amount.ToString() : "the", m_Bandage.Amount != 1 ? "s" : ""); m_Bandage.Delete(); } else { m.SendMessage("You can only wash bloody bandages in water."); } }
public void EndHeal(Bandage origin) { StopHeal(); if (m_Healer is PlayerMobile) { ((PlayerMobile)m_Healer).WeaponTimerCheck(); } int healerNumber = -1; int patientNumber = -1; bool checkSkills = false; SkillName primarySkill = GetPrimarySkill(m_Patient); SkillName secondarySkill = GetSecondarySkill(m_Patient); BaseCreature petPatient = m_Patient as BaseCreature; if (!m_Healer.Alive) { healerNumber = 500962; // You were unable to finish your work before you died. } else if (m_Healer.Paralyzed) { m_Healer.SendAsciiMessage("You were unable to finish your work before you got paralyzed"); return; } else if (!m_Healer.InRange(m_Patient, Bandage.Range)) { healerNumber = 500963; // You did not stay close enough to heal your target. } else if (!m_Patient.Alive || (petPatient != null && petPatient.IsDeadPet)) { double healing = m_Healer.Skills[primarySkill].Value; double anatomy = m_Healer.Skills[secondarySkill].Value; double chance = ((healing - 68.0) / 50.0) - (m_Slips * 0.02); if (((checkSkills = (healing >= 80.0 && anatomy >= 80.0)) && chance > Utility.RandomDouble()) || (Core.SE && petPatient is FactionWarHorse && petPatient.ControlMaster == m_Healer)) //TODO: Dbl check doesn't check for faction of the horse here? { if (m_Patient.Map == null || !m_Patient.Map.CanFit(m_Patient.Location, 16, false, false)) { healerNumber = 501042; // Target can not be resurrected at that location. } else if (m_Patient.Region != null && m_Patient.Region.IsPartOf("Khaldun")) { healerNumber = 1010395; // The veil of death in this area is too strong and resists thy efforts to restore life. } else { healerNumber = 500965; // You are able to resurrect your patient. m_Patient.FixedEffect(0x376A, 10, 16); if (petPatient != null && petPatient.IsDeadPet) { Mobile master = petPatient.ControlMaster; if (master != null && m_Healer == master) { petPatient.ResurrectPet(); for (int i = 0; i < petPatient.Skills.Length; ++i) { petPatient.Skills[i].Base -= 0.1; } } else if (master != null && master.InRange(petPatient, 3)) { healerNumber = 503255; // You are able to resurrect the creature. master.CloseGump(typeof(PetResurrectGump)); master.SendGump(new PetResurrectGump(m_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(typeof(PetResurrectGump)); friend.SendGump(new PetResurrectGump(m_Healer, petPatient)); found = true; break; } } if (!found) { healerNumber = 1049670; // The pet's owner must be nearby to attempt resurrection. } } } else { m_Patient.CloseGump(typeof(ResurrectGump)); m_Patient.SendGump(new ResurrectGump(m_Patient, m_Healer)); } } } else { if (petPatient != null && petPatient.IsDeadPet) { healerNumber = 503256; // You fail to resurrect the creature. } else { healerNumber = 500966; // You are unable to resurrect your patient. } } } else if (m_Patient.Poisoned) { m_Healer.SendLocalizedMessage(500969); // You finish applying the bandages. double healing = m_Healer.Skills[primarySkill].Value; double anatomy = m_Healer.Skills[secondarySkill].Value; double chance = ((healing - 40.0) / 50.0) - (m_Patient.Poison.Level * 0.11) - (m_Slips * 0.02); if ((checkSkills = (healing >= 60.0 && anatomy >= 60.0)) && chance > Utility.RandomDouble()) { if (m_Patient.CurePoison(m_Healer)) { healerNumber = (m_Healer == m_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(m_Patient)) { BleedAttack.EndBleed(m_Patient, false); } else if (MortalStrike.IsWounded(m_Patient)) { healerNumber = (m_Healer == m_Patient ? 1005000 : 1010398); } else if (m_Patient.Hits == m_Patient.HitsMax) { healerNumber = 500967; // You heal what little damage your patient had. } else { checkSkills = true; patientNumber = -1; Bandage bandage = null; if (origin.Parent == null && !origin.Deleted) { origin.Consume(1); } else if ((bandage = m_Healer.Backpack.FindItemByType(typeof(Bandage), true) as Bandage) == null) { m_Healer.SendAsciiMessage("You don't have any bandages."); return; } else { bandage.Consume(1); } double healing = m_Healer.Skills[primarySkill].Base; double anatomy = m_Healer.Skills[secondarySkill].Base; //Loki edit: Dexterity improves healing chance double chance = (healing / 100.0) * (0.91 + (((double)m_Healer.RawDex - 80.0) / 1000.0)); if (chance > Utility.RandomDouble()) { double min, max; min = 0.04 * ((anatomy / 4.0) + (healing / 4.0)); max = ((anatomy / 4.0) + (healing / 4.0)) - 4; //Loki edit: Bonus from dexterity double dexbonus = ((double)m_Healer.RawDex - 80.0) / 10.0; min += dexbonus; max += dexbonus / 2; if (max < 2) { max = 2; } double toHeal = Utility.RandomMinMax((int)min, (int)max); if (toHeal < 1) { toHeal = 1; healerNumber = 500968; // You apply the bandages, but they barely help. } else if ((!origin.Deleted && (!origin.EventItem || (origin.EventItem && origin.EventItemConsume))) || (bandage != null && (!bandage.EventItem || (bandage.EventItem && bandage.EventItemConsume)))) { Item item = new BloodyBandage(); if (origin.EventItem || (bandage != null && bandage.EventItem)) { item.EventItem = true; item.Hue = origin.Hue; item.Name = "event Bloody bandage"; } Mobile from = m_Healer; if (from.AddToBackpack(item)) { from.SendAsciiMessage("You put the {0} in your pack.", item.Name ?? CliLoc.LocToString(item.LabelNumber)); } else //Taran: Bloody bandages stack on ground if the player is overweight { from.SendAsciiMessage("You are overweight and put the {0} on the ground.", item.Name ?? CliLoc.LocToString(item.LabelNumber)); IPooledEnumerable eable = from.Map.GetItemsInRange(from.Location, 0); foreach (Item i in eable) { if (i is BloodyBandage) { if (i.Serial != item.Serial) { i.Amount++; item.Delete(); } break; } } eable.Free(); } } else if (!origin.Deleted && (origin.EventItem && !origin.EventItemConsume)) { Mobile from = m_Healer; from.PlaySound(0x57); from.SendAsciiMessage("You are able to re-use your bandage and put it in your pack."); } //m_Patient.Heal( (int)toHeal ); //Rev ~ 140 update m_Patient.Heal((int)toHeal, m_Healer, false); } else { healerNumber = 500968; // You apply the bandages, but they barely help. } m_Healer.CheckSkill(secondarySkill, 0.0, 120.0); m_Healer.CheckSkill(primarySkill, 0.0, 120.0); } if (healerNumber != -1) { m_Healer.SendAsciiMessage(CliLoc.LocToString(healerNumber)); } if (patientNumber != -1) { m_Patient.SendLocalizedMessage(patientNumber); } if (checkSkills) { m_Healer.CheckSkill(secondarySkill, 0.0, 100.0); m_Healer.CheckSkill(primarySkill, 0.0, 100.0); } }
public void EndHeal( Bandage origin ) { StopHeal(); if( m_Healer is PlayerMobile ) ((PlayerMobile)m_Healer).WeaponTimerCheck(); int healerNumber = -1; int patientNumber = -1; bool checkSkills = false; SkillName primarySkill = GetPrimarySkill( m_Patient ); SkillName secondarySkill = GetSecondarySkill( m_Patient ); BaseCreature petPatient = m_Patient as BaseCreature; if( !m_Healer.Alive ) healerNumber = 500962; // You were unable to finish your work before you died. else if (m_Healer.Paralyzed) { m_Healer.SendAsciiMessage("You were unable to finish your work before you got paralyzed"); return; } else if( !m_Healer.InRange( m_Patient, Bandage.Range ) ) healerNumber = 500963; // You did not stay close enough to heal your target. else if( !m_Patient.Alive || ( petPatient != null && petPatient.IsDeadPet ) ) { double healing = m_Healer.Skills[primarySkill].Value; double anatomy = m_Healer.Skills[secondarySkill].Value; double chance = ( ( healing - 68.0 ) / 50.0 ) - ( m_Slips * 0.02 ); if( ( ( checkSkills = ( healing >= 80.0 && anatomy >= 80.0 ) ) && chance > Utility.RandomDouble() ) || ( Core.SE && petPatient is FactionWarHorse && petPatient.ControlMaster == m_Healer ) ) //TODO: Dbl check doesn't check for faction of the horse here? { if( m_Patient.Map == null || !m_Patient.Map.CanFit( m_Patient.Location, 16, false, false ) ) healerNumber = 501042; // Target can not be resurrected at that location. else if( m_Patient.Region != null && m_Patient.Region.IsPartOf( "Khaldun" ) ) { healerNumber = 1010395; // The veil of death in this area is too strong and resists thy efforts to restore life. } else { healerNumber = 500965; // You are able to resurrect your patient. m_Patient.FixedEffect( 0x376A, 10, 16 ); if( petPatient != null && petPatient.IsDeadPet ) { Mobile master = petPatient.ControlMaster; if (master != null && m_Healer == master) { petPatient.ResurrectPet(); for (int i = 0; i < petPatient.Skills.Length; ++i) { petPatient.Skills[i].Base -= 0.1; } } else if (master != null && master.InRange(petPatient, 3)) { healerNumber = 503255; // You are able to resurrect the creature. master.CloseGump( typeof( PetResurrectGump ) ); master.SendGump( new PetResurrectGump( m_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( typeof( PetResurrectGump ) ); friend.SendGump( new PetResurrectGump( m_Healer, petPatient ) ); found = true; break; } } if( !found ) healerNumber = 1049670; // The pet's owner must be nearby to attempt resurrection. } } else { m_Patient.CloseGump( typeof( ResurrectGump ) ); m_Patient.SendGump( new ResurrectGump( m_Patient, m_Healer ) ); } } } else { if( petPatient != null && petPatient.IsDeadPet ) healerNumber = 503256; // You fail to resurrect the creature. else healerNumber = 500966; // You are unable to resurrect your patient. } } else if (m_Patient.Poisoned) { m_Healer.SendLocalizedMessage(500969); // You finish applying the bandages. double healing = m_Healer.Skills[primarySkill].Value; double anatomy = m_Healer.Skills[secondarySkill].Value; double chance = ((healing - 40.0) / 50.0) - (m_Patient.Poison.Level * 0.11) - (m_Slips * 0.02); if ((checkSkills = (healing >= 60.0 && anatomy >= 60.0)) && chance > Utility.RandomDouble()) { if (m_Patient.CurePoison(m_Healer)) { healerNumber = (m_Healer == m_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( m_Patient ) ) BleedAttack.EndBleed( m_Patient, false ); else if( MortalStrike.IsWounded( m_Patient ) ) healerNumber = ( m_Healer == m_Patient ? 1005000 : 1010398 ); else if( m_Patient.Hits == m_Patient.HitsMax ) healerNumber = 500967; // You heal what little damage your patient had. else { checkSkills = true; patientNumber = -1; Bandage bandage = null; if( origin.Parent == null && !origin.Deleted ) origin.Consume( 1 ); else if( ( bandage = m_Healer.Backpack.FindItemByType( typeof( Bandage ), true ) as Bandage ) == null ) { m_Healer.SendAsciiMessage( "You don't have any bandages." ); return; } else bandage.Consume( 1 ); double healing = m_Healer.Skills[primarySkill].Base; double anatomy = m_Healer.Skills[secondarySkill].Base; //Loki edit: Dexterity improves healing chance double chance = (healing/100.0) * (0.91 + (((double)m_Healer.RawDex - 80.0) / 1000.0)); if( chance > Utility.RandomDouble() ) { double min, max; min = 0.04 * ( ( anatomy / 4.0 ) + ( healing / 4.0 ) ); max = ( ( anatomy / 4.0 ) + ( healing / 4.0 ) ) - 4; //Loki edit: Bonus from dexterity double dexbonus = ((double)m_Healer.RawDex - 80.0) / 10.0; min += dexbonus; max += dexbonus / 2; if( max < 2 ) max = 2; double toHeal = Utility.RandomMinMax( (int)min, (int)max ); if( toHeal < 1 ) { toHeal = 1; healerNumber = 500968; // You apply the bandages, but they barely help. } else if( ( !origin.Deleted && (!origin.EventItem || (origin.EventItem && origin.EventItemConsume)) ) || ( bandage != null && (!bandage.EventItem || (bandage.EventItem && bandage.EventItemConsume)) ) ) { Item item = new BloodyBandage(); if (origin.EventItem || (bandage != null && bandage.EventItem)) { item.EventItem = true; item.Hue = origin.Hue; item.Name = "event Bloody bandage"; } Mobile from = m_Healer; if (from.AddToBackpack(item)) { from.SendAsciiMessage("You put the {0} in your pack.", item.Name ?? CliLoc.LocToString(item.LabelNumber)); } else //Taran: Bloody bandages stack on ground if the player is overweight { from.SendAsciiMessage("You are overweight and put the {0} on the ground.", item.Name ?? CliLoc.LocToString(item.LabelNumber)); IPooledEnumerable eable = from.Map.GetItemsInRange(from.Location, 0); foreach (Item i in eable) { if (i is BloodyBandage) { if (i.Serial != item.Serial) { i.Amount++; item.Delete(); } break; } } eable.Free(); } } else if ( !origin.Deleted && (origin.EventItem && !origin.EventItemConsume)) { Mobile from = m_Healer; from.PlaySound(0x57); from.SendAsciiMessage("You are able to re-use your bandage and put it in your pack."); } //m_Patient.Heal( (int)toHeal ); //Rev ~ 140 update m_Patient.Heal((int)toHeal, m_Healer, false); } else healerNumber = 500968; // You apply the bandages, but they barely help. m_Healer.CheckSkill( secondarySkill, 0.0, 120.0 ); m_Healer.CheckSkill( primarySkill, 0.0, 120.0 ); } if( healerNumber != -1 ) m_Healer.SendAsciiMessage( CliLoc.LocToString( healerNumber ) ); if (patientNumber != -1) m_Patient.SendLocalizedMessage(patientNumber); if (checkSkills) { m_Healer.CheckSkill(secondarySkill, 0.0, 100.0); m_Healer.CheckSkill(primarySkill, 0.0, 100.0); } }