ПОМОГИТЕ

Silence

Member
Спасибо! То, что нужно!:) Нормальным языком это будет звучать примерно так:

Бонусы от рунных молотов
Тёмная медь: 1-2 бонуса, сила бонусов 10-20 % от максимума
Теневое железо: 2 бонуса, сила бонусов 15-25 %
Медь: 2-3 бонуса, сила бонусов 25-50 %
Бронза: 3 бонуса, сила бонусов 30-65 %
Серебро: 3-4 бонуса, сила бонусов 30-70 %
Золото: 3-4 бонуса, сила бонусов 35-75 %
Обсидиан: 3-4 бонуса, сила бонусов 35-80 %
Нефрит: 3-4 бонуса, сила бонусов 35-80 %
Лунит: 3-4 бонуса, сила бонусов 35-80 %
Солнстоун: 3-4 бонуса, сила бонусов 35-80 %
Бладстоун: 3-4 бонуса, сила бонусов 40-80 %
Агапит: 4 бонуса, сила бонусов 40-80 %
Верит: 4-5 бонусов, сила бонусов 45-90 %
Платина: 4-5 бонусов, сила бонусов 45-100 %
Мифрил: 4-5 бонусов, сила бонусов 50-100 %
Валорит: 5 бонусов, сила бонусов 50-100 %
Кристалит; 5-6 бонусов, сила бонусов 80-100 %

п.с.А есть какая-нибудь возможность посмотреть другие серверные скрипты? Они доступны простым смертным?)
 
Останнє редагування:

KOCTa

Dedywkо |Co100
Команда форуму
Супер Модератор
Відповідь: ПОМОГИТЕ

:). Що саме цікавить?
Ось стосовно нагород за ковальськи замовлення, як у скріптах:
Таблиця за якою визначається номер групи нагород:
Код:
		public static double[] m_BlacksmithRewardScore = new double[]
		{
			49831.0,		// 0	Runic Hammers Crystalit
			48875.0,		// 1	Runic Hammers Valorite
			47461.0,		// 2	Runic Hammers Mythril
			46067.0,		// 3	Runic Hammers Platinum
			45151.0,		// 4	Runic Hammers Verite
			40711.0,		// 5	Runic Hammers Agapite
			36511.0,		// 6	Runic Hammers Gold, Obsidian - Bloodstone
			32551.0,		// 7	Runic Hammers Silver
			28831.0,		// 8	Runic Hammers Bronze
			25351.0,		// 9	Runic Hammers Copper
			22111.0,		// 10	Runic Hammers ShadowIron
			20759.625,	// 11	Power Scrolls +20, Ancient Hammers +60
			19111.0,		// 12	Runic Hammers DullCopper

			15000.0,		// 13	Power Scrolls +15, Ancient Hammers +30
			14159.0,		// 14	Colored Anvil Crystalit
			13892.0,		// 15	Colored Anvil Valorite
			13496.0,		// 16	Colored Anvil Mythril
			13106.0,		// 17	Colored Anvil Platinum
			12849.0,		// 18	Colored Anvil Verite
			11606.0,		// 19	Colored Anvil Agapite
			10430.0,		// 20	Colored Anvil Gold, Obsidian - Bloodstone
			9321.0,		// 21	Colored Anvil Silver
			9226.5,		// 22	Power Scrolls +10, Ancient Hammers +15
			8279.0,		// 23	Colored Anvil Bronze
			7305.0,		// 24	Colored Anvil Copper
			6398.0,		// 25	Colored Anvil ShadowIron
			6151.0,		// 26	Power Scrolls +5, Ancient Hammers +10
			5558.0,		// 27	Colored Anvil DullCopper
			3026.0,		// 28	Powder of Temperament
			1929.0,		// 29	Prospectors Tool
			1800.0,		// 30	Gargoyles Pickaxe
			1700.0,		// 31	Gloves +5
			1491.0,		// 32	Gloves +3
			1350.0,		// 33	Gloves +1
			1212.0		// 34	Sturdy Pickaxe/Shovel 
		};
Таблиця у який визначається згідно номеру групи нагород яка саме буде нагорода ( mat це матеріал, деяки рівноцінні ):
Код:
		public static int GetRewardSmithEntryNum( int num, int mat, double skill )
		{
			double random = Utility.RandomDouble();
			switch ( num )
			{
					default: return 0;
					case 34: return ( random < 0.5 ? 0 : 1 );
					case 33: return 2;
					case 32: return 3;
					case 31: return 4;
					case 30: return 5;
					case 29: return 6;
					case 28: return 7;
					case 27: return 16;						//	Colored Anvil DullCopper
					case 26: return (( skill <= 100.0 && random > 0.5 ) ? 12 : 8 );	//	PowerScroll +5 : AncientHammer +10
					case 25: return 17;
					case 24: return 18;
					case 23: return 19;
					case 22: return (( skill <= 105.0 && random > 0.5 ) ? 13 : 9 );	//	PowerScroll +10 : AncientHammer +15
					case 21: return 20;
					case 20:
					{
					switch ( mat )
						{
							case 6: return 21;
							case 7: return 22;
							case 8: return 23;
							case 9: return 24;
							case 10: return 25;
							case 11: return 26;
							default: return ( random > 0.5 ? 21 : 22 + Utility.Random( 6 ));
						}
					}
					case 19: return 27;
					case 18: return 28;
					case 17: return 29;
					case 16: return 30;
					case 15: return 31;
					case 14: return 32;
					case 13: return (( skill <= 110.0 && random > 0.5 ) ? 14 : 10 );
					case 12: return 33;
					case 11: return 15;
					case 10: return 34;
					case 9: return 35;
					case 8: return 36;
					case 7: return 37;
					case 6:
					{
					switch ( mat )
						{
							case 6: return 38;
							case 7: return 39;
							case 8: return 40;
							case 9: return 41;
							case 10: return 42;
							case 11: return 43;
							default: return ( random > 0.5 ? 38 : 39 + Utility.Random( 6 ));
						}
					}
					case 5: return 44;
					case 4: return 45;
					case 3: return 46;
					case 2: return 47;
					case 1: return 48;
					case 0: return 49;

				}
		}
А ось таблиця нагород згідно номеру:
Код:
		public static BODRewardEntry[] m_BlacksmithRewardEntry = new BODRewardEntry[]
		{
			new BODRewardEntry( typeof( SturdyShovel )),				//	0
			new BODRewardEntry( typeof( SturdyPickaxe )),			//	1

			new BODRewardEntry( typeof( LeatherGlovesOfMining ), 1 ),		//	2
			new BODRewardEntry( typeof( StuddedGlovesOfMining ), 3 ),		//	3
			new BODRewardEntry( typeof( RingmailGlovesOfMining ), 5 ),		//	4

			new BODRewardEntry( typeof( GargoylesPickaxe )),			//	5
			new BODRewardEntry( typeof( ProspectorsTool )),			//	6
			new BODRewardEntry( typeof( PowderOfTemperament )),			//	7

			new BODRewardEntry( typeof( AncientSmithyHammer ), 10 ),		//	8
			new BODRewardEntry( typeof( AncientSmithyHammer ), 15 ),		//	9
			new BODRewardEntry( typeof( AncientSmithyHammer ), 30 ),		//	10
			new BODRewardEntry( typeof( AncientSmithyHammer ), 60 ),		//	11

			new BODRewardEntry( typeof( PowerScroll ), 5 ),			//	12
			new BODRewardEntry( typeof( PowerScroll ), 10 ),			//	13
			new BODRewardEntry( typeof( PowerScroll ), 15 ),			//	14
			new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 120 ),			//	15

			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.DullCopper, 50 ),	//	16
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.ShadowIron, 45 ),	//	17
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Copper, 40 ),	//	18
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Bronze, 35 ),	//	19
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Silver, 30 ),	//	20
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Gold, 25 ),	//	21
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Obsidian, 20 ),	//	22
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Jade, 20 ),	//	23
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Moonstone, 20 ),	//	24
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Sunstone, 20 ),	//	25
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Bloodstone, 20 ),	//	26
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Agapite, 15 ),	//	27
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Verite, 12 ),	//	28
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Platinum, 10 ),	//	29
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Mythril, 9 ),	//	30
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Valorite, 7 ),	//	31
			new BODRewardEntry( typeof( ColoredAnvil ), CraftResource.Crystalit, 5 ),	//	32

			new BODRewardEntry( typeof( RunicHammer ), CraftResource.DullCopper, 50 ),	//	33
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.ShadowIron, 45 ),	//	34
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Copper, 40 ),	//	35
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Bronze, 35 ),	//	36
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Silver, 30 ),	//	37
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Gold, 25 ),	//	38
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Obsidian, 20 ),	//	39
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Jade, 20 ),	//	40
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Moonstone, 20 ),	//	41
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Sunstone, 20 ),	//	42
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Bloodstone, 20 ),	//	43
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Agapite, 15 ),	//	44
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Verite, 12 ),	//	45
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Platinum, 10 ),	//	46
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Mythril, 9 ),	//	47
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Valorite, 7 ),	//	48
			new BODRewardEntry( typeof( RunicHammer ), CraftResource.Crystalit, 5 ),	//	49
		};
 

Silence

Member
Исходя из полученного материала нашел 2 ошибки:
1. в методе GetRewardSmithEntryNum
строка
case 11: return 15; // свиток 120 кузнеца
должна быть заменена на
case 11: return (( skill <= 115.0 && random > 0.5 ) ? 15 : 11 );
//свиток 120 или молот +60
Иначе молот +60 не получить впринципе вообще никак

2. В таблице наград строки:

new BODRewardEntry( typeof( PowerScroll ), 5 ), // 12
new BODRewardEntry( typeof( PowerScroll ), 10 ), // 13
new BODRewardEntry( typeof( PowerScroll ), 15 ), // 14
new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 120 ), // 15

По логике вещей должно быть так:

new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 105 ), // 12
new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 110 ), // 13
new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 115 ), // 14
new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 120 ), // 15

п.с. не вижу смысла в том, чтобы вводить рандомизатор в случаях определения свиток или молот.. помоему достаточно было ограничиться просто проверкой скила... примерно так:
return ( skill <= 115.0 ? 15 : 11 );
хотя так было б проще свиток получить, но все же мне уже 3 молотка выпало и ни одного свитка:angry:.. хотя если учесть найденные ошибки, то становится ясно, что свитки должны были выпадать, но изза неправильно переданных параметров происходила ошибка и не выпадало ничего вообще..;)

п.с. еще хотел бы посмотреть скрипт на лечение себя и петов (знаю, что выкладывали, видел) но насколько мне известно он уже поменялся ) и вычисление задержки до следующего удара (выстрела), скрипт переплавки руды, скрипт на крафт тейлором с помощью рункитов, и скрипт на АИ движения вендоров))) такое чуство, что у них шило в одном месте, я только курсор наведу на него - он уже отошел)
если скрипты открыты, то скачаю и сам все найду)
 
Останнє редагування:

KOCTa

Dedywkо |Co100
Команда форуму
Супер Модератор
Відповідь: Re: ПОМОГИТЕ

Исходя из полученного материала нашел 2 ошибки:
1. в методе GetRewardSmithEntryNum
строка
case 11: return 15; // свиток 120 кузнеца
должна быть заменена на
case 11: return (( skill <= 115.0 && random > 0.5 ) ? 15 : 11 );
//свиток 120 или молот +60
Иначе молот +60 не получить впринципе вообще никак

2. В таблице наград строки:

new BODRewardEntry( typeof( PowerScroll ), 5 ), // 12
new BODRewardEntry( typeof( PowerScroll ), 10 ), // 13
new BODRewardEntry( typeof( PowerScroll ), 15 ), // 14
new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 120 ), // 15

По логике вещей должно быть так:

new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 105 ), // 12
new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 110 ), // 13
new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 115 ), // 14
new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 120 ), // 15

п.с. не вижу смысла в том, чтобы вводить рандомизатор в случаях определения свиток или молот.. помоему достаточно было ограничиться просто проверкой скила... примерно так:
return ( skill <= 115.0 ? 15 : 11 );
хотя так было б проще свиток получить, но все же мне уже 3 молотка выпало и ни одного свитка:angry:.. хотя если учесть найденные ошибки, то становится ясно, что свитки должны были выпадать, но изза неправильно переданных параметров происходила ошибка и не выпадало ничего вообще..;)
Дуже дякую. Нарешті знайшовся хтось, хто допомогає. З мене 3 бали. Напишить у ПП логін від акк і ім'я перса, якому цю нагороду покласти у сумку.
Взагалі, з тим, що Ви помітили виявилась цікава історія. Я вже не пам'ятаю, але там
case 11: return (( skill <= 115.0 && random > 0.5 ) ? 15 : 11 );
була у коментах і замінена на
case 11: return 15;
і, здається саме тому щоб випадало без молотків
new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 120
Тому вибачаюсь, мабуть тестів чи правильні поверскроли випадають, а далі або забув, до кінця довести, або замість виправленного скріпта залишився тестовий. Все так, строка
new BODRewardEntry( typeof( PowerScroll ), 5 )
видає помилку, але завдяки захисту серв не вибиває, але всеодно поверскрола не дає.
Виправив:
Код:
					case 11: return (( skill <= 115.0 && random > 0.5 ) ? 15 : 11 );
.....
			new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 105 ),			//	12
			new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 110 ),			//	13
			new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 115 ),			//	14
			new BODRewardEntry( typeof( PowerScroll ), SkillName.Blacksmith, 120 ),			//	15
А рандом тут потрібен саме тому, щоб навить якщо скіл був меньший за 115, всеодно вірогідність того, що нагородою буде поверскрол, була лише 50%.
Зранку виправлення вже буде працювати.
 

KOCTa

Dedywkо |Co100
Команда форуму
Супер Модератор
Відповідь: Re: ПОМОГИТЕ

п.с. еще хотел бы посмотреть скрипт на лечение себя и петов (знаю, что выкладывали, видел) но насколько мне известно он уже поменялся ) и вычисление задержки до следующего удара (выстрела), скрипт переплавки руды, скрипт на крафт тейлором с помощью рункитов, и скрипт на АИ движения вендоров))) такое чуство, что у них шило в одном месте, я только курсор наведу на него - он уже отошел)
если скрипты открыты, то скачаю и сам все найду)
Стосовно лікування, я так розумію цикавить саме це:
Код:
		public static BandageContext BeginHeal( Mobile healer, Mobile patient )
		{
			bool isDeadPet = ( patient is BaseCreature && ((BaseCreature)patient).IsDeadPet );

			if ( patient is Golem )
			{
				healer.SendLocalizedMessage( 500970 ); // Bandages cannot be used on that.
			}
			else if ( patient is BaseCreature && ((BaseCreature)patient).IsAnimatedDead )
			{
				healer.SendLocalizedMessage( 500951 ); // You cannot heal that.
			}
			else if ( !patient.Poisoned && patient.Hits == patient.HitsMax && !BleedAttack.IsBleeding( patient ) && !isDeadPet )
			{
				healer.SendLocalizedMessage( 500955 ); // That being is not damaged!
			}
			else if ( !patient.Alive && (patient.Map == null || !patient.Map.CanFit( patient.Location, 16, false, false )) )
			{
				healer.SendLocalizedMessage( 501042 ); // Target cannot be resurrected at that location.
			}
			else if ( healer.CanBeBeneficial( patient, true, true ) )
			{
				healer.DoBeneficial( patient );

				bool onSelf = ( healer == patient );
//	Mod
				int dex = healer.Dex;
				int stam = healer.Stam;

				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 - стандарт з багом, коли при dex = 220 і більше seconds = 0 
//						seconds = 1100.0/((double)dex+100); // KOCTa algorithm - по суті майже теж саме, тільки без багу 
//						seconds = 1100.0/(4*(double)stam+(double)dex+100); // KOCTa algorithm - так я хотів зробити, але дуже протестували
 						seconds = 1100.0/(4*(double)dex+(double)dex+100); // KOCTa algorithm - діє ця строка
					else
						seconds = 1650.0/((double)dex+100); // KOCTa algorithm
				}
				else
				{
//					seconds = 550.0/((double)dex+50) + resDelay; // KOCTa algorithm
					seconds = 550.0/(4*(double)dex+(double)dex+50); // KOCTa algorithm
				}

				BandageContext context = GetContext( healer );
				if ( context != null )
					context.StopHeal();

				context = new BandageContext( healer, patient, TimeSpan.FromSeconds( 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;
		}
 

KOCTa

Dedywkо |Co100
Команда форуму
Супер Модератор
Відповідь: ПОМОГИТЕ

Стосовно затримки при використанні зброї. Тут скорочено, без зайвого, що не діє і без того що поки що не впроваджено і стосується класової системи ( ClassBonuses.WeaponTimeSpanDelay )
Код:
		public virtual TimeSpan GetDelay( Mobile m )
		{
			int speed = this.Speed;

			if ( speed == 0 )
				return TimeSpan.FromHours( 1.0 );

			double delayInSeconds;

			if ( Core.SE )
			{
				/*
				 * This is likely true for Core.AOS as well... both guides report the same
				 * formula, and both are wrong.
				 * The old formula left in for AOS for legacy & because we aren't quite 100%
				 * Sure that AOS has THIS formula
				 */
				int bonus = AosAttributes.GetValue( m, AosAttribute.WeaponSpeed );

				if ( Spells.Chivalry.DivineFurySpell.UnderEffect( m ) )
					bonus += 10;

				// Bonus granted by successful use of Honorable Execution.
				bonus += HonorableExecution.GetSwingBonus( m );

				if( DualWield.Registry.Contains( m ) )
					bonus += ((DualWield.DualWieldTimer)DualWield.Registry[m]).BonusSwingSpeed;

				if( Feint.Registry.Contains( m ) )
					bonus -= ((Feint.FeintTimer)Feint.Registry[m]).SwingSpeedReduction;

				int discordanceEffect = 0;

				// Discordance gives a malus of -0/-28% to swing speed.
				if ( SkillHandlers.Discordance.GetEffect( m, ref discordanceEffect ) )
					bonus -= discordanceEffect;

//	Mod	KOCTa 17.12.2008	ClassSystem v.1.0
//				if ( m is PlayerMobile && ClassSpecification.Enabled )
//				{
//					return ClassBonuses.WeaponTimeSpanDelay( (PlayerMobile) m, this, bonus );
//				}

				if ( bonus > 60 )
					bonus = 60;

				speed = (int)Math.Floor( speed * (bonus + 100.0) / 100.0 );

				if ( speed <= 0 )
					speed = 1;

				int ticks = (int)Math.Floor( (80000.0 / ((m.Stam + 100) * speed)) - 2 );

				// Swing speed currently capped at one swing every 1.25 seconds (5 ticks).
				if ( ticks < 5 )
					ticks = 5;

				delayInSeconds = ticks * 0.25;
//	Elf Ranged bonus - буде у класових бонусах
				if ( atkWeapon.Type == WeaponType.Ranged && Core.ML && pmAttacker.Race == Race.Elf )
					delayInSeconds = delayInSeconds * 0.8;

//	end	Mod	KOCTa 17.12.2008	ClassSystem v.1.0
			}
			else
....
			return TimeSpan.FromSeconds( delayInSeconds );
		}
 

KOCTa

Dedywkо |Co100
Команда форуму
Супер Модератор
Відповідь: ПОМОГИТЕ

Тейлор:
Код:
		public static double[] m_TailoringRewardScore = new double[]
		{
			31743.0,		// 0	new RewardGroup( 700, new RewardItem( 1, RunicKit, 3 ) )
			25016.0,		// 1	new RewardGroup( 650, new RewardItem( 1, PowerScroll, 20 ) ),
			21720.0,		// 2	new RewardGroup( 600, new RewardItem( 1, RunicKit, 2 ) ),
			20764.5,		// 3	new RewardGroup( 575, new RewardItem( 1, PowerScroll, 15 ) ),
			19620.5,		// 4	new RewardGroup( 550, new RewardItem( 1, ClothingBlessDeed ) ),
			18762.0,		// 5	new RewardGroup( 500, new RewardItem( 1, PowerScroll, 10 ) ),
			17508.7,		// 6	new RewardGroup( 450, new RewardItem( 1, BearRug ) ),
			16853.5,		// 7	new RewardGroup( 400, new RewardItem( 2, PowerScroll, 5 ), new RewardItem( 3, Tapestry ) ),
			14613.5,		// 8	new RewardGroup( 350, new RewardItem( 1, RunicKit, 1 ) ),
			8247.1,		// 9	new RewardGroup( 300, new RewardItem( 1, StretchedHide ) ),
			4399.0,		// 10	new RewardGroup( 200, new RewardItem( 4, Cloth, 4 ), new RewardItem( 1, Sandals ) ),
			2654.0,		// 11	new RewardGroup( 150, new RewardItem( 9, Cloth, 3 ), new RewardItem( 1, Sandals ) ),
			1234.4,		// 12	new RewardGroup( 100, new RewardItem( 1, Cloth, 2 ) ),
			580.0,		// 13	new RewardGroup(  50, new RewardItem( 1, Cloth, 1 ) ),
			317.0,		// 14	new RewardGroup(   0, new RewardItem( 1, Cloth, 0 ) ),
		};
Таблиця нагород стандартна:
Код:
		public TailorRewardCalculator()
		{
			Groups = new RewardGroup[]
				{
					new RewardGroup(   0, new RewardItem( 1, Cloth, 0 ) ),
					new RewardGroup(  50, new RewardItem( 1, Cloth, 1 ) ),
					new RewardGroup( 100, new RewardItem( 1, Cloth, 2 ) ),
					new RewardGroup( 150, new RewardItem( 9, Cloth, 3 ), new RewardItem( 1, Sandals ) ),
					new RewardGroup( 200, new RewardItem( 4, Cloth, 4 ), new RewardItem( 1, Sandals ) ),
					new RewardGroup( 300, new RewardItem( 1, StretchedHide ) ),
					new RewardGroup( 350, new RewardItem( 1, RunicKit, 1 ) ),
					new RewardGroup( 400, new RewardItem( 2, PowerScroll, 5 ), new RewardItem( 3, Tapestry ) ),
					new RewardGroup( 450, new RewardItem( 1, BearRug ) ),
					new RewardGroup( 500, new RewardItem( 1, PowerScroll, 10 ) ),
					new RewardGroup( 550, new RewardItem( 1, ClothingBlessDeed ) ),
					new RewardGroup( 575, new RewardItem( 1, PowerScroll, 15 ) ),
					new RewardGroup( 600, new RewardItem( 1, RunicKit, 2 ) ),
					new RewardGroup( 650, new RewardItem( 1, PowerScroll, 20 ) ),
					new RewardGroup( 700, new RewardItem( 1, RunicKit, 3 ) )
				};
		}
Як воно видає важко пояснити словами, тому ось як у скріпті, спочатку створює, потім зайве видаляє, систему брав таку яка вона була, як зроблена мені самому не подобається, але по часу було скоріше робити під неї, ніж як для коваля писати окрему:
Код:
				rewscor = GetTailoringReward(m_RewardPoints);
				if ( rewscor < m_TailoringRewardScore.Length )
				{
					ArrayList rewards = new ArrayList();
					int grl = TailorRewardCalculator.Instance.Groups.Length;
					if ( rewscor < grl )
					{
						RewardGroup rewardGroup = TailorRewardCalculator.Instance.Groups[grl-rewscor-1];
						for ( int i = 0; i < rewardGroup.Items.Length; ++i )
						{	
							Item item = rewardGroup.Items[ i ].Construct();

							if ( item != null )
							{
								rewards.Add( item );
							}
						}

						if ( rewards.Count > 0 )
						{
							reward = (Item) rewards[ Utility.Random( rewards.Count ) ];

							for ( int i = 0; i < rewards.Count; ++i )
							{
								if ( rewards[ i ] != reward )
								{
									((Item) rewards[ i ]).Delete();
								}
							}
						}
					}
				}
 

KOCTa

Dedywkо |Co100
Команда форуму
Супер Модератор
Відповідь: ПОМОГИТЕ

Стосовно АІ вендорів. Я якраз займаюсь переробкою, там дуже багато всього задіяно, але якщо коротко, то там рандомно він рухається, як і всі інши боти у всіх напрямках, якщо в межах свого "дому". Якщо ні, то прямує до нього.
Стосовно скріптів, якось буде більш вільного часу поспілкуємось у мірці. Десь у другий половині цієї неділі.
 

omen

не тот, кем кажусь
такими скрипткодами, в большинстве своем даже мне понятными, снова меня заинтерисовали. апять захотелось в УО побегать. как-нибудь загляну. (надеюсь мой акк есче не удален, а дома быстрей всего точно исчезли)
и сфера у меня гдето валяется, наверно и сам чего-нибудь со скриптами поразбираю. (блин а я же реально по 8 часов вдень на работе сижу - у же б скриптинг уошный разобрал)
эх может и от меня когда-то польза будет (раньше меня хватило только на создание бронированного коня, не наносящего повреждений и воскрешающего своего хазяина).
 

Silence

Member
Re: Відповідь: ПОМОГИТЕ

Зранку виправлення вже буде працювати.
Проверил) Работает) Из трёх заказов на 115 выпало 2 скролла, 1 молот)) 2й скролл скушал твинк) Большое спасибо!)
Код:
				rewscor = GetTailoringReward(m_RewardPoints);
				if ( rewscor < m_TailoringRewardScore.Length )
				{
					ArrayList rewards = new ArrayList();
					int grl = TailorRewardCalculator.Instance.Groups.Length;
					if ( rewscor < grl )
					{
						RewardGroup rewardGroup = TailorRewardCalculator.Instance.Groups[grl-rewscor-1];
						for ( int i = 0; i < rewardGroup.Items.Length; ++i )
						{	
							Item item = rewardGroup.Items[ i ].Construct();

							if ( item != null )
							{
								rewards.Add( item );
							}
						}

						if ( rewards.Count > 0 )
						{
							reward = (Item) rewards[ Utility.Random( rewards.Count ) ];

							for ( int i = 0; i < rewards.Count; ++i )
							{
								if ( rewards[ i ] != reward )
								{
									((Item) rewards[ i ]).Delete();
								}
							}
						}
					}
				}
Какой ужас...Думаю проще и эффективней было бы так:
Код:
				rewscor = GetTailoringReward(m_RewardPoints);
				if ( rewscor < m_TailoringRewardScore.Length )
				{
					ArrayList rewards = new ArrayList();
					int grl = TailorRewardCalculator.Instance.Groups.Length;
					if ( rewscor < grl )
					{
						RewardGroup rewardGroup = TailorRewardCalculator.Instance.Groups[grl-rewscor-1];
						rewards.Add( rewardGroup.Items[Utility.Random(rewardGroup.Items.Length)].Construct());
					}
				}
К сожалению в вышеприведенном коде не видно что там дальше происходит с листом rewards, думаю что какой-нибудь перебор по его элементам... Тогда можно было бы еще больше упростить если подредактировать его обработку. Например использовать вместо ArrayList rewards переменную Item reward чтото типа такого Item reward = rewardGroup.Items[Utility.Random(rewardGroup.Items.Length)].Construct()
и дальше делать с ней все, что нам нужно.
Никогда не любил динамические массивы и т.п. ... от них много мороки, мусор надо потом убирать.. хотя может С# сам за собой чистит.. я с ним толком не знаком) поэтому такие штуки только сбивают с толку и стараюсь при необходимости обходиться без них... Как видим в данном случае код уменьшается, памяти должно кушать чуток меньше и ошибок выделять тоже).

По поводу лечения там есть упоминание про beneficialActs
Код:
healer.CanBeBeneficial( patient, true, true )
с чем я недавно столкнулся в игре дважды: не мог воскресить одного человека, и полечить другого... хотелось бы увидеть даный метод)

По поводу скорости ударов - очень полезная информация однако) Я и раньше замечал, что когда стамина падает, то скорость ударов тоже, но теперь понимаю как сильно... И ещё полезная ифнормация про то, что DivineFury увеличивает скорость так же как и опция на предмете Увеличение скорости ударов +10% ... Большое спасибо)

Про вендоров... интересовало не само направление, а задержка до следующего шага (прошу увеличить, очень часто случается так, что кликаю на него, а пока всплывет контекстное меню, он уже отходит и приходится кликать снова...) мелочь но всё же был бы очень благодарен.

Возвращаясь к заказам... очень маленькая вероятность выпадения заказа с большой сложностью (> 36000 у кузнеца). вообще не видел ниразу. смотрел только в списках заранее сгенерированных заказов (те, которых по 3 штуки у каждого кузнеца). Спец. заказы вообще не смотрю так как он там только 1 и потом час вообще никакой заказ не посмотреть... А учитывая обстановку с валоритовым рунником и ситуацией с добычей кристаллита - смысл кристаллитового рунника пропадает вовсе... Предлагаю увеличить шанс выпадения заказа на кристаллитовый рунник и его бонусы: шанс заказа для скила 120 - 0,5%, от рунника 6 бонусов строго силой 90-100%.
Еще одна идея: насколько я знаю список заранее сгенерированных заказов состоит из 3 заказов для скила 60, 80 и 100 если не ошибаюсь. Предлагаю добавить еще один для скила 120, чтобы было четыре, и скрывать те, для которых у кузнеца не хватает скила. Пример кузнец со скилом 55 смотрит боды, видит 1, со скилом 78 тоже видит 1, с 90 - видит 2, 100 - видит 3, 120 - 4.
Введение даннных изменений вызовет интерес к получению кристаллитовых рунников) Но особо ничего не изменит, потому что накопать кристаллитовой руды для большого заказа можно наверное только за неделю копания...Соответственно свои награды получат только самые усердные в своём деле:)

P.S.: не против пообщаться в мирке , но не сидел там очень давно... а какой адрес сервера, порт и название канала?..
 
Останнє редагування:
Зверху