Декультиватор
| |
oldnick | Дата: Воскресенье, 22.08.2010, 20:40 | Сообщение # 1 |
Разнорабочий
Группа: Пoльзователи
Сообщений: 4
|
Итак, постановка задачи. Надо создать инструмент для "одичания" полей, превращающий их в необработанную территорию. Зачем? Например, чтобы создавать красивенькие ровненькие границы полей, которые хорошо понимает автопилот. Или исправлять результаты случайных ляпов при работе с плугом и культиватором. Имеется в наличии: плугскрипт. К сожалению, он скомпилирован, а декомпилятор не справляется с некоторыми конструкциями. Значит, модифицировать его не получится и придётся взять за основу какой-нибудь плуг или культиватор, несовместимый с плуг-скриптом (то есть, имеющий свою собственную процедуру обработки поля, которую модифицировать можно). Например, этот: http://truckgame.club/load/28-1-0-1491 "Kockerling Quadro 800". Внутри эта штука считает себя Kverneland CTC, но неважно. Начнём копаться во входящем в состав мода скрипт. После изучения декомпиляции плугскрипта, приходим к выводу, что собака в основном порылась в функции setDensityParallelogram. В ней используются некоторые вспомогательные значения, получение которых имеет смысл разместить в функции load, дабы не получать их каждый кадр в функции update. Так что модификация 1 заключается в том, чтобы встроить в функцию load следующие строки: Code KvernelandCTC.cultiId = g_currentMission.cultivatorChannel; KvernelandCTC.sowingId = g_currentMission.sowingChannel; KvernelandCTC.detailId = g_currentMission.terrainDetailId; KvernelandCTC.ploughId = g_currentMission.ploughChannel; KvernelandCTC.sprayId = g_currentMission.sprayChannel; Далее имело бы смысл сделать отдельную функцию декультивации, но у меня возникли с этим очень странные и неприятные побочные эффекты, так что просто заменяем команду "заплуговать нужный кусочек земли" на последовательность команд для декультивации. Недолгий поиск по функции update наводит нас на строчку Utils.updateCultivatorArea(x, z, x1, z1, x2, z2); Да, это она отвечает за превращение всего, что имело несчастье попасть под культиватор, в окученную землю. Уберём или закомментируем эту строчку (комментарий обозначается двумя минусами в начале строки). Далее в это же самое место добавим творчески переосмысленное содержимое функции Cultivator.updateSafeArea из плуг-скрипта. В данном случае нам нужно убирать из обрабатываемой области вообще все слои (за это отвечает предпоследний параметр функции setDensityParallelogram). Code local dx, dz, dwidthX, dwidthZ, dheightX, dheightZ = Utils.getXZWidthAndHeight(detailId, x, z, x1, z1, x2, z2); Utils.updateDestroyCommonArea(x, z, x1, z1, x2, z2) setDensityParallelogram(KvernelandCTC.detailId, dx, dz, dwidthX, dwidthZ, dheightX, dheightZ, KvernelandCTC.sowingId, 1, 0) setDensityParallelogram(KvernelandCTC.detailId, dx, dz, dwidthX, dwidthZ, dheightX, dheightZ, KvernelandCTC.ploughId, 1, 0) setDensityParallelogram(KvernelandCTC.detailId, dx, dz, dwidthX, dwidthZ, dheightX, dheightZ, KvernelandCTC.cultiId, 1, 0) setDensityParallelogram(KvernelandCTC.detailId, dx, dz, dwidthX, dwidthZ, dheightX, dheightZ, KvernelandCTC.sprayId, 1, 0) И вот результат - "ластик" для полей http://imglink.ru/show-image.php?id=ab8167bf7e8ab45a9932e9decfcbc4ec
Сообщение отредактировал Mythbuster - Воскресенье, 22.08.2010, 21:11 |
|
| |
Northern_Strike | Дата: Воскресенье, 22.08.2010, 20:52 | Сообщение # 2 |
Механик
Группа: V.I.P.
Сообщений: 298
|
o_O oldnick, а можно видео) а так идея не плохая
Сообщение отредактировал Northern_Strike - Воскресенье, 22.08.2010, 20:56 |
|
| |
oldnick | Дата: Понедельник, 23.08.2010, 14:49 | Сообщение # 3 |
Разнорабочий
Группа: Пoльзователи
Сообщений: 4
|
Видео чего? Если самого процесса "стирания", так его несложно воспроизвести с приведёнными модификациями. А если видео самого процесса изменения мода, так там и смотреть не на что - внести пару кусков в текстовый файл и всех делов...
|
|
| |
STALKER | Дата: Понедельник, 23.08.2010, 15:49 | Сообщение # 4 |
Разнорабочий
Группа: Пoльзователи
Сообщений: 1239
|
oldnick, ну ты блин даёшь молодец так держать!
|
|
| |
oleg6799 | Дата: Понедельник, 23.08.2010, 21:52 | Сообщение # 5 |
Группа: Удаленные
|
можешь написать весь текстовый файл этого плуга а то я как нуб
|
|
| |
misha2010ru | Дата: Вторник, 24.08.2010, 03:23 | Сообщение # 6 |
Бригадир
Группа: Постоянный
Сообщений: 119
|
короче,я все прочитал два раза,столько умных слов!вообщем ты молодец
|
|
| |
STALKER | Дата: Вторник, 24.08.2010, 10:34 | Сообщение # 7 |
Разнорабочий
Группа: Пoльзователи
Сообщений: 1239
|
если разобраться то эт не сложно! У мя уже 2 таких декультиватора!
|
|
| |
oleg6799 | Дата: Среда, 25.08.2010, 13:02 | Сообщение # 8 |
Группа: Удаленные
|
или выложите изменненную версию
|
|
| |
oldnick | Дата: Среда, 01.09.2010, 09:26 | Сообщение # 9 |
Разнорабочий
Группа: Пoльзователи
Сообщений: 4
|
Вот версия того мода, который я перекорячил: http://depositfiles.com/files/m5349dm4p . Копирайты - за автором мода и всё такое... Добавлено (01.09.2010, 09:15) --------------------------------------------- По заявкам трудящихся, вот фрагменты из lua-файла декультиватора. Там есть ещё и другие исправления по мелочи, но то, что относится к декультивации, собрано в конце функции load и в основном в update. Это load: Code function KvernelandCTC:load(xmlFile)
self.onBrakeDrums = SpecializationUtil.callSpecializationsFunction("onBrakeDrums");
local hydraulicsCount = Utils.getNoNil(getXMLInt(xmlFile, "vehicle.hydraulics#count"), 0); self.hydraulics = {}; for i=1, hydraulicsCount do local hydraulicName = string.format("vehicle.hydraulics.hydraulic%d", i); self.hydraulics[i] = {}; self.hydraulics[i].node = Utils.indexToObject(self.components, getXMLString(xmlFile, hydraulicName .. "#index")); self.hydraulics[i].punch = Utils.indexToObject(self.components, getXMLString(xmlFile, hydraulicName .. "#punch")); self.hydraulics[i].translationPunch = Utils.indexToObject(self.components, getXMLString(xmlFile, hydraulicName .. "#punchFixpoint")); self.hydraulics[i].fixPoint = Utils.indexToObject(self.components, getXMLString(xmlFile, hydraulicName .. "#fixpoint")); local ax, ay, az = getWorldTranslation(self.hydraulics[i].punch); local bx, by, bz = getWorldTranslation(self.hydraulics[i].translationPunch); self.hydraulics[i].punchDistance = Utils.vector3Length(ax-bx, ay-by, az-bz); self.hydraulics[i].doScale = Utils.getNoNil(getXMLBool(xmlFile, hydraulicName .. "#doScale"), false); end; local hydraulicSound = getXMLString(xmlFile, "vehicle.ctcHydraulicSound#file"); if hydraulicSound ~= nil and hydraulicSound ~= "" then hydraulicSound = Utils.getFilename(hydraulicSound, self.baseDirectory); self.hydraulicSound = createSample("hydraulicSound"); loadSample(self.hydraulicSound, hydraulicSound, false); self.hydraulicSoundPitchOffset = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.ctcHydraulicSound#pitchOffset"), 1); self.hydraulicSoundVolume = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.ctcHydraulicSound#pitchMax"), 2.0); self.hydraulicSoundEnabled = false; end; local cultivatorSound = getXMLString(xmlFile, "vehicle.cultivatorSound#file"); if cultivatorSound ~= nil and cultivatorSound ~= "" then cultivatorSound = Utils.getFilename(cultivatorSound, self.baseDirectory); self.cultivatorSound = createSample("cultivatorSound"); loadSample(self.cultivatorSound, cultivatorSound, false); self.cultivatorSoundPitchOffset = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.cultivatorSound#pitchOffset"), 0); self.cultivatorSoundVolume = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.cultivatorSound#volume"), 1.0); self.cultivatorSoundEnabled = false; end;
self.axis = {}; self.axis.minRot = {Utils.degToRad(getXMLFloat(xmlFile, "vehicle.axis#minRot"))}; self.axis.maxRot = {Utils.degToRad(getXMLFloat(xmlFile, "vehicle.axis#maxRot"))}; self.axis.rotTime = getXMLFloat(xmlFile, "vehicle.axis#rotTime")*1000; self.drawbar = {}; self.drawbar.node = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.drawbar#index")); self.drawbar.minRot = {Utils.degToRad(getXMLFloat(xmlFile, "vehicle.drawbar#minRot"))}; self.drawbar.maxRot = {Utils.degToRad(getXMLFloat(xmlFile, "vehicle.drawbar#maxRot"))}; self.drawbar.rotTime = self.axis.rotTime; self.currentTranslationLimit = {0}; self.frame = {}; self.frame.minRot = {Utils.degToRad(getXMLFloat(xmlFile, "vehicle.frame#minRot"))}; self.frame.maxRot = {Utils.degToRad(getXMLFloat(xmlFile, "vehicle.frame#maxRot"))}; self.frame.rotTime = getXMLFloat(xmlFile, "vehicle.frame#rotTime")*1000; self.groundParticleSystems = {}; Utils.loadParticleSystem(xmlFile, self.groundParticleSystems, "vehicle.leftGroundParticleSystem", self.components[5].node, false, nil, self.baseDirectory); Utils.loadParticleSystem(xmlFile, self.groundParticleSystems, "vehicle.rightGroundParticleSystem", self.components[4].node, false, nil, self.baseDirectory); self.groundParticleSystemActive = false; self.aiTerrainDetailChannel1 = g_currentMission.ploughChannel; self.aiTerrainDetailChannel2 = g_currentMission.sowingChannel;
self.speedViolationMaxTime = 2500; self.speedViolationTimer = self.speedViolationMaxTime; self.cultivatorContactReportsActive = false; self.startActivationTimeout = 5000; self.startActivationTime = 0; self.frameIsDown = true; self.isDown = true; self.isExpanded = true; self.doJointOrientation = false; self.attacherJointCopy = nil;
-- ***** Вот здесь добавленные строки: ********* KvernelandCTC.cultiId = g_currentMission.cultivatorChannel; KvernelandCTC.sowingId = g_currentMission.sowingChannel; KvernelandCTC.detailId = g_currentMission.terrainDetailId; KvernelandCTC.ploughId = g_currentMission.ploughChannel; KvernelandCTC.sprayId = g_currentMission.sprayChannel; -- ****************************************
end; Добавлено (01.09.2010, 09:26) --------------------------------------------- Вот фрагмент update, здесь изменения тоже собраны в одном месте. Вся функция в сообщение не влезает, поэтому публикую с купюрами. Code function KvernelandCTC:update(dt)
if self.doJointOrientation and self.attacherVehicle ~= nil then for k,v in pairs(self.attacherVehicle.attachedImplements) do if v.object == self then local joint = self.attacherVehicle.attacherJoints[v.jointDescIndex]; self.attacherJointCopy = joint; self.rotationCopy = {joint.minRot[1], joint.minRot[2], joint.minRot[3]}; joint.minRot[1] = math.rad(-20); self.isDown = not joint.moveDown; end; end; self.doJointOrientation = false; end;
if self:getIsActiveForInput() then if InputBinding.hasEvent(InputBinding.LOWER_IMPLEMENT) then self.isDown = not self.isDown; end; if not self.frameIsDown then if InputBinding.hasEvent(InputBinding.IMPLEMENT_EXTRA2) then self.isExpanded = not self.isExpanded; end; end; end; if self:getIsActive() then self.wasToFast = false; if self.attacherJointCopy ~= nil then self.attacherJointCopy.moveDown = false; self.attacherVehicle.needsLowering = false; else self.attacherVehicle.needsLowering = true; end; self.frameIsDown = false; if self.attacherVehicle ~= nil then setJointRotationLimit(self.attacherJointCopy.jointIndex, 2, true, math.rad(-25), math.rad(25)); end; local x,y,z = getRotation(self.componentJoints[2].jointNode); if math.abs(self.axis.maxRot[1] - x) > 0.04 then self.frameIsDown = true; else self:onBrakeDrums(); end;
if self.frameIsDown and self.isExpanded then local toFast = false; toFast = self:doCheckSpeedLimit() and self.lastSpeed*3600 > 30; if self.startActivationTime <= self.time and not toFast then for k, cuttingArea in pairs(self.cuttingAreas) do local x,y,z = getWorldTranslation(cuttingArea.start); local x1,y1,z1 = getWorldTranslation(cuttingArea.width); local x2,y2,z2 = getWorldTranslation(cuttingArea.height); local dx, dz, dwidthX, dwidthZ, dheightX, dheightZ = Utils.getXZWidthAndHeight(detailId, x, z, x1, z1, x2, z2); Utils.updateDestroyCommonArea(x, z, x1, z1, x2, z2) -- *********** Закомментировано то, что было раньше ************** -- Utils.updateCultivatorArea(x, z, x1, z1, x2, z2); -- ************* А тут добавлены новые команды ******************* setDensityParallelogram(KvernelandCTC.detailId, dx, dz, dwidthX, dwidthZ, dheightX, dheightZ, KvernelandCTC.sowingId, 1, 0) setDensityParallelogram(KvernelandCTC.detailId, dx, dz, dwidthX, dwidthZ, dheightX, dheightZ, KvernelandCTC.ploughId, 1, 0) setDensityParallelogram(KvernelandCTC.detailId, dx, dz, dwidthX, dwidthZ, dheightX, dheightZ, KvernelandCTC.cultiId, 1, 0) setDensityParallelogram(KvernelandCTC.detailId, dx, dz, dwidthX, dwidthZ, dheightX, dheightZ, KvernelandCTC.sprayId, 1, 0) -- ************************************************************** end; end;
-- ************* Остальная часть функции опущена, там изменений нет ****************** end; end;
Сообщение отредактировал oldnick - Среда, 01.09.2010, 09:17 |
|
| |
STALKER | Дата: Среда, 01.09.2010, 20:38 | Сообщение # 10 |
Разнорабочий
Группа: Пoльзователи
Сообщений: 1239
|
странно у меня он всёравно не работает...
|
|
| |
oldnick | Дата: Четверг, 02.09.2010, 19:15 | Сообщение # 11 |
Разнорабочий
Группа: Пoльзователи
Сообщений: 4
|
А тот вариант, что я на депозит выложил, работает?
|
|
| |
STALKER | Дата: Четверг, 02.09.2010, 20:33 | Сообщение # 12 |
Разнорабочий
Группа: Пoльзователи
Сообщений: 1239
|
oldnick, неа, он както странно *плавает* по полю, ничего не далая, у мя установлен плуг скрипт
|
|
| |
Northern_Strike | Дата: Четверг, 02.09.2010, 20:42 | Сообщение # 13 |
Механик
Группа: V.I.P.
Сообщений: 298
|
oldnick, у меня работает нормально, проблем не заметил, установлен плуг скрипт.
Сообщение отредактировал Northern_Strike - Четверг, 02.09.2010, 20:43 |
|
| |
STALKER | Дата: Четверг, 02.09.2010, 23:16 | Сообщение # 14 |
Разнорабочий
Группа: Пoльзователи
Сообщений: 1239
|
Northern_Strike, ты с каким трактором используешь и какие кнопки жмёшь чтобы работал? ты его сам делал или по вот этой ссылке качал http://depositfiles.com/files/m5349dm4p?
|
|
| |
Northern_Strike | Дата: Пятница, 03.09.2010, 11:07 | Сообщение # 15 |
Механик
Группа: V.I.P.
Сообщений: 298
|
STALKER, Использовал свой Мтз и твой Кировец, нажимаю на кнопку V и еду, все работает хорошо. Скачал мод по ссылке http://depositfiles.com/files/m5349dm4p
|
|
| |
|