Page 1 of 1

pojawiajaca sie komora

Posted: Sat Nov 02, 2019 7:56 pm
by Lavigo.
witamj
mam problem z utworzeniem kodu na komore która by siepojawiała pomimo tego że została zniszczona i zbierała skrzynki z danego obszaru
tzn jest komora i zbiera skrzynki jak sieją zniszczy to chcę żeby siępojawiła i dalej zbierała skrzynki...

znalazłem kod w 15 misji Am ale tam są uwzględnione 3 nacje od razu i mam problem jak go przerobić dla jednej nacji

kod który wynalazłem:
Spoiler:
every 1$0.6 do
var un,
n_cargo,cargo,
side;
begin
for side in cpu_list do
begin
case side of
1: n_cargo:=us_cargo_bay;
2: n_cargo:=ar_cargo_bay;
3: n_cargo:=ru_cargo_bay;
end;
cargo:=FilterAllUnits([ [f_side,side], [f_type,unit_vehicle], [f_weapon,n_cargo] ]);
if not (cargo or FilterUnitsInArea(base_areas[side], [ [f_side,you] ])) then
begin
uc_side:=side;
case side of
1: uc_nation:=nation_american;
2: uc_nation:=nation_arabian;
3: uc_nation:=nation_russian;
end;

uc_direction:=Rand(0,5);
case side of
1: vc_chassis:=us_medium_tracked;
2: vc_chassis:=ar_half_tracked;
3: vc_chassis:=ru_medium_tracked;
end;
vc_engine:=engine_siberite;
case side of
1: vc_control:=control_computer;
2: vc_control:=control_apeman;
3: vc_control:=control_computer;
end;
vc_weapon:=n_cargo;

un:=CreateVehicle;
while GetTag(83) do
wait(0$1);
PlaceUnitArea(un,create_areas[side],false);
end;

end;
enable;
end;
ogarnąłem go jakośtak:
Spoiler:
every 1$0.6 do
var un;

begin
for side in cpu_list do
begin

uc_nation:=nation_american;
vc_chassis:=us_medium_tracked;
vc_engine:=engine_siberite;
vc_control:=control_computer;

un:=CreateVehicle;
wait(0$1);
PlaceUnitArea(un,create_areas[nation_american],false);
enable;
end;

ale i tak sail przy kompilacji wyrzuca błąd na końcu kodu w end
kombinuje i kombinuje i mi to nie chce przejść...

Re: pojawiajaca sie komora

Posted: Sat Nov 02, 2019 8:20 pm
by Serpent
Odnośnie drugiego kodu, zabrakło ci

Code: Select all

end
. Liczb beginów musi być zawsze równa liczbie endów gdyż są to odpowiednio początek i koniec bloku.

Code: Select all

every 1$0.6 do
var un;
begin
  for side in cpu_list do
    begin

          uc_nation:=nation_american;
          vc_chassis:=us_medium_tracked;
          vc_engine:=engine_siberite;
          vc_control:=control_computer;

          un:=CreateVehicle;
            wait(0$1);
          PlaceUnitArea(un,create_areas[nation_american],false);
       enable;
    end;
end;
Poza tym ten kod będzie tworzyć co minutę nową komorę. Lepiej będzie to jakoś inaczej rozkminić.

Założenia:
- Gracz niebieski (side = 1) zbiera skrzynki za pomocą komory z arei o nazwie Area100.
- W przypadku jej zniszczenia, respawnuje nową komorę i kontynuuje zadanie.

Pierwsze co robimy to inicjalizacja zmiennych:

Code: Select all

Starting
begin
ResetFog;
InitVariables;
// ...
End;

Export crates_to_collect;
Function InitVariables;
begin
crates_to_collect := [];
// inne zmienne
End;
Kod na komorę:

Code: Select all

Export Function SpawnCargo(side, area);
begin
uc_side := side;
uc_nation := nation_american;

vc_chassis := us_medium_tracked;
vc_engine := engine_siberite;
vc_control := control_computer;
vc_weapon := us_cargo_bay;

un := CreateVehicle;
PlaceUnitArea(un, area ,false);
End;
Stawiamy naszą komorę na mapie:

Code: Select all

Every 0$1 do
SpawnCargo(1, spawn_area);
Następnie tworzy kod na zbieranie skrzyń:

Code: Select all

// Event rejestrujący spadające skrzynki
On CrateSpawn(id, x, y, amount, mode) do
begin
// pomijamy artefakty
if GetResourceTypeXY(x, y) = mat_artefact then
   exit;

// w tym miejscu można by sprawdzać które dokładnie skrzynki mają być rejestrowane, bierzemy te z Area100
if InArea(x, y, Area100) then
   crates_to_collect := Insert(crates_to_collect, crates_to_collect+1, [x, y]);
End;
Odpalamy skrypt na zbieranie skrzynek:

Code: Select all

Every 0$1 trigger FilterAllUnits([[f_side, 1], [f_weapon, us_cargo_bay]]) and crates_to_collect do
var i;
begin
enable;

for i in FilterAllUnits([[f_side, 1], [f_weapon, us_cargo_bay]]) do
     begin
     if not HasTask(i) and GetLives(i) > 250 then
        begin
        ComCollect(i, crates_to_collect[1][1], crates_to_collect[1][2]);
        crates_to_collect := Delete(crates_to_collect, 1);
        end;
     end;   
End;
Ostatnia rzecz to spawn nowej komory:

Code: Select all

On UnitDestroyed(un) do
begin
if GetSide(un) = 1 and GetWeapon(un) = us_cargo_bay then
   SpawnCargo(1, spawn_area);
End;
Tak bym to widział. Niestety kod pisałem z palca i nie mam jak go przetestować więc pisz w razie problemów :P

Re: pojawiajaca sie komora

Posted: Sun Nov 03, 2019 8:39 am
by Lavigo.
initVariables w bloku startowym sail znalazł jako błąd, po wywaleniu go śmiga

pojawiają się skrzynki i komora chwile stoi ale zaraz zbiera tylko nie zawsze je wkłada do magazynu, czasem czeka i wkłada dopiero przy następnym zbieraniu ?!

jeszcze tylko parę pytań ;)
Spoiler:
PlaceUnitArea(un, area ,false);
to ma w takiej formie pozostać czy za area mam podstawić aree w które ma sie pojawiać komora
Spoiler:
on CrateSpawn(id, x, y, amount, mode) do
tutaj też id, x,y zostawiam?

to samo tu:
Spoiler:
If InArea(x, y, Area100) then
x, y, majątak zostać

bo ogólnie kod ruszył, ale chciałem dopytać ze względu na czasami zastoje komory ;)

Re: pojawiajaca sie komora

Posted: Sun Nov 03, 2019 2:15 pm
by Serpent
Podałem ci gotowy kod, nic nie trzeba podmieniać.
pojawiają się skrzynki i komora chwile stoi ale zaraz zbiera tylko nie zawsze je wkłada do magazynu, czasem czeka i wkłada dopiero przy następnym zbieraniu ?!
Zazwyczaj komora ma ładowność 100 jednostek. Jeden zrzut to maksymalnie 50 jednostek, więc komora nie jedzie do magazynu się wyładować gdyż wciąż ma wolne miejsce.

Jeżeli zależy ci na tym aby komora za każdym razem gdy coś podniesie, jechała od razu do magazynu to trzeba zmodyfikować jeden fragment kodu:

Code: Select all

Every 0$1 trigger FilterAllUnits([[f_side, 1], [f_weapon, us_cargo_bay]]) and crates_to_collect do
var i, dep;
begin
enable;

dep := FilterAllUnits([[f_side, 1], [f_or, [f_btype, b_depot], [f_btype, b_warehouse]]]);

for i in FilterAllUnits([[f_side, 1], [f_weapon, us_cargo_bay]]) do
     begin
     if not HasTask(i) and GetLives(i) > 250 then
        begin
        ComCollect(i, crates_to_collect[1][1], crates_to_collect[1][2]);
        crates_to_collect := Delete(crates_to_collect, 1);
        
        if dep then
           AddComGive(i, NearestUnitToUnit(dep, i));
        end;
     end;   
End;

Re: pojawiajaca sie komora

Posted: Sun Nov 03, 2019 6:07 pm
by Lavigo.
kod ogólnie działa wiec super wielkie dzięki :D
ale i ten lekko zmodyfikowany sięprzyda :d dzieki raz jeszcze :D


edit:
z tym że ten drugi co przed chwilą podałeś jednak nie zawozi skrzyń do magazynu ale ten pierwszy jest ok, tylko dopytać
cchiałem :)

Re: pojawiajaca sie komora

Posted: Tue Dec 13, 2022 5:03 pm
by Jakskomiksu
Odsyłam do starszego, podobnego wątku: viewtopic.php?f=6&t=3712