• Страница 1 из 2
  • 1
  • 2
  • »
Архив - только для чтения
Форум TruckGame.Club » Корзина » Архивы » Декультиватор (Превращаем обработанное поле в необработанную землю.)
Декультиватор
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, ну ты блин даёшь shok молодец так держать!
oleg6799Дата: Понедельник, 23.08.2010, 21:52 | Сообщение # 5
Группа: Удаленные





можешь написать весь текстовый файл этого плуга а то я как нуб
misha2010ruДата: Вторник, 24.08.2010, 03:23 | Сообщение # 6
Бригадир
Группа: Постоянный
Сообщений: 119
wacko короче,я все прочитал два раза,столько умных слов!вообщем ты молодец smile
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
Форум TruckGame.Club » Корзина » Архивы » Декультиватор (Превращаем обработанное поле в необработанную землю.)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:
Copyright © 2009-2024 TRUCKGAME.CLUB