Powtarzanie ID, Nadawanie tych samych ID po tworzeniu w Sail

Wszelkie pytania na temat SAIL'a i modowania OW.
Post Reply
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Powtarzanie ID, Nadawanie tych samych ID po tworzeniu w Sail

Post by Night »

Mam taki oto problem.

Założenie kodu:
Po wybudowaniu 3 pojazdów, pojawia się trzech mechaników, którzy wsiadają do wozów i zabierają je gdzieś tam (z mapy). Gdy pojazdy zostaną zabrane, wszystko ma się powtórzyć.

Problem: gdy zaczyna się powtarzać, mechanicy już nie wsiadają do pojazdów. Kolejne pojazdy dostają kolejne ID Pojazd[4],[5],[6], zamiast znów [1],[2],[3].

Czy da się wymazać ID jednostek? Czy można zapętlić to jakoś inaczej?


Póżniej ta pętla zostaje przerwana i zamiast mechanicy wyjeżdzać z mapy, jadą tymi pojazdami do ataku, na co mam osoby blok every, ale tak samo nie działa z powodu nadawania kolejnych ID, a nie wiadomo w którym secie, będzie wykonany kod (zależy od szybkości gracza), więc nie mogę dać konkretnych ID do tego bloku.


Code: Select all

Every 0$1 trigger GetDistUnits(Am02work, Am02Rus9)<10 or GetDistUnits(Am02work, Am02Rus10)<10 MARKED 02 do
Begin
czolg1 = addcomconstruct(Am02work, ru_medium_wheeled, engine_combustion, control_manual, ru_heavy_machine_gun);
czolg2 = addcomconstruct(Am02work, ru_medium_wheeled, engine_combustion, control_manual, ru_heavy_machine_gun);
czolg3 = addcomconstruct(Am02work, ru_medium_wheeled, engine_combustion, control_manual, ru_heavy_machine_gun);
enable(05);
end;



Function PreparePojazd;
begin
Pojazd := [];
end;

var kierowca;
On VehicleConstructed(un,fab) do
Begin
 if fab=Am02work then
  Begin
     kierowca=IsDrivenBy(un);
     ComMoveToArea(kierowca, RusPark);
     AddComExitVehicle(kierowca);
     AddComEnterUnit(kierowca, Am02work);
  end;
      begin
           if fab=Am02work then
           if GetChassis(un)= ru_medium_wheeled then
           if GetEngine(un)= engine_combustion then
           if GetControl(un)= control_manual then
           if GetWeapon(un)= ru_heavy_machine_gun then
              begin
              pojazd= pojazd ^ un;
              end;
      end;

end;

every 0$1 trigger FilterUnitsInArea(RusBaseMain,[[f_side, 3],[f_weapon, ru_heavy_machine_gun]])=3 Marked 05 do
begin
disable(02);
//wait(0$20);      //do zmiany czas, po testach
PlaceUnitXY(Am02Rus11, 18, 29, false);
AddComEnterUnit(Am02Rus11, pojazd[1]);
PlaceUnitXY(Am02Rus12, 17, 30, false);
AddComEnterUnit(Am02Rus12, pojazd[2]);
PlaceUnitXY(Am02Rus13, 19, 30, false);
AddComEnterUnit(Am02Rus13, pojazd[3]);
enable(03);
AddComMoveToArea(Am02Rus11, Am02exit);
AddComMoveToArea(Am02Rus12, Am02exit);
AddComMoveToArea(Am02Rus13, Am02exit);
enable
end;


every 0$1 trigger IsInArea(pojazd[1], Am02exit) and IsInArea(pojazd[2], Am02exit) and IsInArea(pojazd[3], Am02exit) MARKED 03 do

begin
RemoveUnit(Am02Rus11);
RemoveUnit(Am02Rus12);
RemoveUnit(Am02Rus13);
RemoveUnit(pojazd[1]);
RemoveUnit(pojazd[2]);
RemoveUnit(pojazd[3]);
enable(02);
disable(05);
end;
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4166
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Powtarzanie ID, Nadawanie tych samych ID po tworzeniu w

Post by Serpent »

// kod na produkcje... przykładowo ten twój
Spoiler:

Code: Select all

Export vehlist, list;

Every 1 do
list = []; // tworzysz gdzie pustą listę

Every 0$1 trigger GetDistUnits(Am02work, Am02Rus9)<10 or GetDistUnits(Am02work, Am02Rus10)<10 AND vehlist < 1 MARKED 02 do
Begin
vehlist = 3;


czolg1 = addcomconstruct(Am02work, ru_medium_wheeled, engine_combustion, control_manual, ru_heavy_machine_gun);
czolg2 = addcomconstruct(Am02work, ru_medium_wheeled, engine_combustion, control_manual, ru_heavy_machine_gun);
czolg3 = addcomconstruct(Am02work, ru_medium_wheeled, engine_combustion, control_manual, ru_heavy_machine_gun);
enable(05);
end;
// przyporządkowuje liczbę produkowanych pojazdów
Spoiler:

Code: Select all

On VehicleCounstructed(veh, fac) do
var i;
begin

If fac = fabryka then
   begin
         If GetSide(veh) = twojastrona then // czy jakiś inny warunek
            vehlist = vehlist - 1;
            list = list ^ veh;
              PrepareDriver; // funkcja na mechanika, poniżej
           // kod na wejście kierowcy itd.
                  If vehlist < 1 then // jeżeli lista elementów jest mniejsza od 1 to...
                     // komenda na przejazd do arei
                         for i = 1 to 3 do 
                             begin
                                ComMoveToArea(list[i], area); // albo ComMoveXY(list[i], x,y);
                              end;
end;
// tworzy jednostkę o profesji mechanik
Spoiler:

Code: Select all

Export function PrepareDriver;
var un;

uc_side = side;
uc_nation = nation; // pisz sobie

hc_gallery = '';
hc_class = 3; // mechanik
// i inne hc...
un = CreateHuman;
PlaceUnitArea(un, area, false);
end;
// kod na usunięcie jednostek
Spoiler:

Code: Select all

Every 0$01 do
var un;
begin
enable;

for un in FilterUnitsInArea(area w której maja znikać, [f_side, twojastrona]) do
     begin
           If un in list then
              begin
              list = list - 1;
              end;
       RemoveUnit(un);
      end;

end;
Spróbuj takie coś, ciężko mi bez edytora to sprawdzić ale powinno latać.
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Powtarzanie ID, Nadawanie tych samych ID po tworzeniu w

Post by Night »

Niestety, siedziałem, przerabiałem i nie działa. Zawsze przynajmniej jedna rzecz mi nie działała.

A to od razu tworzący pojazd jedzie do arei gdzie ma znikać pojazd.
A to mechanicy niechcą wchodzić do pojazdów.
A to tylko jeden chce wchodzić.
A to niechcą odjeżdzać.
A to tylko jeden odjeżdza.
itd itd.

Nie mogę tego ogarnąć.

Poza tym, czy dobrze widzę, że to będzie działać tylko na zasadzie

stworzony pojazd - stworzony kierowca - wsiada do pojazdu

a na nie stworzone 3 pojazdy - stworzeni 3 kierowcy - wsiadają do pojazdów?

Code: Select all

On VehicleConstructed(veh, fac) do
var i;
var kierowca;
begin

If fac = Am02work then
                begin
                If GetSide(veh) = 1 then // czy jakiś inny warunek
                 vehlist = vehlist - 1;
                 list = list ^ veh;
                      begin
                      kierowca=IsDrivenBy(veh);
                      ComMoveToArea(kierowca, RusPark);
                      AddComExitVehicle(kierowca);
                      AddComEnterUnit(kierowca, Am02work);
                      end;
                
                  PrepareDriver;
                  AddComEnterUnit(un, veh[i]); // z "list" nie działa, musiałem dać "veh". "un" jest na globalne dane.
                  If vehlist < 1 then 
                        for i = 1 to 3 do
                             begin
                             AddComMoveToArea(veh[i], Am02Exit); //tu nie działa ani z "list", ani z "veh". Jeśli wyłącze "if vehlist <1" i "or i = 1 to 3 do", to mechanicy bezpośrednio jadą z fabryki i pojazdy potem znikają przy użyciu "veh". Czyli nie wykonuje się kod z "kierowca".
                             end;
end;
end;
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Powtarzanie ID, Nadawanie tych samych ID po tworzeniu w

Post by Night »

W końcu dosiedziałem i się udało :D. Tydzień męczenia się z tym:

Code: Select all

Every 1 do
list = []; 

Every 0$1 trigger GetDistUnits(Am02work, Am02Rus1)<10 or GetDistUnits(Am02work, Am02Rus2)<10 AND vehlist < 1 marked 01 do
Begin
vehlist = 3;


czolg1 = addcomconstruct(Am02work, ru_medium_wheeled, engine_combustion, control_manual, ru_heavy_machine_gun);
czolg2 = addcomconstruct(Am02work, ru_medium_wheeled, engine_combustion, control_manual, ru_heavy_machine_gun);
czolg3 = addcomconstruct(Am02work, ru_medium_wheeled, engine_combustion, control_manual, ru_heavy_machine_gun);
end;



On VehicleConstructed(veh, fac) do
var i;
var kierowca;
begin

If fac = Am02work then
   begin
                If GetSide(veh) = 1 then // czy jakiś inny warunek
                vehlist = vehlist - 1;
                list = list ^ veh;
                      begin
                      kierowca=IsDrivenBy(veh[1]);
                      AddComMoveToArea(kierowca, RusPark);
                      AddComExitVehicle(kierowca);
                      AddComEnterUnit(kierowca, Am02work);
                      end;
                                     

                            PrepareDriver;
                            wait(0$10);
                            AddComEnterUnit(un, veh[i]);
                            
                            
                begin
                if FilterUnitsInArea(RusBaseMain,[[f_side, 3],[f_weapon, ru_heavy_machine_gun]])=3 then
                            begin
                            wait(0$15);
                            for un in FilterUnitsInArea(RusPark, [f_side, 3]) do
                            ComMoveToArea(un, Am02Exit);
                            enable(02);
                            end;
                end;
   end;
end;





Export function PrepareDriver;
       begin
            uc_side = 3;
            uc_nation = nation_russian;
            hc_gallery = '';
            hc_class = class_mechanic;
            hc_skills := [];
            un = CreateHuman;
            PlaceUnitArea(un, Am02Exit, false);
       end;

Every 0$1 MARKED 02 do
begin
enable;

if FilterUnitsInArea(Am02Exit,[f_side, 3])=3 then
   begin
   for un in FilterUnitsInArea(Am02Exit, [f_side, 3]) do
          begin
           If un in list then
              begin
              list = list - 1;
              end;
       RemoveUnit(un);
       enable(01);
       disable(02);
       end;
   end;
end;
Nie rozkminiłem tylko jednej rzeczy - czy da się tak ustawić, aby stworzyć mechaników naraz i każdy wsiadł do swojego wozu. Ale na razie jestem happy ;).
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4166
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Powtarzanie ID, Nadawanie tych samych ID po tworzeniu w

Post by Serpent »

Mógłbyś stworzyć mechaników i postawić ich po fabryką:

Code: Select all

Export listMech;
Export function PrepareDriver;
var i;      
 begin

listMech = [];
           
 for i = 1 to 5 do
         begin
           uc_side = 3;
            uc_nation = nation_russian;
            hc_gallery = '';
            hc_class = class_mechanic;
            hc_skills := [];
            un = CreateHuman;
            ListMech = ListMech ^un;
            PlaceUnitArea(un, Am02Exit, false);
 end;
end;
Gdzięs tam wcześniej używasz funkcji PrepareDriver.

Code: Select all

// wycinek kodu

  list = list ^ veh;
                      begin
                      kierowca=IsDrivenBy(veh[1]);
                      AddComMoveToArea(kierowca, RusPark);
                      AddComExitVehicle(kierowca);
                      AddComEnterUnit(kierowca, Am02work);
                      end;
                                     

                       AddComEnterUnit(mechList[i], veh[i]);
                           
         // reszta...
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Powtarzanie ID, Nadawanie tych samych ID po tworzeniu w

Post by Night »

Samo stworzenie mechaników w jednym momencie problemem nie jest. Zaczyna się w momencie gdy mają wsiąść do wozów - każdy do swojego. Zawsze chcą wsiadać wszyscy do ostatniego wyprodukowanego.
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Powtarzanie ID, Nadawanie tych samych ID po tworzeniu w

Post by Night »

Serpent wrote: @Night
Co do twojego tematu, to nie mam obecnie pod ręką edytora żeby ci zbyt pomoc.
Spoiler:
Zrób może kod gdzie pojazd wyprodukowany zostaje gdzieś obok fabryki, a potem gdy masz ich x to wsiadają do nich mechy:

Code: Select all

for i = 1 to 6 do
begin
ComEnterUnit(Mech[i],Pojazd[i]);
end;
Kod po kolei będzie ci wyznaczał jednostki z listy, i to zmienna. Nic innego na tą chwile mi nie przychodzi do głowy.
Nie wychodzi mi tak. Póki co zostawiłem jak jest. Nie jest to jakaś tragedia jakbym tego nie zrobił, ale dla oka byłoby milej.
Post Reply