예제 #1
0
            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.");
                }
            }
예제 #2
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);
            }
        }
예제 #3
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);
            }

		}