Budowa budynku i wejście do niego ludzi

Wszelkie pytania na temat SAIL'a i modowania OW.
AmaVi
Soldier level 0
Soldier level 0
Posts: 5
Joined: Wed Apr 06, 2011 6:08 pm

Budowa budynku i wejście do niego ludzi

Post by AmaVi »

Chciałbym zrobić coś takiego że inżynierzy przeciwnika budują bunkry i po jego zbudowaniu wchodzi do niego żołnierz. Z jednym bunkrem nie mam problemu ale nie mam pojęcia jak to zrobić z większą liczbą bunkrów.

Próbowałem to zrobić tak:

Code: Select all

export inz;

starting
begin
inz=([e1,e2,e3,e4]);
wait(0$1);
b1=addcombuild(inz,b_bunker,133,69,3);
b2=addcombuild(inz,b_bunker,137,76,3);
end;

every 0$1 trigger isok(b1) and not isconstructed(b1) do
begin
comenterunit(s1,b1);
end;

every 0$1 trigger isok(b2) and not isconstructed(b2) do
begin
comenterunit(s2,b2);
end;
Ale nie chce działać. Budynki są budowane ale ludzie nie chcą do nich wchodzić.
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4169
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Budowa budynku i wejście do niego ludzi

Post by Serpent »

Użyj event'u:

Code: Select all

On BuildingComplete(b) do
        If GetBType(b) = b_breastwork then // tu nie wiem czy dobrze napisałem bunkier 
           begin
                  Bunkry := Bunkry + 1;
        end;

Export Bunkry;

Starting
 begin
  //... twoje te kody
  Bunkry = 0;
 end;

Every 0$01 trigger Bunkry = 1 do
 begin
  ComenterUnit(s1,b1);
 end;

Every 0$01 trigger Bunkry = 2 do
 begin
  ComenterUnit(s2,b2);
 end;
Tak bym to widział.
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
AmaVi
Soldier level 0
Soldier level 0
Posts: 5
Joined: Wed Apr 06, 2011 6:08 pm

Re: Budowa budynku i wejście do niego ludzi

Post by AmaVi »

Event się wykonuje ale żołnierz do budynku nie wchodzi. Tak jakby budynek nie maił id.
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4169
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Budowa budynku i wejście do niego ludzi

Post by Serpent »

Hmm, można zrobić to inaczej bo chyba nie wkładasz do bunkra jakiś konkretnych postaci:

Code: Select all

Var sol;

On BuildingComplete(b) do
        If GetBType(b) = b_breastwork then
           begin
           // kod na żołnierza
           sol = CreateHuman;
           PlaceUnitArea(sol, area_gdzieś w bazie wroga, false);
           
             Wait(0$01);
           
           ComEnterUnit(sol, b);
        end;
Założenie jest takie że po wybudowaniu bunkra, pojawi się w bazie żołnierz który wejdzie do budynku.
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
Gwrhkhsh
Soldier level 6
Soldier level 6
Posts: 398
Joined: Fri May 21, 2010 5:56 pm
Location: Wrocław

Re: Budowa budynku i wejście do niego ludzi

Post by Gwrhkhsh »

Nie da się czasem załatwić tego przez

Code: Select all

PlaceHumanInUnit(sol, b);
?
Dawno nie robiłem nic w SAILu, ale z tego co pamiętam, jest taka funkcja.
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4169
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Budowa budynku i wejście do niego ludzi

Post by Serpent »

Ale to ma wyglądać w miarę naturalnie. Człowiek wchodzi do bunkra, a nie pojawia się w nim nagle.
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
Radzio
Site Administrator
Site Administrator
Poland
Posts: 2898
Joined: Fri Jul 28, 2006 10:58 am
Location: Bialystok, Poland

Re: Budowa budynku i wejście do niego ludzi

Post by Radzio »

Code: Select all

on BuildingComplete(b) do
begin
  if GetBType(b) = b_breastwork then
  begin
    Bunkry := Bunkry + 1;
    case Bunkry of
      1: ComEnterUnit(s1, b);
      2: ComEnterUnit(s2, b);
    end;
  end;
end;
AmaVi
Soldier level 0
Soldier level 0
Posts: 5
Joined: Wed Apr 06, 2011 6:08 pm

Re: Budowa budynku i wejście do niego ludzi

Post by AmaVi »

Thx Radziu działa.

A teraz mam jeszcze jedno pytanie.

Jak zrobić żeby wyszli z tych bunkrów kiedy je zniszczę?

Próbowałem tak:

Code: Select all

on unitdestroyed(un) do
begin
 if (un) = b1 then
  begin
   commovexy(s1,167,97);
  end
else
 if (un) = b2 then
  begin
   commovexy(s2,167,97);
  end;
end;
Ale nie działa. Tak jakby te budynki nie miały id. Jak wstawiłem s2 zamiast b1 i zabiłem żołnierza to zadziałało.

Z góry dzięki za pomoc.
Radzio
Site Administrator
Site Administrator
Poland
Posts: 2898
Joined: Fri Jul 28, 2006 10:58 am
Location: Bialystok, Poland

Re: Budowa budynku i wejście do niego ludzi

Post by Radzio »

b1 i b2 są puste. (NULL)
AmaVi
Soldier level 0
Soldier level 0
Posts: 5
Joined: Wed Apr 06, 2011 6:08 pm

Re: Budowa budynku i wejście do niego ludzi

Post by AmaVi »

Tzn? Bo nie bardzo wiem o co chodzi. Czy można coś na to poradzić.
Radzio
Site Administrator
Site Administrator
Poland
Posts: 2898
Joined: Fri Jul 28, 2006 10:58 am
Location: Bialystok, Poland

Re: Budowa budynku i wejście do niego ludzi

Post by Radzio »

Komendy *Com* nie zwracają żadnych wartości AFAIR, więc:

Code: Select all

b1=addcombuild(inz,b_bunker,133,69,3);
b2=addcombuild(inz,b_bunker,137,76,3);
nie ma sensu. Wywal przypisania stąd.

A daj coś takiego:

Code: Select all

on BuildingComplete(b) do
begin
  if GetBType(b) = b_breastwork then
  begin
    Bunkry := Bunkry + 1;
    case Bunkry of
      1: begin b1 := b; ComEnterUnit(s1, b); end;
      2: begin b2 := b; ComEnterUnit(s2, b); end;
    end;
  end;
end;

on UnitDestroyed(un) do
begin
  case un of
    b1: ComMoveXY(s1, 167, 97);
    b2: ComMoveXY(s2, 167, 97);
  end;
end;
AmaVi
Soldier level 0
Soldier level 0
Posts: 5
Joined: Wed Apr 06, 2011 6:08 pm

Re: Budowa budynku i wejście do niego ludzi

Post by AmaVi »

Działa. Thx
User avatar
NNPlaya
Community Veteran
Community Veteran
Posts: 372
Joined: Sat Oct 14, 2006 4:52 pm
Location: Tuszyn, Polska
Contact:

Re: Budowa budynku i wejście do niego ludzi

Post by NNPlaya »

Radzio wrote:Komendy *Com* nie zwracają żadnych wartości AFAIR, więc:

Code: Select all

b1=addcombuild(inz,b_bunker,133,69,3);
b2=addcombuild(inz,b_bunker,137,76,3);
nie ma sensu. Wywal przypisania stąd.

A daj coś takiego:

Code: Select all

on BuildingComplete(b) do
begin
  if GetBType(b) = b_breastwork then
  begin
    Bunkry := Bunkry + 1;
    case Bunkry of
      1: begin b1 := b; ComEnterUnit(s1, b); end;
      2: begin b2 := b; ComEnterUnit(s2, b); end;
    end;
  end;
end;

on UnitDestroyed(un) do
begin
  case un of
    b1: ComMoveXY(s1, 167, 97);
    b2: ComMoveXY(s2, 167, 97);
  end;
end;
To teraz Cię może Radziu zagnę. :D

Code: Select all

var b1, b2;

STARTING
Begin
b1 = combuild(inz, b_bunker,47,45,3);

end;

on BuildingComplete(b) do
begin
  if b = b1 then
  begin
    ComEnterUnit(sold, b1);
  end;
end;
To działa tak, jak AmaVi by tego sobie życzył. Wystarczyło magiczne var b1, b2; przed STARTING.

Nie wiem, co to są wartości AFAIR (z początku cytowanego postu, vide przypomnienia), lecz pamiętam z dawnych czasów, że da się tak odwołać do zbudowanego pojazdu, budynku. W kodzie ALTARu nieraz tak było. :) Z tym, że oni tego używali raczej lokalnie, w stylu masowa produkcja ruskich czołgów. :mrgreen:

A tutaj skoro b1=.... jest w Begin...end po STARTING, wiadomo że zakres ważności zmiennej b1 się skończył razem z tym endem i taka zmienna poza tym blokiem zwyczajnie nie istnieje.

Na przyszłość, dla potomnych: ta instrukcja var na początku to nic innego, jak zadeklarowanie zmiennej globalnej (dla modułu, w którym aktualnie się znajduje, jeśli chcemy to mieć dla wszystkich, użyjmy export). To ma sens, ponieważ jakby nie było identyfikatory wszystkich jednostek postawionych na mapie w edytorze to zmienne globalne, do których spokojnie w najgłębszych czeluściach nie-wiadomo-już-który-raz-zagnieżdzonej pętli można się odwołać. :)

Pozdrawia NNPlaya, stary modder i programista ;p
Radzio
Site Administrator
Site Administrator
Poland
Posts: 2898
Joined: Fri Jul 28, 2006 10:58 am
Location: Bialystok, Poland

Re: Budowa budynku i wejście do niego ludzi

Post by Radzio »

NNPlaya wrote:A tutaj skoro b1=.... jest w Begin...end po STARTING, wiadomo że zakres ważności zmiennej b1 się skończył razem z tym endem i taka zmienna poza tym blokiem zwyczajnie nie istnieje.
Ekhem, ale za przeproszeniem: co ty pie*****sz? xD
On zadeklarował tę zmienną poza blokiem STARTING.
AFAIR = As Far As I Remember
Innymi słowy bywa tak, że pamięć mi szwankuje. ;D
User avatar
NNPlaya
Community Veteran
Community Veteran
Posts: 372
Joined: Sat Oct 14, 2006 4:52 pm
Location: Tuszyn, Polska
Contact:

Re: Budowa budynku i wejście do niego ludzi

Post by NNPlaya »

Radzio wrote:On zadeklarował tę zmienną poza blokiem STARTING.
Gdzie? :) Na pewno nie we fragmencie kodu, który podał i na pewno nie wspomniał o tym. :)
Radzio wrote:AFAIR = As Far As I Remember
Danke.

PS: Nice workaround :mrgreen:
Radzio wrote:A daj coś takiego:

Code: Select all

on BuildingComplete(b) do
begin
  if GetBType(b) = b_breastwork then
  begin
    Bunkry := Bunkry + 1;
    case Bunkry of
      1: begin b1 := b; ComEnterUnit(s1, b); end;
      2: begin b2 := b; ComEnterUnit(s2, b); end;
    end;
  end;
end;

on UnitDestroyed(un) do
begin
  case un of
    b1: ComMoveXY(s1, 167, 97);
    b2: ComMoveXY(s2, 167, 97);
  end;
end;
Post Reply