Перейти к публикации
Планета Deus Ex

Custom footsteps


Рекомендованные сообщения

Люди, кто-нибудь знает каким макаром footstep sounds изменить (ну или добавить например, snow footstep) с помощью скриптов? А то сколько я не пробовал - не получалось. Понимаете в чём проблема, код где описана функция находится в классе DeusExPlayer, который native! И я не знаю как с єтим справиться. Есть тут кодеры?

Ссылка на комментарий
Люди, кто-нибудь знает каким макаром footstep sounds изменить (ну или добавить например, snow footstep) с помощью скриптов? А то сколько я не пробовал - не получалось. Понимаете в чём проблема, код где описана функция находится в классе DeusExPlayer, который native! И я не знаю как с єтим справиться. Есть тут кодеры?

Нужно юзать свой собственный класс игрока и в нём переделать нужную функцию.

Как использовать свой класс - написано у Стива Така:

http://www.planetdeusex.com/tack/CreatingA...ayerClass2.html

 

Сам сейчас уже и не вспомню...

Ссылка на комментарий

Можно сделать так: делаешь подкласс DeusExPlayer, и в нем оверайдишь (т.е. заново их обьявляешь) те функции, которые ты хочешь изменить. Код описывающий (и делающий) footsteps находится в DeusExPlayer, придется его поскролить (хотя еще можно попробовать через поиска на слово "foot" или наподобие) и найти эту функцию. Далее ее копируем в OurNewDeusExPlayer и изменяем там то что нужно -> добавляем новые проигрываемые звуки.

 

На всякий случай: тип footstep'ов проигрываются исходя из группы текстуры по которой идем.

Ссылка на комментарий

2 Dedъ

Стив Так для новичков :)

 

Можно сделать так: делаешь подкласс DeusExPlayer, и в нем оверайдишь (т.е. заново их обьявляешь) те функции, которые ты хочешь изменить.

 

Всё это я уже пробовал. Хотя может я не правильно описал функцию.

 

На всякий случай: тип footstep'ов проигрываются исходя из группы текстуры по которой идем.

 

Знаю, знаю. Хотя они это не очень продумали. Не удобно.

 

Кто знает как правильно оверрайдить функцию? Я думаю проблема у меня именно в этом.

Ссылка на комментарий
2 Dedъ

Стив Так для новичков :)

 

Можно сделать так: делаешь подкласс DeusExPlayer, и в нем оверайдишь (т.е. заново их обьявляешь) те функции, которые ты хочешь изменить.

 

Всё это я уже пробовал. Хотя может я не правильно описал функцию.

 

На всякий случай: тип footstep'ов проигрываются исходя из группы текстуры по которой идем.

 

Знаю, знаю. Хотя они это не очень продумали. Не удобно.

 

Кто знает как правильно оверрайдить функцию? Я думаю проблема у меня именно в этом.

Гы. Новички такие вопросы не задают :)

 

Оверрайдить - полностью копируешь нужную функцию в новый child-класс и модифицируешь как хочешь.

Ссылка на комментарий
На всякий случай: тип footstep'ов проигрываются исходя из группы текстуры по которой идем.
Знаю, знаю. Хотя они это не очень продумали. Не удобно.
Там в классе был даже коммент, что типа "я знаю что это тупо, потом что-нить по умнее придумаем" =)))

 

Вот в U2 там кажется к каждому уровню можно разные поверхности самому переназначивать звук шагов, но это ж U2.

Впрочем ИМХО DX вариант вполне нормальный :)

 

Кто знает как правильно оверрайдить функцию? Я думаю проблема у меня именно в этом.
Вот, специально для тебя нашел эту функцию в DeusExPlayer:
// ----------------------------------------------------------------------

// PlayFootStep()

//

// plays footstep sounds based on the texture group

// yes, I know this looks nasty -- I'll have to figure out a cleaner  

// way to do this

// ----------------------------------------------------------------------

 

simulated function PlayFootStep()

{

local Sound stepSound;

local float rnd;

local float speedFactor, massFactor;

local float volume, pitch, range;

local float radius, mult;

local float volumeMultiplier;

local DeusExPlayer pp;

local bool bOtherPlayer;

 

// Only do this on ourself, since this takes into account aug stealth and such

if ( Level.NetMode != NM_StandAlone )

 pp = DeusExPlayer( GetPlayerPawn() );

 

if ( pp != Self )

 bOtherPlayer = True;

else

 bOtherPlayer = False;

 

rnd = FRand();

 

volumeMultiplier = 1.0;

if (IsInState('PlayerSwimming') || (Physics == PHYS_Swimming))

{

 volumeMultiplier = 0.5;

 if (rnd < 0.5)

  stepSound = Sound'Swimming';

 else

  stepSound = Sound'Treading';

}

else if (FootRegion.Zone.bWaterZone)

{

 volumeMultiplier = 1.0;

 if (rnd < 0.33)

  stepSound = Sound'WaterStep1';

 else if (rnd < 0.66)

  stepSound = Sound'WaterStep2';

 else

  stepSound = Sound'WaterStep3';

}

else

{

 switch(FloorMaterial)

 {

  case 'Textile':

  case 'Paper':

   volumeMultiplier = 0.7;

   if (rnd < 0.25)

    stepSound = Sound'CarpetStep1';

   else if (rnd < 0.5)

    stepSound = Sound'CarpetStep2';

   else if (rnd < 0.75)

    stepSound = Sound'CarpetStep3';

   else

    stepSound = Sound'CarpetStep4';

   break;

 

  case 'Foliage':

  case 'Earth':

   volumeMultiplier = 0.6;

   if (rnd < 0.25)

    stepSound = Sound'GrassStep1';

   else if (rnd < 0.5)

    stepSound = Sound'GrassStep2';

   else if (rnd < 0.75)

    stepSound = Sound'GrassStep3';

   else

    stepSound = Sound'GrassStep4';

   break;

 

  case 'Metal':

  case 'Ladder':

   volumeMultiplier = 1.0;

   if (rnd < 0.25)

    stepSound = Sound'MetalStep1';

   else if (rnd < 0.5)

    stepSound = Sound'MetalStep2';

   else if (rnd < 0.75)

    stepSound = Sound'MetalStep3';

   else

    stepSound = Sound'MetalStep4';

   break;

 

  case 'Ceramic':

  case 'Glass':

  case 'Tiles':

   volumeMultiplier = 0.7;

   if (rnd < 0.25)

    stepSound = Sound'TileStep1';

   else if (rnd < 0.5)

    stepSound = Sound'TileStep2';

   else if (rnd < 0.75)

    stepSound = Sound'TileStep3';

   else

    stepSound = Sound'TileStep4';

   break;

 

  case 'Wood':

   volumeMultiplier = 0.7;

   if (rnd < 0.25)

    stepSound = Sound'WoodStep1';

   else if (rnd < 0.5)

    stepSound = Sound'WoodStep2';

   else if (rnd < 0.75)

    stepSound = Sound'WoodStep3';

   else

    stepSound = Sound'WoodStep4';

   break;

 

  case 'Brick':

  case 'Concrete':

  case 'Stone':

  case 'Stucco':

  default:

   volumeMultiplier = 0.7;

   if (rnd < 0.25)

    stepSound = Sound'StoneStep1';

   else if (rnd < 0.5)

    stepSound = Sound'StoneStep2';

   else if (rnd < 0.75)

    stepSound = Sound'StoneStep3';

   else

    stepSound = Sound'StoneStep4';

   break;

 }

}

 

// compute sound volume, range and pitch, based on mass and speed

if (IsInState('PlayerSwimming') || (Physics == PHYS_Swimming))

 speedFactor = WaterSpeed/180.0;

else

 speedFactor = VSize(Velocity)/180.0;

 

massFactor  = Mass/150.0;

radius      = 375.0;

volume      = (speedFactor+0.2) * massFactor;

range       = radius * volume;

pitch       = (volume+0.5);

volume      = FClamp(volume, 0, 1.0) * 0.5;  // Hack to compensate for increased footstep volume.            

range       = FClamp(range, 0.01, radius*4);

pitch       = FClamp(pitch, 1.0, 1.5);

 

// AugStealth decreases our footstep volume

volume *= RunSilentValue;

 

if ( Level.NetMode == NM_Standalone )

 PlaySound(stepSound, SLOT_Interact, volume, , range, pitch);

else // special case for multiplayer

{

 if ( !bIsWalking )

 {

  // Tone down player's own footsteps

  if ( !bOtherPlayer )

  {

   volume *= 0.33;

   PlaySound(stepSound, SLOT_Interact, volume, , range, pitch);

  }

  else // Exagerate other players sounds (range slightly greater than distance you see with vision aug)

  {

   volume *= 2.0;

   range = (class'AugVision'.Default.mpAugValue * 1.2);

   volume = FClamp(volume, 0, 1.0);

   PlaySound(stepSound, SLOT_Interact, volume, , range, pitch);

  }

 }

}

AISendEvent('LoudNoise', EAITYPE_Audio, volume*volumeMultiplier, range*volumeMultiplier);

}

Суб-класс делай лучше от JCDentonMale, хотя про другие варианты я не уверен :)

Т.е. вот эту функцию всю вставляешь в новый класс и вроде как все - использоваться будет эта. Никаких ключевых слов в UnrealScript вроде указывать не надо.

Ссылка на комментарий

У меня получилось! :) :)

 

В общем чтобы это всё работало, правильно Zonder говорил, нужно создать subclass от JCDentonMale. Но функции PlayFootStep() мало. Нужно обязательно добавить ещё о-очень большой state PlayerWalking. Это для того чтобы присвоить новым поверхностям (surfaces) звуковые файлы. Плюс к этому нужно эти поверхности опознать. Для этого мы в начале скрипта добавляем ф-ции GetWallMaterial() и GetFloorMaterial(). Со скриптом всё.

Теперь создаем другой скрипт:

class MyGameInfo extends DeusExGameInfo;

 

function bool ApproveClass( class<playerpawn> SpawnClass)

{

   return true;

}

 

Без которого вряд ли заработает предидущий. А потом.. (сейчас смеяться будете).. нужно изменить в Deusex.ini параметр GameInfo со значением MyGameInfo и PlayerClass, только вот PlayerClass нужно изменять в User.ini. А я постоянно забывал это делать. Вот тоже было большая ошибка почему оно не работало.

 

Если надо могу закачать первый subclass скрипт. Он очень длинный чтобы выкладывать его тут, хотя... приведу кусок для snow footsteps:

// Это мы добавляем туда, где находится switch(FloorMaterial)

case 'Snow':

volumeMultiplier = 0.7;

if (rnd < 0.16)

stepSound = Sound'SnowStep1';

else if (rnd < 0.32)

stepSound = Sound'SnowStep2';

else if (rnd < 0.50)

stepSound = Sound'SnowStep3';

else if (rnd < 0.66)

stepSound = Sound'SnowStep4';

else if (rnd < 0.82)

stepSound = Sound'SnowStep5';

else

tepSound = Sound'SnowStep6';

break;

Ссылка на комментарий
У меня получилось! :D  :)  

 

В общем чтобы это всё работало, правильно Zonder говорил, нужно  создать subclass от JCDentonMale. Но функции PlayFootStep() мало.  Нужно обязательно добавить ещё о-очень большой state PlayerWalking. (...)

Я просто не просмотривал сам скрипт :) Тем не менее, я подтолкнул тебя к правильному решению ;-)

 

 

Интересно было бы узнать, какую задумку ты делаешь. Все-таки мало кто моддингом под DX увлекается %)

Ссылка на комментарий

Да я тот класс 1000 раз наверно компилировал с небольшими изменениями в надежде на то чтобы он работал. А проблема была в неправильном прописании класса игрока в ini файлах.

 

Интересно было бы узнать, какую задумку ты делаешь. Все-таки мало кто моддингом под DX увлекается %)

Было бы время... хотелось мод сделать хороший, вот только со скриптом у меня худо. Скрипт - это сценарий, типа. Тут главное историю придумать. Как по мне, она должна быть очень хорошо продумана, иначе потом можно столкнуться с разными проблемами при mapping'е да и вообше мотивация может пропасть под конец карты. Ведь когда начинаешь мод, всё очень легко идет, но когда заканчиваешь - это самое трудное. И самое сложное - это доделать последних 10% мода. Поверьте. Поэтому тут я щитаю так: если что-то начинать, то надо уж всё продумать хорошенько сначала. Мэппинг - дело дизайнерское. Тут надо удивить игрока, чтобы ему было интересно играть. У меня же есть карты, но карты с "crappy" архитектурой. Я это ненавижу. По этому не хочу их распостранять в сети. Взять, например, Hotel Carone, так я его сразу закрыл, так и не прошёл до конца, из-за того что мне просто стало не интересно в конце (последней карте) по многим показателям, в т.ч. и по дизайну уровней. Хотя история у них очень продуманная, но в конце чего-то не интересная. Я же больше маппер, чем режиисер, (или как его назвать, ну тот что сценарий пишет?). Мне противно играть в карты с плохой архитектурой, но ещё более противно когда сценарий не продуманый, нет истории. Возьмём, например модификацию (сп-миссия?) Рэя Вендерлиха (поправьте, если не так) Break In. Да, там он хорошо придумал. Геймплей там хороший, на высоте, единственное там было полно дверей, к которым небыло ключей, меня это просто взбесило. Архитектура там.., да сами скачайте, посмотрите. Но мне мод нравиться, а всё потому что он продуманный, да и большинству из вас я думаю тоже понравиться. Просто затягивает, интригует. Вот почему так важно продумать сненарий/геймплей. А возьмём например, мод Jherax'а "Double Cross". Вы видели какая там архитектура? Да, это единственный мод (спм?), наверно, с классной архитектурой в стиле киберпанк.

 

Хотя архитектура у меня лучше чем в модификации Fatal Weapon, но всё же не такая (ещё) как у разработчиков игры Deus Ex.

 

Да, про модификацию. Если кто хочет её создать, маякните. Нужна история, которая начинаеться после 10 лет правления Еверетта. Нью-Йорк. Всё усугубилось ещё хуже, чем было. Большие корпорации срослись и платят очень маленькие налоги, в то же время, существует полный бардак, бедность и ещё всякие ужасы и отброски вселенной. Мажестикиками теперь управляет *** как ираньше до Walton'а Simons'а. Ну и т.п. Теперь как продумать на счёт Дентонов? ДС вроде теперь тоже правит. Значит он плохой. Или вообще игроки будут играть не за Дентона, а кого-то другого. Если будет история, свободное время и чуть мотивации, можно будет начинать. :) :D

 

Кста, Footsteps, это так, для себя, я просто получаю огромное удовольствие, когда у меня что-то получаеться, думаю и вы тоже. Спасибо вам за помощь.

Ссылка на комментарий
А возьмём например, мод Jherax'а "Double Cross". Вы видели какая там архитектура? Да, это единственный мод (спм?), наверно, с классной архитектурой в стиле киберпанк.

У меня или склероз или... В Даблкроссе ведь из уровней-то был только какой-то НьюЙоркский парк по типу Баттери... :D

Ссылка на комментарий

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
×
×
  • Создать...