1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Поговорим об Unreal

Тема в разделе "PC Игры", создана пользователем Teron Lifeslayer, 15 ноя 2004.

  1. Goblinit

    Goblinit

    Регистрация:
    18 мар 2011
    Сообщения:
    4.405
    Ну конечно, 4-х голосная полифония в анриле была бы весьма кстати.
     
  2. LipSheZ Пахан

    LipSheZ

    Регистрация:
    1 окт 2007
    Сообщения:
    908
    Masterkent, используя найденный тобой OldWeapons, наткнулся на баг: скаарджи-оруженосцы на синглплеерных картах при спавне не берут оружие, с которым вместе были спавнены. Как зафиксить?
     
  3. Masterkent

    Masterkent

    Регистрация:
    19 июл 2009
    Сообщения:
    316
    Самый простой вариант - отредактировать функцию CheckReplacement, добавив туда изменение WeaponType для SkaarjTroopers тупо по аналогии с кодом для версии 227.

    Если хочется иметь более рациональную реализацию, то код может быть примерно таким:

    Код:
    function class<Inventory> MutatedInventoryClass(class<Inventory> InventoryClass)
    {
    	if (InventoryClass == class'DispersionPistol')
    		return class'OldWeapons.OldDispersionPistol';
    	if (InventoryClass == class'AutoMag')
    		return class'OldWeapons.OldAutoMag';
    	if (InventoryClass == class'Stinger')
    		return class'OldWeapons.OldStinger';
    	.... и т.д. (полный список замен см. в изначальной версии CheckReplacement)
    
    	return InventoryClass;
    }
    
    function class<Inventory> CastToInventoryClass(class<Actor> aClass)
    {
    	return class<Inventory>(aClass);
    }
    
    function bool InventoryReplacement(Inventory A)
    {
    	local class<Inventory> NewInventoryClass;
    	NewInventoryClass = MutatedInventoryClass(CastToInventoryClass(A.class));
    	if (NewInventoryClass == A.class)
    		return true;
    	return ReplaceWith(A, NewInventoryClass);
    }
    
    function AdjustSkaarjTrooperWeaponType(SkaarjTrooper A)
    {
    	A.WeaponType = class<Weapon>(MutatedInventoryClass(A.WeaponType));
    }
    
    function AdjustDecorationContents(Decoration A)
    {
    	if (CastToInventoryClass(A.contents) != none)
    		A.contents = MutatedInventoryClass(CastToInventoryClass(A.contents));
    	if (CastToInventoryClass(A.content2) != none)
    		A.content2 = MutatedInventoryClass(CastToInventoryClass(A.content2));
    	if (CastToInventoryClass(A.content3) != none)
    		A.content3 = MutatedInventoryClass(CastToInventoryClass(A.content3));
    }
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
    	if (Inventory(Other) != none)
    		return InventoryReplacement(Inventory(Other));
    
    	if (Pawn(Other) != none)
    	{
    		Pawn(Other).DropWhenKilled = MutatedInventoryClass(Pawn(Other).DropWhenKilled);
    		if (SkaarjTrooper(Other) != none)
    			AdjustSkaarjTrooperWeaponType(SkaarjTrooper(Other));
    	}
    	else if (Decoration(Other) != none)
    		AdjustDecorationContents(Decoration(Other));
    
    	return true;
    }
     
    Последнее редактирование: 18 янв 2014
  4. LipSheZ Пахан

    LipSheZ

    Регистрация:
    1 окт 2007
    Сообщения:
    908
    Masterkent, да, я так погляжу... учитывая, что ты мне в ЛС писал последний раз, баги могут вылазить где угодно. То, оружие не берут, то залипает content, вываливающийся и контейнеров, то чёрт знает что ещё. И я подумал - выходит, самый надёжный в плане отсутствия багов способ заменить звуки -это впихнуть их в u-паки с заменой старых? без мутаторов, без реплейсингов в скриптах и прочих махинаций. как думаешь? и когда релиз апдейта для UG фикса? ты вроде говорил, что вот-вот ;)
     
  5. Masterkent

    Masterkent

    Регистрация:
    19 июл 2009
    Сообщения:
    316
    Может быть. Но, насколько я помню, мутатор ещё меняет внешний вид projectile-ов единички. К плюсам правок стандартных packages можно отнести то, что если сделать совмещение измененных пакетов с оригинальными, то можно будет подсоединяться к обычным серверам (если там не используются какие-нибудь античиты, сильно придирчивые к версиям пакетов) и играть с изменённой озвучкой по сети. Мутаторы же на стороне клиента не работают.

    "Вот-вот" говорилось про обновлённую черновую версию. Релиз планируется где-нибудь к лету.
     
    Alien3674 и LipSheZ нравится это.
  6. LipSheZ Пахан

    LipSheZ

    Регистрация:
    1 окт 2007
    Сообщения:
    908
    Masterkent, твой патч че, добавляет пикапы на sp-карты?) На NyLeve дофига кристаллов появилось, играл на анриле 226b.
     
  7. Masterkent

    Masterkent

    Регистрация:
    19 июл 2009
    Сообщения:
    316
    Какой патч?

    Какая difficulty выставлена?
     
  8. LipSheZ Пахан

    LipSheZ

    Регистрация:
    1 окт 2007
    Сообщения:
    908
    UnrealFix draft, ну на сорсфордже который.

    Я ж написал, на анриле=) кристаллы я имел в виду для стингера.
     
    Последнее редактирование: 5 фев 2014
  9. Masterkent

    Masterkent

    Регистрация:
    19 июл 2009
    Сообщения:
    316
    Проверил по отдельности UGoldFix и OldWeapons: с первым никаких лишних предметов замечено не было, со вторым в сингле появляется инвентарь из уровней сложностей 0 - 2, отсутствующий на 3, а также инвентарь для кооперативной игры (что вполне предсказуемо: при замене инвентаря нужно позаботиться о правильной фильтрации, чего в OldWeapons не сделано).
     
    unreal doom и Alien3674 нравится это.
  10. LipSheZ Пахан

    LipSheZ

    Регистрация:
    1 окт 2007
    Сообщения:
    908
    Masterkent, на скилле very hard (экв. Unreal в ориг.) на какое значение отличается здоровье монстров от их же здоровья на Normal (экв. Medium в ориг.)? Интересует точная цифра.
     
  11. Alien3674

    Alien3674

    Регистрация:
    1 июл 2011
    Сообщения:
    477
    LipSheZ, смотрите функцию PreBeginPlay() в скриптах ScriptedPawn и Pawn.
     
  12. LipSheZ Пахан

    LipSheZ

    Регистрация:
    1 окт 2007
    Сообщения:
    908
    Alien3674, посмотрел, но нужного не увидел.

    scriptedpawn

    Код:
    function PreBeginPlay()
    {
    	Super.PreBeginPlay();
    
    	if ( Level.Game.bVeryLowGore )
    		bGreenBlood = true;
    
    	if ( Skill > 2 )
    		bLeadTarget = true;
    	else if ( (Skill == 0) && (Health < 500) )
    	{
    		bLeadTarget = false;		
    		ReFireRate = 0.75 * ReFireRate;
    	}	
    
    	if ( bIsBoss )
    		Health = Health + 0.15 * Skill * Health;
    
    	bInitialFear = (AttitudeToPlayer == ATTITUDE_Fear);
    }
    В просто'pawn нет такой ф-ции, есть эвент.
     
  13. Alien3674

    Alien3674

    Регистрация:
    1 июл 2011
    Сообщения:
    477
    LipSheZ, да, Вы правы, я посмотрел версию 227.
     
  14. Masterkent

    Masterkent

    Регистрация:
    19 июл 2009
    Сообщения:
    316
    Здоровье одинаковое, но может быть разница в skill (см. Engine.Pawn.PreBeginPlay), которая влияет на наносимый монстру урон (см. UnrealShare.UnrealGameInfo.ReduceDamage).
     
  15. LipSheZ Пахан

    LipSheZ

    Регистрация:
    1 окт 2007
    Сообщения:
    908
    Masterkent, я там нишиша не понимаю. Куча функций, переменных, отслеживать которые у меня времени займёт уйму. Ты можешь назвать какой процент урона у врагов редьюсируется?
     
  16. Masterkent

    Masterkent

    Регистрация:
    19 июл 2009
    Сообщения:
    316
    Engine.Pawn:
    Код:
    event PreBeginPlay()
    {
    	....
    	if ( Level.Game != None )
    		Skill += Level.Game.Difficulty;
    	Skill = FClamp(Skill, 0, 3);
    Начальный Skill монстра увеличивается на величину Level.Game.Difficulty (0 - easy, 1 - normal, 2 - hard, 3 - very hard). Если результат меньше 0, то Skill становится равным 0; иначе, если результат больше 3, то Skill становится равным 3.

    Если начальный Skill неотрицательный (полагаю, что отрицательным он бывает очень редко), то на 3-ем уровне сложности он всегда будет приведён к 3, а на normal-е можно получить 1, 2 или 3.

    Когда кто-то кого-то лупит, вызывается вот такая вот простенькая функция

    Engine.Pawn
    Код:
    function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
    					 Vector momentum, name damageType)
    {
    	local int actualDamage;
    	local bool bAlreadyDead;
    	local int I;
    	local int RadNum;
    	local Actor B;
    	local vector Momentum2;
    	local GameRules GR;
    
    	if ( bDeleteMe || Level.NetMode==NM_Client )
    		return;
    	if ( Level.Game!=None && Level.Game.GameRules!=None )
    	{
    		for ( GR=Level.Game.GameRules; GR!=None; GR=GR.NextRules )
    			if ( GR.bModifyDamage )
    				GR.ModifyDamage(Self,instigatedBy,Damage,hitlocation,damageType,momentum);
    	}
    
    	//log(self@"take damage in state"@GetStateName());
    	bAlreadyDead = (Health <= 0);
    
    	if (Physics == PHYS_None)
    		SetMovementPhysics();
    	if (Physics == PHYS_Walking)
    		momentum.Z = FMax(momentum.Z, 0.4 * VSize(momentum));
    	if ( instigatedBy == self )
    		momentum *= 0.6;
    	momentum = momentum/Mass;
    	AddVelocity( momentum );
    
    	actualDamage = Level.Game.ReduceDamage(Damage, DamageType, self, instigatedBy);
    	if ( bIsPlayer )
    	{
    		if (ReducedDamageType == 'All') //God mode
    			actualDamage = 0;
    		else if (Inventory != None) //then check if carrying armor
    			actualDamage = Inventory.ReduceDamage(actualDamage, DamageType, HitLocation);
    		else actualDamage = Damage;
    	}
    	else if ( (InstigatedBy != None) && (InstigatedBy.IsA(Class.Name) || IsA(InstigatedBy.Class.Name)) )
    		ActualDamage = ActualDamage * FMin(1 - ReducedDamagePct, 0.35);
    	else if ( (ReducedDamageType == 'All') || ((ReducedDamageType != '') && (ReducedDamageType == damageType)) )
    		actualDamage = float(actualDamage) * (1 - ReducedDamagePct);
    
    	Health -= actualDamage;
    	if (CarriedDecoration != None)
    		DropDecoration();
    	if ( HitLocation == vect(0,0,0) )
    		HitLocation = Location;
    
    	if (!bDeleteMe && actualdamage > 0 && DamageType != 'DROWNED')
    	{
    		Momentum2=Momentum*3.0;
    		if (DamageType == 'SHREDDED')
    			Momentum2 = vect(0,0,0);
    		if (DamageType == 'SHOT')
    			Momentum2 = Momentum2*2;
    
    		RadNum = Rand(4);
    		if (RadNum > 0)
    		{
    			if (Pawn_BloodsprayClass == None)
    				Pawn_BloodsprayClass = class<actor>(DynamicLoadObject("UnrealShare.BloodSpray2",class'Class'));
    				
    			if (Pawn_BloodsprayClass != none)
    			{
    				for (i = 0; i< RadNum; i++)
    				{
    					b=Spawn(Pawn_BloodsprayClass,self,'',hitlocation,rotator(location-hitlocation));
    					if (b != none)
    						b.Velocity=Momentum2+Vrand()*100;
    				}
    			}
    		}
    		if ( Level.Game.bBleedingEnabled && FRand() < 0.5 ) // Start bleeding.
    		{
    			if (BleedingActor == None)
    			{
    				if (!bIsBleeding)
    				{
    					if(Pawn_BleedingClass == None)
    						Pawn_BleedingClass = class<actor>(DynamicLoadObject("UnrealShare.Bleeding",class'Class'));
    					 if (Pawn_BleedingClass != none)
    						BleedingActor=Spawn(Pawn_BleedingClass,Self,'',hitlocation,rotator(location-hitlocation));
    					if (BleedingActor != none)
    					{
    						bIsBleeding=True;
    						BleedingActor.Instigator=InstigatedBy;
    						BleedingActor.SetTimer(0.1,false);
    					}
    				}
    			}
    			else
    			{
    				bIsBleeding=True;
    				BleedingActor.Instigator=InstigatedBy;
    				BleedingActor.SetTimer(Level.TimeDilation + (Rand(3) / Level.TimeDilation), false);
    			}
    		}
    	}
    	if (Health > 0)
    	{
    		if (instigatedBy != None)
    			damageAttitudeTo(instigatedBy);
    		PlayHit(actualDamage, hitLocation, damageType, Momentum.Z);
    	}
    	else if ( !bAlreadyDead )
    	{
    		NextState = '';
    		PlayDeathHit(actualDamage, hitLocation, damageType);
    		if ( actualDamage > mass )
    			Health = -1 * actualDamage;
    		Enemy = instigatedBy;
    		Died(instigatedBy, damageType, HitLocation);
    	}
    	else
    	{
    		if ( bIsPlayer )
    		{
    			HidePlayer();
    			GotoState('Dying');
    		}
    		else Destroy();
    	}
    	MakeNoise(1.0);
    }
    где InstigatedBy - это тот, кто наносит повреждения, а self - тот, кому они наносятся.

    Нас отсюда интересует строчка

    Код:
    actualDamage = Level.Game.ReduceDamage(Damage, DamageType, self, instigatedBy);
    Для стандартного синглплеера или кооператива она сводится к вызову

    UnrealShare.UnrealGameInfo
    Код:
    function int ReduceDamage(int Damage, name DamageType, pawn injured, pawn instigatedBy)
    {
    	if (injured.Region.Zone.bNeutralZone)
    		return 0;
    
    	if ( instigatedBy == None)
    		return Damage;
    	//skill level modification
    	if ( instigatedBy.bIsPlayer )
    	{
    		if ( injured == instigatedby )
    		{
    			if ( instigatedby.skill == 0 )
    				Damage = 0.25 * Damage;
    			else if ( instigatedby.skill == 1 )
    				Damage = 0.5 * Damage;
    		}
    		else if ( !injured.bIsPlayer )
    			Damage = float(Damage) * (1.1 - 0.1 * injured.skill);
    	}
    	else if ( injured.bIsPlayer )
    		Damage = Damage * (0.4 + 0.2 * instigatedBy.skill);
    	return (Damage * instigatedBy.DamageScaling);
    }
    Если монстр (выступая в роли injured) получает повреждения от игрока (выступающего в роли instigatedBy), то результирующее повреждение корректируется в этой строчке:

    Код:
    Damage = float(Damage) * (1.1 - 0.1 * injured.skill);
    Если skill монстра равен 1, то в этом месте Damage не меняется; если же он равен 2 или 3, то Damage уменьшается приблизительно на 10% или 20% соответственно (приблизительно - потому что результат округляется до целого значения).
     
    Последнее редактирование: 24 май 2014
    unreal doom и Alien3674 нравится это.
  17. Timonza-kun

    Timonza-kun

    Регистрация:
    11 ноя 2008
    Сообщения:
    430
    Давненько я не заходил... Однако, решил поделиться некоторыми наблюдениями (которые, впрочем, для анрилеров никакая не новость, а привычное ощущение от игры). Переигрываю в очередной раз, только не сингл-кампанию, а гиперкооп. Карты забиты монстрятиной (порой просто мозговыносящей) до отказа, столь же сумасшедший и набор стволов и поверапов. Ощущения от геймплея совсем другие, да. Но нельзя не заметить, что при любой интенсивности экшона карты выглядят и играются безупречно - это ли не показатель гениальности эпикцев. Если же брать в расчет не ванильные карты, они не столь вылизаны, кое-где нарушается баланс, есть даже пара откровенно обидных багов - похоже, админы не очень-то следят за контентом. Очень порадовало разнообразие фонарей: когда включаешь все, получается красивое радужное пятно, которое позволяет, что называется, освежить те первые ощущения завороженности красотой локаций. Кажется невероятным, что движок родом из девяностых может почти все то же, что и UE4. Хотя конечно, последняя версия подняла бы вау-эффект анрила на порядок. В конце концов, мелкософт же решилась переиздать хало.
     
  18. NemCe Uncommon Common

    NemCe

    Регистрация:
    25 мар 2006
    Сообщения:
    1.675
    Это вот это?! Выглядит словно моды для сталкера от школьников
     
    Последнее редактирование модератором: 12 июн 2015
    Alien3674 и unreal doom нравится это.
  19. Masterkent

    Masterkent

    Регистрация:
    19 июл 2009
    Сообщения:
    316
    Мне тоже не понравилось. Как, впрочем, и большинство других модов под Unreal. Что характерно, реально новые монстры и оружие в модах встречаются редко, фантазии и умений авторов зачастую хватает лишь на то, чтоб изуродовать уже готовое - естественно, делая игру крайне несбалансированной. По мне так если хочется какой-то новизны по отношению к классическому Unreal, уж лучше зарубиться в какую-нибудь другую игру :facepalm:
     
    Последнее редактирование: 18 авг 2014
    NemCe и unreal doom нравится это.
  20. Timonza-kun

    Timonza-kun

    Регистрация:
    11 ноя 2008
    Сообщения:
    430
    Кстати, о кооперативных режимах. Справедливости ради стоит отметить наличие отнюдь не перегруженных допконтентом, не выглядящих как школомоды, но открывающих кооператив с новой стороны: играть командой становится куда интереснее. Правда, в последнее время многие сервера почему-то не дают подключиться, возвращая ошибку file size mismatch при подгрузке необходимых пакетов.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление