А по поводу кода - он тебе ничего не даст, но раз так хочешь то попробуй найти эту ошибку: http://pastebin.com/6CkFHEG0
Добавлено (22 Января 15, 00:38) --------------------------------------------- Кроме того вместе со скриптами лежат UTAmmo_LongbowAvril.uc (патроны), UTProj_LongbowAvrilRocket.uc (прожектиль (где я увеличил ему скорость, как просили)), UTWeap_LongbowAvril.uc (подклас UTWeapon), UTWeap_LongbowAvril_Content.uc (подклас предыдущего файла, т.к. он шёл вместе с дефолтным аврилом)
Мой IP сменился с 89.113.234.78/185.42.146.32 на 83.167.1.167. Теперь будет этот. Надолго. Порты те же. http-сервер .do impossible beat unbeatable
А теперь мои "идеи": 1 - в тукее например не нужны исходники классов, которые уже скомпилированы и роботают. Нужны только те скрипты которые ты делаеш - соответственно скачаные исходники ложыть никуда не надо - они нужны чтоб разобратса как роботает код и скорее всего просто не скомпилируютса (попробуй скомпилируй в тукее пакедж engine например) 2 - исходя их структуры тех же стандартных исходников, система похожа.
- че за х___я??? Ты хочеш запихнуть свою пушку в пакедж UTGame??? Считай что Development = Unreal Tournament 3, должно быть (по моему мнению) C:\Users\имя_юзера\Documents\My Games\Unreal Tournament 3\LongbowAvrilPackage\Classes\LongbowAvril.uc 3 - ини файл править уже под это.
Добавлено (22 Января 15, 00:47) --------------------------------------------- Ты сначала попробуй успешно скомпилировать файл с одной строчкой, который просто extend стандартный avril, кроме него ничего в папке classes быть не должно. А тогда уже можна гулять.
Добавлено (22 Января 15, 01:01) --------------------------------------------- И ещо, не являетса ли граблями на первой строчке кодировка? писано что надо ANSI. Хорошее обьяснение для 'i', которого не существует.
Сообщение отредактировал GP - Четверг, 22 Января 15, 01:05
... походу ты не понял как всё тут устроено. Для начала прочитай статью как делать моды на УТ3 по ссылке Аншейма, например. Собственно да, я туда положил свои файлы, но ты ошибаешься, я остальные файлы из архива не брал, они вообще нигде там не лежат и не пытаются скомпилироваться. Но этот вариант не прокатил и вышла та ошибка, что на скриншоте. И тут вот в чём загвоздка! В том архиве с исходниками была какая-то папка, а в ней подпапка Developments, а в ней Src. Это просто совпадение, что путь в ошибке совпадает с путём в архиве исходников? Однако этого пути нету в ini-файле, в нём путь который был описан в статье, ЕСЛИ БЫ там была ссылка на диск C с моими документами (хотябы переменная среды), но ведь там написано ..\UTGame, что означает (пример) "C:\A\b\c\d\launcher.exe make" проверяет каталог C:\A\b\c\UTGame, но не C:\Users\....... Поэтому я компилировал после первой ошибки в ...Unreal Tourmanent 3\Development\Src\класс\Classes и я уже сказал, но у меня ведь ошибки небыло и "типа" прошла компиляция, вот только в обещаном ModOutputDir=..\UTGame\Unpublished\CookedPC\Script, ни вообще на компьютере, скомпилированного .u не оказалось. Третий вариант это поместить в ...Unreal Tourmanent 3\UTGame\Src, но в этом случае мне компилятор выдал другую ошибку, что пакадж мой не найден нигде и компиляция невозможна.
Добавлено (22 Января 15, 01:04) --------------------------------------------- Этот код оринтировочно правильный в стиле UT2004. Я всё специально сверил, вот только в чём дело и проблема ли вообще в самом коде, а не компиляторе, я не знаю.
Мой IP сменился с 89.113.234.78/185.42.146.32 на 83.167.1.167. Теперь будет этот. Надолго. Порты те же. http-сервер .do impossible beat unbeatable
UnShame, у тебя файлы лежали в моих документах? И кодировка UTF-8 или UTF-8 without BOM? Сейчас и вчера у меня все .uc файлы были в кодировке UTF-8.
Я тут подумал может это стимовский UT3 какой-то не такой или что. У тебя какой установлен?
Добавлено (22 Января 15, 15:01) --------------------------------------------- Да, сделал UTF-8 without BOM и теперь компилирование пошло дальше, а всё лежало в моих документах. Вот только теперь ему не нравится ошибка в стандартном коде, который я не менял пока.
Код
simulated function EndFire(byte FireModeNum) { local UTPlayerController PC; local int i; local UTProj_AvrilRocketBase Rocket; local UTPawn P;
if (FireModeNum == 1 && bTargetingLaserActive) { // targeting laser altfire bTargetingLaserActive = false; LaserEffect.DeactivateSystem(); WeaponPlaySound(TargetingLaserStopSound); ClearFlashLocation(); P = UTPawn(Instigator); if (P != None) { P.SetWeaponAmbientSound(None); } // lose target lock on any rockets we were controlling for (i = 0; i < TargetedProjectiles.length; i++) { Rocket = UTProj_AvrilRocketBase(TargetedProjectiles[i]); if (Rocket != None && Rocket.LockingWeapon == self && Rocket.MyWeapon != self) { Rocket.SetTarget(None, self); // ошибка в этой строчке, это 615-ая строка } } TargetedProjectiles.length = 0; }
. Так как я понял из туториалов в ини файле мы говорим компилятору где скрипты лежат, тоесть ModPackagesInPath=..\UTGame\Src - папка мода, в которой все пакеджы мода, а ModPackages=LongbowAvril - папка-пакедж в которой непосредственно папка с классами.
По ошыбке: ошибка говорит, что второй параметр в Rocket.SetTarget(None, self) не того типа, что должен быть. Например функцыя хочет чтоб там был павн, а ты пихаеш туда переменную A, которая в var описана как актор (var Actor A), и может быть чем угодно. И даже если ты проверил павн ли это, надо писать Pawn(A). в таком случае если А павн или подклас павна - то все ок, а если нет то там просто получитса none. Если покороче то нужно: посмотреть какого типа вторая переменная в класе UTProj_AvrilRocketBase, т.к. он кастомный, то в его суперкласе. посмотрел... если твой UTWeap_LongbowAvril extends UTWeap_Avril можно self заменить на UTWeap_Avril(self), или в класе прожектиля прожектиля изменить чтоб он обращалса не к UTWeap_Avril а к UTWeap_LongbowAvril.
Предположитльно хотелось бы второй вариант сделать, так как если я буду наследовать, то возможно появятся проблемы из-за другой системы прицеливания (которую я собирался настроить после первой удачной компиляции -_-), поэтому я наследую от UTWeapon, а не от Аврила. Это в случае с патронами, с прожектилем я могу наследовать от аврильских патронов и прожектиля, изменив только defaultproperties.
Мой IP сменился с 89.113.234.78/185.42.146.32 на 83.167.1.167. Теперь будет этот. Надолго. Порты те же. http-сервер .do impossible beat unbeatable
Сообщение отредактировал XCanG - Четверг, 22 Января 15, 22:15
Extennds - расшыряет, дополняет... каждый клас наследует все функцыи предшественника и то что ты их не копировал ничего не значит - они там есть, там даже есть все функцыи которые есть в Actor и тем более в Object. Ты их не пишеш, но они берутса "которая ближе по дереву". (очевидно, но на всякий случай пишу) У тебя UTProj_LongbowAvrilRocket это подклас UTProj_AvrilRocket, он в свою очередь подклас UTProj_AvrilRocketBase. Другими словами: открой UTProj_AvrilRocket, в нем нет функцыи которую вызывает пушка, значит лезеш в его суперклас - UTProj_AvrilRocketBase. Вот в нем есть функцыя "function bool SetTarget(Actor NewTarget, UTWeap_Avril NewLockOwner)" Как видиш второй параметр имеет тип UTWeap_Avril. Вот эту функцыю целиком с кишками копируеш в свой прожектиль изменив тип с UTWeap_Avril на UTWeap_LongbowAvril. Только тогда ты своей функцыей "затмиш" функцыю суперкласа. НО! В тукее например такое не всегда получаетса провернуть: содержымое функцыии можно поменять, а вот шапку, которая идет в описание редко. Так что лучше первый вариант. Как по мне первый вариант "правильней" - так как ты не меняеш того что тебе не надо менять. Проблем с самонаводкой не будет, так как твоя пушка подклас стандартной, и ей свойственно все, что свойственно ей до тех пор, только если это не переделать криво, поэтому нет ничего кривого в обращении к стандартному прожектилю типа "смотри, я тоже стандартная пушка а не что-попало".
Сообщение отредактировал GP - Четверг, 22 Января 15, 22:58
Ааа, вот она где собака зарыта, вот именно этот класс мне надо изменить. Я думал сначала что этот класс для другого нужен и не стал его дубликат делать.
Тогда стоит переделать. Если я первым вариантом сделаю, тогда я могу избавиться в UTWeap_LongbowAvril от тех функций, где я не вношу никаких изменений и оставить только те, где я изменю самонаводку, при этом оружие будет новое с нужными нам параметрами, так ведь?
Добавлено (22 Января 15, 23:20) --------------------------------------------- Если тупо не менять код, а изменить наследование, то мне компилятор выдал варинги на все функции, что они уже объявлены, но компиляция наконец-то прошла успешно.
Мой IP сменился с 89.113.234.78/185.42.146.32 на 83.167.1.167. Теперь будет этот. Надолго. Порты те же. http-сервер .do impossible beat unbeatable
Понимаеш, если например обьявить переменную как прожектиль, то ты можеш через нее напрямую обращатса к функцыям прожектиля, а если ты обьявил эту переменную как актор, то чтоб воспользоватса функцыями прожектиля тебе нужно указать, что твой актор есть именно прожектиль Даже если ты ей присвоил 100% прожектиль, компилятор это не интересует, там может быть любой актор, и доступны функцыи только те, которые есть у всех акторов (общие), и так далее. Твой прожектиль есть подклас стандартного, тоесть тупо копия. А стандартный прожектиль расчитан на стандартную пушку, и его копия тоже. Поэтому ему приходитса обьяснять, что твоя пушка это тоже "типа стандартная", или переделать так, чтоб его не интересовало какая пушка. Первое проще и короче. В тукее к примеру такое в основном с эфектами - например в ракете переменная взрыва указана не как эмиттер, а как конкретный его подклас, скажем рокет_експложын_эмиттер. И вместо него другой эмиттер подставить в дефолт пропертис не получитса - выбьет ошыбку, и в коде а не в дефолт пропертис. А если переменную указать как просто эмиттер, то можно будет спавнить и стандартный и любой другой, все что емиттер. Но если у тебя емиттер с какими-то дополнительными, которые ты собираешся использовать, то тебе придетса либо его прописать конкретно, либо каждый раз в коде указывать что это не просто эмитер, а особенный.
ЦитатаXCanG ()
Если я первым вариантом сделаю, тогда я могу избавиться в UTWeap_LongbowAvril от тех функций, где я не вношу никаких изменений
В иделе, те функцыи, которых ты не меняеш писать не надо, они есть сами по себе, просто пишеш моя_херня extends стандартная_херня, и все, может быть пустой файл - это уже копия, в нем уже все есть что есть в стандартной_херне, не надо копировать текст из оригинала. Копируеш толко те функцыи, которые ты переделываеш, и те которые жестко задают типы (вот эта последняя ошыбка). Чесно говоря, смотря на то как тут все сделано, я бы тебе посоветовал просто скопировать все что связано с аврилом. Тоесть не делать свою пушку как подклас аврила, прожектиль как подклас стандартного и т.д, а сделать просто копию всех файлов со всем их содержымым просто с другими названиями, не менять им екстендс. А уже в самих файлах менять везде где есть посылка на стандартное поставить свои названия. Торетически это длинный путь, но он надежный, и менять можно будет что угодно без гемороя. к примеру поменял ты название с "прожектиль" на "новый_прожектиль", и просто во всех файлах ищеш поиском где попадаетса слово "прожектиль" и меняеш его на "новый_прожектиль", и так скаждым.
Настроил скорость. И кстати, лол, нашёл опечатку в коде
Так-же сделал так, чтобы после сброса фокуса с цели автонаведение не терялось, но вот что не получается, так это наведение на павн.
Вот что по теме я нашёл в коде, но привязки именно к технике я не заметил и тут ступор.
Код
native function UpdateLockTarget(Actor NewLockTarget);
/** * This function is used to adjust the LockTarget. * Called by UpdateLockTarget() only when NewLockTarget is different from LockTarget */ event AdjustLockTarget(actor NewLockTarget) { if ( (NewLockTarget == None) || NewLockTarget.bDeleteMe ) { // Clear the lock if (bLockedOnTarget) { } } else { // Set the lock bLockedOnTarget = true; LockedTarget = NewLockTarget; if ( LockAcquiredSound != None && Instigator != None && Instigator.IsHumanControlled() ) { PlayerController(Instigator.Controller).ClientPlaySound(LockAcquiredSound); } }
CheckLockZoom();
if (MyRocket != none) { MyRocket.SetTarget(NewLockTarget, self); } }
Код
/** * Given an actor (TA) determine if we can lock on to it. By default only allow locking on * to pawns. Some weapons may want to be able to lock on to other actors. */ native function bool CanLockOnTo(Actor TA);
Что тут изменить, чтобы наведение было и на игроков я не знаю.
Добавлено (23 Января 15, 00:52) ---------------------------------------------
ЦитатаGP ()
может быть пустой файл
Это то я знаю. Конкретно интересовал тот факт, когда я делаю обращение к функции, код которой не написан в этом контексте (то есть ни одного упоминания), то нужно ли её наличие или нет. Эта вещь мне пришла от опытов в программировании на С, когда мы классы объявляли public или private, либо когда работа была с мультипоточной оптимизацией и объявление функции в одном потоке не всегда означало, что второй поток сможет получить к ней доступ без дублирования оной.
ЦитатаGP ()
к примеру поменял ты название с "прожектиль" на "новый_прожектиль", и просто во всех файлах ищеш поиском где попадаетса слово "прожектиль" и меняеш его на "новый_прожектиль", и так скаждым.
Это и тому подобное я сделал сразу же, как только сделал дубликаты кода, ещё до того момента как написал мутатор, заменяющий оружие на карте.
Добавлено (23 Января 15, 00:53) --------------------------------------------- В общем у меня готово всё, кроме наведения на пехоту.
Добавлено (23 Января 15, 00:56) --------------------------------------------- UnShame, кстати, раз ты компилировал тоже, ты не в курсе как безопасно можно закрыть консоль? В саму консоль написать ничего нельзя (в тукее можно было ввесли quit), а любая попытка её закрыть вызывает окно, словно компилятор повис ("программа не отвечает, что выберете: поиск в инете, закрыть принудительно, отладка приложения") и каждый раз я закрываю её таким способом, лол.
Мой IP сменился с 89.113.234.78/185.42.146.32 на 83.167.1.167. Теперь будет этот. Надолго. Порты те же. http-сервер .do impossible beat unbeatable
если ты запустил ярлыком или бат-файлом, хз. Если запускал из консоли, та что "типа дос", то можно юзать кнопку Pause/Break, но не факт что здесь поможет.
ЦитатаXCanG ()
привязки именно к технике я не заметил и тут ступор.
ЦитатаGP ()
проверки как таковой игрок это или вехикл там нету - пустой ивент с коментарием, что стандартно мол лочимся только на павнах, а другие пушки могут захотеть на чем-то другом, и это надо будет проверять сдесь (где коментарий). Вариант - дописать в пустом can_lockon "return true", но вероятно пушка начнет лочитса на всем подряд. Идеальный вариант - скопировать функцыю (adjust_lock*** ) от рокетланчера - там отличие только в двух местах: у рокета есть строчка с чем-то относительно PRI (player replication info?), а у аврила есть кусок касательно ракеты (у рокета сложная система зарядки, и видать это в другом месте).
Сейчас не уверен что там только 2 отличия, в детали проверок не вникал. Возьми ту функцыю из рокет ланчера и замени ей, от авриловской оставь только кусок про прожектиль в конце, которого у рокетланчера явно нет.
Попробовал поизменять всякие параметры и true приписал и функцию дополнил, ещё сам пошурудил подозрительные на эту тему строчки, но ничего не помогло. Я тут загуглил, это случайно не по той же теме шаманят с этой строчкой https://forums.epicgames.com/threads....ectiles тут вроде бы как лочатся на сферках шоки или хелебендера и я так понял если это в тему, то можно заставить лочиться на акторах игроков?
Мой IP сменился с 89.113.234.78/185.42.146.32 на 83.167.1.167. Теперь будет этот. Надолго. Порты те же. http-сервер .do impossible beat unbeatable
Сообщение отредактировал XCanG - Пятница, 23 Января 15, 03:13
Там не получаетса и советуют делать все вручную, как сделано в тукее - пушка постоянно трейсит, проверяет то, в что упираетса, потом задержки сколько надо продержать чтоб залочилось и сколько надо промазывать чтоб разлочилось, и когда спавнитса прожектиль ему записываетса цель. Ну а прожектиль сам в тике обрабатывает свой полет, к примеру двигаетса прямо, и если у него есть цель то постоянно поворачиваетса в ее сторону, а чтоб самонаводка не была абсолютной ограничиваетса скорость поворота или контролируетса не скорость а ускорене, что физически более правильно и тогда ракету "заносит" на крутых поворотах. Это не проблема в общем, делал не раз, но учитывая мою граматику то что все через форум то займет вечность.
Мдэ... В принципе я могу выложить уже эту версию, ибо кроме этой функции остальное думаю что готово, хотя я не все тесты провёл. Например если кто-то покинет технику то останется ли самонаводка без направления игроком и водителя, а также случай с несколькими целями. Но это я проверю позже.
Мой IP сменился с 89.113.234.78/185.42.146.32 на 83.167.1.167. Теперь будет этот. Надолго. Порты те же. http-сервер .do impossible beat unbeatable
function ForceLock(Actor ForcedLock) { LockedTarget = ForcedLock; // don't get any more target updates from weapon. MyWeapon.RocketDestroyed(self); if ( (UTVehicle_SPMA(ForcedLock) != None) && (PlayerController(InstigatorController) != None) ) PlayerController(InstigatorController).ReceiveLocalizedMessage(class'UTLockWarningMessage', 3); }
Стоп. Ну рокетанчер в ут3 же лочитса на игроках? Может просто ему поменять модель и режимы огня? Иначе придетса делать вручную. Как ты проверял, что рицеливание не роботает ? Тут цель ловитса в момент выстрела прожектиля, поэтому визуальных признаков того, что цель захвачена может не быть. Попробуй просто пострелять по павнах и посмотреть, как летит ракета.
Сообщение отредактировал GP - Пятница, 23 Января 15, 18:43
Да, но как и в тукее нужно подождать секунды две (на скидку). Я не думаю что тут надо менять на рокет, ибо потом всёравно надо на технику ставить лок, да и придётся время убрать и альт-огонь убрать. К тому же проблема такая,что у рокет ланчера вроде как 3 типа ракеты. Просто прожектиль ракеты, потом другая версия для закрученных ракет (они с предпросчётом похоже) и с самонаводкой. То есть там всё разделено. Просто пальнув ракетой рокета мы не сможем её заставить наводиться. Поэтому и ракету надо будет переделывать.
Мой IP сменился с 89.113.234.78/185.42.146.32 на 83.167.1.167. Теперь будет этот. Надолго. Порты те же. http-сервер .do impossible beat unbeatable
Сообщение отредактировал XCanG - Пятница, 23 Января 15, 22:47
рокетанчер в ут3 не лочитса на технике? вот что значит б___ь универсализацыя, что проще вручную. А в уе4 еще эти блюпринты, кажысь вообще хрен разберешся.
Сообщение отредактировал GP - Пятница, 23 Января 15, 22:54