Welcome to U.A.C. [O.S.A.]
login / register
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Тема для новичков. Вопросы по маппингу/моддингу - любые! Пред.  1, 2, 3 ... 190, 191, 192 ... 198, 199, 200  След.
   Список разделов - Флуд и устаревшие темы - Тема для новичков. Вопросы по маппингу/моддингу - любые!Ответить
АвторСообщение
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +948
Ссылка на пост №3801 Отправлено: 04.03.19 11:27:26
В аноним функциях прыжки прописываются иначе:
TNT1 A 0 
{
if (CallACS("GetActorAngle") == TRUE)//Если вернет 1, прыгнет с вероятностью 128 в стейт MyState_1
	{
	return A_Jump(128, "MyState_1");
	}
else//иначе, 100% прыгаем в стейт MyState_2
	{
	return state("MyState_2");
	}
}


Про другое не уверен, давно не юзал это дело, но можешь и сам проверить что будет с актером если ему прописать null (по идее актер будет уничтожен)

Рейтинг сообщения: +4, отметил(и): theleo_ua, YURA_111, JSO x, Void Weaver
1 3 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +807
Ссылка на пост №3802 Отправлено: 04.03.19 22:01:25
Ну вот опять:
Return type mismatch
Actor DImpA : DoomImp
{
+AVOIDMELEE
States
{
See:
    TROO AABBCCDD 2 
	{
	If (GetDistance(1)<Radius+256)
		{
		Return A_Jump(256,"Avoid");
		}
	Else
		{
		Return State("See");
		}
	A_Chase;
       }
Loop
Melee:
Missile:
   TROO EF 8 A_FaceTarget
   TROO G 6 A_TroopAttack
   goto See
Avoid:
   TROO AABBCCDD 2 
       {
       If (GetDistance(1)>Radius+272)
		{
		Return A_Jump(256,"Missile");
		}
       Else
		{
                Return State("Avoid");
		}
       A_FaceTarget;
       A_Chase(0,"Missile",CHF_NODIRECTIONTURN);
       }
Loop
}
}
В чём косяк?

EDIT:
Пробовал ставить continue в элс теперь до кучи возвращает "'continue' outside of a loop". ((

ЭДИТ2:
Пробовал ставить return и return state(0) и всё время возвращает ошибку "Return type mismatch". ВТФ?!
1 9 1
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +948
Ссылка на пост №3803 Отправлено: 04.03.19 23:02:25
Поставив такого актера на карте, ты можешь подойти к нему или отойти и он будет оповещать дальше или ближе..
Короче тест актер показывает что прыжки работают корректно.
Скрытый текст:

Actor Test 26897
{
+NOINTERACTION
States
	{
	Spawn:
		TNT1 A 1
		{
		if (GetDistance(TRUE, AAPTR_PLAYER1) < 128)
			{
			return A_Jump(256, "PrintCloser");
			}
		else
			{
			return state("PrintFarther");
			}
		}
		loop
	PrintCloser:
		TNT1 A 1 A_PrintBold("Player closer than 128 unit")
		goto spawn
	PrintFarther:
		TNT1 A 1 A_PrintBold("Player farther than 128 unit")
		goto spawn
	}
}





В твоем случае, надо написать функции A_Chase; A_Facetarget ДО КОДА с прыжком, получается код прыжка должен быть последним
Либо после этих всех функций написать return state("");
Т.е. логика такая что если в аноним функции есть прыжок, то она как бы эквивалентна function int myFunc () т.е. должна что-то вернуть обязательно либо 0 либо что-то еще. прописав return state(""); ты в конце возвращаешь 0, как бы все выполняется и если не прыгнуло никуда, то вернет 0.

Вот рабочий вариант:
Actor DImpA : DoomImp
{
+AVOIDMELEE
States
	{
	See:
		TROO AABBCCDD 2
			{
			if (GetDistance(TRUE) < Radius + 256)
				{
				return A_Jump(256, "Avoid");
				}
			else
				{
				return state("See");
				}
			A_Chase;
			return state("");
			}
		Loop
	Melee:
	Missile:
		TROO EF 8 A_FaceTarget
		TROO G 6 A_TroopAttack
		goto See

	Avoid:
		TROO AABBCCDD 2
			{
			A_FaceTarget;
			A_Chase(false, "Missile", CHF_NODIRECTIONTURN);
			if (GetDistance(TRUE) > Radius + 272)
				{
				return A_Jump(256, "Missile");
				}
			else
				{
                return state("Avoid");
				}
			A_FaceTarget;
			A_Chase(false, "Missile", CHF_NODIRECTIONTURN);
			return state("");
			}
		Loop
	}
}

Рейтинг сообщения: +2, отметил(и): theleo_ua, Void Weaver
1 3 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +807
Ссылка на пост №3804 Отправлено: 04.03.19 23:25:04
Так вот где собака порылась... Фига се, не думал что очерёдность ф-ций определяет внутреннюю конструкцию иф\элс. О_О

Т. е. либо так:
See:
		TROO AABBCCDD 2
			{
			A_Chase;
			if (GetDistance(TRUE) < Radius + 256)
				{
				return A_Jump(256, "Avoid");
				}
			else
				{
				return state("");
				}
			}
	Loop
	
либо так:
See:
		TROO AABBCCDD 2
			{
			if (GetDistance(TRUE) < Radius + 256)
				{
				return A_Jump(256, "Avoid");
				}
			else
				{
				//
				}
			A_Chase;
			return state("");
			}
	Loop

alekv, Гранд Мерси!

Рейтинг сообщения: +2, отметил(и): theleo_ua, alekv
1 9 1
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +948
Ссылка на пост №3805 Отправлено: 04.03.19 23:37:59
Да не за что.
Только уточню
Void Weaver пишет:
Фига се, не думал что очерёдность ф-ций определяет внутреннюю конструкцию иф\элс. О_О

alekv пишет:
Т.е. логика такая что если в аноним функции есть прыжок, то она как бы эквивалентна function int myFunc () т.е. должна что-то вернуть обязательно либо 0 либо что-то еще.

и ты пишешь не внутри if\else.
А вот если посмотреть на acs, там тот же принцип, просто мне кажется decorate совсем уг синтаксис.
function int myFunc ()
{
return 0;
}
поскольку функция myFunc имеет тип int, то функция там где ее вызывают должна что-то вернуть.
пример
script "test" (void)
{
if (myFunc() == 0)
PrintBold(s:"test");
}
если функция myFunc() будет иметь возвращаемый тип(bool, int, str(хз может ли строку возвращать не помню)), а не void, то обязательно надо что-то возвращать.

Рейтинг сообщения: +2, отметил(и): theleo_ua, Void Weaver
1 3 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +807
Ссылка на пост №3806 Отправлено: 05.03.19 17:32:06
Запись "####" и "#" (или #### и # для зскрипта) позволяет "копировать" кадр спрайта и его направление соответственно.
Вопрос: есть ли какой-либо способ "копировать" также длительность (тики) кадра?
1 9 1
JSO x
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 10 points
1280

Doom Rate: 2.29

Posts quality: +669
Ссылка на пост №3807 Отправлено: 05.03.19 22:10:18
Зачем тебе такое?..

В Decorate -- невозможно, только через очередной колоссальный костыль выдачи после каждого подпункта стейта предмета количеством предыдущей строки и соответственной проверки. В смысле,
See:
    TROO A 4 A_Chase
    TROO A 0 A_GiveInventory( "TickItem", 4 )
    TROO B 4 A_Chase
    TROO B 0 A_GiveInventory( "TickItem", 4 )
    TROO C 4 A_Chase
    TROO C 0 A_GiveInventory( "TickItem", 4 )
    TROO D 4 A_Chase
    TROO D 0 A_GiveInventory( "TickItem", 4 )
    Loop
<...>
TickTest:
    TROO E 1 A_TakeInventory( "TickItem", 1 )
    TROO E 0 A_JumpIfInventory( "TickItem", 1, "TickTest" )
    TROO FGHI 5 // Если нужно несколько строк стейта, копируешь текущее количество TickItem в какой-нибудь TempTickItem и декрементируешь уже его; и так -- каждый подпункт.
    Goto See

...Но это атас. В ZScript особо другого способа нет, вариант -- проверять через InStateSequence название текущего пункта выполнения и в Tick() обрабатывать изменения.

Никогда с такой проблемой ни там, ни там не встречался, потому больше сказать не могу.
2 7 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +807
Ссылка на пост №3808 Отправлено: 05.03.19 22:24:32
JSO x пишет:
Зачем тебе такое?..
Смотри, допустим есть имп с идл стэйтом:
Actor Imp1 : DoomImp
{
   States
  {
  Idle:
  TROO AABBCCDD 5 //A_Look
  Loop
  }
}
и есть барон с идл стэйтом:
Actor Ba1 : BaronOfHell
{
  States
  {
  Idle:
  BOSS AABBCCDD 3 //A_Look
  Loop
  }
}


Если им выдавать в течении некоторого времени такую штуку, то оба войдут в _Вандер с кадрами Idle, вот только у обоих скорость перемещения будет одинаково запредельная:
Скрытый текст:

Actor EyeRaveler : CustomInventory
{
+INVENTORY.ALWAYSPICKUP
Inventory.MaxAmount 0
States
  {
  Spawn:
  TNT1 A 1
  Loop

  Pickup:
  "####" "#" 0 
     {
     //A_SetTics(???); //Единственное соображение добавить эту ф-цию, но я хз как получить значение длительности из предыдущего кадра Idle стэйта...
     A_Wander;
     }
Loop
  }
}

Мне же нужно чтобы при получении подобного итма каждый моб двигался со скоростью аналогичной таковой своего стэйта.
1 9 1
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +948
Ссылка на пост №3809 Отправлено: 05.03.19 22:39:46
Я не понимаю чего делает #### и не хочу понимать, но тики теоретически можно передавать, таким путем:
Скрытый текст:

Actor Test_Actor_1
{
+NOINTERACTION
var int user_tic;
States
	{
	Spawn:
		TNT1 A 0
			{
			user_tic = random(1, 10);
			ACS_NamedExecute("SaveTic_InSlot", 0, user_tic);//Запоминаем тик в acs переменную
			}
	idle:
		MODL A A_SetTics(user_tic)
		TNT1 A 1
		loop
	}
}

Actor Test_Actor_2
{
+NOINTERACTION
var int user_tic;
States
	{
	Spawn:
		TNT1 A 0
			{
			user_tic = CallACS("GetActorTic_slot");//получаем тики из актера 1.
			}
	idle:
		MODL A A_SetTics(user_tic)//Будут те же тики что и у актера 1.
		loop
	}
}



В ACS прописываем переменную и 2 мини скрипта..
Скрытый текст:

int tic_slot_1;

Script "SaveTic_InSlot" (int tic)
{
tic_slot_1 = tic;
}

Script "GetActorTic_slot" (void)
{
SetResultValue(tic_slot_1);
}


Если надо копипастить тики в пределах 1 актера, то еще проще, надеюсь понятно как?

Рейтинг сообщения: +1, отметил(и): Void Weaver
1 3 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +807
Ссылка на пост №3810 Отправлено: 05.03.19 22:54:42
alekv пишет:
Я не понимаю чего делает #### и не хочу понимать
вот поэтому ты предложил мне АЦС-вариант "шило на мыло". Спасибо конечно за алгоритм (он действительно понятный и возможно кому-нибудь пригодится), но с таким же успехом проще задать фиксированные индивидуальные значения тиков для каждого актора непосредственно в пикап стэйте, типа:
Скрытый текст:

Pickup:
TNT1 A 0 A_JumpIf(CheckClass("Imp1")==1,"Imp")
TNT1 A 0 A_JumpIf(CheckClass("Ba1")==1,"Baron")
<...>
Imp:
  "####" "#" 0 
     {
     A_SetTics(5);
     A_Wander;
     }
Loop
Baron:
  "####" "#" 0 
     {
     A_SetTics(3);
     A_Wander;
     }
Loop
<...>

Но я рассчитывал на более гибкую и универсальную конструкцию.

Рейтинг сообщения: +1, отметил(и): alekv
1 9 1
JSO x
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 10 points
1280

Doom Rate: 2.29

Posts quality: +669
Ссылка на пост №3811 Отправлено: 05.03.19 23:15:50
Придумал, как сделать. ZScript.
class DoomImp2: DoomImp replaces DoomImp {

    State oldState;

    override void Tick() {
        if ( self.CurState != oldState ) {
            if ( self.InStateSequence( CurState, ResolveState( "Pain" ) ) )
                A_SetTics( oldState.Tics );
            oldState = self.CurState;
        }
        Super.Tick();
    }
}

Рейтинг сообщения: +1, отметил(и): alekv
2 7 1
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +948
Ссылка на пост №3812 Отправлено: 05.03.19 23:50:58
Void Weaver пишет:
вот поэтому ты предложил мне АЦС-вариант "шило на мыло". Спасибо конечно за алгоритм (он действительно понятный и возможно кому-нибудь пригодится), но с таким же успехом проще задать фиксированные индивидуальные значения тиков для каждого актора непосредственно в пикап стэйте, типа:
Скрытый текст:
Но я рассчитывал на более гибкую и универсальную конструкцию.

Ну значит зскрипт хороший выход.
Хотя в том коде что ты написал теоретически можно писать так
Скрытый текст:

var int user_tic;
Pickup:
  "####" "#" 0 
     {
	 if (CheckClass("Ba1") == TRUE) { user_tic = 5; }
	 if (CheckClass("imp") == TRUE) { user_tic = 1; }
	 if (CheckClass("actor3") == TRUE) { user_tic = 77; }
	 if (CheckClass("actor4") == TRUE) { user_tic = 44; }
	 if (CheckClass("actor5") == TRUE) { user_tic = 41; }
	 if (CheckClass("actor6") == TRUE) { user_tic = 3; }
	
     A_SetTics(user_tic);
     A_Wander;
     }
	Loop


Я просто видимо не вижу проблемы т.к. не понимаю как работает стейт ####.. ну понимаю что он копирует предыдущий стейт но что дальше хз и зачем это надо тоже хз =)

Рейтинг сообщения: +1, отметил(и): Void Weaver
1 3 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +807
Ссылка на пост №3813 Отправлено: 06.03.19 00:14:08
JSO x пишет:
Придумал, как сделать. ZScript.
Сорри, ваще нифига не понял.
Я случаем не упоминал раз стопицот в этом треде что все мои вопросы базируются на условии "декор онли" если не указано иное?

alekv снова выручаэ! ^_^ Далеко не то что надо, но отличная оптимизация вместо "спагетти". )

Добавлено спустя 14 минут 47 секунд:

alekv пишет:
не понимаю как работает стейт ####.. ну понимаю что он копирует предыдущий стейт но что дальше хз и зачем это надо тоже хз
Ну например для
Actors spawned with A_SpawnItemEx can utilize SXF_TRANSFERSPRITEFRAME, allowing use of the two preserving names above for the first frame of the initializing actor. This only works with A_SpawnItemEx, and should not be attempted with anything else.
Т. е. такими кадрами можно эмулировать блур эффект из _СпаунИтемЭкс.

ЛИБО же для визуализации кадрами текущего стэйта актора принудительного вызова какой-либо А_Ф-ции извне (как в моём случае) или внутри самого актора.
Например у актора (импа, барона) нет своего стэйта в котором бы вызывалась A_Wander, но оную можно принудительно вызвать из кастоминвентори, вот только без указания "####" "#" придётся либо довольствоваться невидимыми TNT1 либо визуализировать КАЖДЫЙ кадр для КАЖДОГО получателя:
TROO AABBCCDD 5 A_Wander
BOSS AABBCCDD 3 A_Wander
<...>

Кароч эти "####" "#" кадры весьма удобная штука.
1 9 1
theleo_ua
= Colonel =
Next rank: - Commissar - after 260 points
4630

Doom Rate: 1.81

Posts quality: +996
Ссылка на пост №3814 Отправлено: 06.03.19 00:36:20
alekv пишет:
Я просто видимо не вижу проблемы т.к. не понимаю как работает стейт ####.. ну понимаю что он копирует предыдущий стейт но что дальше хз и зачем это надо тоже хз


Это не стейт, а спрайт фрейм. Когда ты пишешь DEMN A 1, то в ваднике ищется файл DEMNA0.PNG. А теперь представь ситуацию, когда мне надо переопределить заморозку монстра таким образом, что я хочу убрать монстра которого заморозили, и на его месте заспавнить другого актора, которого я заморожу, и чтобы этот другой актор был с точно таким же спрайт фреймом, в котором был сам монстр в момент его заморозки

Тогда спавн актора будет с такой командой:

A_SpawnItemEx("замороженный" бла бла бла, SXF_TRANSFERSPRITEFRAME)

а в коде актора "замороженный" первый спрайт фрейм будет #### #, и движок гздума заменит его на тот, который был у спавнера в момент выполнения A_SpawnItemEx

Каким образом оно работает у Void Weaver, я не вникал в код, но думаю там какой-то похожий механизм, когда в момент самой игры, откуда-то возьмется спрайт фрейм и подставится вместо #### #

Рейтинг сообщения: +1, отметил(и): Void Weaver
3 1
JSO x
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 10 points
1280

Doom Rate: 2.29

Posts quality: +669
Ссылка на пост №3815 Отправлено: 06.03.19 11:09:28
Void Weaver пишет:
Я случаем не упоминал раз стопицот в этом треде что все мои вопросы базируются на условии "декор онли" если не указано иное?

JSO x пишет:
В Decorate -- невозможно, только через очередной колоссальный костыль выдачи после каждого подпункта стейта предмета количеством предыдущей строки и соответственной проверки.

Дополнение -- да, что в Decorate ныне можно свои переменные добавлять, забыл.

В общем, всё упирается в извечный вопрос: "Тебе шашечки или ехать?". Нужен исключительно Decorate (совместимость со старыми версиями всё равно нарушена, так как в моём любимом ZDoom 2.8.1 anonymous-функции не поддерживаются. А тогда зачем Decorate использовать, кроме как для совместимости?) -- тогда используй вариант, предложенный alekv и первоначально мной, нужна универсальность -- обучайся ZScript, даром что рабочий код для тебя УЖЕ написан.
2 7 1
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +948
Ссылка на пост №3816 Отправлено: 06.03.19 11:27:03
theleo_ua
Void Weaver
Спасибо, за разъяснения.

Void Weaver пишет:
Далеко не то что надо, но отличная оптимизация вместо "спагетти". )

Жаль что с появлением зскрипта, забили на декорейт синтаксис, так бы оптимизация была гораздо круче.
К примеру в декорейт поддерживает ENUM перечисления, но только цифры.. Строки не может, так же не понимает именованных enum да кучу всего, все это теперь в зскрипте, а он не понятный для простого юзера.

JSO x пишет:
обучайся ZScript, даром что рабочий код для тебя УЖЕ написан.

Вот я бы лучше посоветовал забить болт на этот гздум и учить нормальные ЯП. А гздум пусть покоится с миром.
Zscript уже не для мододелов, это язык программирования довольно сложный и плохо задокументированный, да еще и с хз каким синтаксисом. Если нужен зскрипт для создания модов, пора задуматься может пора менять движок, на ue или unity или cryengine и др., а не яп?
Тот же сишарп юнити во многие разы проще и круче и возможности огромные, обучение на столько простое что словами не передать, инфы и уроков тьма.

Полемика про достоверность Дума перенесена в http://i.iddqd.ru/viewtopic.php?p=107763#107763 BeeWen

Рейтинг сообщения: -1, отметил(и): MyNameIs
1 3 1
Doomgay1999
- Corporal -
Next rank: = Corporal = after 6 points
94

Doom Rate: 2

Posts quality: -1
Ссылка на пост №3817 Отправлено: 10.03.19 07:54:12
Можно как нибудь заменить текстуры в DOOM не трогая программы предназначение для этого?
ZZYZX
- UAC Commissar -
Next rank: = UAC Commissar = after 16 pointsМодератор форума
6284

Doom Rate: 1.65

Posts quality: +1630
Ссылка на пост №3818 Отправлено: 10.03.19 08:43:04
alekv пишет:
Вот я бы лучше посоветовал забить болт на этот гздум и учить нормальные ЯП. А гздум пусть покоится с миром.
Zscript уже не для мододелов, это язык программирования довольно сложный и плохо задокументированный, да еще и с хз каким синтаксисом. Если нужен зскрипт для создания модов, пора задуматься может пора менять движок, на ue или unity или cryengine и др., а не яп?
Тот же сишарп юнити во многие разы проще и круче и возможности огромные, обучение на столько простое что словами не передать, инфы и уроков тьма.

Тут ведь какая интересненькая особенность выходит — ты потратишь кучу времени на создание игры с нуля, а в неё в итоге будет играть столько же людей, сколько и в мод, то есть 5-20 за всё время :o
Так что тут скорее надо учитывать, насколько то что ты делаешь близко к думу, и сколько оригинального контента планируется слепить (причём код тоже в это входит).

Вот тебе пример: чтобы перейти на Unity, необходимо начать с менюшек настройки игры и открытия уровня, самому реализовать перемещение по уровню и AI монстров, нарисовать оружие, руки игрока (причём вероятно в 3D, чтобы не выглядело как уг, раз уж на юньке), и только после этого можно будет приступить к непосредственно созданию игры. И начать придётся с того что ты нарисуешь модель игрока. Потому что в думе она уже есть, а тут вот какая незадача — нема. И мало нарисовать, важно ещё и АНИМИРОВАТЬ, и состыковать с видом из глаз. Или смириться с тем что зеркал в твоём уровне не будет %)
Если бы в юньке существовало что-то в стиле "стартер пак для переходящих с маппинга к думоподобным играм", можно было бы ещё посмотреть.

А так вполне уместно учить зскрипт. Только с оглядкой на то что это практически буквальный интерфейс к внутренностям движка, защитой от дурака часто не обременённый.

Рейтинг сообщения: +2, отметил(и): theleo_ua, Mud
2 2 1
Герр Смертоносец
Chief Petty Officer
Next rank: Chief Petty Officer after 63 points
877

Doom Rate: 1.29

Posts quality: +785
Ссылка на пост №3819 Отправлено: 10.03.19 14:39:30
ZZYZX пишет:
Если бы в юньке существовало что-то в стиле "стартер пак для переходящих с маппинга к думоподобным играм", можно было бы ещё посмотреть.

Это, не?
2
ZZYZX
- UAC Commissar -
Next rank: = UAC Commissar = after 16 pointsМодератор форума
6284

Doom Rate: 1.65

Posts quality: +1630
Ссылка на пост №3820 Отправлено: 10.03.19 15:59:44
Это не совсем сравнимо с готовым игровым миром дума, мне кажется. В думе легко делать игру кусками, сначала маппишь с обычными текстурами или вообще дефолтными, потом подумал - дорисовал свои, а потом и монстру позаменял. Процесс вообще другой.

Рейтинг сообщения: +2, отметил(и): theleo_ua, Mud
2 2 1
Страница 191 из 200Перейти наверх Пред.  1, 2, 3 ... 190, 191, 192 ... 198, 199, 200  След.
   Список разделов - Флуд и устаревшие темы - Тема для новичков. Вопросы по маппингу/моддингу - любые!